From 189d7179c0245242742e5481825a566ff14f738a Mon Sep 17 00:00:00 2001 From: orignal Date: Mon, 23 Sep 2024 15:34:14 -0400 Subject: [PATCH] check if msg 5 was received instead state --- libi2pd/SSU2Session.cpp | 28 +++++++++++++++------------- libi2pd/SSU2Session.h | 6 +++--- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/libi2pd/SSU2Session.cpp b/libi2pd/SSU2Session.cpp index 307c82f2..2142ba0d 100644 --- a/libi2pd/SSU2Session.cpp +++ b/libi2pd/SSU2Session.cpp @@ -2341,14 +2341,18 @@ namespace transport if (addr) { session->m_Address = addr; - auto& state = session->m_State; - if (state == eSSU2SessionStatePeerTestReceived || state == eSSU2SessionStateVoidPeerTestReceived) + if (session->GetMsgNumReceived () >= 5) { - // msg 5 already received. send msg 6 - if (state == eSSU2SessionStatePeerTestReceived) - SetRouterStatus (eRouterStatusOK); - state = eSSU2SessionStatePeerTest; - session->SendPeerTest (6, buf + offset, len - offset, addr->i); + // msg 5 already received + if (session->GetMsgNumReceived () == 5) + { + if (!session->IsConnectedRecently ()) + SetRouterStatus (eRouterStatusOK); + // send msg 6 + session->SendPeerTest (6, buf + offset, len - offset, addr->i); + } + else + LogPrint (eLogWarning, "SSU2: PeerTest 4 received, but msg ", session->GetMsgNumReceived (), " already received"); } else { @@ -3088,7 +3092,8 @@ namespace transport } SSU2PeerTestSession::SSU2PeerTestSession (SSU2Server& server, uint64_t sourceConnID, uint64_t destConnID): - SSU2Session (server, nullptr, nullptr, false), m_MsgNumReceived (0) + SSU2Session (server, nullptr, nullptr, false), + m_MsgNumReceived (0), m_IsConnectedRecently (false) { if (!sourceConnID) sourceConnID = ~destConnID; if (!destConnID) destConnID = ~sourceConnID; @@ -3151,17 +3156,14 @@ namespace transport { if (htobe64 (((uint64_t)nonce << 32) | nonce) == GetSourceConnID ()) { - bool isConnectedRecently = GetServer ().IsConnectedRecently (GetRemoteEndpoint ()); + m_IsConnectedRecently = GetServer ().IsConnectedRecently (GetRemoteEndpoint ()); auto addr = GetAddress (); if (addr) { - if (!isConnectedRecently) + if (!m_IsConnectedRecently) SetRouterStatus (eRouterStatusOK); SendPeerTest (6, buf + offset, len - offset, addr->i); } - else - // we received msg 5 before msg 4 - SetState (isConnectedRecently ? eSSU2SessionStateVoidPeerTestReceived : eSSU2SessionStatePeerTestReceived); } else LogPrint (eLogWarning, "SSU2: Peer test 5 nonce mismatch ", nonce, " connID=", GetSourceConnID ()); diff --git a/libi2pd/SSU2Session.h b/libi2pd/SSU2Session.h index 13d0f262..1449305a 100644 --- a/libi2pd/SSU2Session.h +++ b/libi2pd/SSU2Session.h @@ -113,8 +113,6 @@ namespace transport eSSU2SessionStateFailed, eSSU2SessionStateIntroduced, eSSU2SessionStatePeerTest, - eSSU2SessionStatePeerTestReceived, // 5 before 4 - eSSU2SessionStateVoidPeerTestReceived, // 5 before 4, but from connected recently eSSU2SessionStateTokenRequestReceived }; @@ -397,7 +395,8 @@ namespace transport SSU2PeerTestSession (SSU2Server& server, uint64_t sourceConnID, uint64_t destConnID); - uint8_t GetMsgNumReceived () const { return m_MsgNumReceived; } + uint8_t GetMsgNumReceived () const { return m_MsgNumReceived; } + bool IsConnectedRecently () const { return m_IsConnectedRecently; } bool ProcessPeerTest (uint8_t * buf, size_t len) override; private: @@ -407,6 +406,7 @@ namespace transport private: uint8_t m_MsgNumReceived; + bool m_IsConnectedRecently; }; inline uint64_t CreateHeaderMask (const uint8_t * kh, const uint8_t * nonce)