From b0543dfe32fd1b5bd2bf89597254b406def02593 Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 4 Feb 2026 14:36:46 -0500 Subject: [PATCH] let few first tunnel build messages go through before drop --- libi2pd/I2NPProtocol.cpp | 19 ++++++++++++++++--- libi2pd/I2NPProtocol.h | 8 ++++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/libi2pd/I2NPProtocol.cpp b/libi2pd/I2NPProtocol.cpp index 045fad8d..822a136a 100644 --- a/libi2pd/I2NPProtocol.cpp +++ b/libi2pd/I2NPProtocol.cpp @@ -557,9 +557,13 @@ namespace i2p case eI2NPShortTunnelBuild: { auto ts = i2p::util::GetMonotonicMilliseconds (); - if (!m_LastTunnelBuildMessageTimestamp || ts > m_LastTunnelBuildMessageTimestamp + TUNNEL_BUILD_MESSAGES_MIN_INTERVAL) + if (!m_LastTunnelBuildMessageTimestamp || + ts > m_LastTunnelBuildMessageTimestamp + TUNNEL_BUILD_MESSAGES_MAX_INTERVAL || + ts > m_LastTunnelBuildMessageTimestamp + TUNNEL_BUILD_MESSAGES_MIN_INTERVAL + + m_NumThrottledTunnelBuildMessages*TUNNEL_BUILD_MESSAGES_EXTRA_INTERVAL_PER_MESSAGE) { m_LastTunnelBuildMessageTimestamp = ts; + m_NumThrottledTunnelBuildMessages = 0; if (m_NumDroppedTunnelBuildMessages > 0) { LogPrint (eLogWarning, "I2NP: ", m_NumDroppedTunnelBuildMessages, " tunnel build messages dropped"); @@ -567,8 +571,17 @@ namespace i2p } HandleI2NPMessage (msg); } - else // drop TBM - m_NumDroppedTunnelBuildMessages++; + else + { + if (m_NumThrottledTunnelBuildMessages < MAX_NUM_THROTTLED_TUNNEL_BUILD_MESSAGES) + { + // let TBM go through + m_NumThrottledTunnelBuildMessages++; + HandleI2NPMessage (msg); + } + else // drop TBM + m_NumDroppedTunnelBuildMessages++; + } break; } default: diff --git a/libi2pd/I2NPProtocol.h b/libi2pd/I2NPProtocol.h index bef65267..fe358b6f 100644 --- a/libi2pd/I2NPProtocol.h +++ b/libi2pd/I2NPProtocol.h @@ -320,11 +320,15 @@ namespace tunnel void HandleI2NPMessage (std::shared_ptr msg); const uint64_t TUNNEL_BUILD_MESSAGES_MIN_INTERVAL = 200; // in milliseconds + const uint64_t TUNNEL_BUILD_MESSAGES_MAX_INTERVAL = 3000; // in milliseconds + const uint64_t TUNNEL_BUILD_MESSAGES_EXTRA_INTERVAL_PER_MESSAGE = 50; // in milliseconds + const int MAX_NUM_THROTTLED_TUNNEL_BUILD_MESSAGES = 5; class I2NPMessagesHandler { public: - I2NPMessagesHandler (): m_LastTunnelBuildMessageTimestamp (0), m_NumDroppedTunnelBuildMessages (0) {}; + I2NPMessagesHandler (): m_LastTunnelBuildMessageTimestamp (0), + m_NumThrottledTunnelBuildMessages (0), m_NumDroppedTunnelBuildMessages (0) {}; ~I2NPMessagesHandler (); void PutNextMessage (std::shared_ptr&& msg); void Flush (); @@ -333,7 +337,7 @@ namespace tunnel std::list > m_TunnelMsgs, m_TunnelGatewayMsgs; uint64_t m_LastTunnelBuildMessageTimestamp; // in milliseconds - int m_NumDroppedTunnelBuildMessages; + int m_NumThrottledTunnelBuildMessages, m_NumDroppedTunnelBuildMessages; }; }