diff --git a/TunnelPool.cpp b/TunnelPool.cpp index cc7b4eb0..0eaed3a3 100644 --- a/TunnelPool.cpp +++ b/TunnelPool.cpp @@ -70,7 +70,7 @@ namespace tunnel std::unique_lock l(m_OutboundTunnelsMutex); m_OutboundTunnels.insert (createdTunnel); } - CreatePairedInboundTunnel (createdTunnel); + //CreatePairedInboundTunnel (createdTunnel); } void TunnelPool::TunnelExpired (std::shared_ptr expiredTunnel) @@ -290,6 +290,35 @@ namespace tunnel hop = i2p::data::netdb.GetRandomRouter (); return hop; } + + bool TunnelPool::SelectPeers (std::vector >& hops) + { + auto prevHop = i2p::context.GetSharedRouterInfo (); + int numHops = m_NumInboundHops; + if (i2p::transport::transports.GetNumPeers () > 25) + { + auto r = i2p::transport::transports.GetRandomPeer (); + if (r && !r->GetProfile ()->IsBad ()) + { + prevHop = r; + hops.push_back (r); + numHops--; + } + } + + for (int i = 0; i < numHops; i++) + { + auto hop = SelectNextHop (prevHop); + if (!hop) + { + LogPrint (eLogError, "Can't select next hop"); + return false; + } + prevHop = hop; + hops.push_back (hop); + } + return true; + } void TunnelPool::CreateInboundTunnel () { @@ -297,34 +326,15 @@ namespace tunnel if (!outboundTunnel) outboundTunnel = tunnels.GetNextOutboundTunnel (); LogPrint ("Creating destination inbound tunnel..."); - auto prevHop = i2p::context.GetSharedRouterInfo (); std::vector > hops; - int numHops = m_NumInboundHops; - if (outboundTunnel) - { - // last hop - auto hop = outboundTunnel->GetTunnelConfig ()->GetFirstHop ()->router; - if (hop->GetIdentHash () != i2p::context.GetIdentHash ()) // outbound shouldn't be zero-hop tunnel - { - prevHop = hop; - hops.push_back (prevHop); - numHops--; - } - } - for (int i = 0; i < numHops; i++) + if (SelectPeers (hops)) { - auto hop = SelectNextHop (prevHop); - if (!hop) - { - LogPrint (eLogError, "Can't select next hop for inbound tunnel"); - return; - } - prevHop = hop; - hops.push_back (hop); - } - std::reverse (hops.begin (), hops.end ()); - auto tunnel = tunnels.CreateTunnel (std::make_shared (hops), outboundTunnel); - tunnel->SetTunnelPool (shared_from_this ()); + std::reverse (hops.begin (), hops.end ()); + auto tunnel = tunnels.CreateTunnel (std::make_shared (hops), outboundTunnel); + tunnel->SetTunnelPool (shared_from_this ()); + } + else + LogPrint (eLogError, "Can't create inbound tunnel. No peers available"); } void TunnelPool::RecreateInboundTunnel (std::shared_ptr tunnel) @@ -345,34 +355,15 @@ namespace tunnel if (inboundTunnel) { LogPrint ("Creating destination outbound tunnel..."); - int numHops = m_NumOutboundHops; - auto prevHop = i2p::context.GetSharedRouterInfo (); std::vector > hops; - 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) - { - LogPrint (eLogError, "Can't select next hop for outbound tunnel"); - return; - } - prevHop = hop; - hops.push_back (hop); + if (SelectPeers (hops)) + { + auto tunnel = tunnels.CreateTunnel ( + std::make_shared (hops, inboundTunnel->GetTunnelConfig ())); + tunnel->SetTunnelPool (shared_from_this ()); } - - auto tunnel = tunnels.CreateTunnel ( - std::make_shared (hops, inboundTunnel->GetTunnelConfig ())); - tunnel->SetTunnelPool (shared_from_this ()); + else + LogPrint (eLogError, "Can't create outbound tunnel. No peers available"); } else LogPrint (eLogError, "Can't create outbound tunnel. No inbound tunnels found"); diff --git a/TunnelPool.h b/TunnelPool.h index 5f2dd5ce..b20cfaf2 100644 --- a/TunnelPool.h +++ b/TunnelPool.h @@ -61,6 +61,7 @@ namespace tunnel template typename TTunnels::value_type GetNextTunnel (TTunnels& tunnels, typename TTunnels::value_type excluded) const; std::shared_ptr SelectNextHop (std::shared_ptr prevHop) const; + bool SelectPeers (std::vector >& hops); private: