コード例 #1
0
ファイル: netfront.c プロジェクト: cnplab/mini-os
void resume_netfront(void)
{
	struct netfront_dev_list *list;

	for (list = dev_list; list != NULL; list = list->next)
		_init_netfront(list->dev, NULL, NULL);
}
コード例 #2
0
ファイル: netfront.c プロジェクト: carriercomm/mini-os
struct netfront_dev *init_netfront(char *_nodename, void (*thenetif_rx)(unsigned char* data, int len, void *arg), unsigned char rawmac[6], char **ip)
{
    char nodename[256];
    struct netfront_dev *dev;
    struct netfront_dev_list *ldev = NULL;
    struct netfront_dev_list *list = NULL;
    static int netfrontends = 0;

    if (!_nodename)
        snprintf(nodename, sizeof(nodename), "device/vif/%d", netfrontends);
    else {
        strncpy(nodename, _nodename, sizeof(nodename) - 1);
        nodename[sizeof(nodename) - 1] = 0;
    }

    /* Check if the device is already initialized */
    for ( list = dev_list; list != NULL; list = list->next) {
        if (strcmp(nodename, list->dev->nodename) == 0) {
            list->refcount++;
            dev = list->dev;
            if (thenetif_rx)
                netfront_set_rx_handler(dev, thenetif_rx, NULL);
            goto out;
        }
    }

    if (!thenetif_rx)
	thenetif_rx = netif_rx;

    dev = malloc(sizeof(*dev));
    memset(dev, 0, sizeof(*dev));
    dev->nodename = strdup(nodename);
#ifdef HAVE_LIBC
    dev->fd = -1;
#endif
    dev->netif_rx = thenetif_rx;
    dev->netif_rx_arg = NULL;

    ldev = malloc(sizeof(struct netfront_dev_list));
    memset(ldev, 0, sizeof(struct netfront_dev_list));

    if (_init_netfront(dev, ldev->rawmac, &(ldev->ip))) {
        ldev->dev = dev;
        ldev->refcount = 1;
        ldev->next = NULL;

        if (!dev_list) {
            dev_list = ldev;
        } else {
            for ( list = dev_list; list->next != NULL; list = list->next);
            list->next = ldev;
        }

        netfrontends++;
    } else {
        free(dev->nodename);
        free(dev);
        free(ldev);
        dev = NULL;
        goto err;
    }

out:
    if (rawmac) {
        rawmac[0] = ldev->rawmac[0];
        rawmac[1] = ldev->rawmac[1];
        rawmac[2] = ldev->rawmac[2];
        rawmac[3] = ldev->rawmac[3];
        rawmac[4] = ldev->rawmac[4];
        rawmac[5] = ldev->rawmac[5];
    }
    if (ip) {
        *ip = malloc(strlen(ldev->ip));
        strncpy(*ip, ldev->ip, strlen(ldev->ip));
    }

err:
    return dev;
}