From df794e6627d4ad86d05b20a6b558285b48038a3e Mon Sep 17 00:00:00 2001 From: orignal Date: Tue, 16 Sep 2025 13:45:49 -0400 Subject: [PATCH] Drop expired tunnel messages. Don't overwrite tunnel message timestamp --- libi2pd/TransitTunnel.cpp | 4 +++- libi2pd/Tunnel.cpp | 3 ++- libi2pd/Tunnel.h | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/libi2pd/TransitTunnel.cpp b/libi2pd/TransitTunnel.cpp index b24c8ac5..9e1924ac 100644 --- a/libi2pd/TransitTunnel.cpp +++ b/libi2pd/TransitTunnel.cpp @@ -68,7 +68,9 @@ namespace tunnel m_NumTransmittedBytes += tunnelMsg->GetLength (); htobe32buf (tunnelMsg->GetPayload (), GetNextTunnelID ()); - tunnelMsg->FillI2NPMessageHeader (eI2NPTunnelData); + // update header, expiration and size remain the same + tunnelMsg->SetMsgID (i2p::tunnel::tunnels.GetRng ()()); // assign new msgID + tunnelMsg->UpdateChks (); // new checksum TODO: remove later m_TunnelDataMsgs.push_back (tunnelMsg); } diff --git a/libi2pd/Tunnel.cpp b/libi2pd/Tunnel.cpp index 1347b5b8..f4aa01ce 100644 --- a/libi2pd/Tunnel.cpp +++ b/libi2pd/Tunnel.cpp @@ -561,13 +561,14 @@ namespace tunnel if (m_Queue.Wait (1,0)) // 1 sec { m_Queue.GetWholeQueue (msgs); + auto mts = i2p::util::GetMillisecondsSinceEpoch (); int numMsgs = 0; uint32_t prevTunnelID = 0, tunnelID = 0; std::shared_ptr prevTunnel; while (!msgs.empty ()) { auto msg = msgs.front (); msgs.pop_front (); - if (!msg) continue; + if (!msg || msg->IsExpired (mts)) continue; std::shared_ptr tunnel; uint8_t typeID = msg->GetTypeID (); switch (typeID) diff --git a/libi2pd/Tunnel.h b/libi2pd/Tunnel.h index 78e2d124..e9d78083 100644 --- a/libi2pd/Tunnel.h +++ b/libi2pd/Tunnel.h @@ -248,6 +248,7 @@ namespace tunnel void SetMaxNumTransitTunnels (uint32_t maxNumTransitTunnels); uint32_t GetMaxNumTransitTunnels () const { return m_MaxNumTransitTunnels; }; int GetCongestionLevel() const { return m_MaxNumTransitTunnels ? CONGESTION_LEVEL_FULL * m_TransitTunnels.GetNumTransitTunnels () / m_MaxNumTransitTunnels : CONGESTION_LEVEL_FULL; } + std::mt19937& GetRng () { return m_Rng; } private: