diff --git a/libi2pd_client/I2CP.cpp b/libi2pd_client/I2CP.cpp index d592cc7e..243e2e0c 100644 --- a/libi2pd_client/I2CP.cpp +++ b/libi2pd_client/I2CP.cpp @@ -337,8 +337,8 @@ namespace client } I2CPSession::I2CPSession (I2CPServer& owner, std::shared_ptr socket): - m_Owner (owner), m_Socket (socket), m_SessionID (0xFFFF), - m_MessageID (0), m_IsSendAccepted (true), m_IsSending (false) + m_Owner (owner), m_Socket (socket), m_ReadinessCheckTimer (owner.GetService ()), + m_SessionID (0xFFFF), m_MessageID (0), m_IsSendAccepted (true), m_IsSending (false) { } @@ -470,6 +470,7 @@ namespace client void I2CPSession::Terminate () { + m_ReadinessCheckTimer.cancel (); if (m_Destination) { m_Destination->Stop (); @@ -649,9 +650,10 @@ namespace client std::make_shared(shared_from_this (), identity, true, params); if (m_Owner.InsertSession (shared_from_this ())) { - SendSessionStatusMessage (eI2CPSessionStatusCreated); // created LogPrint (eLogDebug, "I2CP: Session ", m_SessionID, " created"); m_Destination->Start (); + // check if ready, or schedule readiness timer + HandleSessionReadinessCheckTimer (boost::system::error_code ()); } else { @@ -672,6 +674,27 @@ namespace client } } + void I2CPSession::HandleSessionReadinessCheckTimer (const boost::system::error_code& ecode) + { + if (ecode != boost::asio::error::operation_aborted) + { + if (m_Destination) + { + if (m_Destination->IsReady ()) + { + LogPrint (eLogDebug, "I2CP: Session ", m_SessionID, " created"); + SendSessionStatusMessage (eI2CPSessionStatusCreated); // created + } + else + { + m_ReadinessCheckTimer.expires_from_now (boost::posix_time::seconds(I2CP_SESSION_READINESS_CHECK_INTERVAL)); + m_ReadinessCheckTimer.async_wait (std::bind (&I2CPSession::HandleSessionReadinessCheckTimer, + shared_from_this (), std::placeholders::_1)); + } + } + } + } + void I2CPSession::DestroySessionMessageHandler (const uint8_t * buf, size_t len) { SendSessionStatusMessage (eI2CPSessionStatusDestroyed); // destroy diff --git a/libi2pd_client/I2CP.h b/libi2pd_client/I2CP.h index 98adbf0e..51d082de 100644 --- a/libi2pd_client/I2CP.h +++ b/libi2pd_client/I2CP.h @@ -30,6 +30,7 @@ namespace client const size_t I2CP_MAX_MESSAGE_LENGTH = 65535; const size_t I2CP_MAX_SEND_QUEUE_SIZE = 1024*1024; // in bytes, 1M const int I2CP_LEASESET_CREATION_TIMEOUT = 10; // in seconds + const int I2CP_SESSION_READINESS_CHECK_INTERVAL = 3; // in seconds const size_t I2CP_HEADER_LENGTH_OFFSET = 0; const size_t I2CP_HEADER_TYPE_OFFSET = I2CP_HEADER_LENGTH_OFFSET + 4; @@ -197,10 +198,13 @@ namespace client void SendSessionStatusMessage (I2CPSessionStatus status); void SendHostReplyMessage (uint32_t requestID, std::shared_ptr identity); + void HandleSessionReadinessCheckTimer (const boost::system::error_code& ecode); + private: I2CPServer& m_Owner; std::shared_ptr m_Socket; + boost::asio::deadline_timer m_ReadinessCheckTimer; uint8_t m_Header[I2CP_HEADER_SIZE], m_Payload[I2CP_MAX_MESSAGE_LENGTH]; size_t m_PayloadLen;