|
|
@ -14,7 +14,7 @@ namespace transport |
|
|
|
SSUSession::SSUSession (SSUServer& server, boost::asio::ip::udp::endpoint& remoteEndpoint, |
|
|
|
SSUSession::SSUSession (SSUServer& server, boost::asio::ip::udp::endpoint& remoteEndpoint, |
|
|
|
std::shared_ptr<const i2p::data::RouterInfo> router, bool peerTest ): |
|
|
|
std::shared_ptr<const i2p::data::RouterInfo> router, bool peerTest ): |
|
|
|
TransportSession (router, SSU_TERMINATION_TIMEOUT), |
|
|
|
TransportSession (router, SSU_TERMINATION_TIMEOUT), |
|
|
|
m_Server (server), m_RemoteEndpoint (remoteEndpoint), m_Timer (GetService ()), |
|
|
|
m_Server (server), m_RemoteEndpoint (remoteEndpoint), m_ConnectTimer (GetService ()), |
|
|
|
m_IsPeerTest (peerTest),m_State (eSessionStateUnknown), m_IsSessionKey (false), |
|
|
|
m_IsPeerTest (peerTest),m_State (eSessionStateUnknown), m_IsSessionKey (false), |
|
|
|
m_RelayTag (0),m_Data (*this), m_IsDataReceived (false) |
|
|
|
m_RelayTag (0),m_Data (*this), m_IsDataReceived (false) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -97,7 +97,7 @@ namespace transport |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!len) return; // ignore zero-length packets
|
|
|
|
if (!len) return; // ignore zero-length packets
|
|
|
|
if (m_State == eSessionStateEstablished) |
|
|
|
if (m_State == eSessionStateEstablished) |
|
|
|
ScheduleTermination (); |
|
|
|
m_LastActivityTimestamp = i2p::util::GetSecondsSinceEpoch (); |
|
|
|
|
|
|
|
|
|
|
|
if (m_IsSessionKey && Validate (buf, len, m_MacKey)) // try session key first
|
|
|
|
if (m_IsSessionKey && Validate (buf, len, m_MacKey)) // try session key first
|
|
|
|
DecryptSessionKey (buf, len); |
|
|
|
DecryptSessionKey (buf, len); |
|
|
@ -229,7 +229,7 @@ namespace transport |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
LogPrint (eLogDebug, "SSU message: session created"); |
|
|
|
LogPrint (eLogDebug, "SSU message: session created"); |
|
|
|
m_Timer.cancel (); // connect timer
|
|
|
|
m_ConnectTimer.cancel (); // connect timer
|
|
|
|
SignedData s; // x,y, our IP, our port, remote IP, remote port, relayTag, signed on time
|
|
|
|
SignedData s; // x,y, our IP, our port, remote IP, remote port, relayTag, signed on time
|
|
|
|
auto headerSize = GetSSUHeaderSize (buf); |
|
|
|
auto headerSize = GetSSUHeaderSize (buf); |
|
|
|
if (headerSize >= len) |
|
|
|
if (headerSize >= len) |
|
|
@ -804,9 +804,9 @@ namespace transport |
|
|
|
|
|
|
|
|
|
|
|
void SSUSession::ScheduleConnectTimer () |
|
|
|
void SSUSession::ScheduleConnectTimer () |
|
|
|
{ |
|
|
|
{ |
|
|
|
m_Timer.cancel (); |
|
|
|
m_ConnectTimer.cancel (); |
|
|
|
m_Timer.expires_from_now (boost::posix_time::seconds(SSU_CONNECT_TIMEOUT)); |
|
|
|
m_ConnectTimer.expires_from_now (boost::posix_time::seconds(SSU_CONNECT_TIMEOUT)); |
|
|
|
m_Timer.async_wait (std::bind (&SSUSession::HandleConnectTimer, |
|
|
|
m_ConnectTimer.async_wait (std::bind (&SSUSession::HandleConnectTimer, |
|
|
|
shared_from_this (), std::placeholders::_1)); |
|
|
|
shared_from_this (), std::placeholders::_1)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -826,8 +826,8 @@ namespace transport |
|
|
|
if (m_State == eSessionStateUnknown) |
|
|
|
if (m_State == eSessionStateUnknown) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// set connect timer
|
|
|
|
// set connect timer
|
|
|
|
m_Timer.expires_from_now (boost::posix_time::seconds(SSU_CONNECT_TIMEOUT)); |
|
|
|
m_ConnectTimer.expires_from_now (boost::posix_time::seconds(SSU_CONNECT_TIMEOUT)); |
|
|
|
m_Timer.async_wait (std::bind (&SSUSession::HandleConnectTimer, |
|
|
|
m_ConnectTimer.async_wait (std::bind (&SSUSession::HandleConnectTimer, |
|
|
|
shared_from_this (), std::placeholders::_1)); |
|
|
|
shared_from_this (), std::placeholders::_1)); |
|
|
|
} |
|
|
|
} |
|
|
|
uint32_t nonce; |
|
|
|
uint32_t nonce; |
|
|
@ -840,8 +840,8 @@ namespace transport |
|
|
|
{ |
|
|
|
{ |
|
|
|
m_State = eSessionStateIntroduced; |
|
|
|
m_State = eSessionStateIntroduced; |
|
|
|
// set connect timer
|
|
|
|
// set connect timer
|
|
|
|
m_Timer.expires_from_now (boost::posix_time::seconds(SSU_CONNECT_TIMEOUT)); |
|
|
|
m_ConnectTimer.expires_from_now (boost::posix_time::seconds(SSU_CONNECT_TIMEOUT)); |
|
|
|
m_Timer.async_wait (std::bind (&SSUSession::HandleConnectTimer, |
|
|
|
m_ConnectTimer.async_wait (std::bind (&SSUSession::HandleConnectTimer, |
|
|
|
shared_from_this (), std::placeholders::_1)); |
|
|
|
shared_from_this (), std::placeholders::_1)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -851,7 +851,7 @@ namespace transport |
|
|
|
SendSesionDestroyed (); |
|
|
|
SendSesionDestroyed (); |
|
|
|
transports.PeerDisconnected (shared_from_this ()); |
|
|
|
transports.PeerDisconnected (shared_from_this ()); |
|
|
|
m_Data.Stop (); |
|
|
|
m_Data.Stop (); |
|
|
|
m_Timer.cancel (); |
|
|
|
m_ConnectTimer.cancel (); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void SSUSession::Done () |
|
|
|
void SSUSession::Done () |
|
|
@ -868,7 +868,7 @@ namespace transport |
|
|
|
transports.PeerConnected (shared_from_this ()); |
|
|
|
transports.PeerConnected (shared_from_this ()); |
|
|
|
if (m_IsPeerTest) |
|
|
|
if (m_IsPeerTest) |
|
|
|
SendPeerTest (); |
|
|
|
SendPeerTest (); |
|
|
|
ScheduleTermination (); |
|
|
|
m_LastActivityTimestamp = i2p::util::GetSecondsSinceEpoch (); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void SSUSession::Failed () |
|
|
|
void SSUSession::Failed () |
|
|
@ -880,24 +880,6 @@ namespace transport |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void SSUSession::ScheduleTermination () |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
m_Timer.cancel (); |
|
|
|
|
|
|
|
m_Timer.expires_from_now (boost::posix_time::seconds(GetTerminationTimeout ())); |
|
|
|
|
|
|
|
m_Timer.async_wait (std::bind (&SSUSession::HandleTerminationTimer, |
|
|
|
|
|
|
|
shared_from_this (), std::placeholders::_1)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SSUSession::HandleTerminationTimer (const boost::system::error_code& ecode) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (ecode != boost::asio::error::operation_aborted) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LogPrint (eLogWarning, "SSU: no activity with ", m_RemoteEndpoint, " for ", GetTerminationTimeout (), " seconds"); |
|
|
|
|
|
|
|
Failed (); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SSUSession::SendI2NPMessages (const std::vector<std::shared_ptr<I2NPMessage> >& msgs) |
|
|
|
void SSUSession::SendI2NPMessages (const std::vector<std::shared_ptr<I2NPMessage> >& msgs) |
|
|
|
{ |
|
|
|
{ |
|
|
|
GetService ().post (std::bind (&SSUSession::PostI2NPMessages, shared_from_this (), msgs)); |
|
|
|
GetService ().post (std::bind (&SSUSession::PostI2NPMessages, shared_from_this (), msgs)); |
|
|
@ -1126,7 +1108,7 @@ namespace transport |
|
|
|
FillHeaderAndEncrypt (PAYLOAD_TYPE_DATA, buf, 48); |
|
|
|
FillHeaderAndEncrypt (PAYLOAD_TYPE_DATA, buf, 48); |
|
|
|
Send (buf, 48); |
|
|
|
Send (buf, 48); |
|
|
|
LogPrint (eLogDebug, "SSU: keep-alive sent"); |
|
|
|
LogPrint (eLogDebug, "SSU: keep-alive sent"); |
|
|
|
ScheduleTermination (); |
|
|
|
m_LastActivityTimestamp = i2p::util::GetSecondsSinceEpoch (); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|