From 2cc106b43eaa40bfabadf52ebf9a8460a00de23b Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 17 Jun 2022 15:16:12 -0400 Subject: [PATCH] bind SSU2 socket to specified interface --- libi2pd/SSU2.cpp | 14 ++++++++++++-- libi2pd/SSU2.h | 4 +++- libi2pd/Transports.cpp | 2 ++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/libi2pd/SSU2.cpp b/libi2pd/SSU2.cpp index fbdb52bd..a62f9980 100644 --- a/libi2pd/SSU2.cpp +++ b/libi2pd/SSU2.cpp @@ -20,6 +20,7 @@ namespace transport SSU2Server::SSU2Server (): RunnableServiceWithWork ("SSU2"), m_ReceiveService ("SSU2r"), m_SocketV4 (m_ReceiveService.GetService ()), m_SocketV6 (m_ReceiveService.GetService ()), + m_AddressV4 (boost::asio::ip::address_v4()), m_AddressV6 (boost::asio::ip::address_v6()), m_TerminationTimer (GetService ()), m_ResendTimer (GetService ()) { } @@ -52,7 +53,7 @@ namespace transport if (address->IsV4 ()) { found = true; - OpenSocket (boost::asio::ip::udp::endpoint (boost::asio::ip::udp::v4(), port)); + OpenSocket (boost::asio::ip::udp::endpoint (m_AddressV4, port)); m_ReceiveService.GetService ().post( [this]() { @@ -62,7 +63,7 @@ namespace transport if (address->IsV6 ()) { found = true; - OpenSocket (boost::asio::ip::udp::endpoint (boost::asio::ip::udp::v6(), port)); + OpenSocket (boost::asio::ip::udp::endpoint (m_AddressV6, port)); m_ReceiveService.GetService ().post( [this]() { @@ -99,6 +100,15 @@ namespace transport StopIOService (); } + void SSU2Server::SetLocalAddress (const boost::asio::ip::address& localAddress) + { + if (localAddress.is_unspecified ()) return; + if (localAddress.is_v4 ()) + m_AddressV4 = localAddress; + else if (localAddress.is_v6 ()) + m_AddressV6 = localAddress; + } + boost::asio::ip::udp::socket& SSU2Server::OpenSocket (const boost::asio::ip::udp::endpoint& localEndpoint) { boost::asio::ip::udp::socket& socket = localEndpoint.address ().is_v6 () ? m_SocketV6 : m_SocketV4; diff --git a/libi2pd/SSU2.h b/libi2pd/SSU2.h index 4dfe8485..1c16f7af 100644 --- a/libi2pd/SSU2.h +++ b/libi2pd/SSU2.h @@ -48,7 +48,8 @@ namespace transport void Start (); void Stop (); boost::asio::io_service& GetService () { return GetIOService (); }; - + void SetLocalAddress (const boost::asio::ip::address& localAddress); + void AddSession (std::shared_ptr session); void RemoveSession (uint64_t connID); void AddSessionByRouterHash (std::shared_ptr session); @@ -97,6 +98,7 @@ namespace transport ReceiveService m_ReceiveService; boost::asio::ip::udp::socket m_SocketV4, m_SocketV6; + boost::asio::ip::address m_AddressV4, m_AddressV6; std::unordered_map > m_Sessions; std::map > m_SessionsByRouterHash; std::map > m_PendingOutgoingSessions; diff --git a/libi2pd/Transports.cpp b/libi2pd/Transports.cpp index 1864aa72..32651904 100644 --- a/libi2pd/Transports.cpp +++ b/libi2pd/Transports.cpp @@ -233,6 +233,7 @@ namespace transport { if (m_NTCP2Server) m_NTCP2Server->SetLocalAddress (addr); if (m_SSUServer) m_SSUServer->SetLocalAddress (addr); + if (m_SSU2Server) m_SSU2Server->SetLocalAddress (addr); } } } @@ -249,6 +250,7 @@ namespace transport { if (m_NTCP2Server) m_NTCP2Server->SetLocalAddress (addr); if (m_SSUServer) m_SSUServer->SetLocalAddress (addr); + if (m_SSU2Server) m_SSU2Server->SetLocalAddress (addr); } } }