Rework how paths are set as remote cluster preferred. The code is now clearer and cluster preference indications are now very sticky as they should be.
This commit is contained in:
parent
43780742b0
commit
8a2e8bd585
3 changed files with 46 additions and 37 deletions
|
@ -33,7 +33,6 @@ namespace ZeroTier {
|
|||
static uint32_t _natKeepaliveBuf = 0;
|
||||
|
||||
Peer::Peer(const RuntimeEnvironment *renv,const Identity &myIdentity,const Identity &peerIdentity) :
|
||||
RR(renv),
|
||||
_lastUsed(0),
|
||||
_lastReceive(0),
|
||||
_lastUnicastFrame(0),
|
||||
|
@ -41,6 +40,8 @@ Peer::Peer(const RuntimeEnvironment *renv,const Identity &myIdentity,const Ident
|
|||
_lastAnnouncedTo(0),
|
||||
_lastDirectPathPushSent(0),
|
||||
_lastDirectPathPushReceive(0),
|
||||
RR(renv),
|
||||
_remoteClusterOptimal4(0),
|
||||
_vProto(0),
|
||||
_vMajor(0),
|
||||
_vMinor(0),
|
||||
|
@ -50,6 +51,7 @@ Peer::Peer(const RuntimeEnvironment *renv,const Identity &myIdentity,const Ident
|
|||
_latency(0),
|
||||
_directPathPushCutoffCount(0)
|
||||
{
|
||||
memset(_remoteClusterOptimal6,0,sizeof(_remoteClusterOptimal6));
|
||||
if (!myIdentity.agree(peerIdentity,_key,ZT_PEER_SECRET_KEY_LENGTH))
|
||||
throw std::runtime_error("new peer identity key agreement failed");
|
||||
}
|
||||
|
@ -126,7 +128,7 @@ void Peer::received(
|
|||
_paths[p].lastReceive = now;
|
||||
_paths[p].path = path; // local address may have changed!
|
||||
#ifdef ZT_ENABLE_CLUSTER
|
||||
_paths[p].clusterWeights = (unsigned int)(!suboptimalPath);
|
||||
_paths[p].localClusterSuboptimal = suboptimalPath;
|
||||
#endif
|
||||
pathIsConfirmed = true;
|
||||
break;
|
||||
|
@ -173,11 +175,9 @@ void Peer::received(
|
|||
_paths[slot].lastReceive = now;
|
||||
_paths[slot].path = path;
|
||||
#ifdef ZT_ENABLE_CLUSTER
|
||||
_paths[slot].clusterWeights = (unsigned int)(!suboptimalPath);
|
||||
_paths[p].localClusterSuboptimal = suboptimalPath;
|
||||
if (RR->cluster)
|
||||
RR->cluster->broadcastHavePeer(_id);
|
||||
#else
|
||||
_paths[slot].clusterWeights = 1;
|
||||
#endif
|
||||
} else {
|
||||
TRACE("got %s via unknown path %s(%s), confirming...",Packet::verbString(verb),_id.address().toString().c_str(),path->address().toString().c_str());
|
||||
|
@ -216,26 +216,6 @@ bool Peer::hasActivePathTo(uint64_t now,const InetAddress &addr) const
|
|||
return false;
|
||||
}
|
||||
|
||||
void Peer::setClusterOptimal(const InetAddress &addr)
|
||||
{
|
||||
Mutex::Lock _l(_paths_m);
|
||||
|
||||
int opt = -1;
|
||||
for(unsigned int p=0;p<_numPaths;++p) {
|
||||
if (_paths[p].path->address() == addr) {
|
||||
opt = (int)p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (opt >= 0) { // only change anything if we have the optimal path
|
||||
for(unsigned int p=0;p<_numPaths;++p) {
|
||||
if (_paths[p].path->address().ss_family == addr.ss_family)
|
||||
_paths[p].clusterWeights = ((int)p == opt) ? 2 : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool Peer::sendDirect(const void *data,unsigned int len,uint64_t now,bool forceEvenIfDead)
|
||||
{
|
||||
Mutex::Lock _l(_paths_m);
|
||||
|
@ -350,7 +330,9 @@ bool Peer::resetWithinScope(InetAddress::IpScope scope,uint64_t now)
|
|||
if (x != y) {
|
||||
_paths[y].lastReceive = _paths[x].lastReceive;
|
||||
_paths[y].path = _paths[x].path;
|
||||
_paths[y].clusterWeights = _paths[x].clusterWeights;
|
||||
#ifdef ZT_ENABLE_CLUSTER
|
||||
_paths[y].localClusterSuboptimal = _paths[x].localClusterSuboptimal;
|
||||
#endif
|
||||
}
|
||||
++y;
|
||||
}
|
||||
|
@ -399,7 +381,9 @@ void Peer::clean(uint64_t now)
|
|||
if (y != x) {
|
||||
_paths[y].lastReceive = _paths[x].lastReceive;
|
||||
_paths[y].path = _paths[x].path;
|
||||
_paths[y].clusterWeights = _paths[x].clusterWeights;
|
||||
#ifdef ZT_ENABLE_CLUSTER
|
||||
_paths[y].localClusterSuboptimal = _paths[x].localClusterSuboptimal;
|
||||
#endif
|
||||
}
|
||||
++y;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue