diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-11-30 13:10:22 -0800 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-11-30 13:10:22 -0800 |
commit | 67685213309a3e4aaa76a2f3173af5dd0ffa3eec (patch) | |
tree | 7b5745bfebac22cf83ef834b73d751b3467a07de /service | |
parent | 6c0de526e864716a6c11d05108d4034257a19d5c (diff) | |
download | infinitytier-67685213309a3e4aaa76a2f3173af5dd0ffa3eec.tar.gz infinitytier-67685213309a3e4aaa76a2f3173af5dd0ffa3eec.zip |
Ton of uPnP work and adding NAT-PMP support, still testing...
Diffstat (limited to 'service')
-rw-r--r-- | service/OneService.cpp | 48 |
1 files changed, 25 insertions, 23 deletions
diff --git a/service/OneService.cpp b/service/OneService.cpp index 8e21fc5f..269599c7 100644 --- a/service/OneService.cpp +++ b/service/OneService.cpp @@ -54,7 +54,7 @@ #include "../osdep/OSUtils.hpp" #include "../osdep/Http.hpp" #include "../osdep/BackgroundResolver.hpp" -#include "../osdep/UPNPClient.hpp" +#include "../osdep/PortMapper.hpp" #include "OneService.hpp" #include "ControlPlane.hpp" @@ -452,7 +452,7 @@ public: ,_port(0) #ifdef ZT_USE_MINIUPNPC ,_v4UpnpUdpSocket((PhySocket *)0) - ,_upnpClient((UPNPClient *)0) + ,_portMapper((PortMapper *)0) #endif #ifdef ZT_ENABLE_CLUSTER ,_clusterMessageSocket((PhySocket *)0) @@ -508,22 +508,6 @@ public: char portstr[64]; Utils::snprintf(portstr,sizeof(portstr),"%u",_port); OSUtils::writeFile((_homePath + ZT_PATH_SEPARATOR_S + "zerotier-one.port").c_str(),std::string(portstr)); - -#ifdef ZT_USE_MINIUPNPC - // Bind a secondary port for use with uPnP, since some NAT routers - // (cough Ubiquity Edge cough) barf up a lung if you do both conventional - // NAT-t and uPnP from behind the same port. I think this is a bug, but - // everyone else's router bugs are our problem. :P - for(int k=0;k<512;++k) { - const unsigned int upnport = 40000 + (((port + 1) * (k + 1)) % 25500); - _v4UpnpLocalAddress = InetAddress(0,upnport); - _v4UpnpUdpSocket = _phy.udpBind((const struct sockaddr *)&_v4UpnpLocalAddress,reinterpret_cast<void *>(&_v4UpnpLocalAddress),ZT_UDP_DESIRED_BUF_SIZE); - if (_v4UpnpUdpSocket) { - _upnpClient = new UPNPClient(upnport); - break; - } - } -#endif } virtual ~OneServiceImpl() @@ -537,7 +521,7 @@ public: #endif #ifdef ZT_USE_MINIUPNPC _phy.close(_v4UpnpUdpSocket); - delete _upnpClient; + delete _portMapper; #endif #ifdef ZT_ENABLE_NETWORK_CONTROLLER delete _controller; @@ -580,6 +564,24 @@ public: SnodeVirtualNetworkConfigFunction, SnodeEventCallback); +#ifdef ZT_USE_MINIUPNPC + // Bind a secondary port for use with uPnP, since some NAT routers + // (cough Ubiquity Edge cough) barf up a lung if you do both conventional + // NAT-t and uPnP from behind the same port. I think this is a bug, but + // everyone else's router bugs are our problem. :P + for(int k=0;k<512;++k) { + unsigned int mapperPort = 40000 + (((_port + 1) * (k + 1)) % 25500); + char uniqueName[64]; + _v4UpnpLocalAddress = InetAddress(0,mapperPort); + _v4UpnpUdpSocket = _phy.udpBind((const struct sockaddr *)&_v4UpnpLocalAddress,reinterpret_cast<void *>(&_v4UpnpLocalAddress),ZT_UDP_DESIRED_BUF_SIZE); + if (_v4UpnpUdpSocket) { + Utils::snprintf(uniqueName,sizeof(uniqueName),"ZeroTier/%.16llx",_node->address()); + _portMapper = new PortMapper(mapperPort,uniqueName); + break; + } + } +#endif + #ifdef ZT_ENABLE_NETWORK_CONTROLLER _controller = new SqliteNetworkController(_node,(_homePath + ZT_PATH_SEPARATOR_S + ZT_CONTROLLER_DB_PATH).c_str(),(_homePath + ZT_PATH_SEPARATOR_S + "circuitTestResults.d").c_str()); _node->setNetconfMaster((void *)_controller); @@ -674,7 +676,7 @@ public: _lastRestart = clockShouldBe; uint64_t lastTapMulticastGroupCheck = 0; uint64_t lastTcpFallbackResolve = 0; - uint64_t lastLocalInterfaceAddressCheck = (OSUtils::now() - ZT_LOCAL_INTERFACE_CHECK_INTERVAL) + 15000; // do this in 15s to give UPnP time to configure and other things time to settle + uint64_t lastLocalInterfaceAddressCheck = (OSUtils::now() - ZT_LOCAL_INTERFACE_CHECK_INTERVAL) + 15000; // do this in 15s to give portmapper time to configure and other things time to settle #ifdef ZT_AUTO_UPDATE uint64_t lastSoftwareUpdateCheck = 0; #endif // ZT_AUTO_UPDATE @@ -742,8 +744,8 @@ public: _node->clearLocalInterfaceAddresses(); #ifdef ZT_USE_MINIUPNPC - std::vector<InetAddress> upnpAddresses(_upnpClient->get()); - for(std::vector<InetAddress>::const_iterator ext(upnpAddresses.begin());ext!=upnpAddresses.end();++ext) + 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 @@ -1472,7 +1474,7 @@ public: #ifdef ZT_USE_MINIUPNPC InetAddress _v4UpnpLocalAddress; PhySocket *_v4UpnpUdpSocket; - UPNPClient *_upnpClient; + PortMapper *_portMapper; #endif #ifdef ZT_ENABLE_CLUSTER |