From e5753ec44ee3b25d801d6b190c9c7630dc446a17 Mon Sep 17 00:00:00 2001 From: orignal Date: Tue, 17 Mar 2026 19:36:43 -0400 Subject: [PATCH] adjust MTU after remote endpoint is known --- libi2pd/SSU2.cpp | 1 + libi2pd/SSU2Session.cpp | 8 ++++---- libi2pd/SSU2Session.h | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/libi2pd/SSU2.cpp b/libi2pd/SSU2.cpp index 7fe2064f..4b6532bd 100644 --- a/libi2pd/SSU2.cpp +++ b/libi2pd/SSU2.cpp @@ -784,6 +784,7 @@ namespace transport { auto session = std::make_shared (*this); session->SetRemoteEndpoint (senderEndpoint); + session->AdjustMaxPayloadSize (); session->SetVersion (m_Version); session->ProcessFirstIncomingMessage (connID, buf, len); } diff --git a/libi2pd/SSU2Session.cpp b/libi2pd/SSU2Session.cpp index 4658f1e6..8089fe8b 100644 --- a/libi2pd/SSU2Session.cpp +++ b/libi2pd/SSU2Session.cpp @@ -91,7 +91,7 @@ namespace transport m_WindowSize (SSU2_MIN_WINDOW_SIZE), m_RTO (SSU2_INITIAL_RTO), m_RelayTag (0),m_ConnectTimer (server.GetService ()), m_TerminationReason (eSSU2TerminationReasonNormalClose), - m_MaxPayloadSize (SSU2_MIN_PACKET_SIZE - IPV6_HEADER_SIZE - UDP_HEADER_SIZE - 32), // min size + m_MaxPayloadSize (SSU2_MAX_PACKET_SIZE - IPV6_HEADER_SIZE - UDP_HEADER_SIZE - 32), // max size m_LastResendTime (0), m_LastResendAttemptTime (0), m_NextRouterInfoResendTime(0), m_NumRanges (0), m_Version (2) { @@ -105,8 +105,8 @@ namespace transport if (in_RemoteRouter->IsSSU2PeerTesting (false)) m_RemotePeerTestTransports |= i2p::data::RouterInfo::eSSU2V6; RAND_bytes ((uint8_t *)&m_DestConnID, 8); RAND_bytes ((uint8_t *)&m_SourceConnID, 8); + AdjustMaxPayloadSize (); } - AdjustMaxPayloadSize (); } SSU2Session::~SSU2Session () @@ -1582,6 +1582,8 @@ namespace transport } m_State = eSSU2SessionStateTokenReceived; HandlePayload (payload, len - 48); + if (m_TerminationReason == eSSU2TerminationReasonIncompatibleVersion) + m_Version = 2; // fallback to non-PQ if (!token) { // we should handle payload even for zero token to handle Datetime block and adjust clock in case of clock skew @@ -1590,8 +1592,6 @@ namespace transport } if (!m_NoiseState) m_NoiseState.reset (new i2p::crypto::NoiseSymmetricState); - if (m_TerminationReason == eSSU2TerminationReasonIncompatibleVersion) - m_Version = 2; // fallback to non-PQ #if OPENSSL_PQ if (m_Version > 2) InitNoiseXKStateMLKEM1 (*m_NoiseState, (i2p::data::CryptoKeyType)(m_Version + 2), m_Address->s); diff --git a/libi2pd/SSU2Session.h b/libi2pd/SSU2Session.h index 70170e05..c4b829e3 100644 --- a/libi2pd/SSU2Session.h +++ b/libi2pd/SSU2Session.h @@ -251,6 +251,7 @@ namespace transport bool SetVersion (uint8_t version); void SetRemoteEndpoint (const boost::asio::ip::udp::endpoint& ep) { m_RemoteEndpoint = ep; }; const boost::asio::ip::udp::endpoint& GetRemoteEndpoint () const { return m_RemoteEndpoint; }; + void AdjustMaxPayloadSize (size_t maxMtu = SSU2_MAX_PACKET_SIZE); i2p::data::RouterInfo::CompatibleTransports GetRemoteTransports () const { return m_RemoteTransports; }; i2p::data::RouterInfo::CompatibleTransports GetRemotePeerTestTransports () const { return m_RemotePeerTestTransports; }; int GetRemoteVersion () const { return m_RemoteVersion; }; @@ -344,7 +345,6 @@ namespace transport virtual void HandleAddress (const uint8_t * buf, size_t len); size_t CreateEndpoint (uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& ep); std::shared_ptr FindLocalAddress () const; - void AdjustMaxPayloadSize (size_t maxMtu = SSU2_MAX_PACKET_SIZE); bool GetTestingState () const; void SetTestingState(bool testing) const; std::shared_ptr ExtractRouterInfo (const uint8_t * buf, size_t size);