Browse Source

session closing state

pull/1774/head
orignal 2 years ago
parent
commit
2f44d99a74
  1. 27
      libi2pd/SSU2.cpp
  2. 9
      libi2pd/SSU2Session.cpp
  3. 3
      libi2pd/SSU2Session.h

27
libi2pd/SSU2.cpp

@ -239,6 +239,8 @@ namespace transport
auto ident = it->second->GetRemoteIdentity (); auto ident = it->second->GetRemoteIdentity ();
if (ident) if (ident)
m_SessionsByRouterHash.erase (ident->GetIdentHash ()); m_SessionsByRouterHash.erase (ident->GetIdentHash ());
if (m_LastSession == it->second)
m_LastSession = nullptr;
m_Sessions.erase (it); m_Sessions.erase (it);
} }
} }
@ -385,6 +387,9 @@ namespace transport
m_LastSession->SetRemoteEndpoint (senderEndpoint); m_LastSession->SetRemoteEndpoint (senderEndpoint);
m_LastSession->ProcessPeerTest (buf, len); m_LastSession->ProcessPeerTest (buf, len);
break; break;
case eSSU2SessionStateClosing:
m_LastSession->RequestTermination (); // send termination again
break;
case eSSU2SessionStateTerminated: case eSSU2SessionStateTerminated:
m_LastSession = nullptr; m_LastSession = nullptr;
break; break;
@ -617,22 +622,20 @@ namespace transport
it++; it++;
} }
for (auto it = m_Sessions.begin (); it != m_Sessions.end ();) for (auto it: m_Sessions)
{ {
if (it->second->GetState () == eSSU2SessionStateTerminated || auto state = it.second->GetState ();
it->second->IsTerminationTimeoutExpired (ts)) if (state == eSSU2SessionStateTerminated || state == eSSU2SessionStateClosing)
GetService ().post (std::bind (&SSU2Session::Terminate, it.second));
else if (it.second->IsTerminationTimeoutExpired (ts))
{ {
if (it->second->IsEstablished ()) if (it.second->IsEstablished ())
it->second->TerminateByTimeout (); it.second->RequestTermination ();
if (it->second == m_LastSession) else
m_LastSession = nullptr; GetService ().post (std::bind (&SSU2Session::Terminate, it.second));
it = m_Sessions.erase (it);
} }
else else
{ it.second->CleanUp (ts);
it->second->CleanUp (ts);
it++;
}
} }
for (auto it = m_IncomingTokens.begin (); it != m_IncomingTokens.end (); ) for (auto it = m_IncomingTokens.begin (); it != m_IncomingTokens.end (); )

9
libi2pd/SSU2Session.cpp

@ -168,10 +168,13 @@ namespace transport
} }
} }
void SSU2Session::TerminateByTimeout () void SSU2Session::RequestTermination ()
{ {
SendTermination (); if (m_State == eSSU2SessionStateEstablished || m_State == eSSU2SessionStateClosing)
m_Server.GetService ().post (std::bind (&SSU2Session::Terminate, shared_from_this ())); {
m_State = eSSU2SessionStateClosing;
SendTermination ();
}
} }
void SSU2Session::Established () void SSU2Session::Established ()

3
libi2pd/SSU2Session.h

@ -86,6 +86,7 @@ namespace transport
eSSU2SessionStateSessionCreatedSent, eSSU2SessionStateSessionCreatedSent,
eSSU2SessionStateSessionConfirmedSent, eSSU2SessionStateSessionConfirmedSent,
eSSU2SessionStateEstablished, eSSU2SessionStateEstablished,
eSSU2SessionStateClosing,
eSSU2SessionStateTerminated, eSSU2SessionStateTerminated,
eSSU2SessionStateFailed, eSSU2SessionStateFailed,
eSSU2SessionStateIntroduced, eSSU2SessionStateIntroduced,
@ -188,7 +189,7 @@ namespace transport
void WaitForIntroduction (); void WaitForIntroduction ();
void SendPeerTest (); // Alice, Data message void SendPeerTest (); // Alice, Data message
void Terminate (); void Terminate ();
void TerminateByTimeout (); void RequestTermination ();
void CleanUp (uint64_t ts); void CleanUp (uint64_t ts);
void FlushData (); void FlushData ();
void Done () override; void Done () override;

Loading…
Cancel
Save