|
@@ -202,6 +202,14 @@ public:
|
|
|
{
|
|
|
const std::vector<InetAddress> *const alwaysContactEndpoints = _alwaysContact.get(p->address());
|
|
|
if (alwaysContactEndpoints) {
|
|
|
+
|
|
|
+ // Contact upstream peers as infrequently as possible
|
|
|
+ ZT_PeerRole role = RR->topology->role(p->address());
|
|
|
+ int roleBasedTimerScale = (role == ZT_PEER_ROLE_LEAF) ? 2 : 16;
|
|
|
+ if ((RR->node->now() - p->lastSentFullHello()) <= (ZT_PATH_HEARTBEAT_PERIOD * roleBasedTimerScale)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
const unsigned int sent = p->doPingAndKeepalive(_tPtr,_now);
|
|
|
bool contacted = (sent != 0);
|
|
|
|
|
@@ -262,7 +270,7 @@ ZT_ResultCode Node::processBackgroundTasks(void *tptr,int64_t now,volatile int64
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- unsigned long timeUntilNextPingCheck = ZT_PING_CHECK_INVERVAL;
|
|
|
+ unsigned long timeUntilNextPingCheck = _lowBandwidthMode ? (ZT_PING_CHECK_INVERVAL * 5) : ZT_PING_CHECK_INVERVAL;
|
|
|
const int64_t timeSinceLastPingCheck = now - _lastPingCheck;
|
|
|
if (timeSinceLastPingCheck >= timeUntilNextPingCheck) {
|
|
|
try {
|
|
@@ -309,6 +317,7 @@ ZT_ResultCode Node::processBackgroundTasks(void *tptr,int64_t now,volatile int64
|
|
|
|
|
|
// Get peers we should stay connected to according to network configs
|
|
|
// Also get networks and whether they need config so we only have to do one pass over networks
|
|
|
+ int timerScale = _lowBandwidthMode ? 64 : 1;
|
|
|
std::vector< std::pair< SharedPtr<Network>,bool > > networkConfigNeeded;
|
|
|
{
|
|
|
Mutex::Lock l(_networks_m);
|
|
@@ -317,7 +326,7 @@ ZT_ResultCode Node::processBackgroundTasks(void *tptr,int64_t now,volatile int64
|
|
|
SharedPtr<Network> *network = (SharedPtr<Network> *)0;
|
|
|
while (i.next(nwid,network)) {
|
|
|
(*network)->config().alwaysContactAddresses(alwaysContact);
|
|
|
- networkConfigNeeded.push_back( std::pair< SharedPtr<Network>,bool >(*network,(((now - (*network)->lastConfigUpdate()) >= ZT_NETWORK_AUTOCONF_DELAY)||(!(*network)->hasConfig()))) );
|
|
|
+ networkConfigNeeded.push_back( std::pair< SharedPtr<Network>,bool >(*network,(((now - (*network)->lastConfigUpdate()) >= ZT_NETWORK_AUTOCONF_DELAY * timerScale)||(!(*network)->hasConfig()))) );
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -336,9 +345,12 @@ ZT_ResultCode Node::processBackgroundTasks(void *tptr,int64_t now,volatile int64
|
|
|
|
|
|
// Refresh network config or broadcast network updates to members as needed
|
|
|
for(std::vector< std::pair< SharedPtr<Network>,bool > >::const_iterator n(networkConfigNeeded.begin());n!=networkConfigNeeded.end();++n) {
|
|
|
- if (n->second)
|
|
|
+ if (n->second) {
|
|
|
n->first->requestConfiguration(tptr);
|
|
|
- n->first->sendUpdatesToMembers(tptr);
|
|
|
+ }
|
|
|
+ if (! _lowBandwidthMode) {
|
|
|
+ n->first->sendUpdatesToMembers(tptr);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Update online status, post status change as event
|