void resume_netfront(void) { struct netfront_dev_list *list; for (list = dev_list; list != NULL; list = list->next) _init_netfront(list->dev, NULL, NULL); }
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; }