From 5aa2a8f60fe4bd1c60515639dbe56fe86a00d6d2 Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 13 May 2022 20:38:18 -0400 Subject: [PATCH] handle peer tests --- libi2pd/SSU2.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++++++- libi2pd/SSU2.h | 5 ++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/libi2pd/SSU2.cpp b/libi2pd/SSU2.cpp index da867df4..b019b9c6 100644 --- a/libi2pd/SSU2.cpp +++ b/libi2pd/SSU2.cpp @@ -977,8 +977,12 @@ namespace transport HandleRelayResponse (buf + offset, size); break; case eSSU2BlkRelayIntro: + LogPrint (eLogDebug, "SSU2: RelayIntro"); + HandleRelayIntro (buf + offset, size); break; case eSSU2BlkPeerTest: + LogPrint (eLogDebug, "SSU2: PeerTest"); + HandlePeerTest (buf + offset, size); break; case eSSU2BlkNextNonce: break; @@ -1273,6 +1277,37 @@ namespace transport else LogPrint (eLogWarning, "SSU2: RelayResponse unknown nonce ", bufbe32toh (buf + 2)); } + + void SSU2Session::HandlePeerTest (const uint8_t * buf, size_t len) + { + uint32_t nonce = bufbe32toh (buf + 37); + switch (buf[0]) // msg + { + case 1: // Bob for Alice + break; + case 2: // Charlie from Bob + break; + case 3: // Bob from Charlie + { + auto it = m_PeerTests.find (nonce); + if (it != m_PeerTests.end () && it->second.first) + { + // TODO + } + break; + } + case 4: // Alice from Bob + break; + case 5: // Alice from Chralie 1 + break; + case 6: // Chralie from Alice + break; + case 7: // Alice from Charlie 2 + break; + default: + LogPrint (eLogWarning, "SSU2: PeerTest unexpected msg num ", buf[0]); + } + } bool SSU2Session::ExtractEndpoint (const uint8_t * buf, size_t size, boost::asio::ip::udp::endpoint& ep) { @@ -1590,12 +1625,22 @@ namespace transport { if (ts > it->second.second + SSU2_RELAY_NONCE_EXPIRATION_TIMEOUT) { - LogPrint (eLogWarning, "SSU2: noce ", it->first, " was not responded in ", SSU2_RELAY_NONCE_EXPIRATION_TIMEOUT, " seconds, deleted"); + LogPrint (eLogWarning, "SSU2: Relay nonce ", it->first, " was not responded in ", SSU2_RELAY_NONCE_EXPIRATION_TIMEOUT, " seconds, deleted"); it = m_RelaySessions.erase (it); } else ++it; } + for (auto it = m_PeerTests.begin (); it != m_PeerTests.end ();) + { + if (ts > it->second.second + SSU2_PEER_TEST_EXPIRATION_TIMEOUT) + { + LogPrint (eLogWarning, "SSU2: Peer test nonce ", it->first, " was not responded in ", SSU2_PEER_TEST_EXPIRATION_TIMEOUT, " seconds, deleted"); + it = m_PeerTests.erase (it); + } + else + ++it; + } } void SSU2Session::FlushData () diff --git a/libi2pd/SSU2.h b/libi2pd/SSU2.h index b4369f25..58e45f2a 100644 --- a/libi2pd/SSU2.h +++ b/libi2pd/SSU2.h @@ -28,6 +28,7 @@ namespace transport const int SSU2_TERMINATION_CHECK_TIMEOUT = 30; // 30 seconds const int SSU2_TOKEN_EXPIRATION_TIMEOUT = 9; // in seconds const int SSU2_RELAY_NONCE_EXPIRATION_TIMEOUT = 10; // in seconds + const int SSU2_PEER_TEST_EXPIRATION_TIMEOUT = 60; // 60 seconds const size_t SSU2_SOCKET_RECEIVE_BUFFER_SIZE = 0x1FFFF; // 128K const size_t SSU2_SOCKET_SEND_BUFFER_SIZE = 0x1FFFF; // 128K const size_t SSU2_MTU = 1488; @@ -134,7 +135,7 @@ namespace transport uint8_t payload[SSU2_MAX_PAYLOAD_SIZE]; size_t payloadSize; }; - + typedef std::function OnEstablished; public: @@ -204,6 +205,7 @@ namespace transport void HandleRelayRequest (const uint8_t * buf, size_t len); void HandleRelayIntro (const uint8_t * buf, size_t len); void HandleRelayResponse (const uint8_t * buf, size_t len); + void HandlePeerTest (const uint8_t * buf, size_t len); size_t CreateAddressBlock (uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& ep); size_t CreateRouterInfoBlock (uint8_t * buf, size_t len, std::shared_ptr r); @@ -231,6 +233,7 @@ namespace transport std::map > m_SentPackets; // packetNum -> packet std::map > m_IncompleteMessages; // I2NP std::map, uint64_t > > m_RelaySessions; // nonce->(Alice, timestamp) for Bob or nonce->(Charlie, timestamp) for Alice + std::map, uint64_t > > m_PeerTests; // same as for relay sessions std::list > m_SendQueue; i2p::I2NPMessagesHandler m_Handler; bool m_IsDataReceived;