diff --git a/TunnelPool.cpp b/TunnelPool.cpp index ae21c17d..e04cf501 100644 --- a/TunnelPool.cpp +++ b/TunnelPool.cpp @@ -167,17 +167,28 @@ namespace tunnel OutboundTunnel * outboundTunnel = m_OutboundTunnels.size () > 0 ? *m_OutboundTunnels.begin () : tunnels.GetNextOutboundTunnel (); LogPrint ("Creating destination inbound tunnel..."); - auto firstHop = i2p::data::netdb.GetRandomRouter (outboundTunnel ? outboundTunnel->GetEndpointRouter () : nullptr); - auto secondHop = outboundTunnel ? outboundTunnel->GetTunnelConfig ()->GetFirstHop ()->router : nullptr; - if (!secondHop || secondHop->GetIdentHash () == i2p::context.GetIdentHash ()) - secondHop = i2p::data::netdb.GetRandomRouter (firstHop); - auto * tunnel = tunnels.CreateTunnel ( - new TunnelConfig (std::vector - { - firstHop, - secondHop - }), - outboundTunnel); + const i2p::data::RouterInfo * prevHop = &i2p::context.GetRouterInfo (); + std::vector hops; + int numHops = m_NumHops; + 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++) + { + auto hop = i2p::data::netdb.GetRandomRouter (prevHop); + prevHop = hop; + hops.push_back (hop); + } + std::reverse (hops.begin (), hops.end ()); + auto * tunnel = tunnels.CreateTunnel (new TunnelConfig (hops)); tunnel->SetTunnelPool (this); }