From ee9e6a3c6b697b25445fa93fd6bffc1a91e03e07 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Thu, 20 Nov 2014 13:20:16 -0800 Subject: [PATCH] Change path selection logic to exclude non-fixed and non-active paths -- possible fix for "NAT traversal coma" issue. Also fix a typo. --- make-mac.mk | 2 +- node/Peer.cpp | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/make-mac.mk b/make-mac.mk index 1e66d0892..26ca8fe0b 100644 --- a/make-mac.mk +++ b/make-mac.mk @@ -50,7 +50,7 @@ one: $(OBJS) main.o ln -sf zerotier-one zerotier-cli ln -sf zerotier-one zerotier-idtool -selftest: $(OBJS) sefltest.o +selftest: $(OBJS) selftest.o $(CXX) $(CXXFLAGS) -o zerotier-selftest selftest.o $(OBJS) $(LIBS) $(STRIP) zerotier-selftest diff --git a/node/Peer.cpp b/node/Peer.cpp index 209de9498..181761a88 100644 --- a/node/Peer.cpp +++ b/node/Peer.cpp @@ -176,6 +176,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 @@ -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;