Ton of uPnP work and adding NAT-PMP support, still testing...
This commit is contained in:
parent
6c0de526e8
commit
6768521330
36 changed files with 3703 additions and 245 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue