mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-04-14 22:36:33 +00:00
Bugfix for incorrect port binding of secondary and tertiary ports
This commit is contained in:
parent
088dab4f04
commit
e1e27eb19d
@ -678,44 +678,50 @@ public:
|
||||
// than one device behind the same NAT tries to use the same internal
|
||||
// private address port number. Buggy NATs are a running theme.
|
||||
if (_allowSecondaryPort) {
|
||||
_ports[1] = (_secondaryPort == 0) ? 20000 + ((unsigned int)_node->address() % 45500) : _secondaryPort;
|
||||
for(int i=0;;++i) {
|
||||
if (i > 1000) {
|
||||
_ports[1] = 0;
|
||||
break;
|
||||
} else if (++_ports[1] >= 65536) {
|
||||
_ports[1] = 20000;
|
||||
if (_secondaryPort) {
|
||||
_ports[1] = _secondaryPort;
|
||||
} else {
|
||||
_ports[1] = 20000 + ((unsigned int)_node->address() % 45500);
|
||||
for(int i=0;;++i) {
|
||||
if (i > 1000) {
|
||||
_ports[1] = 0;
|
||||
break;
|
||||
} else if (++_ports[1] >= 65536) {
|
||||
_ports[1] = 20000;
|
||||
}
|
||||
if (_trialBind(_ports[1]))
|
||||
break;
|
||||
}
|
||||
if (_trialBind(_ports[1]))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef ZT_USE_MINIUPNPC
|
||||
if (_portMappingEnabled) {
|
||||
// If we're running uPnP/NAT-PMP, bind a *third* port for that. We can't
|
||||
// use the other two ports for that because some NATs do really funky
|
||||
// stuff with ports that are explicitly mapped that breaks things.
|
||||
if (_ports[1]) {
|
||||
_ports[2] = (_tertiaryPort == 0) ? _ports[1] : _tertiaryPort;
|
||||
for(int i=0;;++i) {
|
||||
if (i > 1000) {
|
||||
_ports[2] = 0;
|
||||
break;
|
||||
} else if (++_ports[2] >= 65536) {
|
||||
_ports[2] = 20000;
|
||||
if (_tertiaryPort) {
|
||||
_ports[2] = _tertiaryPort;
|
||||
} else {
|
||||
_ports[2] = _ports[1];
|
||||
for(int i=0;;++i) {
|
||||
if (i > 1000) {
|
||||
_ports[2] = 0;
|
||||
break;
|
||||
} else if (++_ports[2] >= 65536) {
|
||||
_ports[2] = 20000;
|
||||
}
|
||||
if (_trialBind(_ports[2]))
|
||||
break;
|
||||
}
|
||||
if (_ports[2]) {
|
||||
char uniqueName[64];
|
||||
OSUtils::ztsnprintf(uniqueName,sizeof(uniqueName),"ZeroTier/%.10llx@%u",_node->address(),_ports[2]);
|
||||
_portMapper = new PortMapper(_ports[2],uniqueName);
|
||||
}
|
||||
if (_trialBind(_ports[2]))
|
||||
break;
|
||||
}
|
||||
if (_ports[2]) {
|
||||
char uniqueName[64];
|
||||
OSUtils::ztsnprintf(uniqueName,sizeof(uniqueName),"ZeroTier/%.10llx@%u",_node->address(),_ports[2]);
|
||||
_portMapper = new PortMapper(_ports[2],uniqueName);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Delete legacy iddb.d if present (cleanup)
|
||||
OSUtils::rmDashRf((_homePath + ZT_PATH_SEPARATOR_S "iddb.d").c_str());
|
||||
|
Loading…
x
Reference in New Issue
Block a user