summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2014-11-20 13:20:16 -0800
committerAdam Ierymenko <adam.ierymenko@gmail.com>2014-11-20 13:20:16 -0800
commitee9e6a3c6b697b25445fa93fd6bffc1a91e03e07 (patch)
treec6a26455a17a03da8e2ecf3c2d787c7002a48b60 /node
parent7b6f10e8591c31e6e145545c3578eda05d5b732c (diff)
downloadinfinitytier-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.cpp21
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;