diff --git a/libi2pd/Transports.cpp b/libi2pd/Transports.cpp index 9265f289..9f3e75b7 100644 --- a/libi2pd/Transports.cpp +++ b/libi2pd/Transports.cpp @@ -772,10 +772,15 @@ namespace transport std::shared_ptr Transports::GetRandomPeer () const { if (m_Peers.empty ()) return nullptr; - std::unique_lock l(m_PeersMutex); - auto it = m_Peers.begin (); - std::advance (it, rand () % m_Peers.size ()); - return it != m_Peers.end () ? it->second.router : nullptr; + i2p::data::IdentHash ident; + { + std::unique_lock l(m_PeersMutex); + auto it = m_Peers.begin (); + std::advance (it, rand () % m_Peers.size ()); + if (it == m_Peers.end () || it->second.router) return nullptr; // not connected + ident = it->first; + } + return i2p::data::netdb.FindRouter (ident); } void Transports::RestrictRoutesToFamilies(std::set families) { diff --git a/libi2pd/TunnelPool.cpp b/libi2pd/TunnelPool.cpp index 417f5f15..038bbb0f 100644 --- a/libi2pd/TunnelPool.cpp +++ b/libi2pd/TunnelPool.cpp @@ -406,6 +406,7 @@ namespace tunnel bool StandardSelectPeers(Path & peers, int numHops, bool inbound, SelectHopFunc nextHop) { + int start = 0; auto prevHop = i2p::context.GetSharedRouterInfo (); if(i2p::transport::transports.RoutesRestricted()) { @@ -414,6 +415,7 @@ namespace tunnel if(!hop) return false; peers.push_back(hop->GetRouterIdentity()); prevHop = hop; + start++; } else if (i2p::transport::transports.GetNumPeers () > 25) { @@ -423,11 +425,11 @@ namespace tunnel { prevHop = r; peers.push_back (r->GetRouterIdentity ()); - numHops--; + start++; } } - for(int i = 0; i < numHops; i++ ) + for(int i = start; i < numHops; i++ ) { auto hop = nextHop (prevHop, inbound); if (!hop && !i) // if no suitable peer found for first hop, try already connected