|
|
|
|
@ -116,7 +116,9 @@ void Peer::received(
|
|
|
|
|
havePath = true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} else break; |
|
|
|
|
} else { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -132,7 +134,7 @@ void Peer::received(
|
|
|
|
|
replacePath = i; |
|
|
|
|
break; |
|
|
|
|
} else { |
|
|
|
|
const long q = _paths[i].p->quality(now); |
|
|
|
|
const long q = _paths[i].p->quality(now) / _paths[i].priority; |
|
|
|
|
if (q > replacePathQuality) { |
|
|
|
|
replacePathQuality = q; |
|
|
|
|
replacePath = i; |
|
|
|
|
@ -150,22 +152,23 @@ void Peer::received(
|
|
|
|
|
_paths[replacePath].p = path; |
|
|
|
|
_paths[replacePath].priority = 1; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
Mutex::Lock ltl(_lastTriedPath_m); |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
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); |
|
|
|
|
bool triedTooRecently = false; |
|
|
|
|
for(std::vector< std::pair< Path *, int64_t > >::iterator i(_lastTriedPath.begin());i!=_lastTriedPath.end();) { |
|
|
|
|
if ((now - i->second) > 1000) { |
|
|
|
|
_lastTriedPath.erase(i++); |
|
|
|
|
} else if (i->first == path.ptr()) { |
|
|
|
|
++i; |
|
|
|
|
triedTooRecently = true; |
|
|
|
|
} else { |
|
|
|
|
++i; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
Mutex::Lock ltl(_lastTriedPath_m); |
|
|
|
|
int64_t < = _lastTriedPath[(uint64_t)path.ptr()]; |
|
|
|
|
if ((now - lt) >= 2000) { |
|
|
|
|
lt = now; |
|
|
|
|
|
|
|
|
|
if (!triedTooRecently) { |
|
|
|
|
_lastTriedPath.push_back(std::pair< Path *, int64_t >(path.ptr(), now)); |
|
|
|
|
attemptToContactAt(tPtr,path->localSocket(),path->address(),now,true); |
|
|
|
|
path->sent(now); |
|
|
|
|
RR->t->peerConfirmingUnknownPath(tPtr,networkId,*this,path,packetId,verb); |
|
|
|
|
|