diff --git a/net.c b/net.c index f88d38d52472108b482c6aaf605d98a92ae105e6..413dac4ce92bf3a45f09c842ff75cfe1d1954b53 100644 --- a/net.c +++ b/net.c @@ -1124,7 +1124,6 @@ void net_cleanup(void) void net_check_clients(void) { - VLANState *vlan; VLANClientState *vc; int i; @@ -1140,30 +1139,8 @@ void net_check_clients(void) return; } - QTAILQ_FOREACH(vlan, &vlans, next) { - int has_nic = 0, has_host_dev = 0; + net_hub_check_clients(); - QTAILQ_FOREACH(vc, &vlan->clients, next) { - switch (vc->info->type) { - case NET_CLIENT_OPTIONS_KIND_NIC: - has_nic = 1; - break; - case NET_CLIENT_OPTIONS_KIND_USER: - case NET_CLIENT_OPTIONS_KIND_TAP: - case NET_CLIENT_OPTIONS_KIND_SOCKET: - case NET_CLIENT_OPTIONS_KIND_VDE: - has_host_dev = 1; - break; - default: ; - } - } - if (has_host_dev && !has_nic) - fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id); - if (has_nic && !has_host_dev) - fprintf(stderr, - "Warning: vlan %d is not connected to host network\n", - vlan->id); - } QTAILQ_FOREACH(vc, &non_vlan_clients, next) { if (!vc->peer) { fprintf(stderr, "Warning: %s %s has no peer\n", diff --git a/net/hub.c b/net/hub.c index 9806a592f077e2a4242dd647cb2baf6e14ce1da2..5cdd8c9152eba3c2516dd558d11f593622eabc1d 100644 --- a/net/hub.c +++ b/net/hub.c @@ -244,3 +244,48 @@ int net_init_hubport(const NetClientOptions *opts, const char *name, net_hub_add_port(hubport->hubid, name); return 0; } + +/** + * Warn if hub configurations are likely wrong + */ +void net_hub_check_clients(void) +{ + NetHub *hub; + NetHubPort *port; + VLANClientState *peer; + + QLIST_FOREACH(hub, &hubs, next) { + int has_nic = 0, has_host_dev = 0; + + QLIST_FOREACH(port, &hub->ports, next) { + peer = port->nc.peer; + if (!peer) { + fprintf(stderr, "Warning: hub port %s has no peer\n", + port->nc.name); + continue; + } + + switch (peer->info->type) { + case NET_CLIENT_OPTIONS_KIND_NIC: + has_nic = 1; + break; + case NET_CLIENT_OPTIONS_KIND_USER: + case NET_CLIENT_OPTIONS_KIND_TAP: + case NET_CLIENT_OPTIONS_KIND_SOCKET: + case NET_CLIENT_OPTIONS_KIND_VDE: + has_host_dev = 1; + break; + default: + break; + } + } + if (has_host_dev && !has_nic) { + fprintf(stderr, "Warning: vlan %d with no nics\n", hub->id); + } + if (has_nic && !has_host_dev) { + fprintf(stderr, + "Warning: vlan %d is not connected to host network\n", + hub->id); + } + } +} diff --git a/net/hub.h b/net/hub.h index 677085069b17a91a61b8edad98955e237ac8d1e0..9973da3bb9dad4993e0173e34b8fe3f4a81af98f 100644 --- a/net/hub.h +++ b/net/hub.h @@ -23,5 +23,6 @@ VLANClientState *net_hub_add_port(int hub_id, const char *name); VLANClientState *net_hub_find_client_by_name(int hub_id, const char *name); void net_hub_info(Monitor *mon); int net_hub_id_for_client(VLANClientState *nc, int *id); +void net_hub_check_clients(void); #endif /* NET_HUB_H */