|
|
|
|
@ -877,78 +877,19 @@ public:
|
|
|
|
|
if ((now - lastLocalInterfaceAddressCheck) >= ZT_LOCAL_INTERFACE_CHECK_INTERVAL) { |
|
|
|
|
lastLocalInterfaceAddressCheck = now; |
|
|
|
|
|
|
|
|
|
_node->clearLocalInterfaceAddresses(); |
|
|
|
|
#ifdef ZT_USE_MINIUPNPC |
|
|
|
|
if (_portMapper) { |
|
|
|
|
std::vector<InetAddress> mappedAddresses(_portMapper->get()); |
|
|
|
|
for(std::vector<InetAddress>::const_iterator ext(mappedAddresses.begin());ext!=mappedAddresses.end();++ext) |
|
|
|
|
_node->addLocalInterfaceAddress(reinterpret_cast<const struct sockaddr_storage *>(&(*ext))); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
_node->clearLocalInterfaceAddresses(); |
|
|
|
|
|
|
|
|
|
#ifdef __UNIX_LIKE__ |
|
|
|
|
std::vector<std::string> ztDevices; |
|
|
|
|
{ |
|
|
|
|
Mutex::Lock _l(_taps_m); |
|
|
|
|
for(std::map< uint64_t,EthernetTap *>::const_iterator t(_taps.begin());t!=_taps.end();++t) |
|
|
|
|
ztDevices.push_back(t->second->deviceName()); |
|
|
|
|
} |
|
|
|
|
struct ifaddrs *ifatbl = (struct ifaddrs *)0; |
|
|
|
|
if ((getifaddrs(&ifatbl) == 0)&&(ifatbl)) { |
|
|
|
|
struct ifaddrs *ifa = ifatbl; |
|
|
|
|
while (ifa) { |
|
|
|
|
if ((ifa->ifa_name)&&(ifa->ifa_addr)&&(!isBlacklistedLocalInterfaceForZeroTierTraffic(ifa->ifa_name))) { |
|
|
|
|
bool isZT = false; |
|
|
|
|
for(std::vector<std::string>::const_iterator d(ztDevices.begin());d!=ztDevices.end();++d) { |
|
|
|
|
if (*d == ifa->ifa_name) { |
|
|
|
|
isZT = true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (!isZT) { |
|
|
|
|
InetAddress ip(ifa->ifa_addr); |
|
|
|
|
ip.setPort(_ports[0]); |
|
|
|
|
_node->addLocalInterfaceAddress(reinterpret_cast<const struct sockaddr_storage *>(&ip)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
ifa = ifa->ifa_next; |
|
|
|
|
} |
|
|
|
|
freeifaddrs(ifatbl); |
|
|
|
|
#ifdef ZT_USE_MINIUPNPC |
|
|
|
|
if (_portMapper) { |
|
|
|
|
std::vector<InetAddress> mappedAddresses(_portMapper->get()); |
|
|
|
|
for(std::vector<InetAddress>::const_iterator ext(mappedAddresses.begin());ext!=mappedAddresses.end();++ext) |
|
|
|
|
_node->addLocalInterfaceAddress(reinterpret_cast<const struct sockaddr_storage *>(&(*ext))); |
|
|
|
|
} |
|
|
|
|
#endif // __UNIX_LIKE__
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef __WINDOWS__ |
|
|
|
|
std::vector<NET_LUID> ztDevices; |
|
|
|
|
{ |
|
|
|
|
Mutex::Lock _l(_taps_m); |
|
|
|
|
for(std::map< uint64_t,EthernetTap *>::const_iterator t(_taps.begin());t!=_taps.end();++t) |
|
|
|
|
ztDevices.push_back(t->second->luid()); |
|
|
|
|
} |
|
|
|
|
char aabuf[16384]; |
|
|
|
|
ULONG aalen = sizeof(aabuf); |
|
|
|
|
if (GetAdaptersAddresses(AF_UNSPEC,GAA_FLAG_SKIP_ANYCAST|GAA_FLAG_SKIP_MULTICAST|GAA_FLAG_SKIP_DNS_SERVER,(void *)0,reinterpret_cast<PIP_ADAPTER_ADDRESSES>(aabuf),&aalen) == NO_ERROR) { |
|
|
|
|
PIP_ADAPTER_ADDRESSES a = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(aabuf); |
|
|
|
|
while (a) { |
|
|
|
|
bool isZT = false; |
|
|
|
|
for(std::vector<NET_LUID>::const_iterator d(ztDevices.begin());d!=ztDevices.end();++d) { |
|
|
|
|
if (a->Luid.Value == d->Value) { |
|
|
|
|
isZT = true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (!isZT) { |
|
|
|
|
PIP_ADAPTER_UNICAST_ADDRESS ua = a->FirstUnicastAddress; |
|
|
|
|
while (ua) { |
|
|
|
|
InetAddress ip(ua->Address.lpSockaddr); |
|
|
|
|
ip.setPort(_port); |
|
|
|
|
_node->addLocalInterfaceAddress(reinterpret_cast<const struct sockaddr_storage *>(&ip)); |
|
|
|
|
ua = ua->Next; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
a = a->Next; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif // __WINDOWS__
|
|
|
|
|
std::vector<InetAddress> boundAddrs(_bindings[0].allBoundLocalInterfaceAddresses()); |
|
|
|
|
for(std::vector<InetAddress>::const_iterator i(boundAddrs.begin());i!=boundAddrs.end();++i) |
|
|
|
|
_node->addLocalInterfaceAddress(reinterpret_cast<const struct sockaddr_storage *>(&(*i))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const unsigned long delay = (dl > now) ? (unsigned long)(dl - now) : 100; |
|
|
|
|
|