From 457b64f92dbbce9974453da71fc5af2802a4292f Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 14 Jun 2024 18:05:01 -0400 Subject: [PATCH] try to connect to introducer through any available address --- libi2pd/RouterInfo.cpp | 7 ++++++- libi2pd/RouterInfo.h | 1 + libi2pd/SSU2.cpp | 26 ++++++++++++++++++++++---- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/libi2pd/RouterInfo.cpp b/libi2pd/RouterInfo.cpp index 13fd2e17..56281de7 100644 --- a/libi2pd/RouterInfo.cpp +++ b/libi2pd/RouterInfo.cpp @@ -1022,9 +1022,14 @@ namespace data bool RouterInfo::IsPublished (bool v4) const { if (m_Caps & (eUnreachable | eHidden)) return false; // if router sets U or H we assume that all addresses are not published - return m_PublishedTransports & (v4 ? (eNTCP2V4 | eSSU2V4) : (eNTCP2V6 | eSSU2V6)); + return IsPublishedOn (v4 ? (eNTCP2V4 | eSSU2V4) : (eNTCP2V6 | eSSU2V6)); } + bool RouterInfo::IsPublishedOn (CompatibleTransports transports) const + { + return m_PublishedTransports & transports; + } + bool RouterInfo::IsNAT2NATOnly (const RouterInfo& other) const { return !(m_PublishedTransports & other.m_SupportedTransports) && diff --git a/libi2pd/RouterInfo.h b/libi2pd/RouterInfo.h index 412c815e..cff5515e 100644 --- a/libi2pd/RouterInfo.h +++ b/libi2pd/RouterInfo.h @@ -264,6 +264,7 @@ namespace data bool IsEligibleFloodfill () const; bool IsDeclaredFloodfill () const { return m_Caps & RouterInfo::eFloodfill; }; bool IsPublished (bool v4) const; + bool IsPublishedOn (CompatibleTransports transports) const; bool IsNAT2NATOnly (const RouterInfo& other) const; // only NAT-to-NAT connection is possible bool IsSSU2PeerTesting (bool v4) const; bool IsSSU2Introducer (bool v4) const; diff --git a/libi2pd/SSU2.cpp b/libi2pd/SSU2.cpp index ab1a7d8b..41707b15 100644 --- a/libi2pd/SSU2.cpp +++ b/libi2pd/SSU2.cpp @@ -810,7 +810,8 @@ namespace transport r = i2p::data::netdb.FindRouter (introducer.iH); if (r) { - if (r->IsReachableFrom (i2p::context.GetRouterInfo ())) + if (r->IsPublishedOn (i2p::context.GetRouterInfo ().GetCompatibleTransports (false) & // outgoing + (i2p::data::RouterInfo::eSSU2V4 | i2p::data::RouterInfo::eSSU2V6))) { relayTag = introducer.iTag; addr = address->IsV6 () ? r->GetSSU2V6Address () : r->GetSSU2V4Address (); @@ -819,9 +820,26 @@ namespace transport break; else { - // address is invalid, try next introducer - relayTag = 0; - addr = nullptr; + // address is invalid try another SSU2 address if exists + if (address->IsV4 ()) + { + if (i2p::context.SupportsV6 ()) + addr = r->GetSSU2V6Address (); + } + else + { + if (i2p::context.SupportsV4 ()) + addr = r->GetSSU2V4Address (); + } + if (addr && !addr->host.is_unspecified () && addr->port && + !i2p::transport::transports.IsInReservedRange(addr->host)) + break; + else + { + // all addresses are invalid, try next introducer + relayTag = 0; + addr = nullptr; + } } } }