From c30dd2639a6141931e3db3d57a3bb62be6fd8ccc Mon Sep 17 00:00:00 2001 From: orignal Date: Mon, 7 Apr 2014 21:40:28 -0400 Subject: [PATCH] SSU timeout --- NTCPSession.cpp | 4 ++-- NTCPSession.h | 2 +- SSU.cpp | 21 ++++++++++++++++++++- SSU.h | 4 ++++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/NTCPSession.cpp b/NTCPSession.cpp index e21e8d18..ad71e3b0 100644 --- a/NTCPSession.cpp +++ b/NTCPSession.cpp @@ -519,7 +519,7 @@ namespace ntcp void NTCPSession::ScheduleTermination () { m_TerminationTimer.cancel (); - m_TerminationTimer.expires_from_now (boost::posix_time::seconds(TERMINATION_TIMEOUT)); + m_TerminationTimer.expires_from_now (boost::posix_time::seconds(NTCP_TERMINATION_TIMEOUT)); m_TerminationTimer.async_wait (boost::bind (&NTCPSession::HandleTerminationTimer, this, boost::asio::placeholders::error)); } @@ -528,7 +528,7 @@ namespace ntcp { if (ecode != boost::asio::error::operation_aborted) { - LogPrint ("No activity fo ", TERMINATION_TIMEOUT, " seconds"); + LogPrint ("No activity fo ", NTCP_TERMINATION_TIMEOUT, " seconds"); m_Socket.close (); } } diff --git a/NTCPSession.h b/NTCPSession.h index 4202c5c9..83396e11 100644 --- a/NTCPSession.h +++ b/NTCPSession.h @@ -61,7 +61,7 @@ namespace ntcp #pragma pack() - const int TERMINATION_TIMEOUT = 120; // 2 minutes + const int NTCP_TERMINATION_TIMEOUT = 120; // 2 minutes class NTCPSession { public: diff --git a/SSU.cpp b/SSU.cpp index 36817a65..2b0f2c7a 100644 --- a/SSU.cpp +++ b/SSU.cpp @@ -546,6 +546,7 @@ namespace ssu } if (m_PeerTest) SendPeerTest (); + ScheduleTermination (); } void SSUSession::Failed () @@ -557,7 +558,24 @@ namespace ssu m_Server.DeleteSession (this); // delete this } } - + + void SSUSession::ScheduleTermination () + { + m_Timer.cancel (); + m_Timer.expires_from_now (boost::posix_time::seconds(SSU_TERMINATION_TIMEOUT)); + m_Timer.async_wait (boost::bind (&SSUSession::HandleTerminationTimer, + this, boost::asio::placeholders::error)); + } + + void SSUSession::HandleTerminationTimer (const boost::system::error_code& ecode) + { + if (ecode != boost::asio::error::operation_aborted) + { + LogPrint ("SSU no activity fo ", SSU_TERMINATION_TIMEOUT, " seconds"); + Close (); + } + } + const uint8_t * SSUSession::GetIntroKey () const { if (m_RemoteRouter) @@ -587,6 +605,7 @@ namespace ssu void SSUSession::ProcessData (uint8_t * buf, size_t len) { + ScheduleTermination (); //uint8_t * start = buf; uint8_t flag = *buf; buf++; diff --git a/SSU.h b/SSU.h index 88e3dd45..196da273 100644 --- a/SSU.h +++ b/SSU.h @@ -30,6 +30,7 @@ namespace ssu const size_t SSU_MTU = 1484; const int SSU_CONNECT_TIMEOUT = 5; // 5 seconds + const int SSU_TERMINATION_TIMEOUT = 270; // 4.5 minutes // payload types (4 bits) const uint8_t PAYLOAD_TYPE_SESSION_REQUEST = 0; @@ -115,6 +116,9 @@ namespace ssu bool Validate (uint8_t * buf, size_t len, const uint8_t * macKey); const uint8_t * GetIntroKey () const; + void ScheduleTermination (); + void HandleTerminationTimer (const boost::system::error_code& ecode); + private: SSUServer& m_Server;