Possible fix for path issues in 1.6.2

This commit is contained in:
Adam Ierymenko 2021-02-02 14:55:47 -05:00
parent 717e9238fe
commit b2b3271a96
No known key found for this signature in database
GPG Key ID: C8877CF2D7A5D7F3

View File

@ -120,16 +120,46 @@ void Peer::received(
} }
} }
bool attemptToContact = false; if ( (!havePath) && RR->node->shouldUsePathForZeroTierTraffic(tPtr,_id.address(),path->localSocket(),path->address()) ) {
if ((!havePath)&&(RR->node->shouldUsePathForZeroTierTraffic(tPtr,_id.address(),path->localSocket(),path->address()))) { if (verb == Packet::VERB_OK) {
Mutex::Lock _l(_paths_m); Mutex::Lock _l(_paths_m);
unsigned int replacePath = ZT_MAX_PEER_NETWORK_PATHS;
long replacePathQuality = 0;
for(unsigned int i=0;i<ZT_MAX_PEER_NETWORK_PATHS;++i) {
if (_paths[i].p) {
const long q = _paths[i].p->quality(now);
if (q > replacePathQuality) {
replacePathQuality = q;
replacePath = i;
if ( (!_paths[i].p->alive(now)) || _paths[i].p->address().ipsEqual(path->address()) )
break;
}
} else {
replacePath = i;
break;
}
}
if (replacePath != ZT_MAX_PEER_NETWORK_PATHS) {
RR->t->peerLearnedNewPath(tPtr, networkId, *this, path, packetId);
_paths[replacePath].lr = now;
_paths[replacePath].p = path;
_paths[replacePath].priority = 1;
}
} else {
attemptToContactAt(tPtr,path->localSocket(),path->address(),now,true);
path->sent(now);
RR->t->peerConfirmingUnknownPath(tPtr,networkId,*this,path,packetId,verb);
}
/*
// Paths are redunant if they duplicate an alive path to the same IP or // Paths are redunant if they duplicate an alive path to the same IP or
// with the same local socket and address family. // with the same local socket and address family.
bool redundant = false; bool redundant = false;
for(unsigned int i=0;i<ZT_MAX_PEER_NETWORK_PATHS;++i) { for(unsigned int i=0;i<ZT_MAX_PEER_NETWORK_PATHS;++i) {
if (_paths[i].p) { if (_paths[i].p) {
if ( (_paths[i].p->alive(now)) && ( ((_paths[i].p->localSocket() == path->localSocket())&&(_paths[i].p->address().ss_family == path->address().ss_family)) || (_paths[i].p->address().ipsEqual2(path->address())) ) ) { if ( _paths[i].p->alive(now) && (_paths[i].p->localSocket() == path->localSocket()) && _paths[i].p->address().ipsEqual(path->address()) ) {
redundant = true; redundant = true;
break; break;
} }
@ -166,12 +196,7 @@ void Peer::received(
} }
} }
} }
} */
if (attemptToContact) {
attemptToContactAt(tPtr,path->localSocket(),path->address(),now,true);
path->sent(now);
RR->t->peerConfirmingUnknownPath(tPtr,networkId,*this,path,packetId,verb);
} }
} }