diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-11-20 13:20:16 -0800 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-11-20 13:20:16 -0800 |
commit | ee9e6a3c6b697b25445fa93fd6bffc1a91e03e07 (patch) | |
tree | c6a26455a17a03da8e2ecf3c2d787c7002a48b60 /node | |
parent | 7b6f10e8591c31e6e145545c3578eda05d5b732c (diff) | |
download | infinitytier-ee9e6a3c6b697b25445fa93fd6bffc1a91e03e07.tar.gz infinitytier-ee9e6a3c6b697b25445fa93fd6bffc1a91e03e07.zip |
Change path selection logic to exclude non-fixed and non-active paths -- possible fix for "NAT traversal coma" issue. Also fix a typo.
Diffstat (limited to 'node')
-rw-r--r-- | node/Peer.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/node/Peer.cpp b/node/Peer.cpp index 209de949..181761a8 100644 --- a/node/Peer.cpp +++ b/node/Peer.cpp @@ -177,6 +177,25 @@ Path::Type Peer::send(const RuntimeEnvironment *RR,const void *data,unsigned int } Path *bestPath = (Path *)0; + uint64_t normalPathAge = now - bestNormalPathLastReceived; + uint64_t tcpOutPathAge = now - bestTcpOutPathLastReceived; + if (normalPathAge < ZT_PEER_PATH_ACTIVITY_TIMEOUT) { + /* If we have a normal path that looks alive, only use TCP if it looks + * even more alive, if the UDP path is not a very recent acquisition, + * and if TCP tunneling is globally enabled. */ + bestPath = ( (tcpOutPathAge < normalPathAge) && (normalPathAge > (ZT_PEER_DIRECT_PING_DELAY / 4)) && (RR->tcpTunnelingEnabled) ) ? bestTcpOutPath : bestNormalPath; + } else if ( (tcpOutPathAge < ZT_PEER_PATH_ACTIVITY_TIMEOUT) || ((RR->tcpTunnelingEnabled)&&(bestTcpOutPath)) ) { + /* Otherwise use a TCP path if we have an active one or if TCP + * fallback has been globally triggered and we know of one at all. */ + bestPath = bestTcpOutPath; + } else if ( (bestNormalPath) && (bestNormalPath->fixed()) ) { + /* Finally, use a normal path if we have a "fixed" one as these are + * always considered basically alive. */ + bestPath = bestNormalPath; + } + + /* Old path choice logic -- would attempt to use inactive paths... deprecating and will probably kill. + Path *bestPath = (Path *)0; if (bestTcpOutPath) { // we have a TCP out path if (bestNormalPath) { // we have both paths, decide which to use if (RR->tcpTunnelingEnabled) { // TCP tunneling is enabled, so use normal path only if it looks alive @@ -192,6 +211,8 @@ Path::Type Peer::send(const RuntimeEnvironment *RR,const void *data,unsigned int } else { // we only have a normal path (or none at all, that case is caught below) bestPath = bestNormalPath; } + */ + if (!bestPath) return Path::PATH_TYPE_NULL; |