mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-27 09:04:15 +00:00
incoming SSU V6 sessions
This commit is contained in:
parent
a3fd338fab
commit
8403c17c59
58
SSU.cpp
58
SSU.cpp
@ -1010,11 +1010,19 @@ namespace transport
|
|||||||
|
|
||||||
|
|
||||||
SSUServer::SSUServer (int port): m_Thread (nullptr), m_Work (m_Service),
|
SSUServer::SSUServer (int port): m_Thread (nullptr), m_Work (m_Service),
|
||||||
m_Endpoint (boost::asio::ip::udp::v4 (), port), m_Socket (m_Service, m_Endpoint),
|
m_Endpoint (boost::asio::ip::udp::v4 (), port), m_EndpointV6 (boost::asio::ip::udp::v6 (), port),
|
||||||
m_IntroducersUpdateTimer (m_Service)
|
m_Socket (m_Service, m_Endpoint), m_SocketV6 (m_Service), m_IntroducersUpdateTimer (m_Service)
|
||||||
{
|
{
|
||||||
m_Socket.set_option (boost::asio::socket_base::receive_buffer_size (65535));
|
m_Socket.set_option (boost::asio::socket_base::receive_buffer_size (65535));
|
||||||
m_Socket.set_option (boost::asio::socket_base::send_buffer_size (65535));
|
m_Socket.set_option (boost::asio::socket_base::send_buffer_size (65535));
|
||||||
|
if (context.SupportsV6 ())
|
||||||
|
{
|
||||||
|
m_SocketV6.open (boost::asio::ip::udp::v6());
|
||||||
|
m_SocketV6.set_option (boost::asio::ip::v6_only (true));
|
||||||
|
m_SocketV6.set_option (boost::asio::socket_base::receive_buffer_size (65535));
|
||||||
|
m_SocketV6.set_option (boost::asio::socket_base::send_buffer_size (65535));
|
||||||
|
m_SocketV6.bind (m_EndpointV6);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SSUServer::~SSUServer ()
|
SSUServer::~SSUServer ()
|
||||||
@ -1028,6 +1036,8 @@ namespace transport
|
|||||||
m_IsRunning = true;
|
m_IsRunning = true;
|
||||||
m_Thread = new std::thread (std::bind (&SSUServer::Run, this));
|
m_Thread = new std::thread (std::bind (&SSUServer::Run, this));
|
||||||
m_Service.post (boost::bind (&SSUServer::Receive, this));
|
m_Service.post (boost::bind (&SSUServer::Receive, this));
|
||||||
|
if (context.SupportsV6 ())
|
||||||
|
m_Service.post (boost::bind (&SSUServer::ReceiveV6, this));
|
||||||
if (i2p::context.IsUnreachable ())
|
if (i2p::context.IsUnreachable ())
|
||||||
ScheduleIntroducersUpdateTimer ();
|
ScheduleIntroducersUpdateTimer ();
|
||||||
}
|
}
|
||||||
@ -1085,27 +1095,49 @@ namespace transport
|
|||||||
boost::bind (&SSUServer::HandleReceivedFrom, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
|
boost::bind (&SSUServer::HandleReceivedFrom, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SSUServer::ReceiveV6 ()
|
||||||
|
{
|
||||||
|
m_SocketV6.async_receive_from (boost::asio::buffer (m_ReceiveBufferV6, SSU_MTU_V6), m_SenderEndpointV6,
|
||||||
|
boost::bind (&SSUServer::HandleReceivedFromV6, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
|
||||||
|
}
|
||||||
|
|
||||||
void SSUServer::HandleReceivedFrom (const boost::system::error_code& ecode, std::size_t bytes_transferred)
|
void SSUServer::HandleReceivedFrom (const boost::system::error_code& ecode, std::size_t bytes_transferred)
|
||||||
{
|
{
|
||||||
if (!ecode)
|
if (!ecode)
|
||||||
{
|
{
|
||||||
SSUSession * session = nullptr;
|
HandleReceivedBuffer (m_SenderEndpoint, m_ReceiveBuffer, bytes_transferred);
|
||||||
auto it = m_Sessions.find (m_SenderEndpoint);
|
|
||||||
if (it != m_Sessions.end ())
|
|
||||||
session = it->second;
|
|
||||||
if (!session)
|
|
||||||
{
|
|
||||||
session = new SSUSession (*this, m_SenderEndpoint);
|
|
||||||
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, m_SenderEndpoint);
|
|
||||||
Receive ();
|
Receive ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LogPrint ("SSU receive error: ", ecode.message ());
|
LogPrint ("SSU receive error: ", ecode.message ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SSUServer::HandleReceivedFromV6 (const boost::system::error_code& ecode, std::size_t bytes_transferred)
|
||||||
|
{
|
||||||
|
if (!ecode)
|
||||||
|
{
|
||||||
|
HandleReceivedBuffer (m_SenderEndpointV6, m_ReceiveBufferV6, bytes_transferred);
|
||||||
|
ReceiveV6 ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LogPrint ("SSU V6 receive error: ", ecode.message ());
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSUServer::HandleReceivedBuffer (boost::asio::ip::udp::endpoint& from, uint8_t * buf, std::size_t bytes_transferred)
|
||||||
|
{
|
||||||
|
SSUSession * session = nullptr;
|
||||||
|
auto it = m_Sessions.find (from);
|
||||||
|
if (it != m_Sessions.end ())
|
||||||
|
session = it->second;
|
||||||
|
if (!session)
|
||||||
|
{
|
||||||
|
session = new SSUSession (*this, from);
|
||||||
|
m_Sessions[m_SenderEndpoint] = session;
|
||||||
|
LogPrint ("New SSU session from ", from.address ().to_string (), ":", from.port (), " created");
|
||||||
|
}
|
||||||
|
session->ProcessNextMessage (buf, bytes_transferred, from);
|
||||||
|
}
|
||||||
|
|
||||||
SSUSession * SSUServer::FindSession (const i2p::data::RouterInfo * router)
|
SSUSession * SSUServer::FindSession (const i2p::data::RouterInfo * router)
|
||||||
{
|
{
|
||||||
if (!router) return nullptr;
|
if (!router) return nullptr;
|
||||||
|
13
SSU.h
13
SSU.h
@ -169,7 +169,10 @@ namespace transport
|
|||||||
|
|
||||||
void Run ();
|
void Run ();
|
||||||
void Receive ();
|
void Receive ();
|
||||||
void HandleReceivedFrom (const boost::system::error_code& ecode, std::size_t bytes_transferred);
|
void ReceiveV6 ();
|
||||||
|
void HandleReceivedFrom (const boost::system::error_code& ecode, std::size_t bytes_transferred);
|
||||||
|
void HandleReceivedFromV6 (const boost::system::error_code& ecode, std::size_t bytes_transferred);
|
||||||
|
void HandleReceivedBuffer (boost::asio::ip::udp::endpoint& from, uint8_t * buf, std::size_t bytes_transferred);
|
||||||
|
|
||||||
template<typename Filter>
|
template<typename Filter>
|
||||||
SSUSession * GetRandomSession (Filter filter);
|
SSUSession * GetRandomSession (Filter filter);
|
||||||
@ -184,12 +187,12 @@ namespace transport
|
|||||||
std::thread * m_Thread;
|
std::thread * m_Thread;
|
||||||
boost::asio::io_service m_Service;
|
boost::asio::io_service m_Service;
|
||||||
boost::asio::io_service::work m_Work;
|
boost::asio::io_service::work m_Work;
|
||||||
boost::asio::ip::udp::endpoint m_Endpoint;
|
boost::asio::ip::udp::endpoint m_Endpoint, m_EndpointV6;
|
||||||
boost::asio::ip::udp::socket m_Socket;
|
boost::asio::ip::udp::socket m_Socket, m_SocketV6;
|
||||||
boost::asio::ip::udp::endpoint m_SenderEndpoint;
|
boost::asio::ip::udp::endpoint m_SenderEndpoint, m_SenderEndpointV6;
|
||||||
boost::asio::deadline_timer m_IntroducersUpdateTimer;
|
boost::asio::deadline_timer m_IntroducersUpdateTimer;
|
||||||
std::list<boost::asio::ip::udp::endpoint> m_Introducers; // introducers we are connected to
|
std::list<boost::asio::ip::udp::endpoint> m_Introducers; // introducers we are connected to
|
||||||
uint8_t m_ReceiveBuffer[2*SSU_MTU_V4];
|
uint8_t m_ReceiveBuffer[2*SSU_MTU_V4], m_ReceiveBufferV6[2*SSU_MTU_V6];
|
||||||
std::map<boost::asio::ip::udp::endpoint, SSUSession *> m_Sessions;
|
std::map<boost::asio::ip::udp::endpoint, SSUSession *> m_Sessions;
|
||||||
std::map<uint32_t, boost::asio::ip::udp::endpoint> m_Relays; // we are introducer
|
std::map<uint32_t, boost::asio::ip::udp::endpoint> m_Relays; // we are introducer
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ namespace transport
|
|||||||
this, conn, boost::asio::placeholders::error));
|
this, conn, boost::asio::placeholders::error));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (address.transportStyle == RouterInfo::eTransportSSU)
|
else if (address.transportStyle == RouterInfo::eTransportSSU && address.host.is_v4 ())
|
||||||
{
|
{
|
||||||
if (!m_SSUServer)
|
if (!m_SSUServer)
|
||||||
{
|
{
|
||||||
@ -356,7 +356,7 @@ namespace transport
|
|||||||
|
|
||||||
void Transports::DetectExternalIP ()
|
void Transports::DetectExternalIP ()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 5; i ++)
|
for (int i = 0; i < 5; i++)
|
||||||
{
|
{
|
||||||
auto router = i2p::data::netdb.GetRandomRouter ();
|
auto router = i2p::data::netdb.GetRandomRouter ();
|
||||||
if (router && router->IsSSU () && m_SSUServer)
|
if (router && router->IsSSU () && m_SSUServer)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user