From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KJawr-0004ea-29 for qemu-devel@nongnu.org; Thu, 17 Jul 2008 17:23:37 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KJawn-0004du-J4 for qemu-devel@nongnu.org; Thu, 17 Jul 2008 17:23:36 -0400 Received: from [199.232.76.173] (port=34842 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KJawn-0004dp-DN for qemu-devel@nongnu.org; Thu, 17 Jul 2008 17:23:33 -0400 Received: from an-out-0708.google.com ([209.85.132.250]:11966) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KJawn-0006ZB-08 for qemu-devel@nongnu.org; Thu, 17 Jul 2008 17:23:33 -0400 Received: by an-out-0708.google.com with SMTP id d18so267417and.130 for ; Thu, 17 Jul 2008 14:23:27 -0700 (PDT) Message-ID: Date: Thu, 17 Jul 2008 23:23:27 +0200 From: "andrzej zaborowski" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-Disposition: inline Subject: [Qemu-devel] Allow VLANs with no nics Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel mailing list Hi, I added the usb-net patch, and it's the only NIC that is hot-pluggable. The current command line switch to enable it has suboptimal syntax requiring you to know the index of the nic in nb_table[]. Instead -usbdevice net:... could automatically add the nic in nb_table[] when needed (see below). This requires allowing empty vlans on start, so the patch makes the "vlan (N) with no nics" message non-fatal. Do you have suggestions? Cheers diff --git a/qemu-doc.texi b/qemu-doc.texi index 78ba587..62eda1c 100644 --- a/qemu-doc.texi +++ b/qemu-doc.texi @@ -567,7 +567,7 @@ available devices. Braille device. This will use BrlAPI to display the braille output on a real or fake device. -@item net:nic_num +@item net:options Network adapter that supports CDC ethernet and RNDIS protocols. @end table @@ -587,7 +587,7 @@ Qemu can emulate several different models of network card. Valid values for @var{type} are @code{i82551}, @code{i82557b}, @code{i82559er}, @code{ne2k_pci}, @code{ne2k_isa}, @code{pcnet}, @code{rtl8139}, -@code{e1000}, @code{smc91c111}, @code{lance}, @code{mcf_fec} and @code{usb}. +@code{e1000}, @code{smc91c111}, @code{lance} and @code{mcf_fec}. Not all devices are supported on all targets. Use -net nic,model=? for a list of available devices for your target. @@ -1710,14 +1710,12 @@ serial converter, faking a Matrix Orbital LCD Display (USB ID 0403:FA00). @item braille Braille device. This will use BrlAPI to display the braille output on a real or fake device. -@item net:@var{nic_num} -Network adapter that supports CDC ethernet and RNDIS protocols. This must be -used together with the @code{-net nic,model=usb,...} option (see description), -where @var{nic_num} specifies the index of the @code{-net nic,...} option -describing the interface (zero-based). -For instance, user-mode networking can be used by specifying -@example -qemu -net user,vlan=1 -net nic,model=usb,vlan=1 -usbdevice net:0 [...OPTIONS...] +@item net:@var{options} +Network adapter that supports CDC ethernet and RNDIS protocols. @var{options} +specifies NIC options as with @code{-net nic,}@var{options} (see description). +For instance, user-mode networking can be used with +@example +qemu [...OPTIONS...] -net user,vlan=0 -usbdevice net:vlan=0 @end example Currently this cannot be used in machines that support PCI NICs. @end table diff --git a/vl.c b/vl.c index 613fa84..3005fe8 100644 --- a/vl.c +++ b/vl.c @@ -4917,26 +4917,12 @@ static int check_params(char *buf, int buf_size, return 0; } - -static int net_client_init(const char *str) +static int net_client_init(const char *device, const char *p) { - const char *p; - char *q; - char device[64]; char buf[1024]; int vlan_id, ret; VLANState *vlan; - p = str; - q = device; - while (*p != '\0' && *p != ',') { - if ((q - device) < sizeof(device) - 1) - *q++ = *p; - p++; - } - *q = '\0'; - if (*p == ',') - p++; vlan_id = 0; if (get_param_value(buf, sizeof(buf), "vlan", p)) { vlan_id = strtol(buf, NULL, 0); @@ -5057,6 +5043,26 @@ static int net_client_init(const char *str) return ret; } +static int net_client_parse(const char *str) +{ + const char *p; + char *q; + char device[64]; + + p = str; + q = device; + while (*p != '\0' && *p != ',') { + if ((q - device) < sizeof(device) - 1) + *q++ = *p; + p++; + } + *q = '\0'; + if (*p == ',') + p++; + + return net_client_init(device, p); +} + void do_info_network(void) { VLANState *vlan; @@ -5480,6 +5486,13 @@ static int usb_device_add(const char *devname) dev = usb_keyboard_init(); } else if (strstart(devname, "disk:", &p)) { dev = usb_msd_init(p); + } else if (strstart(devname, "net:", &p)) { + int nic = nb_nics; + + if (net_client_init("nic", p) < 0) + return -1; + nd_table[nic].model = "usb"; + dev = usb_net_init(&nd_table[nic]); } else if (!strcmp(devname, "wacom-tablet")) { dev = usb_wacom_init(); } else if (strstart(devname, "serial:", &p)) { @@ -5488,12 +5501,6 @@ static int usb_device_add(const char *devname) } else if (!strcmp(devname, "braille")) { dev = usb_baum_init(); #endif - } else if (strstart(devname, "net:", &p)) { - int nicidx = strtoul(p, NULL, 0); - - if (nicidx >= nb_nics || strcmp(nd_table[nicidx].model, "usb")) - return -1; - dev = usb_net_init(&nd_table[nicidx]); } else { return -1; } @@ -8639,16 +8646,14 @@ int main(int argc, char **argv) } for(i = 0;i < nb_net_clients; i++) { - if (net_client_init(net_clients[i]) < 0) + if (net_client_parse(net_clients[i]) < 0) exit(1); } for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) { if (vlan->nb_guest_devs == 0 && vlan->nb_host_devs == 0) continue; - if (vlan->nb_guest_devs == 0) { - fprintf(stderr, "Invalid vlan (%d) with no nics\n", vlan->id); - exit(1); - } + if (vlan->nb_guest_devs == 0) + fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id); if (vlan->nb_host_devs == 0) fprintf(stderr, "Warning: vlan %d is not connected to host network\n",