diff options
-rw-r--r-- | hw/usb-net.c | 78 | ||||
-rw-r--r-- | hw/usb.h | 3 | ||||
-rw-r--r-- | vl.c | 18 |
3 files changed, 47 insertions, 52 deletions
diff --git a/hw/usb-net.c b/hw/usb-net.c index 122a0d8490..9744dfa5d9 100644 --- a/hw/usb-net.c +++ b/hw/usb-net.c @@ -1420,8 +1420,7 @@ static void usbnet_cleanup(VLANClientState *nc) { USBNetState *s = DO_UPCAST(NICState, nc, nc)->opaque; - rndis_clear_responsequeue(s); - qemu_free(s); + s->nic = NULL; } static void usb_net_handle_destroy(USBDevice *dev) @@ -1429,9 +1428,18 @@ static void usb_net_handle_destroy(USBDevice *dev) USBNetState *s = (USBNetState *) dev; /* TODO: remove the nd_table[] entry */ + rndis_clear_responsequeue(s); qemu_del_vlan_client(&s->nic->nc); } +static NetClientInfo net_usbnet_info = { + .type = NET_CLIENT_TYPE_NIC, + .size = sizeof(NICState), + .can_receive = usbnet_can_receive, + .receive = usbnet_receive, + .cleanup = usbnet_cleanup, +}; + static int usb_net_initfn(USBDevice *dev) { USBNetState *s = DO_UPCAST(USBNetState, dev, dev); @@ -1447,43 +1455,45 @@ static int usb_net_initfn(USBDevice *dev) s->media_state = 0; /* NDIS_MEDIA_STATE_CONNECTED */; s->filter = 0; s->vendorid = 0x1234; + + qemu_macaddr_default_if_unset(&s->conf.macaddr); + s->nic = qemu_new_nic(&net_usbnet_info, &s->conf, + s->dev.qdev.info->name, s->dev.qdev.id, s); + qemu_format_nic_info_str(&s->nic->nc, s->conf.macaddr.a); + snprintf(s->usbstring_mac, sizeof(s->usbstring_mac), + "%02x%02x%02x%02x%02x%02x", + 0x40, + s->conf.macaddr.a[1], + s->conf.macaddr.a[2], + s->conf.macaddr.a[3], + s->conf.macaddr.a[4], + s->conf.macaddr.a[5]); + return 0; } -static NetClientInfo net_usbnet_info = { - .type = NET_CLIENT_TYPE_NIC, - .size = sizeof(NICState), - .can_receive = usbnet_can_receive, - .receive = usbnet_receive, - .cleanup = usbnet_cleanup, -}; - -USBDevice *usb_net_init(NICInfo *nd) +static USBDevice *usb_net_init(const char *cmdline) { USBDevice *dev; - USBNetState *s; - - dev = usb_create_simple(NULL /* FIXME */, "usb-net"); - s = DO_UPCAST(USBNetState, dev, dev); + QemuOpts *opts; + int idx; - memcpy(s->conf.macaddr.a, nd->macaddr, sizeof(nd->macaddr)); - s->conf.vlan = nd->vlan; - s->conf.peer = nd->netdev; - - s->nic = qemu_new_nic(&net_usbnet_info, &s->conf, - nd->model, nd->name, s); + opts = qemu_opts_parse(&qemu_net_opts, cmdline, NULL); + if (!opts) { + return NULL; + } + qemu_opt_set(opts, "type", "nic"); + qemu_opt_set(opts, "model", "usb"); - qemu_format_nic_info_str(&s->nic->nc, s->conf.macaddr.a); + idx = net_client_init(NULL, opts, 0); + if (idx == -1) { + return NULL; + } - snprintf(s->usbstring_mac, sizeof(s->usbstring_mac), - "%02x%02x%02x%02x%02x%02x", - 0x40, s->conf.macaddr.a[1], s->conf.macaddr.a[2], - s->conf.macaddr.a[3], s->conf.macaddr.a[4], s->conf.macaddr.a[5]); - fprintf(stderr, "usbnet: initialized mac %02x:%02x:%02x:%02x:%02x:%02x\n", - s->conf.macaddr.a[0], s->conf.macaddr.a[1], s->conf.macaddr.a[2], - s->conf.macaddr.a[3], s->conf.macaddr.a[4], s->conf.macaddr.a[5]); - - return (USBDevice *) s; + dev = usb_create(NULL /* FIXME */, "usb-net"); + qdev_set_nic_properties(&dev->qdev, &nd_table[idx]); + qdev_init(&dev->qdev); + return dev; } static struct USBDeviceInfo net_info = { @@ -1496,6 +1506,12 @@ static struct USBDeviceInfo net_info = { .handle_control = usb_net_handle_control, .handle_data = usb_net_handle_data, .handle_destroy = usb_net_handle_destroy, + .usbdevice_name = "net", + .usbdevice_init = usb_net_init, + .qdev.props = (Property[]) { + DEFINE_NIC_PROPERTIES(USBNetState, conf), + DEFINE_PROP_END_OF_LIST(), + } }; static void usb_net_register_devices(void) @@ -258,9 +258,6 @@ void usb_host_info(Monitor *mon); /* usb-hid.c */ void usb_hid_datain_cb(USBDevice *dev, void *opaque, void (*datain)(void *)); -/* usb-net.c */ -USBDevice *usb_net_init(NICInfo *nd); - /* usb-bt.c */ USBDevice *usb_bt_init(HCIInfo *hci); @@ -2654,24 +2654,6 @@ static int usb_device_add(const char *devname, int is_hotplug) /* the other ones */ if (strstart(devname, "host:", &p)) { dev = usb_host_device_open(p); - } else if (strstart(devname, "net:", &p)) { - QemuOpts *opts; - int idx; - - opts = qemu_opts_parse(&qemu_net_opts, p, NULL); - if (!opts) { - return -1; - } - - qemu_opt_set(opts, "type", "nic"); - qemu_opt_set(opts, "model", "usb"); - - idx = net_client_init(NULL, opts, 0); - if (idx == -1) { - return -1; - } - - dev = usb_net_init(&nd_table[idx]); } else if (!strcmp(devname, "bt") || strstart(devname, "bt:", &p)) { dev = usb_bt_init(devname[2] ? hci_init(p) : bt_new_hci(qemu_find_bt_vlan(0))); |