summaryrefslogtreecommitdiff
path: root/node/Peer.cpp
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2014-04-03 17:12:34 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2014-04-03 17:12:34 -0700
commitfe85426df6dd1127df71d4faed44df0a8ef17af6 (patch)
treec2ecfb241937c704a68a199b7c05ffd287790cc8 /node/Peer.cpp
parent158002d2d1603eea6336cb316b80e1c4b9ef7b10 (diff)
downloadinfinitytier-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.cpp57
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