diff options
| author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-04-03 17:12:34 -0700 |
|---|---|---|
| committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-04-03 17:12:34 -0700 |
| commit | fe85426df6dd1127df71d4faed44df0a8ef17af6 (patch) | |
| tree | c2ecfb241937c704a68a199b7c05ffd287790cc8 /node/Peer.cpp | |
| parent | 158002d2d1603eea6336cb316b80e1c4b9ef7b10 (diff) | |
| download | infinitytier-fe85426df6dd1127df71d4faed44df0a8ef17af6.tar.gz infinitytier-fe85426df6dd1127df71d4faed44df0a8ef17af6.zip | |
A few more tweaks to TCP failover... seems to be switching back and forth pretty well now!
Diffstat (limited to 'node/Peer.cpp')
| -rw-r--r-- | node/Peer.cpp | 57 |
1 files changed, 26 insertions, 31 deletions
diff --git a/node/Peer.cpp b/node/Peer.cpp index db6ad261..d2f8705b 100644 --- a/node/Peer.cpp +++ b/node/Peer.cpp @@ -120,25 +120,24 @@ void Peer::receive( bool Peer::send(const RuntimeEnvironment *_r,const void *data,unsigned int len,uint64_t now) { - // Note: we'll still use TCP here if that's all we have, but if this - // is false we will prefer UDP. - bool useTcp = isTcpFailoverTime(_r,now); - Mutex::Lock _l(_lock); + bool useTcp = _isTcpFailoverTime(_r,now); std::vector<Path>::iterator p(_paths.begin()); + if (useTcp) { + while ((p->tcp())&&(p != _paths.end())) + ++p; + } if (p == _paths.end()) return false; uint64_t bestPathLastReceived = p->lastReceived(); std::vector<Path>::iterator bestPath = p; - bool bestPathIsTcp = p->tcp(); while (++p != _paths.end()) { uint64_t lr = p->lastReceived(); - if ( (lr > bestPathLastReceived) || ((bestPathIsTcp)&&(!useTcp)) ) { + if ( (lr > bestPathLastReceived) && ((useTcp)||(!p->tcp())) ) { bestPathLastReceived = lr; bestPath = p; - bestPathIsTcp = p->tcp(); } } @@ -167,13 +166,11 @@ bool Peer::sendPing(const RuntimeEnvironment *_r,uint64_t now) { bool sent = false; SharedPtr<Peer> self(this); - - // In the ping case we will never send TCP unless this returns true. - bool useTcp = isTcpFailoverTime(_r,now); + Mutex::Lock _l(_lock); + bool useTcp = _isTcpFailoverTime(_r,now); TRACE("PING %s (useTcp==%d)",_id.address().toString().c_str(),(int)useTcp); - Mutex::Lock _l(_lock); for(std::vector<Path>::iterator p(_paths.begin());p!=_paths.end();++p) { if ((useTcp)||(!p->tcp())) { p->pinged(now); // we log pings sent even if the send "fails", since what we want to track is when we last tried to ping @@ -187,9 +184,22 @@ bool Peer::sendPing(const RuntimeEnvironment *_r,uint64_t now) return sent; } -bool Peer::isTcpFailoverTime(const RuntimeEnvironment *_r,uint64_t now) const +void Peer::clean(uint64_t now) +{ + Mutex::Lock _l(_lock); + unsigned long i = 0,o = 0,l = (unsigned long)_paths.size(); + while (i != l) { + if (_paths[i].active(now)) + _paths[o++] = _paths[i]; + ++i; + } + _paths.resize(o); +} + +bool Peer::_isTcpFailoverTime(const RuntimeEnvironment *_r,uint64_t now) const throw() { + // assumes _lock is locked uint64_t lastResync = _r->timeOfLastResynchronize; if ((now - lastResync) >= ZT_TCP_TUNNEL_FAILOVER_TIMEOUT) { if ((now - _r->timeOfLastPacketReceived) >= ZT_TCP_TUNNEL_FAILOVER_TIMEOUT) @@ -198,13 +208,10 @@ bool Peer::isTcpFailoverTime(const RuntimeEnvironment *_r,uint64_t now) const uint64_t lastUdpPingSent = 0; uint64_t lastUdpReceive = 0; - { - Mutex::Lock _l(_lock); - for(std::vector<Path>::const_iterator p(_paths.begin());p!=_paths.end();++p) { - if (p->type() == Path::PATH_TYPE_UDP) { - lastUdpPingSent = std::max(lastUdpPingSent,p->lastPing()); - lastUdpReceive = std::max(lastUdpReceive,p->lastReceived()); - } + for(std::vector<Path>::const_iterator p(_paths.begin());p!=_paths.end();++p) { + if (p->type() == Path::PATH_TYPE_UDP) { + lastUdpPingSent = std::max(lastUdpPingSent,p->lastPing()); + lastUdpReceive = std::max(lastUdpReceive,p->lastReceived()); } } @@ -213,16 +220,4 @@ bool Peer::isTcpFailoverTime(const RuntimeEnvironment *_r,uint64_t now) const return false; } -void Peer::clean(uint64_t now) -{ - Mutex::Lock _l(_lock); - unsigned long i = 0,o = 0,l = (unsigned long)_paths.size(); - while (i != l) { - if (_paths[i].active(now)) - _paths[o++] = _paths[i]; - ++i; - } - _paths.resize(o); -} - } // namespace ZeroTier |
