From e50377e55774777a912e1eed694261ad73ec238b Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 27 Aug 2014 22:21:29 -0400 Subject: [PATCH] random pick tunnels --- Tunnel.cpp | 2 +- TunnelPool.cpp | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) 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 ()