Browse Source

session closing state

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

27
libi2pd/SSU2.cpp

@ -239,6 +239,8 @@ namespace transport @@ -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 @@ -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 @@ -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 (); )

13
libi2pd/SSU2Session.cpp

@ -168,12 +168,15 @@ namespace transport @@ -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;

3
libi2pd/SSU2Session.h

@ -86,6 +86,7 @@ namespace transport @@ -86,6 +86,7 @@ namespace transport
eSSU2SessionStateSessionCreatedSent,
eSSU2SessionStateSessionConfirmedSent,
eSSU2SessionStateEstablished,
eSSU2SessionStateClosing,
eSSU2SessionStateTerminated,
eSSU2SessionStateFailed,
eSSU2SessionStateIntroduced,
@ -188,7 +189,7 @@ namespace transport @@ -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;

Loading…
Cancel
Save