summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-11-30 13:10:22 -0800
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-11-30 13:10:22 -0800
commit67685213309a3e4aaa76a2f3173af5dd0ffa3eec (patch)
tree7b5745bfebac22cf83ef834b73d751b3467a07de /service
parent6c0de526e864716a6c11d05108d4034257a19d5c (diff)
downloadinfinitytier-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.cpp48
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