From 8350ebb308dcff80a930d4b1d39adadbc38a2225 Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 27 May 2026 20:14:07 -0400 Subject: [PATCH] select OBEP/IBGW based on peer ordering key for low bandwidth tunnels --- libi2pd/NetDb.cpp | 10 ++++++++-- libi2pd/NetDb.hpp | 3 ++- libi2pd/TunnelPool.cpp | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/libi2pd/NetDb.cpp b/libi2pd/NetDb.cpp index 3e4f32d9..48ad68c1 100644 --- a/libi2pd/NetDb.cpp +++ b/libi2pd/NetDb.cpp @@ -1151,13 +1151,19 @@ namespace data } std::shared_ptr NetDb::GetRandomRouter (std::shared_ptr compatibleWith, - bool reverse, bool endpoint, bool clientTunnel) const + bool reverse, bool endpoint, bool clientTunnel, PeerOrdering * peerOrdering) const { bool checkIsReal = clientTunnel && i2p::tunnel::tunnels.GetPreciseTunnelCreationSuccessRate () < NETDB_TUNNEL_CREATION_RATE_THRESHOLD && // too low rate context.GetUptime () > NETDB_CHECK_FOR_EXPIRATION_UPTIME; // after 10 minutes uptime return GetRandomRouter ( - [compatibleWith, reverse, endpoint, clientTunnel, checkIsReal](std::shared_ptr router)->bool + [compatibleWith, reverse, endpoint, clientTunnel, checkIsReal, peerOrdering](std::shared_ptr router)->bool { + if (peerOrdering) + { + bool lastHop = peerOrdering->IsLastHop (router->GetIdentHash ()); + if (endpoint && !lastHop) return false; + if (lastHop && !endpoint && router->IsV4 ()) return false; // if router is eligible for endpoint but it's not + } return !router->IsHidden () && router != compatibleWith && (reverse ? (compatibleWith->IsReachableFrom (*router) && router->GetCompatibleTransports (true)): router->IsReachableFrom (*compatibleWith)) && !router->IsNAT2NATOnly (*compatibleWith) && diff --git a/libi2pd/NetDb.hpp b/libi2pd/NetDb.hpp index 6fde3644..358e003a 100644 --- a/libi2pd/NetDb.hpp +++ b/libi2pd/NetDb.hpp @@ -94,7 +94,8 @@ namespace data void RequestDestination (const IdentHash& destination, RequestedDestination::RequestComplete requestComplete = nullptr, bool direct = true); std::shared_ptr GetRandomRouter () const; - std::shared_ptr GetRandomRouter (std::shared_ptr compatibleWith, bool reverse, bool endpoint, bool clientTunnel) const; + std::shared_ptr GetRandomRouter (std::shared_ptr compatibleWith, + bool reverse, bool endpoint, bool clientTunnel, PeerOrdering * peerOrdering = nullptr) const; std::shared_ptr GetHighBandwidthRandomRouter (std::shared_ptr compatibleWith, bool reverse, bool endpoint, PeerOrdering * peerOrdering = nullptr) const; std::shared_ptr GetRandomSSU2PeerTestRouter (bool v4, const std::unordered_set& excluded) const; diff --git a/libi2pd/TunnelPool.cpp b/libi2pd/TunnelPool.cpp index 6f09ebe7..464143ca 100644 --- a/libi2pd/TunnelPool.cpp +++ b/libi2pd/TunnelPool.cpp @@ -578,7 +578,7 @@ namespace tunnel hop = tryClient ? (m_IsHighBandwidth ? i2p::data::netdb.GetHighBandwidthRandomRouter (prevHop, reverse, endpoint, &m_PeerOrdering) : - i2p::data::netdb.GetRandomRouter (prevHop, reverse, endpoint, true)): + i2p::data::netdb.GetRandomRouter (prevHop, reverse, endpoint, true, &m_PeerOrdering)): i2p::data::netdb.GetRandomRouter (prevHop, reverse, endpoint, false); if (hop) {