Add delay to NAT-t escalation stuff to try to address GitHub issue #167

This commit is contained in:
Adam Ierymenko 2015-05-22 13:11:55 -07:00
parent b388d9fdc9
commit 196f27f1f0
2 changed files with 25 additions and 36 deletions

View file

@ -444,42 +444,31 @@ unsigned long Switch::doTimerTasks(uint64_t now)
continue; continue;
} else { } else {
// Nope, nothing yet. Time to kill some kittens. // Nope, nothing yet. Time to kill some kittens.
if (qi->strategyIteration == 0) {
switch(qi->strategyIteration++) { // First stragegy: send packet directly (we already tried this but try again)
case 0: {
// First strategy: rifle method: direct packet to known port
qi->peer->attemptToContactAt(RR,qi->inaddr,now); qi->peer->attemptToContactAt(RR,qi->inaddr,now);
} break; } else if (qi->strategyIteration <= 9) {
// Strategies 1-9: try escalating ports
case 1: {
// Second strategy: shotgun method up: try a few ports above
InetAddress tmpaddr(qi->inaddr); InetAddress tmpaddr(qi->inaddr);
int p = (int)qi->inaddr.port(); int p = (int)qi->inaddr.port() + qi->strategyIteration;
for(int i=0;i<9;++i) { if (p < 0xffff) {
if (++p > 0xffff) break;
tmpaddr.setPort((unsigned int)p); tmpaddr.setPort((unsigned int)p);
qi->peer->attemptToContactAt(RR,tmpaddr,now); qi->peer->attemptToContactAt(RR,tmpaddr,now);
} }
} break; } else if (qi->strategyIteration <= 18) {
// Strategies 10-18: try ports below
case 2: {
// Third strategy: shotgun method down: try a few ports below
InetAddress tmpaddr(qi->inaddr); InetAddress tmpaddr(qi->inaddr);
int p = (int)qi->inaddr.port(); int p = (int)qi->inaddr.port() - (qi->strategyIteration - 9);
for(int i=0;i<3;++i) { if (p >= 1024) {
if (--p < 1024) break;
tmpaddr.setPort((unsigned int)p); tmpaddr.setPort((unsigned int)p);
qi->peer->attemptToContactAt(RR,tmpaddr,now); qi->peer->attemptToContactAt(RR,tmpaddr,now);
} }
} else {
// We've tried all strategies // All strategies tried, expire entry
_contactQueue.erase(qi++); _contactQueue.erase(qi++);
continue; continue;
} break;
} }
++qi->strategyIteration;
qi->fireAtTime = now + ZT_NAT_T_TACTICAL_ESCALATION_DELAY; qi->fireAtTime = now + ZT_NAT_T_TACTICAL_ESCALATION_DELAY;
nextDelay = std::min(nextDelay,(unsigned long)ZT_NAT_T_TACTICAL_ESCALATION_DELAY); nextDelay = std::min(nextDelay,(unsigned long)ZT_NAT_T_TACTICAL_ESCALATION_DELAY);
} }

View file

@ -250,7 +250,7 @@ private:
peer(p), peer(p),
fireAtTime(ft), fireAtTime(ft),
inaddr(a), inaddr(a),
strategyIteration(1) {} // start with 2nd strategy, since first was tried at inception strategyIteration(0) {}
SharedPtr<Peer> peer; SharedPtr<Peer> peer;
uint64_t fireAtTime; uint64_t fireAtTime;