From 9557adf8c26af109ed172f097258b42d9cf4eae2 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 28 Aug 2014 21:34:23 -0400 Subject: [PATCH] hold I2NP message for 5 seconds if router is not in netDb --- Transports.cpp | 22 +++++++++++++++++++++- Transports.h | 2 ++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Transports.cpp b/Transports.cpp index 851e244d..136e4a07 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -258,11 +258,31 @@ namespace i2p { LogPrint ("Router not found. Requested"); i2p::data::netdb.RequestDestination (ident); - DeleteI2NPMessage (msg); // TODO: implement a placeholder for router and send once it's available + auto resendTimer = new boost::asio::deadline_timer (m_Service); + resendTimer->expires_from_now (boost::posix_time::seconds(5)); // 5 seconds + resendTimer->async_wait (boost::bind (&Transports::HandleResendTimer, + this, boost::asio::placeholders::error, resendTimer, ident, msg)); } } } + void Transports::HandleResendTimer (const boost::system::error_code& ecode, + boost::asio::deadline_timer * timer, const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg) + { + RouterInfo * r = netdb.FindRouter (ident); + if (r) + { + LogPrint ("Router found. Sending message"); + PostMessage (ident, msg); + } + else + { + LogPrint ("Router not found. Failed to send message"); + DeleteI2NPMessage (msg); + } + delete timer; + } + void Transports::CloseSession (const i2p::data::RouterInfo * router) { if (!router) return; diff --git a/Transports.h b/Transports.h index e5e6ddfa..20052a15 100644 --- a/Transports.h +++ b/Transports.h @@ -69,6 +69,8 @@ namespace i2p void Run (); void HandleAccept (i2p::ntcp::NTCPServerConnection * conn, const boost::system::error_code& error); + void HandleResendTimer (const boost::system::error_code& ecode, boost::asio::deadline_timer * timer, + const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg); void PostMessage (const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg); void PostCloseSession (const i2p::data::RouterInfo * router);