From 9e91be671dd10d5a3677e7cd169e98e975fc0116 Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 24 Jan 2014 16:30:07 -0500 Subject: [PATCH 1/3] SSU payload types --- SSU.cpp | 27 ++++++++++++++++++++++++++- SSU.h | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/SSU.cpp b/SSU.cpp index 45788ed4..aebab995 100644 --- a/SSU.cpp +++ b/SSU.cpp @@ -7,11 +7,26 @@ namespace i2p { namespace ssu { + + SSUSession::SSUSession (): m_State (eSessionStateUnknown) + { + } + + void SSUSession::ProcessNextMessage (uint8_t * buf, std::size_t len) + { + } + SSUServer::SSUServer (boost::asio::io_service& service, int port): m_Socket (service, boost::asio::ip::udp::v4 (), port) { } + SSUServer::~SSUServer () + { + for (auto it: m_Sessions) + delete it.second; + } + void SSUServer::Start () { Receive (); @@ -33,7 +48,17 @@ namespace ssu if (!ecode) { LogPrint ("SSU received ", bytes_transferred, " bytes"); - // Handle + SSUSession * session = nullptr; + auto it = m_Sessions.find (m_SenderEndpoint); + if (it != m_Sessions.end ()) + session = it->second; + if (session) + { + session = new SSUSession (); + m_Sessions[m_SenderEndpoint] = session; + LogPrint ("New SSU session from ", m_SenderEndpoint.address ().to_string (), ":", m_SenderEndpoint.port (), " created"); + } + session->ProcessNextMessage (m_ReceiveBuffer, bytes_transferred); Receive (); } else diff --git a/SSU.h b/SSU.h index 0cbc31f1..8bb2c6fa 100644 --- a/SSU.h +++ b/SSU.h @@ -2,6 +2,7 @@ #define SSU_H__ #include +#include #include namespace i2p @@ -10,11 +11,46 @@ namespace ssu { const int SSU_MTU = 1484; + // payload types (4 bits) + const uint8_t PAYLOAD_TYPE_SESSION_REQUEST = 0; + const uint8_t PAYLOAD_TYPE_SESSION_CREATED = 1; + const uint8_t PAYLOAD_TYPE_SESSION_CONFIRMED = 2; + const uint8_t PAYLOAD_TYPE_RELAY_REQUEST = 3; + const uint8_t PAYLOAD_TYPE_RELAY_RESPONSE = 4; + const uint8_t PAYLOAD_TYPE_RELAY_INTRO = 5; + const uint8_t PAYLOAD_TYPE_DATA = 6; + const uint8_t PAYLOAD_TYPE_TEST = 7; + + enum SessionState + { + eSessionStateUnknown, + eSessionStateRequestSent, + eSessionStateRequestReceived, + eSessionStateCreatedSent, + eSessionStateCreatedReceived, + eSessionStateConfirmedSent, + eSessionStateConfirmedReceived, + eSessionStateEstablised + }; + + class SSUSession + { + public: + + SSUSession (); + void ProcessNextMessage (uint8_t * buf, std::size_t len); + + private: + + SessionState m_State; + }; + class SSUServer { public: SSUServer (boost::asio::io_service& service, int port); + ~SSUServer (); void Start (); void Stop (); @@ -28,6 +64,7 @@ namespace ssu boost::asio::ip::udp::socket m_Socket; boost::asio::ip::udp::endpoint m_SenderEndpoint; uint8_t m_ReceiveBuffer[SSU_MTU]; + std::map m_Sessions; }; } } From bd8ea0bac03ac5e55b077c7a6ce4dcc1f2ea3311 Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 24 Jan 2014 20:53:15 -0500 Subject: [PATCH 2/3] use any router for second hop of tunnel --- NetDb.cpp | 7 +++++-- Tunnel.cpp | 9 ++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/NetDb.cpp b/NetDb.cpp index a00e900d..05d9d9fa 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -499,12 +499,15 @@ namespace data { CryptoPP::RandomNumberGenerator& rnd = i2p::context.GetRandomNumberGenerator (); uint32_t ind = rnd.GenerateWord32 (0, m_RouterInfos.size () - 1), i = 0; + RouterInfo * last = nullptr; for (auto it: m_RouterInfos) { - if (i >= ind) return it.second; + if (!it.second->IsUnreachable ()) + last = it.second; + if (i >= ind) break; else i++; } - return nullptr; + return last; } void NetDb::PostI2NPMsg (I2NPMessage * msg) diff --git a/Tunnel.cpp b/Tunnel.cpp index f92337f7..fe904369 100644 --- a/Tunnel.cpp +++ b/Tunnel.cpp @@ -395,16 +395,15 @@ namespace tunnel } else { - //OutboundTunnel * outboundTunnel = GetNextOutboundTunnel (); + LogPrint ("Creating two hops outbound tunnel..."); CreateTunnel ( new TunnelConfig (std::vector { - i2p::data::netdb.GetRandomNTCPRouter (), - i2p::data::netdb.GetRandomNTCPRouter () + i2p::data::netdb.GetRandomNTCPRouter (), // first hop must be NTCP + i2p::data::netdb.GetRandomRouter () }, - inboundTunnel->GetTunnelConfig ())/*, - outboundTunnel*/); + inboundTunnel->GetTunnelConfig ())); } } } From ef7e81baae746d3ac887f948d5df79649b11d38a Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 24 Jan 2014 21:14:14 -0500 Subject: [PATCH 3/3] fixed crash --- Garlic.cpp | 2 +- NetDb.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Garlic.cpp b/Garlic.cpp index ad824fd7..cdb8860e 100644 --- a/Garlic.cpp +++ b/Garlic.cpp @@ -236,8 +236,8 @@ namespace garlic auto it = m_Sessions.find (destination->GetIdentHash ()); if (it != m_Sessions.end ()) { - m_Sessions.erase (it); delete it->second; + m_Sessions.erase (it); } GarlicRoutingSession * session = new GarlicRoutingSession (destination, 0); // not follow-on messages expected m_Sessions[destination->GetIdentHash ()] = session; diff --git a/NetDb.cpp b/NetDb.cpp index 05d9d9fa..3e6b83fa 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -412,8 +412,8 @@ namespace data else { // no more requests for detination possible. delete it - m_RequestedDestinations.erase (it); delete it->second; + m_RequestedDestinations.erase (it); } } else @@ -474,8 +474,8 @@ namespace data auto it = m_RequestedDestinations.find (dest); if (it != m_RequestedDestinations.end ()) { - m_RequestedDestinations.erase (it); delete it->second; + m_RequestedDestinations.erase (it); } }