diff --git a/service/OneService.cpp b/service/OneService.cpp index dfa5df056..8a0aee294 100644 --- a/service/OneService.cpp +++ b/service/OneService.cpp @@ -1067,7 +1067,7 @@ public: if (_secondaryPort) { _ports[1] = _secondaryPort; } else { - _ports[1] = _secondaryPort = _getRandomPort(); + _ports[1] = _getRandomPort(); } } #ifdef ZT_USE_MINIUPNPC @@ -1129,7 +1129,6 @@ public: int64_t lastBindRefresh = 0; int64_t lastUpdateCheck = clockShouldBe; int64_t lastCleanedPeersDb = 0; - int64_t lastLocalInterfaceAddressCheck = (clockShouldBe - ZT_LOCAL_INTERFACE_CHECK_INTERVAL) + 15000; // do this in 15s to give portmapper time to configure and other things time to settle int64_t lastLocalConfFileCheck = OSUtils::now(); int64_t lastOnline = lastLocalConfFileCheck; for(;;) { @@ -1176,16 +1175,22 @@ public: // If secondary port is not configured to a constant value and we've been offline for a while, // bind a new secondary port. This is a workaround for a "coma" issue caused by buggy NATs that stop // working on one port after a while. - if (_node->online()) { - lastOnline = now; - } else if ((_secondaryPort == 0)&&((now - lastOnline) > ZT_PATH_HEARTBEAT_PERIOD)) { - _secondaryPort = _getRandomPort(); - lastBindRefresh = 0; + if (_secondaryPort == 0) { + if (_node->online()) { + lastOnline = now; + } + if ((now - lastOnline) > ZT_PATH_HEARTBEAT_PERIOD || restarted) { + _ports[1] = _getRandomPort(); +#if ZT_DEBUG==1 + fprintf(stderr, "randomized secondary port. Now it's %d\n", _ports[1]); +#endif + lastOnline = now; // don't keep spamming this branch. online() will be false for a few seconds + } } + // Refresh bindings in case device's interfaces have changed, and also sync routes to update any shadow routes (e.g. shadow default) - if (((now - lastBindRefresh) >= (_node->bondController()->inUse() ? ZT_BINDER_REFRESH_PERIOD / 4 : ZT_BINDER_REFRESH_PERIOD))||(restarted)) { - lastBindRefresh = now; + if (((now - lastBindRefresh) >= (_node->bondController()->inUse() ? ZT_BINDER_REFRESH_PERIOD / 4 : ZT_BINDER_REFRESH_PERIOD))||restarted) { unsigned int p[3]; unsigned int pc = 0; for(int i=0;i<3;++i) { @@ -1196,6 +1201,23 @@ public: // Only bother binding UDP ports if we aren't forcing TCP-relay mode _binder.refresh(_phy,p,pc,explicitBind,*this); } + + lastBindRefresh = now; + + // Sync information about physical network interfaces + _node->clearLocalInterfaceAddresses(); +#ifdef ZT_USE_MINIUPNPC + if (_portMapper) { + std::vector mappedAddresses(_portMapper->get()); + for(std::vector::const_iterator ext(mappedAddresses.begin());ext!=mappedAddresses.end();++ext) + _node->addLocalInterfaceAddress(reinterpret_cast(&(*ext))); + } +#endif + std::vector boundAddrs(_binder.allBoundLocalInterfaceAddresses()); + for(std::vector::const_iterator i(boundAddrs.begin());i!=boundAddrs.end();++i) { + _node->addLocalInterfaceAddress(reinterpret_cast(&(*i))); + } + { Mutex::Lock _l(_nets_m); for(std::map::iterator n(_nets.begin());n!=_nets.end();++n) { @@ -1239,26 +1261,6 @@ public: } } - // Sync information about physical network interfaces - if ((now - lastLocalInterfaceAddressCheck) >= (_node->bondController()->inUse() ? ZT_LOCAL_INTERFACE_CHECK_INTERVAL / 8 : ZT_LOCAL_INTERFACE_CHECK_INTERVAL)) { - lastLocalInterfaceAddressCheck = now; - - _node->clearLocalInterfaceAddresses(); - -#ifdef ZT_USE_MINIUPNPC - if (_portMapper) { - std::vector mappedAddresses(_portMapper->get()); - for(std::vector::const_iterator ext(mappedAddresses.begin());ext!=mappedAddresses.end();++ext) - _node->addLocalInterfaceAddress(reinterpret_cast(&(*ext))); - } -#endif - - std::vector boundAddrs(_binder.allBoundLocalInterfaceAddresses()); - for(std::vector::const_iterator i(boundAddrs.begin());i!=boundAddrs.end();++i) { - _node->addLocalInterfaceAddress(reinterpret_cast(&(*i))); - } - } - // Clean peers.d periodically if ((now - lastCleanedPeersDb) >= 3600000) { lastCleanedPeersDb = now; @@ -2037,7 +2039,7 @@ public: settings["allowTcpFallbackRelay"] = OSUtils::jsonBool(settings["allowTcpFallbackRelay"],_allowTcpFallbackRelay); settings["forceTcpRelay"] = OSUtils::jsonBool(settings["forceTcpRelay"],_forceTcpRelay); settings["primaryPort"] = OSUtils::jsonInt(settings["primaryPort"],(uint64_t)_primaryPort) & 0xffff; - settings["secondaryPort"] = OSUtils::jsonInt(settings["secondaryPort"],(uint64_t)_secondaryPort) & 0xffff; + settings["secondaryPort"] = OSUtils::jsonInt(settings["secondaryPort"],(uint64_t)_ports[1]) & 0xffff; settings["tertiaryPort"] = OSUtils::jsonInt(settings["tertiaryPort"],(uint64_t)_tertiaryPort) & 0xffff; // Enumerate all local address/port pairs that this node is listening on std::vector boundAddrs(_binder.allBoundLocalInterfaceAddresses());