From 7ef1fdf6340ec252969e332874205b5b336956d1 Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 18 Sep 2024 18:48:18 -0400 Subject: [PATCH] exclude false position OK peer test if comes from recently connected endpoint --- libi2pd/SSU2Session.cpp | 10 ++++++---- libi2pd/SSU2Session.h | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/libi2pd/SSU2Session.cpp b/libi2pd/SSU2Session.cpp index 98b6c6f6..789b42e4 100644 --- a/libi2pd/SSU2Session.cpp +++ b/libi2pd/SSU2Session.cpp @@ -2365,10 +2365,11 @@ namespace transport if (addr) { it->second.first->m_Address = addr; - if (it->second.first->m_State == eSSU2SessionStatePeerTestReceived) + auto state = it->second.first->m_State; + if (state == eSSU2SessionStatePeerTestReceived || state == eSSU2SessionStateVoidPeerTestReceived) { // msg 5 already received. send msg 6 - SetRouterStatus (eRouterStatusOK); + SetRouterStatus (state == eSSU2SessionStatePeerTestReceived ? eRouterStatusOK : eRouterStatusUnknown); it->second.first->m_State = eSSU2SessionStatePeerTest; it->second.first->SendPeerTest (6, buf + offset, len - offset, addr->i); } @@ -2426,14 +2427,15 @@ namespace transport case 5: // Alice from Charlie 1 if (htobe64 (((uint64_t)nonce << 32) | nonce) == m_SourceConnID) { + bool isConnectedRecently = m_Server.IsConnectedRecently (m_RemoteEndpoint); if (m_Address) { - SetRouterStatus (eRouterStatusOK); + SetRouterStatus (isConnectedRecently ? eRouterStatusUnknown : eRouterStatusOK); SendPeerTest (6, buf + offset, len - offset, m_Address->i); } else // we received msg 5 before msg 4 - m_State = eSSU2SessionStatePeerTestReceived; + m_State = isConnectedRecently ? eSSU2SessionStateVoidPeerTestReceived : eSSU2SessionStatePeerTestReceived; } else LogPrint (eLogWarning, "SSU2: Peer test 5 nonce mismatch ", nonce, " connID=", m_SourceConnID); diff --git a/libi2pd/SSU2Session.h b/libi2pd/SSU2Session.h index cd6793d3..eaeda949 100644 --- a/libi2pd/SSU2Session.h +++ b/libi2pd/SSU2Session.h @@ -114,6 +114,7 @@ namespace transport eSSU2SessionStateIntroduced, eSSU2SessionStatePeerTest, eSSU2SessionStatePeerTestReceived, // 5 before 4 + eSSU2SessionStateVoidPeerTestReceived, // 5 before 4, but from connected recently eSSU2SessionStateTokenRequestReceived };