mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2024-12-21 13:57:49 +00:00
getUpstreamPeer issue with interim federated roots
This commit is contained in:
parent
47166c9614
commit
db87d95c1d
@ -159,33 +159,14 @@ void Topology::saveIdentity(const Identity &id)
|
||||
SharedPtr<Peer> Topology::getUpstreamPeer(const Address *avoid,unsigned int avoidCount,bool strictAvoid)
|
||||
{
|
||||
const uint64_t now = RR->node->now();
|
||||
Mutex::Lock _l1(_peers_m);
|
||||
Mutex::Lock _l2(_upstreams_m);
|
||||
|
||||
if (_amRoot) {
|
||||
/* If I am a root, pick another root that isn't mine and that
|
||||
* has a numerically greater ID. This causes packets to roam
|
||||
* around the top rather than bouncing between just two. */
|
||||
|
||||
for(unsigned long p=0;p<_upstreamAddresses.size();++p) {
|
||||
if (_upstreamAddresses[p] == RR->identity.address()) {
|
||||
for(unsigned long q=1;q<_upstreamAddresses.size();++q) {
|
||||
const SharedPtr<Peer> *const nextsn = _peers.get(_upstreamAddresses[(p + q) % _upstreamAddresses.size()]);
|
||||
if ((nextsn)&&((*nextsn)->hasActiveDirectPath(now)))
|
||||
return *nextsn;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
/* Otherwise pick the bestest looking upstream */
|
||||
|
||||
unsigned int bestQualityOverall = ~((unsigned int)0);
|
||||
unsigned int bestQualityNotAvoid = ~((unsigned int)0);
|
||||
const SharedPtr<Peer> *bestOverall = (const SharedPtr<Peer> *)0;
|
||||
const SharedPtr<Peer> *bestNotAvoid = (const SharedPtr<Peer> *)0;
|
||||
|
||||
Mutex::Lock _l1(_peers_m);
|
||||
Mutex::Lock _l2(_upstreams_m);
|
||||
|
||||
for(std::vector<Address>::const_iterator a(_upstreamAddresses.begin());a!=_upstreamAddresses.end();++a) {
|
||||
const SharedPtr<Peer> *p = _peers.get(*a);
|
||||
if (p) {
|
||||
@ -214,8 +195,6 @@ SharedPtr<Peer> Topology::getUpstreamPeer(const Address *avoid,unsigned int avoi
|
||||
return *bestOverall;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return SharedPtr<Peer>();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user