From 24a9457ec026f45a8f88a51421f14d03ca7d2bb3 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 23 Jul 2026 14:45:15 -0400 Subject: [PATCH] calculate publish timeout based on tunnel lengths --- libi2pd/Destination.cpp | 14 ++++++++------ libi2pd/Destination.h | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/libi2pd/Destination.cpp b/libi2pd/Destination.cpp index f88688f9..1bc7c139 100644 --- a/libi2pd/Destination.cpp +++ b/libi2pd/Destination.cpp @@ -685,7 +685,7 @@ namespace client LogPrint (eLogInfo, "Destination: Can't publish LeasetSet because destination is not ready. Try publishing again after ", PUBLISH_CONFIRMATION_TIMEOUT, " milliseconds"); m_PublishConfirmationTimer.expires_after (std::chrono::milliseconds(PUBLISH_CONFIRMATION_TIMEOUT)); m_PublishConfirmationTimer.async_wait (std::bind (&LeaseSetDestination::HandlePublishConfirmationTimer, - shared_from_this (), std::placeholders::_1)); + shared_from_this (), std::placeholders::_1, PUBLISH_CONFIRMATION_TIMEOUT)); return; } } @@ -699,23 +699,25 @@ namespace client boost::asio::post (s->GetService (), [s]() { s->m_PublishConfirmationTimer.cancel (); - s->HandlePublishConfirmationTimer (boost::system::error_code()); + s->HandlePublishConfirmationTimer (boost::system::error_code(), 0); }); }; - m_PublishConfirmationTimer.expires_after (std::chrono::milliseconds(PUBLISH_CONFIRMATION_TIMEOUT)); + uint64_t publishConfirmationTimeout = PUBLISH_CONFIRMATION_TIMEOUT + + (inbound->GetNumHops () + outbound->GetNumHops ())*(uint64_t)i2p::tunnel::HIGH_LATENCY_PER_HOP/1000LL; + m_PublishConfirmationTimer.expires_after (std::chrono::milliseconds(publishConfirmationTimeout)); m_PublishConfirmationTimer.async_wait (std::bind (&LeaseSetDestination::HandlePublishConfirmationTimer, - shared_from_this (), std::placeholders::_1)); + shared_from_this (), std::placeholders::_1, publishConfirmationTimeout)); outbound->SendTunnelDataMsgTo (floodfill->GetIdentHash (), 0, msg); m_LastSubmissionTime = ts; } - void LeaseSetDestination::HandlePublishConfirmationTimer (const boost::system::error_code& ecode) + void LeaseSetDestination::HandlePublishConfirmationTimer (const boost::system::error_code& ecode, uint64_t publishConfirmationTimeout) { if (ecode != boost::asio::error::operation_aborted) { if (m_PublishReplyToken) { - LogPrint (eLogWarning, "Destination: Publish confirmation was not received in ", PUBLISH_CONFIRMATION_TIMEOUT, " milliseconds or failed. will try again"); + LogPrint (eLogWarning, "Destination: Publish confirmation was not received in ", publishConfirmationTimeout, " milliseconds or failed. will try again"); m_PublishReplyToken = 0; Publish (); } diff --git a/libi2pd/Destination.h b/libi2pd/Destination.h index 82cda560..4be0c3ce 100644 --- a/libi2pd/Destination.h +++ b/libi2pd/Destination.h @@ -192,7 +192,7 @@ namespace client std::shared_ptr GetLeaseSetMt (); void Publish (); - void HandlePublishConfirmationTimer (const boost::system::error_code& ecode); + void HandlePublishConfirmationTimer (const boost::system::error_code& ecode, uint64_t publishConfirmationTimeout); void HandlePublishVerificationTimer (const boost::system::error_code& ecode); void HandlePublishDelayTimer (const boost::system::error_code& ecode); void HandleDatabaseStoreMessage (const uint8_t * buf, size_t len, i2p::garlic::ECIESX25519AEADRatchetSession * from);