From 2f44d99a74566b49bf7ca4687d9967523ed09f8c Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 8 Jul 2022 19:06:09 -0400 Subject: [PATCH] session closing state --- libi2pd/SSU2.cpp | 27 +++++++++++++++------------ libi2pd/SSU2Session.cpp | 13 ++++++++----- libi2pd/SSU2Session.h | 3 ++- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/libi2pd/SSU2.cpp b/libi2pd/SSU2.cpp index a2125320..209d3352 100644 --- a/libi2pd/SSU2.cpp +++ b/libi2pd/SSU2.cpp @@ -239,6 +239,8 @@ namespace transport auto ident = it->second->GetRemoteIdentity (); if (ident) m_SessionsByRouterHash.erase (ident->GetIdentHash ()); + if (m_LastSession == it->second) + m_LastSession = nullptr; m_Sessions.erase (it); } } @@ -385,6 +387,9 @@ namespace transport m_LastSession->SetRemoteEndpoint (senderEndpoint); m_LastSession->ProcessPeerTest (buf, len); break; + case eSSU2SessionStateClosing: + m_LastSession->RequestTermination (); // send termination again + break; case eSSU2SessionStateTerminated: m_LastSession = nullptr; break; @@ -617,22 +622,20 @@ namespace transport it++; } - for (auto it = m_Sessions.begin (); it != m_Sessions.end ();) + for (auto it: m_Sessions) { - if (it->second->GetState () == eSSU2SessionStateTerminated || - it->second->IsTerminationTimeoutExpired (ts)) + auto state = it.second->GetState (); + if (state == eSSU2SessionStateTerminated || state == eSSU2SessionStateClosing) + GetService ().post (std::bind (&SSU2Session::Terminate, it.second)); + else if (it.second->IsTerminationTimeoutExpired (ts)) { - if (it->second->IsEstablished ()) - it->second->TerminateByTimeout (); - if (it->second == m_LastSession) - m_LastSession = nullptr; - it = m_Sessions.erase (it); + if (it.second->IsEstablished ()) + it.second->RequestTermination (); + else + GetService ().post (std::bind (&SSU2Session::Terminate, it.second)); } else - { - it->second->CleanUp (ts); - it++; - } + it.second->CleanUp (ts); } for (auto it = m_IncomingTokens.begin (); it != m_IncomingTokens.end (); ) diff --git a/libi2pd/SSU2Session.cpp b/libi2pd/SSU2Session.cpp index 7041aad9..7ed1e5a7 100644 --- a/libi2pd/SSU2Session.cpp +++ b/libi2pd/SSU2Session.cpp @@ -168,12 +168,15 @@ namespace transport } } - void SSU2Session::TerminateByTimeout () + void SSU2Session::RequestTermination () { - SendTermination (); - m_Server.GetService ().post (std::bind (&SSU2Session::Terminate, shared_from_this ())); - } - + if (m_State == eSSU2SessionStateEstablished || m_State == eSSU2SessionStateClosing) + { + m_State = eSSU2SessionStateClosing; + SendTermination (); + } + } + void SSU2Session::Established () { m_State = eSSU2SessionStateEstablished; diff --git a/libi2pd/SSU2Session.h b/libi2pd/SSU2Session.h index f18f51f6..348cff56 100644 --- a/libi2pd/SSU2Session.h +++ b/libi2pd/SSU2Session.h @@ -86,6 +86,7 @@ namespace transport eSSU2SessionStateSessionCreatedSent, eSSU2SessionStateSessionConfirmedSent, eSSU2SessionStateEstablished, + eSSU2SessionStateClosing, eSSU2SessionStateTerminated, eSSU2SessionStateFailed, eSSU2SessionStateIntroduced, @@ -188,7 +189,7 @@ namespace transport void WaitForIntroduction (); void SendPeerTest (); // Alice, Data message void Terminate (); - void TerminateByTimeout (); + void RequestTermination (); void CleanUp (uint64_t ts); void FlushData (); void Done () override;