diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Datagram.cpp /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Datagram.cpp --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Datagram.cpp 2026-07-23 18:47:11.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Datagram.cpp 2026-07-23 18:45:15.000000000 +0000 @@ -618,6 +618,5 @@ } - if (!m_RoutingSession || m_RoutingSession->IsTerminated () || !m_RoutingSession->IsReadyToSend () || - (m_RoutingSession->GetLastActivityTimestamp () && m_RoutingSession->IsInactive (i2p::util::GetSecondsSinceEpoch ()))) // request new garlic session if established session became inactive + if (!m_RoutingSession || m_RoutingSession->IsTerminated () || !m_RoutingSession->IsReadyToSend ()) { bool found = false; @@ -659,6 +658,5 @@ LogPrint (eLogDebug, "Datagram: path reset"); m_RoutingSession->SetSharedRoutingPath (nullptr); - m_RoutingSession = nullptr; // re-query garlic session, it gets restarted if inactive - return GetSharedRoutingPath (); + path = nullptr; } @@ -750,13 +748,4 @@ } - void DatagramSession::RequestUpdatedLeaseSet () - { - if (!m_RequestingLS) - { - m_RequestingLS = true; - m_LocalDestination->RequestDestination(m_RemoteIdent, std::bind(&DatagramSession::HandleLeaseSetUpdated, this, std::placeholders::_1)); - } - } - void DatagramSession::FlushSendQueue () { diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Datagram.h /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Datagram.h --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Datagram.h 2026-07-23 18:47:11.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Datagram.h 2026-07-23 18:45:15.000000000 +0000 @@ -86,6 +86,4 @@ void DropSharedRoutingPath () { if (m_RoutingSession) m_RoutingSession->SetSharedRoutingPath (nullptr); } - // request LeaseSet update from floodfill in case our copy contains dead leases - void RequestUpdatedLeaseSet (); struct Info diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/ECIESX25519AEADRatchetSession.h /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/ECIESX25519AEADRatchetSession.h --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/ECIESX25519AEADRatchetSession.h 2026-07-23 18:47:11.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/ECIESX25519AEADRatchetSession.h 2026-07-23 18:45:15.000000000 +0000 @@ -186,5 +186,5 @@ bool CheckExpired (uint64_t ts); // true is expired bool CanBeRestarted (uint64_t ts) const { return ts > m_SessionCreatedTimestamp + ECIESX25519_RESTART_TIMEOUT; } - bool IsInactive (uint64_t ts) const override { return ts > m_LastActivityTimestamp + ECIESX25519_INACTIVITY_TIMEOUT && CanBeRestarted (ts); } + bool IsInactive (uint64_t ts) const { return ts > m_LastActivityTimestamp + ECIESX25519_INACTIVITY_TIMEOUT && CanBeRestarted (ts); } void CleanupReceiveNSRKeys (); // called from ReceiveRatchetTagSet at Alice's side bool IsResponseRequired () const { return m_State == eSessionStateNewSessionReceived || m_SendReverseKey || !m_AckRequests.empty (); }; diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Garlic.h /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Garlic.h --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Garlic.h 2026-07-23 18:47:11.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Garlic.h 2026-07-23 18:45:15.000000000 +0000 @@ -118,5 +118,4 @@ virtual bool IsReadyToSend () const { return true; }; virtual bool IsTerminated () const { return !GetOwner (); }; - virtual bool IsInactive (uint64_t ts) const { return false; }; // override in ECIESX25519AEADRatchetSession virtual uint64_t GetLastActivityTimestamp () const { return 0; }; // non-zero for rathets only virtual void SetAckRequestInterval (int interval) {}; // in milliseconds, override in ECIESX25519AEADRatchetSession diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/UDPTunnel.cpp /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/UDPTunnel.cpp --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/UDPTunnel.cpp 2026-07-23 18:47:11.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/UDPTunnel.cpp 2026-07-23 18:45:15.000000000 +0000 @@ -206,5 +206,5 @@ { LogPrint (eLogInfo, "UDP Connection: Packet ", m_AckTimerSeqn, " was not acked"); - if (m_IsFirstPacket) m_IsSendingAllowed = false; // stop sending only if session is not established yet + m_IsSendingAllowed = false; // stop sending datagrams m_AckTimerSeqn = 0; m_RTT = 0; @@ -214,10 +214,6 @@ options.Put (UDP_SESSION_FLAGS, UDP_SESSION_FLAG_RESET_PATH | UDP_SESSION_FLAG_ACK_REQUESTED); auto session = GetDatagramSession (); - if (session) - { - session->DropSharedRoutingPath (); - session->RequestUpdatedLeaseSet (); // in case current leases are dead - m_Destination->SendDatagram (session, nullptr, 0, 0, 0, &options); - } + session->DropSharedRoutingPath (); + m_Destination->SendDatagram (session, nullptr, 0, 0, 0, &options); } }); @@ -488,6 +484,5 @@ if (!m_IsSendingAllowed) { - const auto ts1 = i2p::util::GetMillisecondsSinceEpoch (); - if (!m_IsFirstPacket && ts1 > m_LastRepliableDatagramTime + I2P_UDP_SESSION_TIMEOUT) + if (!m_IsFirstPacket && i2p::util::GetMillisecondsSinceEpoch () > m_LastRepliableDatagramTime + I2P_UDP_SESSION_TIMEOUT) { // reset session @@ -500,10 +495,6 @@ if (!m_IsSendingAllowed) { - if (!(m_IsFirstPacket && ts1 > m_LastRepliableDatagramTime + I2P_UDP_FIRST_PACKET_RESEND_INTERVAL)) - { - RecvFromLocal (); - return; - } - // else fall through and send new first packet, previous one wasn't acked in time + RecvFromLocal (); + return; } } diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/UDPTunnel.h /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/UDPTunnel.h --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/UDPTunnel.h 2026-07-23 18:47:11.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/UDPTunnel.h 2026-07-23 18:45:15.000000000 +0000 @@ -33,5 +33,4 @@ const uint64_t I2P_UDP_REPLIABLE_DATAGRAM_INTERVAL = 100; // in milliseconds const uint64_t I2P_UDP_MAX_UNACKED_DATAGRAM_TIME = 8000; // in milliseconds - const uint64_t I2P_UDP_FIRST_PACKET_RESEND_INTERVAL = 1000; // in milliseconds const size_t I2P_UDP_MAX_NUM_UNACKED_DATAGRAMS = 500; @@ -217,5 +216,5 @@ i2p::datagram::DatagramVersion m_DatagramVersion; std::shared_ptr m_LastSession; - uint32_t m_KeepAliveInterval = 0; + uint32_t m_KeepAliveInterval; std::unique_ptr m_KeepAliveTimer;