From 517ab5d56fc6941796fbb00df3a4060225acea0b Mon Sep 17 00:00:00 2001 From: David Rose Date: Thu, 14 Mar 2013 18:59:53 +0000 Subject: [PATCH] properly filter disconnected interfaces on win32 --- panda/src/net/connectionManager.cxx | 72 +++++++++++++++-------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/panda/src/net/connectionManager.cxx b/panda/src/net/connectionManager.cxx index f816077614..5dfd3c4a3a 100644 --- a/panda/src/net/connectionManager.cxx +++ b/panda/src/net/connectionManager.cxx @@ -534,44 +534,46 @@ scan_interfaces() { if (result == ERROR_SUCCESS) { IP_ADAPTER_ADDRESSES *p = addresses; while (p != NULL) { - // p->AdapterName appears to be a GUID. Not sure if this is - // actually useful to anyone; we'll store the "friendly name" - // instead. - TextEncoder encoder; - encoder.set_wtext(wstring(p->FriendlyName)); - string friendly_name = encoder.get_text(); + if (p->OperStatus == IfOperStatusUp) { + // p->AdapterName appears to be a GUID. Not sure if this is + // actually useful to anyone; we'll store the "friendly name" + // instead. + TextEncoder encoder; + encoder.set_wtext(wstring(p->FriendlyName)); + string friendly_name = encoder.get_text(); - Interface interface; - interface.set_name(friendly_name); + Interface interface; + interface.set_name(friendly_name); - // Prefixes are a linked list, in the order Network IP, - // Adapter IP, Broadcast IP (plus more). - NetAddress addresses[3]; - IP_ADAPTER_PREFIX *m = p->FirstPrefix; - int mc = 0; - while (m != NULL && mc < 3) { - addresses[mc] = NetAddress(Socket_Address(*(sockaddr_in *)m->Address.lpSockaddr)); - m = m->Next; - ++mc; + // Prefixes are a linked list, in the order Network IP, + // Adapter IP, Broadcast IP (plus more). + NetAddress addresses[3]; + IP_ADAPTER_PREFIX *m = p->FirstPrefix; + int mc = 0; + while (m != NULL && mc < 3) { + addresses[mc] = NetAddress(Socket_Address(*(sockaddr_in *)m->Address.lpSockaddr)); + m = m->Next; + ++mc; + } + + if (mc > 1) { + interface.set_ip(addresses[1]); + } + + if (mc > 2) { + interface.set_broadcast(addresses[2]); + + // Now, we can infer the netmask by the difference between the + // network address (the first address) and the broadcast + // address (the last address). + PN_uint32 netmask = addresses[0].get_ip() - addresses[2].get_ip() - 1; + Socket_Address sa; + sa.set_host(netmask, 0); + interface.set_netmask(NetAddress(sa)); + } + + _interfaces.push_back(interface); } - - if (mc > 1) { - interface.set_ip(addresses[1]); - } - - if (mc > 2) { - interface.set_broadcast(addresses[2]); - - // Now, we can infer the netmask by the difference between the - // network address (the first address) and the broadcast - // address (the last address). - PN_uint32 netmask = addresses[0].get_ip() - addresses[2].get_ip() - 1; - Socket_Address sa; - sa.set_host(netmask, 0); - interface.set_netmask(NetAddress(sa)); - } - - _interfaces.push_back(interface); p = p->Next; } }