diff --git a/Transports.cpp b/Transports.cpp index 860d5611..0cb4a970 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -489,6 +489,14 @@ namespace transport m_PeerCleanupTimer.async_wait (std::bind (&Transports::HandlePeerCleanupTimer, this, std::placeholders::_1)); } } + + std::shared_ptr Transports::GetRandomPeer () const + { + CryptoPP::RandomNumberGenerator& rnd = i2p::context.GetRandomNumberGenerator (); + auto it = m_Peers.begin (); + std::advance (it, rnd.GenerateWord32 (0, m_Peers.size () - 1)); + return it != m_Peers.end () ? it->second.router : nullptr; + } } } diff --git a/Transports.h b/Transports.h index b5ee61fc..00bf5b6f 100644 --- a/Transports.h +++ b/Transports.h @@ -98,6 +98,8 @@ namespace transport uint32_t GetInBandwidth () const { return m_InBandwidth; }; // bytes per second uint32_t GetOutBandwidth () const { return m_OutBandwidth; }; // bytes per second bool IsBandwidthExceeded () const; + size_t GetNumPeers () const { return m_Peers.size (); }; + std::shared_ptr GetRandomPeer () const; private: diff --git a/TunnelPool.cpp b/TunnelPool.cpp index 95906472..e7d75f11 100644 --- a/TunnelPool.cpp +++ b/TunnelPool.cpp @@ -4,6 +4,7 @@ #include "NetDb.h" #include "Timestamp.h" #include "Garlic.h" +#include "Transports.h" #include "TunnelPool.h" namespace i2p @@ -341,10 +342,20 @@ namespace tunnel if (inboundTunnel) { LogPrint ("Creating destination outbound tunnel..."); - + int numHops = m_NumOutboundHops; auto prevHop = i2p::context.GetSharedRouterInfo (); std::vector > hops; - for (int i = 0; i < m_NumOutboundHops; i++) + if (i2p::transport::transports.GetNumPeers () > 25) + { + auto r = i2p::transport::transports.GetRandomPeer (); + if (r) + { + prevHop = r; + hops.push_back (r); + numHops--; + } + } + for (int i = 0; i < numHops; i++) { auto hop = SelectNextHop (prevHop); if (!hop)