From 5e42947fbd99cfdd7fcf7123e3cb976f52274468 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 25 Apr 2019 12:54:44 -0400 Subject: [PATCH] always lookup SSU session if peer's endpoint doesn't match --- libi2pd/SSU.cpp | 14 ++++++-------- libi2pd/SSUSession.cpp | 5 ++--- libi2pd/SSUSession.h | 8 ++++---- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/libi2pd/SSU.cpp b/libi2pd/SSU.cpp index 4fe45e01..daf7e1e9 100644 --- a/libi2pd/SSU.cpp +++ b/libi2pd/SSU.cpp @@ -328,7 +328,11 @@ namespace transport { if (!session || session->GetRemoteEndpoint () != packet->from) // we received packet for other session than previous { - if (session) session->FlushData (); + if (session) + { + session->FlushData (); + session = nullptr; + } auto it = sessions->find (packet->from); if (it != sessions->end ()) session = it->second; @@ -751,10 +755,7 @@ namespace transport { auto session = it.second; if (it.first != session->GetRemoteEndpoint ()) - { LogPrint (eLogWarning, "SSU: remote endpoint ", session->GetRemoteEndpoint (), " doesn't match key ", it.first, " adjusted"); - session->SetRemoteEndpoint (it.first); // TODO: investigate why it happens - } m_Service.post ([session] { LogPrint (eLogWarning, "SSU: no activity with ", session->GetRemoteEndpoint (), " for ", session->GetTerminationTimeout (), " seconds"); @@ -782,10 +783,7 @@ namespace transport { auto session = it.second; if (it.first != session->GetRemoteEndpoint ()) - { - LogPrint (eLogWarning, "SSU: remote endpoint ", session->GetRemoteEndpoint (), " doesn't match key ", it.first, " adjusted"); - session->SetRemoteEndpoint (it.first); // TODO: investigate why it happens - } + LogPrint (eLogWarning, "SSU: remote endpoint ", session->GetRemoteEndpoint (), " doesn't match key ", it.first); m_ServiceV6.post ([session] { LogPrint (eLogWarning, "SSU: no activity with ", session->GetRemoteEndpoint (), " for ", session->GetTerminationTimeout (), " seconds"); diff --git a/libi2pd/SSUSession.cpp b/libi2pd/SSUSession.cpp index c58e70d6..a7497fd1 100644 --- a/libi2pd/SSUSession.cpp +++ b/libi2pd/SSUSession.cpp @@ -158,7 +158,7 @@ namespace transport ProcessData (buf + headerSize, len - headerSize); break; case PAYLOAD_TYPE_SESSION_REQUEST: - ProcessSessionRequest (buf, len, senderEndpoint); // buf with header + ProcessSessionRequest (buf, len); // buf with header break; case PAYLOAD_TYPE_SESSION_CREATED: ProcessSessionCreated (buf, len); // buf with header @@ -194,7 +194,7 @@ namespace transport } } - void SSUSession::ProcessSessionRequest (const uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& senderEndpoint) + void SSUSession::ProcessSessionRequest (const uint8_t * buf, size_t len) { LogPrint (eLogDebug, "SSU message: session request"); bool sendRelayTag = true; @@ -215,7 +215,6 @@ namespace transport LogPrint (eLogError, "Session request header size ", headerSize, " exceeds packet length ", len); return; } - m_RemoteEndpoint = senderEndpoint; if (!m_DHKeysPair) m_DHKeysPair = transports.GetNextDHKeysPair (); CreateAESandMacKey (buf + headerSize); diff --git a/libi2pd/SSUSession.h b/libi2pd/SSUSession.h index 8df3933a..8f81838a 100644 --- a/libi2pd/SSUSession.h +++ b/libi2pd/SSUSession.h @@ -80,8 +80,8 @@ namespace transport void Close (); void Done (); void Failed (); - boost::asio::ip::udp::endpoint& GetRemoteEndpoint () { return m_RemoteEndpoint; }; - void SetRemoteEndpoint (const boost::asio::ip::udp::endpoint& ep) { m_RemoteEndpoint = ep; }; // TODO: not to use + const boost::asio::ip::udp::endpoint& GetRemoteEndpoint () { return m_RemoteEndpoint; }; + bool IsV6 () const { return m_RemoteEndpoint.address ().is_v6 (); }; void SendI2NPMessages (const std::vector >& msgs); void SendPeerTest (); // Alice @@ -104,7 +104,7 @@ namespace transport size_t GetSSUHeaderSize (const uint8_t * buf) const; void PostI2NPMessages (std::vector > msgs); void ProcessMessage (uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& senderEndpoint); // call for established session - void ProcessSessionRequest (const uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& senderEndpoint); + void ProcessSessionRequest (const uint8_t * buf, size_t len); void SendSessionRequest (); void SendRelayRequest (const i2p::data::RouterInfo::Introducer& introducer, uint32_t nonce); void ProcessSessionCreated (uint8_t * buf, size_t len); @@ -140,7 +140,7 @@ namespace transport friend class SSUData; // TODO: change in later SSUServer& m_Server; - boost::asio::ip::udp::endpoint m_RemoteEndpoint; + const boost::asio::ip::udp::endpoint m_RemoteEndpoint; boost::asio::deadline_timer m_ConnectTimer; bool m_IsPeerTest; SessionState m_State;