diff --git a/Tunnel.cpp b/Tunnel.cpp index 75f89c0e..5a736f61 100644 --- a/Tunnel.cpp +++ b/Tunnel.cpp @@ -273,7 +273,7 @@ namespace tunnel OutboundTunnel * tunnel = nullptr; for (auto it: m_OutboundTunnels) { - if (i >= ind) return it; + if (i >= ind) break; if (it->IsEstablished ()) { tunnel = it; diff --git a/TunnelPool.cpp b/TunnelPool.cpp index 590e459f..6481fa40 100644 --- a/TunnelPool.cpp +++ b/TunnelPool.cpp @@ -91,10 +91,20 @@ namespace tunnel if (tunnels.empty ()) return nullptr; if (suggested && tunnels.count (suggested) > 0 && suggested->IsEstablished ()) return suggested; + + CryptoPP::RandomNumberGenerator& rnd = i2p::context.GetRandomNumberGenerator (); + uint32_t ind = rnd.GenerateWord32 (0, tunnels.size ()/2), i = 0; + typename TTunnels::value_type tunnel = nullptr; for (auto it: tunnels) + { + if (i >= ind) break; if (it->IsEstablished ()) - return it; - return nullptr; + { + tunnel = it; + i++; + } + } + return tunnel; } void TunnelPool::CreateTunnels ()