From 3cf3e69aef309bb1096d1f16655a747a661622c0 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 23 Jan 2014 16:10:33 -0500 Subject: [PATCH] SSU added --- Makefile | 2 +- SSU.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ SSU.h | 36 ++++++++++++++++++++++++++++++++++++ Transports.cpp | 21 +++++++++++++++++++-- Transports.h | 2 ++ 5 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 SSU.cpp create mode 100644 SSU.h diff --git a/Makefile b/Makefile index 1fec1950..84c7a32f 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ CC = g++ CFLAGS = -g -Wall -std=c++0x OBJECTS = i2p.o base64.o NTCPSession.o RouterInfo.o Transports.o RouterContext.o \ NetDb.o LeaseSet.o Tunnel.o TunnelEndpoint.o TunnelGateway.o TransitTunnel.o \ - I2NPProtocol.o Log.o Garlic.o HTTPServer.o Streaming.o Identity.o + I2NPProtocol.o Log.o Garlic.o HTTPServer.o Streaming.o Identity.o SSU.o INCFLAGS = LDFLAGS = -Wl,-rpath,/usr/local/lib -lcryptopp -lboost_system -lboost_filesystem LIBS = diff --git a/SSU.cpp b/SSU.cpp new file mode 100644 index 00000000..45788ed4 --- /dev/null +++ b/SSU.cpp @@ -0,0 +1,44 @@ +#include +#include "Log.h" +#include "hmac.h" +#include "SSU.h" + +namespace i2p +{ +namespace ssu +{ + SSUServer::SSUServer (boost::asio::io_service& service, int port): + m_Socket (service, boost::asio::ip::udp::v4 (), port) + { + } + + void SSUServer::Start () + { + Receive (); + } + + void SSUServer::Stop () + { + m_Socket.close (); + } + + void SSUServer::Receive () + { + m_Socket.async_receive_from (boost::asio::buffer (m_ReceiveBuffer, SSU_MTU), m_SenderEndpoint, + boost::bind (&SSUServer::HandleReceivedFrom, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); + } + + void SSUServer::HandleReceivedFrom (const boost::system::error_code& ecode, std::size_t bytes_transferred) + { + if (!ecode) + { + LogPrint ("SSU received ", bytes_transferred, " bytes"); + // Handle + Receive (); + } + else + LogPrint ("SSU receive error: ", ecode.message ()); + } +} +} + diff --git a/SSU.h b/SSU.h new file mode 100644 index 00000000..0cbc31f1 --- /dev/null +++ b/SSU.h @@ -0,0 +1,36 @@ +#ifndef SSU_H__ +#define SSU_H__ + +#include +#include + +namespace i2p +{ +namespace ssu +{ + const int SSU_MTU = 1484; + + class SSUServer + { + public: + + SSUServer (boost::asio::io_service& service, int port); + void Start (); + void Stop (); + + private: + + void Receive (); + void HandleReceivedFrom (const boost::system::error_code& ecode, std::size_t bytes_transferred); + + private: + + boost::asio::ip::udp::socket m_Socket; + boost::asio::ip::udp::endpoint m_SenderEndpoint; + uint8_t m_ReceiveBuffer[SSU_MTU]; + }; +} +} + +#endif + diff --git a/Transports.cpp b/Transports.cpp index 31d0325f..c3b96d78 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -12,7 +12,7 @@ namespace i2p Transports transports; Transports::Transports (): - m_Thread (0), m_Work (m_Service),m_NTCPAcceptor (0) + m_Thread (nullptr), m_Work (m_Service),m_NTCPAcceptor (nullptr), m_SSUServer (nullptr) { } @@ -34,11 +34,22 @@ namespace i2p m_NTCPAcceptor = new boost::asio::ip::tcp::acceptor (m_Service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), address.port)); - LogPrint ("Start listening port ", address.port); + LogPrint ("Start listening TCP port ", address.port); auto conn = new i2p::ntcp::NTCPServerConnection (m_Service); m_NTCPAcceptor->async_accept(conn->GetSocket (), boost::bind (&Transports::HandleAccept, this, conn, boost::asio::placeholders::error)); } + else if (address.transportStyle == RouterInfo::eTransportSSU) + { + if (!m_SSUServer) + { + m_SSUServer = new i2p::ssu::SSUServer (m_Service, address.port); + LogPrint ("Start listening UDP port ", address.port); + m_SSUServer->Start (); + } + else + LogPrint ("SSU server already exists"); + } } } @@ -49,6 +60,12 @@ namespace i2p m_NTCPSessions.clear (); delete m_NTCPAcceptor; + if (m_SSUServer) + { + m_SSUServer->Stop (); + delete m_SSUServer; + } + m_IsRunning = false; m_Service.stop (); if (m_Thread) diff --git a/Transports.h b/Transports.h index d6b08227..03f6cf35 100644 --- a/Transports.h +++ b/Transports.h @@ -7,6 +7,7 @@ #include #include #include "NTCPSession.h" +#include "SSU.h" #include "RouterInfo.h" #include "I2NPProtocol.h" @@ -47,6 +48,7 @@ namespace i2p boost::asio::ip::tcp::acceptor * m_NTCPAcceptor; std::map m_NTCPSessions; + i2p::ssu::SSUServer * m_SSUServer; public: