From 9e91be671dd10d5a3677e7cd169e98e975fc0116 Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 24 Jan 2014 16:30:07 -0500 Subject: [PATCH] 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; }; } }