From c5a1e8cac8181ae089a868d8e628625e002b34b2 Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 19 Apr 2024 19:12:29 -0400 Subject: [PATCH] give preference to direct connection --- libi2pd/RouterInfo.h | 1 + libi2pd/Transports.cpp | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/libi2pd/RouterInfo.h b/libi2pd/RouterInfo.h index b5c9a557..423f1e9e 100644 --- a/libi2pd/RouterInfo.h +++ b/libi2pd/RouterInfo.h @@ -247,6 +247,7 @@ namespace data bool IsReachableFrom (const RouterInfo& other) const { return m_ReachableTransports & other.m_SupportedTransports; }; bool IsReachableBy (CompatibleTransports transports) const { return m_ReachableTransports & transports; }; CompatibleTransports GetCompatibleTransports (bool incoming) const { return incoming ? m_ReachableTransports : m_SupportedTransports; }; + CompatibleTransports GetPublishedTransports () const { return m_PublishedTransports; }; bool HasValidAddresses () const { return m_SupportedTransports; }; bool IsHidden () const { return m_Caps & eHidden; }; bool IsHighBandwidth () const { return m_Caps & RouterInfo::eHighBandwidth; }; diff --git a/libi2pd/Transports.cpp b/libi2pd/Transports.cpp index 8531e820..287cffbc 100644 --- a/libi2pd/Transports.cpp +++ b/libi2pd/Transports.cpp @@ -626,13 +626,26 @@ namespace transport if (!peer.router) return; auto compatibleTransports = context.GetRouterInfo ().GetCompatibleTransports (false) & peer.router->GetCompatibleTransports (true); + auto directTransports = compatibleTransports & peer.router->GetPublishedTransports (); peer.numAttempts = 0; peer.priority.clear (); bool ssu2 = peer.router->GetProfile ()->IsReal () ? (rand () & 1) : false; // try NTCP2 if router is not confirmed real const auto& priority = ssu2 ? ssu2Priority : ntcp2Priority; - for (auto transport: priority) - if (transport & compatibleTransports) - peer.priority.push_back (transport); + if (directTransports) + { + // direct connections have higher priority + for (auto transport: priority) + if (transport & directTransports) + peer.priority.push_back (transport); + compatibleTransports &= ~directTransports; + } + if (compatibleTransports) + { + // then remaining + for (auto transport: priority) + if (transport & compatibleTransports) + peer.priority.push_back (transport); + } } void Transports::RequestComplete (std::shared_ptr r, const i2p::data::IdentHash& ident)