From 2a4403f1e008228591b7bbdc5ae24dd110e04e17 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 27 Feb 2025 18:00:24 -0500 Subject: [PATCH] lazy creation of TunnelEnpoint for transit tunnel --- libi2pd/TransitTunnel.cpp | 22 +++++++++++++++------- libi2pd/TransitTunnel.h | 7 +++---- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/libi2pd/TransitTunnel.cpp b/libi2pd/TransitTunnel.cpp index 57fd8513..b24c8ac5 100644 --- a/libi2pd/TransitTunnel.cpp +++ b/libi2pd/TransitTunnel.cpp @@ -131,27 +131,35 @@ namespace tunnel LogPrint (eLogDebug, "TransitTunnel: handle msg for endpoint ", GetTunnelID ()); std::lock_guard l(m_HandleMutex); - m_Endpoint.HandleDecryptedTunnelDataMsg (newMsg); + if (!m_Endpoint) m_Endpoint = std::make_unique(false); // transit endpoint is always outbound + m_Endpoint->HandleDecryptedTunnelDataMsg (newMsg); } void TransitTunnelEndpoint::FlushTunnelDataMsgs () { - std::lock_guard l(m_HandleMutex); - m_Endpoint.FlushI2NPMsgs (); + if (m_Endpoint) + { + std::lock_guard l(m_HandleMutex); + m_Endpoint->FlushI2NPMsgs (); + } } void TransitTunnelEndpoint::Cleanup () { - std::lock_guard l(m_HandleMutex); - m_Endpoint.Cleanup (); + if (m_Endpoint) + { + std::lock_guard l(m_HandleMutex); + m_Endpoint->Cleanup (); + } } std::string TransitTunnelEndpoint::GetNextPeerName () const { - auto hash = m_Endpoint.GetCurrentHash (); + if (!m_Endpoint) return ""; + auto hash = m_Endpoint->GetCurrentHash (); if (hash) { - const auto& sender = m_Endpoint.GetSender (); + const auto& sender = m_Endpoint->GetSender (); if (sender) { auto transport = sender->GetCurrentTransport (); diff --git a/libi2pd/TransitTunnel.h b/libi2pd/TransitTunnel.h index 46d09b1a..34bcc79f 100644 --- a/libi2pd/TransitTunnel.h +++ b/libi2pd/TransitTunnel.h @@ -97,20 +97,19 @@ namespace tunnel TransitTunnelEndpoint (uint32_t receiveTunnelID, const i2p::data::IdentHash& nextIdent, uint32_t nextTunnelID, const i2p::crypto::AESKey& layerKey, const i2p::crypto::AESKey& ivKey): - TransitTunnel (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey), - m_Endpoint (false) {}; // transit endpoint is always outbound + TransitTunnel (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey) {}; void Cleanup () override; void HandleTunnelDataMsg (std::shared_ptr&& tunnelMsg) override; void FlushTunnelDataMsgs () override; - size_t GetNumTransmittedBytes () const override { return m_Endpoint.GetNumReceivedBytes (); } + size_t GetNumTransmittedBytes () const override { return m_Endpoint ? m_Endpoint->GetNumReceivedBytes () : 0; } std::string GetNextPeerName () const override; private: std::mutex m_HandleMutex; - TunnelEndpoint m_Endpoint; + std::unique_ptr m_Endpoint; }; std::shared_ptr CreateTransitTunnel (uint32_t receiveTunnelID,