diff --git a/NetDb.cpp b/NetDb.cpp index 02601e20..435e710b 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -785,22 +785,34 @@ namespace data } } + const RouterInfo * NetDb::GetRandomRouter () const + { + return GetRandomRouter ( + [](const RouterInfo * router)->bool + { + return !router->IsHidden (); + }); + } + const RouterInfo * NetDb::GetRandomRouter (const RouterInfo * compatibleWith) const { - if (compatibleWith) - return GetRandomRouter ( - [compatibleWith](const RouterInfo * router)->bool - { - return !router->IsHidden () && router->IsCompatible (*compatibleWith); - }); - else - return GetRandomRouter ( - [](const RouterInfo * router)->bool - { - return !router->IsHidden (); - }); + return GetRandomRouter ( + [compatibleWith](const RouterInfo * router)->bool + { + return !router->IsHidden () && router->IsCompatible (*compatibleWith); + }); } + const RouterInfo * NetDb::GetHighBandwidthRandomRouter (const RouterInfo * compatibleWith) const + { + return GetRandomRouter ( + [compatibleWith](const RouterInfo * router)->bool + { + return !router->IsHidden () && router->IsCompatible (*compatibleWith) && + (router->GetCaps () & RouterInfo::eHighBandwidth); + }); + } + template const RouterInfo * NetDb::GetRandomRouter (Filter filter) const { diff --git a/NetDb.h b/NetDb.h index 5a696e66..159644be 100644 --- a/NetDb.h +++ b/NetDb.h @@ -79,8 +79,10 @@ namespace data void HandleDatabaseSearchReplyMsg (I2NPMessage * msg); void HandleDatabaseLookupMsg (I2NPMessage * msg); - const RouterInfo * GetRandomRouter (const RouterInfo * compatibleWith = nullptr) const; - + const RouterInfo * GetRandomRouter () const; + const RouterInfo * GetRandomRouter (const RouterInfo * compatibleWith) const; + const RouterInfo * GetHighBandwidthRandomRouter (const RouterInfo * compatibleWith) const; + void PostI2NPMsg (I2NPMessage * msg); // for web interface diff --git a/TunnelPool.cpp b/TunnelPool.cpp index fc725238..3aef8120 100644 --- a/TunnelPool.cpp +++ b/TunnelPool.cpp @@ -197,6 +197,15 @@ namespace tunnel i2p::garlic::routing.PostI2NPMsg (msg); } + const i2p::data::RouterInfo * TunnelPool::SelectNextHop (const i2p::data::RouterInfo * prevHop) const + { + auto hop = m_NumHops >= 3 ? i2p::data::netdb.GetHighBandwidthRandomRouter (prevHop) : + i2p::data::netdb.GetRandomRouter (prevHop); + if (!hop) + hop = i2p::data::netdb.GetRandomRouter (); + return hop; + } + void TunnelPool::CreateInboundTunnel () { OutboundTunnel * outboundTunnel = GetNextOutboundTunnel (); @@ -219,7 +228,7 @@ namespace tunnel } for (int i = 0; i < numHops; i++) { - auto hop = i2p::data::netdb.GetRandomRouter (prevHop); + auto hop = SelectNextHop (prevHop); prevHop = hop; hops.push_back (hop); } @@ -251,7 +260,7 @@ namespace tunnel std::vector hops; for (int i = 0; i < m_NumHops; i++) { - auto hop = i2p::data::netdb.GetRandomRouter (prevHop); + auto hop = SelectNextHop (prevHop); prevHop = hop; hops.push_back (hop); } @@ -263,7 +272,7 @@ namespace tunnel else LogPrint ("Can't create outbound tunnel. No inbound tunnels found"); } - + void TunnelPool::RecreateOutboundTunnel (OutboundTunnel * tunnel) { InboundTunnel * inboundTunnel = GetNextInboundTunnel (); diff --git a/TunnelPool.h b/TunnelPool.h index 855b0409..da2fe2a2 100644 --- a/TunnelPool.h +++ b/TunnelPool.h @@ -7,6 +7,7 @@ #include #include "Identity.h" #include "LeaseSet.h" +#include "RouterInfo.h" #include "I2NPProtocol.h" #include "TunnelBase.h" #include "RouterContext.h" @@ -53,6 +54,7 @@ namespace tunnel template typename TTunnels::value_type GetNextTunnel (TTunnels& tunnels, typename TTunnels::value_type suggested = nullptr); + const i2p::data::RouterInfo * SelectNextHop (const i2p::data::RouterInfo * prevHop) const; private: