diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2017-04-14 18:02:04 -0700 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2017-04-14 18:02:04 -0700 |
commit | f1c0563c40dc9e3ec5e975d3e1e8d6057ed6bd83 (patch) | |
tree | 7b3e3e6fd25204f79ba7a7dd239968b61b1510ff /node | |
parent | 139c4b56337c0cfe7458ecf5df4e12e38c2d4f8a (diff) | |
download | infinitytier-f1c0563c40dc9e3ec5e975d3e1e8d6057ed6bd83.tar.gz infinitytier-f1c0563c40dc9e3ec5e975d3e1e8d6057ed6bd83.zip |
Fix for cluster handoff.
Diffstat (limited to 'node')
-rw-r--r-- | node/IncomingPacket.cpp | 4 | ||||
-rw-r--r-- | node/Peer.cpp | 4 | ||||
-rw-r--r-- | node/Peer.hpp | 16 |
3 files changed, 22 insertions, 2 deletions
diff --git a/node/IncomingPacket.cpp b/node/IncomingPacket.cpp index a0f5ee1d..303160ec 100644 --- a/node/IncomingPacket.cpp +++ b/node/IncomingPacket.cpp @@ -1206,6 +1206,8 @@ bool IncomingPacket::_doPUSH_DIRECT_PATHS(const RuntimeEnvironment *RR,void *tPt (!( ((flags & ZT_PUSH_DIRECT_PATHS_FLAG_CLUSTER_REDIRECT) == 0) && (peer->hasActivePathTo(now,a)) )) && // not already known (RR->node->shouldUsePathForZeroTierTraffic(tPtr,peer->address(),_path->localAddress(),a)) ) // should use path { + if ((flags & ZT_PUSH_DIRECT_PATHS_FLAG_CLUSTER_REDIRECT) != 0) + peer->setClusterPreferred(a); if (++countPerScope[(int)a.ipScope()][0] <= ZT_PUSH_DIRECT_PATHS_MAX_PER_SCOPE_AND_FAMILY) { TRACE("attempting to contact %s at pushed direct path %s",peer->address().toString().c_str(),a.toString().c_str()); peer->attemptToContactAt(tPtr,InetAddress(),a,now,false,0); @@ -1221,6 +1223,8 @@ bool IncomingPacket::_doPUSH_DIRECT_PATHS(const RuntimeEnvironment *RR,void *tPt (!( ((flags & ZT_PUSH_DIRECT_PATHS_FLAG_CLUSTER_REDIRECT) == 0) && (peer->hasActivePathTo(now,a)) )) && // not already known (RR->node->shouldUsePathForZeroTierTraffic(tPtr,peer->address(),_path->localAddress(),a)) ) // should use path { + if ((flags & ZT_PUSH_DIRECT_PATHS_FLAG_CLUSTER_REDIRECT) != 0) + peer->setClusterPreferred(a); if (++countPerScope[(int)a.ipScope()][1] <= ZT_PUSH_DIRECT_PATHS_MAX_PER_SCOPE_AND_FAMILY) { TRACE("attempting to contact %s at pushed direct path %s",peer->address().toString().c_str(),a.toString().c_str()); peer->attemptToContactAt(tPtr,InetAddress(),a,now,false,0); diff --git a/node/Peer.cpp b/node/Peer.cpp index 2711dd19..7ffe8926 100644 --- a/node/Peer.cpp +++ b/node/Peer.cpp @@ -169,7 +169,7 @@ void Peer::received( if (verb == Packet::VERB_OK) { Mutex::Lock _l(_paths_m); if (path->address().ss_family == AF_INET) { - if ((!_v4Path.p)||(!_v4Path.p->alive(now))||(path->preferenceRank() >= _v4Path.p->preferenceRank())) { + if ( (!_v4Path.p) || (!_v4Path.p->alive(now)) || ((_v4Path.p->address() != _v4ClusterPreferred)&&(path->preferenceRank() >= _v4Path.p->preferenceRank())) ) { _v4Path.lr = now; _v4Path.p = path; #ifdef ZT_ENABLE_CLUSTER @@ -179,7 +179,7 @@ void Peer::received( #endif } } else if (path->address().ss_family == AF_INET6) { - if ((!_v6Path.p)||(!_v6Path.p->alive(now))||(path->preferenceRank() >= _v6Path.p->preferenceRank())) { + if ( (!_v6Path.p) || (!_v6Path.p->alive(now)) || ((_v6Path.p->address() != _v6ClusterPreferred)&&(path->preferenceRank() >= _v6Path.p->preferenceRank())) ) { _v6Path.lr = now; _v6Path.p = path; #ifdef ZT_ENABLE_CLUSTER diff --git a/node/Peer.hpp b/node/Peer.hpp index f225eb85..6cf30feb 100644 --- a/node/Peer.hpp +++ b/node/Peer.hpp @@ -211,6 +211,19 @@ public: } /** + * Indicate that the given address was provided by a cluster as a preferred destination + * + * @param addr Address cluster prefers that we use + */ + inline void setClusterPreferred(const InetAddress &addr) + { + if (addr.ss_family == AF_INET) + _v4ClusterPreferred = addr; + else if (addr.ss_family == AF_INET6) + _v6ClusterPreferred = addr; + } + + /** * Fill parameters with V4 and V6 addresses if known and alive * * @param now Current time @@ -465,6 +478,9 @@ private: uint16_t _vMinor; uint16_t _vRevision; + InetAddress _v4ClusterPreferred; + InetAddress _v6ClusterPreferred; + _PeerPath _v4Path; // IPv4 direct path _PeerPath _v6Path; // IPv6 direct path Mutex _paths_m; |