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,41 +290,51 @@ namespace tunnel hop = i2p::data::netdb.GetRandomRouter (); return hop; } - - void TunnelPool::CreateInboundTunnel () + + bool TunnelPool::SelectPeers (std::vector >& hops) { - auto outboundTunnel = GetNextOutboundTunnel (); - 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); + 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 for inbound tunnel"); - return; + LogPrint (eLogError, "Can't select next hop"); + return false; } 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 ()); + return true; + } + + void TunnelPool::CreateInboundTunnel () + { + auto outboundTunnel = GetNextOutboundTunnel (); + if (!outboundTunnel) + outboundTunnel = tunnels.GetNextOutboundTunnel (); + LogPrint ("Creating destination inbound tunnel..."); + std::vector > hops; + if (SelectPeers (hops)) + { + 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: