From f8a609f692633383242ad972d221093005100c04 Mon Sep 17 00:00:00 2001 From: orignal Date: Mon, 25 Jul 2022 18:46:25 -0400 Subject: [PATCH] respond to termination --- libi2pd/SSU2.cpp | 10 +++++++--- libi2pd/SSU2Session.cpp | 5 ++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/libi2pd/SSU2.cpp b/libi2pd/SSU2.cpp index 2f7c1e74..aebeaa05 100644 --- a/libi2pd/SSU2.cpp +++ b/libi2pd/SSU2.cpp @@ -234,7 +234,8 @@ namespace transport { ProcessNextPacket (packet->buf, packet->len, packet->from); m_PacketsPool.ReleaseMt (packet); - if (m_LastSession) m_LastSession->FlushData (); + if (m_LastSession && m_LastSession->GetState () != eSSU2SessionStateTerminated) + m_LastSession->FlushData (); } } @@ -243,7 +244,8 @@ namespace transport for (auto& packet: packets) ProcessNextPacket (packet->buf, packet->len, packet->from); m_PacketsPool.ReleaseMt (packets); - if (m_LastSession) m_LastSession->FlushData (); + if (m_LastSession && m_LastSession->GetState () != eSSU2SessionStateTerminated) + m_LastSession->FlushData (); } void SSU2Server::AddSession (std::shared_ptr session) @@ -416,7 +418,9 @@ namespace transport m_LastSession->ProcessPeerTest (buf, len); break; case eSSU2SessionStateClosing: - m_LastSession->RequestTermination (eSSU2TerminationReasonIdleTimeout); // send termination again + m_LastSession->ProcessData (buf, len); // we might receive termintaion block + if (m_LastSession && m_LastSession->GetState () != eSSU2SessionStateTerminated) + m_LastSession->RequestTermination (eSSU2TerminationReasonIdleTimeout); // send termination again break; case eSSU2SessionStateTerminated: m_LastSession = nullptr; diff --git a/libi2pd/SSU2Session.cpp b/libi2pd/SSU2Session.cpp index 8a67d9ca..5d440c54 100644 --- a/libi2pd/SSU2Session.cpp +++ b/libi2pd/SSU2Session.cpp @@ -1308,7 +1308,10 @@ namespace transport break; case eSSU2BlkTermination: LogPrint (eLogDebug, "SSU2: Termination reason=", (int)buf[11]); - Terminate (); + if (IsEstablished () && buf[11] != eSSU2TerminationReasonTerminationReceived) + RequestTermination (eSSU2TerminationReasonTerminationReceived); + else + Terminate (); break; case eSSU2BlkRelayRequest: LogPrint (eLogDebug, "SSU2: RelayRequest");