Browse Source

Keep attemting to upgrade direct path if path is not private to facilitate better use of LANs and backplane networks.

Adam Ierymenko 8 years ago
parent
commit
52916eebcf
1 changed files with 15 additions and 9 deletions
  1. 15 9
      node/Peer.cpp

+ 15 - 9
node/Peer.cpp

@@ -194,8 +194,12 @@ void Peer::received(
 				}
 			}
 		}
-	} else if (this->trustEstablished(now)) {
-		// Send PUSH_DIRECT_PATHS if hops>0 (relayed) and we have a trust relationship (common network membership)
+	}
+
+	// If we are being relayed or if we're using a global address, send PUSH_DIRECT_PATHS.
+	// In the global address case we push only configured direct paths to accomplish
+	// fall-forward to local backplane networks over e.g. LAN or Amazon VPC.
+	if ( ((hops > 0)||(path->ipScope() == InetAddress::IP_SCOPE_GLOBAL)) && (this->trustEstablished(now)) ) {
 		if ((now - _lastDirectPathPushSent) >= ZT_DIRECT_PATH_PUSH_INTERVAL) {
 			_lastDirectPathPushSent = now;
 
@@ -205,13 +209,15 @@ void Peer::received(
 			for(std::vector<InetAddress>::const_iterator i(dps.begin());i!=dps.end();++i)
 				pathsToPush.push_back(*i);
 
-			std::vector<InetAddress> sym(RR->sa->getSymmetricNatPredictions());
-			for(unsigned long i=0,added=0;i<sym.size();++i) {
-				InetAddress tmp(sym[(unsigned long)RR->node->prng() % sym.size()]);
-				if (std::find(pathsToPush.begin(),pathsToPush.end(),tmp) == pathsToPush.end()) {
-					pathsToPush.push_back(tmp);
-					if (++added >= ZT_PUSH_DIRECT_PATHS_MAX_PER_SCOPE_AND_FAMILY)
-						break;
+			if (hops > 0) {
+				std::vector<InetAddress> sym(RR->sa->getSymmetricNatPredictions());
+				for(unsigned long i=0,added=0;i<sym.size();++i) {
+					InetAddress tmp(sym[(unsigned long)RR->node->prng() % sym.size()]);
+					if (std::find(pathsToPush.begin(),pathsToPush.end(),tmp) == pathsToPush.end()) {
+						pathsToPush.push_back(tmp);
+						if (++added >= ZT_PUSH_DIRECT_PATHS_MAX_PER_SCOPE_AND_FAMILY)
+							break;
+					}
 				}
 			}