diff --git a/node/Peer.cpp b/node/Peer.cpp index ac409a46..12d52b70 100644 --- a/node/Peer.cpp +++ b/node/Peer.cpp @@ -128,12 +128,15 @@ void Peer::received( long replacePathQuality = 0; for(unsigned int i=0;iquality(now); - if (q > replacePathQuality) { - replacePathQuality = q; + if ( (!_paths[i].p->alive(now)) || _paths[i].p->address().ipsEqual(path->address()) ) { replacePath = i; - if ( (!_paths[i].p->alive(now)) || _paths[i].p->address().ipsEqual(path->address()) ) - break; + break; + } else { + const long q = _paths[i].p->quality(now); + if (q > replacePathQuality) { + replacePathQuality = q; + replacePath = i; + } } } else { replacePath = i; @@ -147,10 +150,26 @@ void Peer::received( _paths[replacePath].p = path; _paths[replacePath].priority = 1; } + + { + Mutex::Lock ltl(_lastTriedPath_m); + uint64_t *k = (uint64_t *)0; + int64_t *v = (int64_t *)0; + Hashtable< uint64_t,int64_t >::Iterator i(_lastTriedPath); + while (i.next(k, v)) { + if ((now - *v) >= 2000) + _lastTriedPath.erase(*k); + } + } } else { - attemptToContactAt(tPtr,path->localSocket(),path->address(),now,true); - path->sent(now); - RR->t->peerConfirmingUnknownPath(tPtr,networkId,*this,path,packetId,verb); + Mutex::Lock ltl(_lastTriedPath_m); + int64_t < = _lastTriedPath[(uint64_t)path.ptr()]; + if ((now - lt) >= 2000) { + lt = now; + attemptToContactAt(tPtr,path->localSocket(),path->address(),now,true); + path->sent(now); + RR->t->peerConfirmingUnknownPath(tPtr,networkId,*this,path,packetId,verb); + } } /* diff --git a/node/Peer.hpp b/node/Peer.hpp index 0ee138bb..3d1ab45a 100644 --- a/node/Peer.hpp +++ b/node/Peer.hpp @@ -573,6 +573,9 @@ private: uint16_t _vMinor; uint16_t _vRevision; + Hashtable< uint64_t, int64_t > _lastTriedPath; + Mutex _lastTriedPath_m; + _PeerPath _paths[ZT_MAX_PEER_NETWORK_PATHS]; Mutex _paths_m;