From a4839bf2be7e2e88a40c27e2e555838366a6498a Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 8 Jan 2026 19:56:09 -0500 Subject: [PATCH] handle ntcp2.version param in config --- libi2pd/Config.cpp | 25 +++--- libi2pd/NTCP2.cpp | 17 +++- libi2pd/NTCP2.h | 5 +- libi2pd/RouterContext.cpp | 27 ++++-- libi2pd/RouterContext.h | 6 +- libi2pd/Transports.cpp | 179 ++++++++++++++++++++------------------ 6 files changed, 146 insertions(+), 113 deletions(-) diff --git a/libi2pd/Config.cpp b/libi2pd/Config.cpp index 51849214..71986228 100644 --- a/libi2pd/Config.cpp +++ b/libi2pd/Config.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2013-2025, The PurpleI2P Project +* Copyright (c) 2013-2026, The PurpleI2P Project * * This file is part of Purple i2pd project and licensed under BSD3 * @@ -80,9 +80,9 @@ namespace config { #if defined(__HAIKU__) // Haiku's system default is 512, so we set 4096 explicitly ("limits.openfiles", value()->default_value(4096), "Maximum number of open files (4096 by default)") -#else +#else ("limits.openfiles", value()->default_value(0), "Maximum number of open files (0 - use system default)") -#endif +#endif ("limits.transittunnels", value()->default_value(10000), "Maximum active transit tunnels (default:10000)") ("limits.zombies", value()->default_value(0), "Minimum percentage of successfully created tunnels under which tunnel cleanup is paused (default [%]: 0.00)") ("limits.ntcpsoft", value()->default_value(0), "Ignored") @@ -128,9 +128,9 @@ namespace config { ("httpproxy.i2cp.leaseSetType", value()->default_value("3"), "Local destination's LeaseSet type") #if OPENSSL_PQ ("httpproxy.i2cp.leaseSetEncType", value()->default_value("6,4,0"), "Local destination's LeaseSet encryption type") -#else +#else ("httpproxy.i2cp.leaseSetEncType", value()->default_value("4,0"), "Local destination's LeaseSet encryption type") -#endif +#endif ("httpproxy.i2cp.leaseSetPrivKey", value()->default_value(""), "LeaseSet private key") ("httpproxy.i2p.streaming.maxOutboundSpeed", value()->default_value("1730000000"), "Max outbound speed of HTTP proxy stream in bytes/sec") ("httpproxy.i2p.streaming.maxInboundSpeed", value()->default_value("1730000000"), "Max inbound speed of HTTP proxy stream in bytes/sec") @@ -160,9 +160,9 @@ namespace config { ("socksproxy.i2cp.leaseSetType", value()->default_value("3"), "Local destination's LeaseSet type") #if OPENSSL_PQ ("socksproxy.i2cp.leaseSetEncType", value()->default_value("6,4,0"), "Local destination's LeaseSet encryption type") -#else +#else ("socksproxy.i2cp.leaseSetEncType", value()->default_value("4,0"), "Local destination's LeaseSet encryption type") -#endif +#endif ("socksproxy.i2cp.leaseSetPrivKey", value()->default_value(""), "LeaseSet private key") ("socksproxy.i2p.streaming.maxOutboundSpeed", value()->default_value("1730000000"), "Max outbound speed of SOCKS proxy stream in bytes/sec") ("socksproxy.i2p.streaming.maxInboundSpeed", value()->default_value("1730000000"), "Max inbound speed of SOCKS proxy stream in bytes/sec") @@ -179,12 +179,12 @@ namespace config { ("shareddest.i2cp.leaseSetType", value()->default_value("3"), "Shared local destination's LeaseSet type") #if OPENSSL_PQ ("shareddest.i2cp.leaseSetEncType", value()->default_value("6,4,0"), "Shared local destination's LeaseSet encryption type") -#else +#else ("shareddest.i2cp.leaseSetEncType", value()->default_value("4,0"), "Shared local destination's LeaseSet encryption type") -#endif +#endif ("shareddest.i2p.streaming.profile", value()->default_value("2"), "Shared local destination bandwidth usage profile. 1 - bulk(high), 2- interactive(low)") - ; - + ; + options_description sam("SAM bridge options"); sam.add_options() ("sam.enabled", value()->default_value(true), "Enable or disable SAM Application bridge") @@ -261,7 +261,7 @@ namespace config { "https://reseed-pl.i2pd.xyz/," "https://www2.mk16.de/," "https://i2p.novg.net/," - "https://reseed.stormycloud.org/" + "https://reseed.stormycloud.org/" ), "Reseed URLs, separated by comma") ("reseed.yggurls", value()->default_value( "http://[324:71e:281a:9ed3::ace]:7070/," @@ -313,6 +313,7 @@ namespace config { ("ntcp2.port", value()->default_value(0), "Port to listen for incoming NTCP2 connections (default: auto)") ("ntcp2.addressv6", value()->default_value("::"), "Address to publish NTCP2 with") ("ntcp2.proxy", value()->default_value(""), "Proxy URL for NTCP2 transport") + ("ntcp2.version", value()->default_value(2), "Protocol version. 2 - standard, 3,4,5 - post quantum (default: 2") ; options_description ssu2("SSU2 Options"); diff --git a/libi2pd/NTCP2.cpp b/libi2pd/NTCP2.cpp index a7cd3cae..33946465 100644 --- a/libi2pd/NTCP2.cpp +++ b/libi2pd/NTCP2.cpp @@ -1115,8 +1115,9 @@ namespace transport }); } - void NTCP2Session::ServerLogin () + void NTCP2Session::ServerLogin (int version) { + if (m_Establisher) m_Establisher->SetVersion (version); SetTerminationTimeout (NTCP2_ESTABLISH_TIMEOUT); SetLastActivityTimestamp (i2p::util::GetSecondsSinceEpoch ()); boost::asio::async_read (m_Socket, boost::asio::buffer(m_Establisher->m_SessionRequestBuffer, 64), boost::asio::transfer_all (), @@ -1675,7 +1676,8 @@ namespace transport NTCP2Server::NTCP2Server (): RunnableServiceWithWork ("NTCP2"), m_TerminationTimer (GetService ()), m_ProxyType(eNoProxy), m_Resolver(GetService ()), - m_Rng(i2p::util::GetMonotonicMicroseconds ()%1000000LL) + m_Rng(i2p::util::GetMonotonicMicroseconds ()%1000000LL), + m_Version (2) { } @@ -1940,7 +1942,7 @@ namespace transport if (m_PendingIncomingSessions.emplace (ep.address (), conn).second) { conn->SetRemoteEndpoint (ep); - conn->ServerLogin (); + conn->ServerLogin (m_Version); conn = nullptr; } else @@ -1988,7 +1990,7 @@ namespace transport if (m_PendingIncomingSessions.emplace (ep.address (), conn).second) { conn->SetRemoteEndpoint (ep); - conn->ServerLogin (); + conn->ServerLogin (i2p::util::net::IsYggdrasilAddress (ep.address ()) ? 2 : m_Version); // yggdrasil is always 2 for now conn = nullptr; } else @@ -2233,5 +2235,12 @@ namespace transport { return m_Decryptor.Decrypt (msg, msgLen, ad, adLen, key, nonce, buf, len); } + + void NTCP2Server::SetVersion (int version) + { +#if OPENSSL_PQ + m_Version = version; +#endif + } } } diff --git a/libi2pd/NTCP2.h b/libi2pd/NTCP2.h index 2ed0e608..2e937c69 100644 --- a/libi2pd/NTCP2.h +++ b/libi2pd/NTCP2.h @@ -163,7 +163,7 @@ namespace transport bool IsTerminated () const { return m_IsTerminated; }; void ClientLogin (); // Alice - void ServerLogin (); // Bob + void ServerLogin (int version); // Bob void SendLocalRouterInfo (bool update) override; // after handshake or by update void SendI2NPMessages (std::list >& msgs) override; @@ -306,6 +306,7 @@ namespace transport void UseProxy(ProxyType proxy, const std::string& address, uint16_t port, const std::string& user, const std::string& pass); void SetLocalAddress (const boost::asio::ip::address& localAddress); + void SetVersion (int version); private: @@ -338,6 +339,8 @@ namespace transport i2p::crypto::AEADChaCha20Poly1305Encryptor m_Encryptor; i2p::crypto::AEADChaCha20Poly1305Decryptor m_Decryptor; + int m_Version; + public: // for HTTP/I2PControl diff --git a/libi2pd/RouterContext.cpp b/libi2pd/RouterContext.cpp index 4ee570c4..fdd25c7c 100644 --- a/libi2pd/RouterContext.cpp +++ b/libi2pd/RouterContext.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2013-2025, The PurpleI2P Project +* Copyright (c) 2013-2026, The PurpleI2P Project * * This file is part of Purple i2pd project and licensed under BSD3 * @@ -406,16 +406,17 @@ namespace i2p } void RouterContext::PublishNTCP2Address (std::shared_ptr address, - int port, bool publish) const + int port, bool publish, int version) const { if (!address) return; if (!port && !address->port) port = SelectRandomPort (); if (port) address->port = port; address->published = publish; + address->v = version; memcpy (address->i, m_NTCP2Keys->iv, 16); } - void RouterContext::PublishNTCP2Address (int port, bool publish, bool v4, bool v6, bool ygg) + void RouterContext::PublishNTCP2Address (int port, bool publish, bool v4, bool v6, bool ygg, int version) { if (!m_NTCP2Keys) return; auto addresses = m_RouterInfo.GetAddresses (); @@ -426,7 +427,7 @@ namespace i2p auto addr = (*addresses)[i2p::data::RouterInfo::eNTCP2V4Idx]; if (addr && (addr->port != port || addr->published != publish)) { - PublishNTCP2Address (addr, port, publish); + PublishNTCP2Address (addr, port, publish, version); updated = true; } } @@ -435,7 +436,7 @@ namespace i2p auto addr = (*addresses)[i2p::data::RouterInfo::eNTCP2V6Idx]; if (addr && (addr->port != port || addr->published != publish)) { - PublishNTCP2Address (addr, port, publish); + PublishNTCP2Address (addr, port, publish, version); updated = true; } } @@ -444,7 +445,7 @@ namespace i2p auto addr = (*addresses)[i2p::data::RouterInfo::eNTCP2V6MeshIdx]; if (addr && (addr->port != port || addr->published != publish)) { - PublishNTCP2Address (addr, port, publish); + PublishNTCP2Address (addr, port, publish, 2); updated = true; } } @@ -782,7 +783,13 @@ namespace i2p // unpublish NTCP2 addreeses bool ntcp2; i2p::config::GetOption("ntcp2.enabled", ntcp2); if (ntcp2) - PublishNTCP2Address (port, false, v4, v6, false); + { + int ntcp2version = 2; +#if OPENSSL_PQ + i2p::config::GetOption("ntcp2.version", ntcp2version); +#endif + PublishNTCP2Address (port, false, v4, v6, false, ntcp2version); + } // update m_RouterInfo.UpdateSupportedTransports (); UpdateRouterInfo (); @@ -824,7 +831,11 @@ namespace i2p { uint16_t ntcp2Port; i2p::config::GetOption ("ntcp2.port", ntcp2Port); if (!ntcp2Port) ntcp2Port = port; - PublishNTCP2Address (ntcp2Port, true, v4, v6, false); + int ntcp2version = 2; +#if OPENSSL_PQ + i2p::config::GetOption("ntcp2.version", ntcp2version); +#endif + PublishNTCP2Address (ntcp2Port, true, v4, v6, false, ntcp2version); } } // update diff --git a/libi2pd/RouterContext.h b/libi2pd/RouterContext.h index 315b1d85..8d4d8c0f 100644 --- a/libi2pd/RouterContext.h +++ b/libi2pd/RouterContext.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2013-2025, The PurpleI2P Project +* Copyright (c) 2013-2026, The PurpleI2P Project * * This file is part of Purple i2pd project and licensed under BSD3 * @@ -152,7 +152,7 @@ namespace garlic void UpdatePort (int port); // called from Daemon void UpdateAddress (const boost::asio::ip::address& host); // called from SSU2 or Daemon - void PublishNTCP2Address (int port, bool publish, bool v4, bool v6, bool ygg); + void PublishNTCP2Address (int port, bool publish, bool v4, bool v6, bool ygg, int version); void PublishSSU2Address (int port, bool publish, bool v4, bool v6); bool AddSSU2Introducer (const i2p::data::RouterInfo::Introducer& introducer, bool v4); void RemoveSSU2Introducer (const i2p::data::IdentHash& h, bool v4); @@ -221,7 +221,7 @@ namespace garlic void SaveKeys (); void Sign (const uint8_t * buf, int len, uint8_t * signature) const { m_Keys.Sign (buf, len, signature); }; uint16_t SelectRandomPort () const; - void PublishNTCP2Address (std::shared_ptr address, int port, bool publish) const; + void PublishNTCP2Address (std::shared_ptr address, int port, bool publish, int version) const; void UpdateSSU2AddressCapsIntroducer (std::shared_ptr address, bool isIntroducer) const; void UpdateSSU2AddressCapsTesting (std::shared_ptr address, bool isTesting) const; diff --git a/libi2pd/Transports.cpp b/libi2pd/Transports.cpp index aebbb4e4..b05437ba 100644 --- a/libi2pd/Transports.cpp +++ b/libi2pd/Transports.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2013-2025, The PurpleI2P Project +* Copyright (c) 2013-2026, The PurpleI2P Project * * This file is part of Purple i2pd project and licensed under BSD3 * @@ -142,14 +142,14 @@ namespace transport void Peer::UpdateParams (std::shared_ptr router) { if (router) - { + { isHighBandwidth = router->IsHighBandwidth (); isEligible =(bool)router->GetCompatibleTransports (true) && // reachable router->GetCongestion () != i2p::data::RouterInfo::eRejectAll && // accepts tunnel router->IsECIES () && router->GetVersion () >= NETDB_MIN_HIGHBANDWIDTH_VERSION; // not too old - } - } - + } + } + Transports transports; Transports::Transports (): @@ -196,6 +196,10 @@ namespace transport m_IsRunning = true; m_Thread = new std::thread (std::bind (&Transports::Run, this)); std::string ntcp2proxy; i2p::config::GetOption("ntcp2.proxy", ntcp2proxy); + int ntcp2version = 2; +#if OPENSSL_PQ + i2p::config::GetOption("ntcp2.version", ntcp2version); +#endif i2p::http::URL proxyurl; // create NTCP2. TODO: move to acceptor if (enableNTCP2 || i2p::context.SupportsMesh ()) @@ -225,6 +229,7 @@ namespace transport } else m_NTCP2Server = new NTCP2Server (); + m_NTCP2Server->SetVersion (ntcp2version); } // create SSU2 server @@ -467,9 +472,9 @@ namespace transport return boost::asio::post (*m_Service, boost::asio::use_future ([this, ident, msgs = std::move(msgs)] () mutable { return PostMessages (ident, msgs); - })); - } - + })); + } + std::shared_ptr Transports::PostMessages (const i2p::data::IdentHash& ident, std::list >& msgs) { if (ident == i2p::context.GetRouterInfo ().GetIdentHash ()) @@ -487,7 +492,7 @@ namespace transport auto it = m_Peers.find (ident); if (it != m_Peers.end ()) peer = it->second; - } + } if (!peer) { // check if not banned @@ -500,7 +505,7 @@ namespace transport if (r && (r->IsUnreachable () || !r->IsReachableFrom (i2p::context.GetRouterInfo ()))) return nullptr; // router found but non-reachable peer = std::make_shared(r, i2p::util::GetSecondsSinceEpoch ()); - { + { std::lock_guard l(m_PeersMutex); peer = m_Peers.emplace (ident, peer).first->second; } @@ -513,17 +518,17 @@ namespace transport } if (!connected) return nullptr; } - + if (!peer) return nullptr; if (peer->IsConnected ()) - { - auto session = peer->sessions.front (); + { + auto session = peer->sessions.front (); if (session) session->SendI2NPMessages (msgs); return session; - } + } else { - auto sz = peer->delayedMessages.size (); + auto sz = peer->delayedMessages.size (); if (sz < MAX_NUM_DELAYED_MESSAGES) { if (sz < CHECK_PROFILE_NUM_DELAYED_MESSAGES && sz + msgs.size () >= CHECK_PROFILE_NUM_DELAYED_MESSAGES) @@ -534,16 +539,16 @@ namespace transport std::lock_guard l(m_PeersMutex); m_Peers.erase (ident); return nullptr; - } - } + } + } if (sz > MAX_NUM_DELAYED_MESSAGES/2) - { + { for (auto& it1: msgs) if (it1->onDrop) it1->Drop (); // drop earlier because we can handle it else peer->delayedMessages.push_back (it1); - } + } else peer->delayedMessages.splice (peer->delayedMessages.end (), msgs); } @@ -561,14 +566,14 @@ namespace transport bool Transports::ConnectToPeer (const i2p::data::IdentHash& ident, std::shared_ptr peer) { if (!peer->router) // reconnect - { + { auto r = netdb.FindRouter (ident); // try to get new one from netdb if (r) - { - peer->SetRouter (r); + { + peer->SetRouter (r); r->CancelBufferToDelete (); - } - } + } + } if (peer->router) // we have RI already { if (peer->priority.empty ()) @@ -680,43 +685,43 @@ namespace transport auto directTransports = compatibleTransports & peer->router->GetPublishedTransports (); peer->numAttempts = 0; peer->priority.clear (); - + std::shared_ptr profile; if (peer->router->HasProfile ()) profile = peer->router->GetProfile (); // only if in memory bool ssu2 = false; // NTCP2 by default bool isReal = profile ? profile->IsReal () : true; - if (isReal) - { + if (isReal) + { ssu2 = m_Rng () & 1; // 1/2 if (ssu2 && !profile) - { + { profile = peer->router->GetProfile (); // load profile if necessary - isReal = profile->IsReal (); + isReal = profile->IsReal (); if (!isReal) ssu2 = false; // try NTCP2 if router is not confirmed real } - } + } const auto& priority = ssu2 ? ssu2Priority : ntcp2Priority; if (directTransports) - { + { // direct connections have higher priority if (!isReal && (directTransports & (i2p::data::RouterInfo::eNTCP2V4 | i2p::data::RouterInfo::eNTCP2V6))) { // Non-confirmed router and a NTCP2 direct connection is presented compatibleTransports &= ~directTransports; // exclude SSU2 direct connections directTransports &= ~(i2p::data::RouterInfo::eSSU2V4 | i2p::data::RouterInfo::eSSU2V6); - } + } 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); - } + } if (peer->priority.empty ()) { // try recently connected SSU2 if any @@ -727,22 +732,22 @@ namespace transport { auto ep = peer->router->GetProfile ()->GetLastEndpoint (); if (!ep.address ().is_unspecified () && ep.port ()) - { + { if (ep.address ().is_v4 ()) - { + { if ((supportedTransports & i2p::data::RouterInfo::eSSU2V4) && m_SSU2Server->IsConnectedRecently (ep, false)) peer->priority.push_back (i2p::data::RouterInfo::eSSU2V4); - } + } else if (ep.address ().is_v6 ()) { if ((supportedTransports & i2p::data::RouterInfo::eSSU2V6) && m_SSU2Server->IsConnectedRecently (ep)) peer->priority.push_back (i2p::data::RouterInfo::eSSU2V6); } - } - } - } + } + } + } } void Transports::RequestComplete (std::shared_ptr r, const i2p::data::IdentHash& ident) @@ -762,9 +767,9 @@ namespace transport peer = it->second; else m_Peers.erase (it); - } + } } - + if (peer && !peer->router && r) { LogPrint (eLogDebug, "Transports: RouterInfo for ", ident.ToBase64 (), " found, trying to connect"); @@ -807,16 +812,16 @@ namespace transport if (router) { if (!i2p::context.GetTesting ()) - { + { i2p::context.SetTesting (true); - // send first peer test immediately + // send first peer test immediately m_SSU2Server->StartPeerTest (router, true); - } + } else { testDelay += PEER_TEST_DELAY_INTERVAL + m_Rng() % PEER_TEST_DELAY_INTERVAL_VARIANCE; if (m_Service) - { + { auto delayTimer = std::make_shared(*m_Service); delayTimer->expires_from_now (boost::posix_time::milliseconds (testDelay)); delayTimer->async_wait ( @@ -824,9 +829,9 @@ namespace transport { if (ecode != boost::asio::error::operation_aborted) m_SSU2Server->StartPeerTest (router, true); - }); - } - } + }); + } + } excluded.insert (router->GetIdentHash ()); } } @@ -845,16 +850,16 @@ namespace transport if (router) { if (!i2p::context.GetTestingV6 ()) - { - i2p::context.SetTestingV6 (true); - // send first peer test immediately + { + i2p::context.SetTestingV6 (true); + // send first peer test immediately m_SSU2Server->StartPeerTest (router, false); - } + } else { testDelay += PEER_TEST_DELAY_INTERVAL + m_Rng() % PEER_TEST_DELAY_INTERVAL_VARIANCE; if (m_Service) - { + { auto delayTimer = std::make_shared(*m_Service); delayTimer->expires_from_now (boost::posix_time::milliseconds (testDelay)); delayTimer->async_wait ( @@ -862,8 +867,8 @@ namespace transport { if (ecode != boost::asio::error::operation_aborted) m_SSU2Server->StartPeerTest (router, false); - }); - } + }); + } } excluded.insert (router->GetIdentHash ()); } @@ -903,19 +908,19 @@ namespace transport for (int i = 0; i < numExcluded; i++) transports |= peer->priority[i]; i2p::data::netdb.ExcludeReachableTransports (ident, transports); - } + } if (peer->router && peer->numAttempts) - { + { auto transport = peer->priority[peer->numAttempts-1]; - if (transport == i2p::data::RouterInfo::eNTCP2V4 || + if (transport == i2p::data::RouterInfo::eNTCP2V4 || transport == i2p::data::RouterInfo::eNTCP2V6 || transport == i2p::data::RouterInfo::eNTCP2V6Mesh) i2p::data::UpdateRouterProfile (ident, [](std::shared_ptr profile) { if (profile) profile->Connected (); // outgoing NTCP2 connection if always real }); - i2p::data::netdb.SetUnreachable (ident, false); // clear unreachable - } + i2p::data::netdb.SetUnreachable (ident, false); // clear unreachable + } peer->numAttempts = 0; peer->router = nullptr; // we don't need RouterInfo after successive connect bool sendDatabaseStore = true; @@ -946,7 +951,7 @@ namespace transport { std::list > msgs{ CreateDatabaseStoreMsg () }; session->SendI2NPMessages (msgs); // send DatabaseStore - } + } auto r = i2p::data::netdb.FindRouter (ident); // router should be in netdb after SessionConfirmed i2p::data::UpdateRouterProfile (ident, [](std::shared_ptr profile) @@ -990,7 +995,7 @@ namespace transport std::lock_guard l(m_PeersMutex); m_Peers.erase (it); } - // delete buffer of just disconnected router + // delete buffer of just disconnected router auto r = i2p::data::netdb.FindRouter (ident); if (r && !r->IsUpdated ()) r->ScheduleBufferToDelete (); } @@ -1004,10 +1009,10 @@ namespace transport std::lock_guard l(m_PeersMutex); #if __cplusplus >= 202002L // C++20 return m_Peers.contains (ident); -#else +#else auto it = m_Peers.find (ident); return it != m_Peers.end (); -#endif +#endif } void Transports::HandlePeerCleanupTimer (const boost::system::error_code& ecode) @@ -1025,8 +1030,8 @@ namespace transport if (!it->second->IsConnected () && ts > it->second->creationTime + SESSION_CREATION_TIMEOUT) { LogPrint (eLogWarning, "Transports: Session to peer ", it->first.ToBase64 (), " has not been created in ", SESSION_CREATION_TIMEOUT, " seconds"); - /* if (!it->second.router) - { + /* if (!it->second.router) + { // if router for ident not found mark it unreachable auto profile = i2p::data::GetRouterProfile (it->first); if (profile) profile->Unreachable (); @@ -1199,7 +1204,7 @@ namespace transport m_TrustedRouters.insert(ri); } - bool Transports::RoutesRestricted() const + bool Transports::RoutesRestricted() const { { std::lock_guard routerslock(m_TrustedRoutersMutex); @@ -1254,15 +1259,15 @@ namespace transport if (m_TrustedRouters.contains (ih)) #else if (m_TrustedRouters.count (ih) > 0) -#endif +#endif return true; return false; - } - + } + bool Transports::IsRestrictedPeer(const i2p::data::IdentHash& ih) const { if (IsTrustedRouter (ih)) return true; - + { std::lock_guard l(m_FamilyMutex); auto ri = i2p::data::netdb.FindRouter(ih); @@ -1287,13 +1292,13 @@ namespace transport int Transports::GetLocalDelay () const { return (i2p::context.GetStatus () == eRouterStatusProxy) ? 1000 : 0; // 1 sec for proxy. TODO: implement param - } - - bool Transports::IsInReservedRange (const boost::asio::ip::address& host) const + } + + bool Transports::IsInReservedRange (const boost::asio::ip::address& host) const { return IsCheckReserved () && i2p::util::net::IsInReservedRange (host); - } - + } + void InitAddressFromIface () { bool ipv6; i2p::config::GetOption("ipv6", ipv6); @@ -1356,8 +1361,8 @@ namespace transport { LogPrint(eLogWarning, "Transports: Clearnet ipv6 not found. Disabled"); ipv6 = false; - } - + } + if (!i2p::config::IsDefault("port")) { LogPrint(eLogInfo, "Transports: Accepting incoming connections at port ", port); @@ -1370,18 +1375,22 @@ namespace transport bool ntcp2; i2p::config::GetOption("ntcp2.enabled", ntcp2); if (ntcp2) { - bool published = false; + bool published = false; if (!stan) i2p::config::GetOption("ntcp2.published", published); if (published) { std::string ntcp2proxy; i2p::config::GetOption("ntcp2.proxy", ntcp2proxy); if (!ntcp2proxy.empty ()) published = false; } + int ntcp2version = 2; +#if OPENSSL_PQ + i2p::config::GetOption("ntcp2.version", ntcp2version); +#endif if (published) { uint16_t ntcp2port; i2p::config::GetOption("ntcp2.port", ntcp2port); if (!ntcp2port) ntcp2port = port; // use standard port - i2p::context.PublishNTCP2Address (ntcp2port, true, ipv4, ipv6, false); // publish + i2p::context.PublishNTCP2Address (ntcp2port, true, ipv4, ipv6, false, ntcp2version); // publish if (ipv6) { std::string ipv6Addr; i2p::config::GetOption("ntcp2.addressv6", ipv6Addr); @@ -1391,11 +1400,11 @@ namespace transport } } else - i2p::context.PublishNTCP2Address (port, false, ipv4, ipv6, false); // unpublish + i2p::context.PublishNTCP2Address (port, false, ipv4, ipv6, false, ntcp2version); // unpublish } if (ygg) { - i2p::context.PublishNTCP2Address (port, true, false, false, true); + i2p::context.PublishNTCP2Address (port, true, false, false, true, 2); i2p::context.UpdateNTCP2V6Address (yggaddr); if (!ipv4 && !ipv6) i2p::context.SetStatus (eRouterStatusMesh); @@ -1407,7 +1416,7 @@ namespace transport { uint16_t ssu2port; i2p::config::GetOption("ssu2.port", ssu2port); if (!ssu2port && port) ssu2port = port; - bool published = false; + bool published = false; if (!stan) i2p::config::GetOption("ssu2.published", published); if (published) i2p::context.PublishSSU2Address (ssu2port, true, ipv4, ipv6); // publish