From patchwork Tue Nov 17 10:26:17 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 38622 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id B0DC3B7067 for ; Tue, 17 Nov 2009 22:08:29 +1100 (EST) Received: from localhost ([127.0.0.1]:42629 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NALv9-0007W3-1l for incoming@patchwork.ozlabs.org; Tue, 17 Nov 2009 06:08:27 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NALGU-0002pa-Uv for qemu-devel@nongnu.org; Tue, 17 Nov 2009 05:26:27 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NALGQ-0002oG-Qp for qemu-devel@nongnu.org; Tue, 17 Nov 2009 05:26:26 -0500 Received: from [199.232.76.173] (port=55201 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NALGQ-0002oB-Jr for qemu-devel@nongnu.org; Tue, 17 Nov 2009 05:26:22 -0500 Received: from mx1.redhat.com ([209.132.183.28]:46747) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NALGP-0008CH-Q4 for qemu-devel@nongnu.org; Tue, 17 Nov 2009 05:26:22 -0500 Received: from int-mx03.intmail.prod.int.phx2.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id nAHAQKuV027314 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 17 Nov 2009 05:26:21 -0500 Received: from zweiblum.home.kraxel.org (vpn1-7-195.ams2.redhat.com [10.36.7.195]) by int-mx03.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id nAHAQIWD025191; Tue, 17 Nov 2009 05:26:19 -0500 Received: by zweiblum.home.kraxel.org (Postfix, from userid 500) id 2C9BF7003F; Tue, 17 Nov 2009 11:26:17 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Tue, 17 Nov 2009 11:26:17 +0100 Message-Id: <1258453577-4388-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.16 X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Cc: Gerd Hoffmann Subject: [Qemu-devel] [PATCH] usb-net: use qdev for -usbdevice X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Gerd Hoffmann --- hw/usb-net.c | 78 +++++++++++++++++++++++++++++++++++---------------------- hw/usb.h | 3 -- vl.c | 18 ------------- 3 files changed, 48 insertions(+), 51 deletions(-) diff --git a/hw/usb-net.c b/hw/usb-net.c index 9c6549c..b2d01b6 100644 --- a/hw/usb-net.c +++ b/hw/usb-net.c @@ -610,7 +610,6 @@ typedef struct USBNetState { uint32_t media_state; uint16_t filter; uint32_t vendorid; - uint8_t mac[6]; unsigned int out_ptr; uint8_t out_buf[2048]; @@ -621,6 +620,7 @@ typedef struct USBNetState { char usbstring_mac[13]; VLANClientState *vc; + NICConf conf; QTAILQ_HEAD(rndis_resp_head, rndis_response) rndis_resp; } USBNetState; @@ -741,12 +741,12 @@ static int ndis_query(USBNetState *s, uint32_t oid, /* ieee802.3 OIDs (table 4-3) */ /* mandatory */ case OID_802_3_PERMANENT_ADDRESS: - memcpy(outbuf, s->mac, 6); + memcpy(outbuf, s->conf.macaddr.a, 6); return 6; /* mandatory */ case OID_802_3_CURRENT_ADDRESS: - memcpy(outbuf, s->mac, 6); + memcpy(outbuf, s->conf.macaddr.a, 6); return 6; /* mandatory */ @@ -1420,15 +1420,14 @@ static void usbnet_cleanup(VLANClientState *vc) { USBNetState *s = vc->opaque; - rndis_clear_responsequeue(s); - qemu_free(s); + s->vc = NULL; } 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->vc); } @@ -1447,42 +1446,55 @@ 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->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_NIC, + s->conf.vlan, s->conf.peer, + dev->qdev.info->name, dev->qdev.id, + usbnet_can_receive, + usbnet_receive, + NULL, NULL, + usbnet_cleanup, s); + qemu_format_nic_info_str(s->vc, 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; } -USBDevice *usb_net_init(NICInfo *nd) +static USBDevice *usb_net_init(const char *cmdline) { USBDevice *dev; - USBNetState *s; - - dev = usb_create_simple(NULL /* FIXME */, "QEMU USB Network Interface"); - s = DO_UPCAST(USBNetState, dev, dev); + QemuOpts *opts; + int idx; - memcpy(s->mac, nd->macaddr, 6); - - s->vc = nd->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_NIC, - nd->vlan, nd->netdev, - nd->model, nd->name, - usbnet_can_receive, - usbnet_receive, - NULL, NULL, - usbnet_cleanup, 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->vc, s->mac); + 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->mac[1], s->mac[2], - s->mac[3], s->mac[4], s->mac[5]); - fprintf(stderr, "usbnet: initialized mac %02x:%02x:%02x:%02x:%02x:%02x\n", - s->mac[0], s->mac[1], s->mac[2], - s->mac[3], s->mac[4], s->mac[5]); - - return (USBDevice *) s; + dev = usb_create(NULL /* FIXME */, "QEMU USB Network Interface"); + qdev_set_nic_properties(&dev->qdev, &nd_table[idx]); + qdev_init(&dev->qdev); + return dev; } static struct USBDeviceInfo net_info = { .qdev.name = "QEMU USB Network Interface", + .qdev.alias = "usb-net", .qdev.size = sizeof(USBNetState), .init = usb_net_initfn, .handle_packet = usb_generic_handle_packet, @@ -1490,6 +1502,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) diff --git a/hw/usb.h b/hw/usb.h index 351c466..3dc79d6 100644 --- a/hw/usb.h +++ b/hw/usb.h @@ -256,9 +256,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); diff --git a/vl.c b/vl.c index fff8e8d..6c7cf72 100644 --- a/vl.c +++ b/vl.c @@ -2543,24 +2543,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)));