diff --git a/TransportSession.h b/TransportSession.h index f4079590..99d8d868 100644 --- a/TransportSession.h +++ b/TransportSession.h @@ -6,6 +6,7 @@ #include #include "Identity.h" #include "RouterInfo.h" +#include "I2NPProtocol.h" namespace i2p { @@ -64,6 +65,8 @@ namespace transport std::shared_ptr GetRemoteRouter () { return m_RemoteRouter; }; const i2p::data::IdentityEx& GetRemoteIdentity () { return m_RemoteIdentity; }; + virtual void SendI2NPMessage (I2NPMessage * msg) = 0; + protected: std::shared_ptr m_RemoteRouter; diff --git a/Transports.cpp b/Transports.cpp index 3992290a..680389e7 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -285,27 +285,26 @@ namespace transport void Transports::SendMessage (const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg) { - if (ident == i2p::context.GetRouterInfo ().GetIdentHash ()) - // we send it to ourself - i2p::HandleI2NPMessage (msg); - else - m_Service.post (boost::bind (&Transports::PostMessage, this, ident, msg)); + m_Service.post (boost::bind (&Transports::PostMessage, this, ident, msg)); } void Transports::PostMessage (const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg) { - auto session = FindNTCPSession (ident); - if (session) - session->SendI2NPMessage (msg); - else + if (ident == i2p::context.GetRouterInfo ().GetIdentHash ()) + { + // we send it to ourself + i2p::HandleI2NPMessage (msg); + return; + } + std::shared_ptr session = FindNTCPSession (ident); + if (!session) { auto r = netdb.FindRouter (ident); if (r) { - auto ssuSession = m_SSUServer ? m_SSUServer->FindSession (r) : nullptr; - if (ssuSession) - ssuSession->SendI2NPMessage (msg); - else + if (m_SSUServer) + session = m_SSUServer->FindSession (r); + if (!session) { // existing session not found. create new // try NTCP first if message size < 16K @@ -314,20 +313,19 @@ namespace transport { auto s = std::make_shared (m_Service, r); AddNTCPSession (s); - s->SendI2NPMessage (msg); + session = s; Connect (address->host, address->port, s); } else { // then SSU - auto s = m_SSUServer ? m_SSUServer->GetSession (r) : nullptr; - if (s) - s->SendI2NPMessage (msg); - else + if (m_SSUServer) + session = m_SSUServer->GetSession (r); + if (!session) { LogPrint ("No NTCP and SSU addresses available"); - DeleteI2NPMessage (msg); - } + DeleteI2NPMessage (msg); + } } } } @@ -341,6 +339,8 @@ namespace transport this, boost::asio::placeholders::error, resendTimer, ident, msg)); } } + if (session) + session->SendI2NPMessage (msg); } void Transports::HandleResendTimer (const boost::system::error_code& ecode,