summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2017-09-14 20:56:50 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2017-09-14 20:56:50 -0700
commit52916eebcfae2559966d12d4be4b5376289a982d (patch)
treebf4f4497c576b4c3e29fb1764ab240f6bf4d8655
parentf8014413a376551b7853baae81072f969a755e46 (diff)
downloadinfinitytier-52916eebcfae2559966d12d4be4b5376289a982d.tar.gz
infinitytier-52916eebcfae2559966d12d4be4b5376289a982d.zip
Keep attemting to upgrade direct path if path is not private to facilitate better use of LANs and backplane networks.
-rw-r--r--node/Peer.cpp24
1 files changed, 15 insertions, 9 deletions
diff --git a/node/Peer.cpp b/node/Peer.cpp
index b3020854..a954b716 100644
--- a/node/Peer.cpp
+++ b/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;
+ }
}
}