summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2016-04-05 15:53:19 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2016-04-05 15:53:19 -0700
commit504738b1839ca7f38ea4421dbe142a6192f6c2d4 (patch)
tree69f1e162fae8dda5b3c0bcc98adc1b7624880b43
parent32cd2a02c90fdc90470d0fe30cca1e9a3facd855 (diff)
downloadinfinitytier-504738b1839ca7f38ea4421dbe142a6192f6c2d4.tar.gz
infinitytier-504738b1839ca7f38ea4421dbe142a6192f6c2d4.zip
Binder for Windows, and use Binder to get local interface addresses to advertise.
-rw-r--r--osdep/Binder.hpp43
-rw-r--r--service/OneService.cpp79
2 files changed, 50 insertions, 72 deletions
diff --git a/osdep/Binder.hpp b/osdep/Binder.hpp
index 3f2749d7..b68e6dac 100644
--- a/osdep/Binder.hpp
+++ b/osdep/Binder.hpp
@@ -136,11 +136,37 @@ public:
#ifdef __WINDOWS__
+ char aabuf[32768];
+ 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) {
+ PIP_ADAPTER_UNICAST_ADDRESS ua = a->FirstUnicastAddress;
+ while (ua) {
+ InetAddress ip(ua->Address.lpSockaddr);
+ if (ifChecker.shouldBindInterface("",ip)) {
+ switch(ip.ipScope()) {
+ default: break;
+ case InetAddress::IP_SCOPE_PSEUDOPRIVATE:
+ case InetAddress::IP_SCOPE_GLOBAL:
+ //case InetAddress::IP_SCOPE_LINK_LOCAL:
+ case InetAddress::IP_SCOPE_SHARED:
+ case InetAddress::IP_SCOPE_PRIVATE:
+ ip.setPort(port);
+ localIfAddrs.push_back(ip);
+ break;
+ }
+ }
+ ua = ua->Next;
+ }
+ a = a->Next;
+ }
+ }
+
#else // not __WINDOWS__
struct ifaddrs *ifatbl = (struct ifaddrs *)0;
struct ifaddrs *ifa;
-
if ((getifaddrs(&ifatbl) == 0)&&(ifatbl)) {
ifa = ifatbl;
while (ifa) {
@@ -162,10 +188,9 @@ public:
}
ifa = ifa->ifa_next;
}
+ freeifaddrs(ifatbl);
}
- freeifaddrs(ifatbl);
-
#endif
// Default to binding to wildcard if we can't enumerate addresses
@@ -274,6 +299,18 @@ public:
}
}
+ /**
+ * @return All currently bound local interface addresses
+ */
+ inline std::vector<InetAddress> allBoundLocalInterfaceAddresses()
+ {
+ Mutex::Lock _l(_lock);
+ std::vector<InetAddress> aa;
+ for(std::vector<_Binding>::const_iterator i(_bindings.begin());i!=_bindings.end();++i)
+ aa.push_back(i->address);
+ return aa;
+ }
+
private:
std::vector<_Binding> _bindings;
Mutex _lock;
diff --git a/service/OneService.cpp b/service/OneService.cpp
index 4acf007b..3a1a1628 100644
--- a/service/OneService.cpp
+++ b/service/OneService.cpp
@@ -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;