net: Improve the warnings for dubious command line option combinations

Improve the warnings we give if the user specified a combination of -net
options which don't make much sense:
 * Don't warn about anything if the config is the implicit default
   "-net user -net nic" rather than one specified by the user (this will
   only kick in for boards with no NIC or if CONFIG_SLIRP is not set)
 * Diagnose the case where the user asked for NICs which the board
   didn't instantiate (for example where the user asked for two NICs
   but the board only supports one)

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
Peter Maydell 2011-03-22 18:39:40 +00:00 committed by Aurelien Jarno
parent e6b3c8ca02
commit f68b9d672b
1 changed files with 31 additions and 0 deletions

31
net.c
View File

@ -1305,6 +1305,22 @@ void net_check_clients(void)
{
VLANState *vlan;
VLANClientState *vc;
int seen_nics = 0;
/* Don't warn about the default network setup that you get if
* no command line -net options are specified. There are two
* cases that we would otherwise complain about:
* (1) board doesn't support a NIC but the implicit "-net nic"
* requested one; we'd otherwise complain about more NICs being
* specified than we support, and also that the vlan set up by
* the implicit "-net user" didn't have any NICs connected to it
* (2) CONFIG_SLIRP not set: we'd otherwise complain about the
* implicit "-net nic" setting up a nic that wasn't connected to
* anything.
*/
if (default_net) {
return;
}
QTAILQ_FOREACH(vlan, &vlans, next) {
int has_nic = 0, has_host_dev = 0;
@ -1312,6 +1328,7 @@ void net_check_clients(void)
QTAILQ_FOREACH(vc, &vlan->clients, next) {
switch (vc->info->type) {
case NET_CLIENT_TYPE_NIC:
seen_nics++;
has_nic = 1;
break;
case NET_CLIENT_TYPE_SLIRP:
@ -1331,12 +1348,26 @@ void net_check_clients(void)
vlan->id);
}
QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
if (vc->info->type == NET_CLIENT_TYPE_NIC) {
seen_nics++;
}
if (!vc->peer) {
fprintf(stderr, "Warning: %s %s has no peer\n",
vc->info->type == NET_CLIENT_TYPE_NIC ? "nic" : "netdev",
vc->name);
}
}
if (seen_nics != nb_nics) {
/* Number of NICs requested by user on command line doesn't match
* the number the model actually registered with us.
* This will generally only happen for models of embedded boards
* with no PCI bus or similar. PCI based machines can instantiate
* all requested NICs as PCI devices but usually embedded boards
* only have a single NIC.
*/
fprintf(stderr, "Warning: more nics requested than this machine "
"supports; some have been ignored\n");
}
}
static int net_init_client(QemuOpts *opts, void *dummy)