mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 21:37:17 +01:00
don't send session create reply until destination is ready
This commit is contained in:
parent
f516d4c6f2
commit
c8bca65b97
|
@ -28,6 +28,7 @@ namespace client
|
||||||
bool IsRunning () const { return m_IsRunning; };
|
bool IsRunning () const { return m_IsRunning; };
|
||||||
boost::asio::io_service * GetService () { return m_Service; };
|
boost::asio::io_service * GetService () { return m_Service; };
|
||||||
i2p::tunnel::TunnelPool * GetTunnelPool () { return m_Pool; };
|
i2p::tunnel::TunnelPool * GetTunnelPool () { return m_Pool; };
|
||||||
|
bool IsReady () const { return m_LeaseSet && m_LeaseSet->HasNonExpiredLeases (); };
|
||||||
|
|
||||||
void ResetCurrentOutboundTunnel () { m_CurrentOutboundTunnel = nullptr; };
|
void ResetCurrentOutboundTunnel () { m_CurrentOutboundTunnel = nullptr; };
|
||||||
const i2p::data::LeaseSet * FindLeaseSet (const i2p::data::IdentHash& ident);
|
const i2p::data::LeaseSet * FindLeaseSet (const i2p::data::IdentHash& ident);
|
||||||
|
|
41
SAM.cpp
41
SAM.cpp
|
@ -220,18 +220,45 @@ namespace client
|
||||||
if (m_Session)
|
if (m_Session)
|
||||||
{
|
{
|
||||||
m_SocketType = eSAMSocketTypeSession;
|
m_SocketType = eSAMSocketTypeSession;
|
||||||
uint8_t buf[1024];
|
if (m_Session->localDestination->IsReady ())
|
||||||
char priv[1024];
|
SendSessionCreateReplyOk ();
|
||||||
size_t l = m_Session->localDestination->GetPrivateKeys ().ToBuffer (buf, 1024);
|
else
|
||||||
size_t l1 = i2p::data::ByteStreamToBase64 (buf, l, priv, 1024);
|
{
|
||||||
priv[l1] = 0;
|
m_Timer.expires_from_now (boost::posix_time::seconds(SAM_SESSION_READINESS_CHECK_INTERVAL));
|
||||||
size_t l2 = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_SESSION_CREATE_REPLY_OK, priv);
|
m_Timer.async_wait (boost::bind (&SAMSocket::HandleSessionReadinessCheckTimer,
|
||||||
SendMessageReply (m_Buffer, l2, false);
|
this, boost::asio::placeholders::error));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
SendMessageReply (SAM_SESSION_CREATE_DUPLICATED_DEST, strlen(SAM_SESSION_CREATE_DUPLICATED_DEST), true);
|
SendMessageReply (SAM_SESSION_CREATE_DUPLICATED_DEST, strlen(SAM_SESSION_CREATE_DUPLICATED_DEST), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SAMSocket::HandleSessionReadinessCheckTimer (const boost::system::error_code& ecode)
|
||||||
|
{
|
||||||
|
if (ecode != boost::asio::error::operation_aborted)
|
||||||
|
{
|
||||||
|
if (m_Session->localDestination->IsReady ())
|
||||||
|
SendSessionCreateReplyOk ();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_Timer.expires_from_now (boost::posix_time::seconds(SAM_SESSION_READINESS_CHECK_INTERVAL));
|
||||||
|
m_Timer.async_wait (boost::bind (&SAMSocket::HandleSessionReadinessCheckTimer,
|
||||||
|
this, boost::asio::placeholders::error));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SAMSocket::SendSessionCreateReplyOk ()
|
||||||
|
{
|
||||||
|
uint8_t buf[1024];
|
||||||
|
char priv[1024];
|
||||||
|
size_t l = m_Session->localDestination->GetPrivateKeys ().ToBuffer (buf, 1024);
|
||||||
|
size_t l1 = i2p::data::ByteStreamToBase64 (buf, l, priv, 1024);
|
||||||
|
priv[l1] = 0;
|
||||||
|
size_t l2 = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_SESSION_CREATE_REPLY_OK, priv);
|
||||||
|
SendMessageReply (m_Buffer, l2, false);
|
||||||
|
}
|
||||||
|
|
||||||
void SAMSocket::ProcessStreamConnect (char * buf, size_t len)
|
void SAMSocket::ProcessStreamConnect (char * buf, size_t len)
|
||||||
{
|
{
|
||||||
LogPrint ("SAM stream connect: ", buf);
|
LogPrint ("SAM stream connect: ", buf);
|
||||||
|
|
3
SAM.h
3
SAM.h
|
@ -20,6 +20,7 @@ namespace client
|
||||||
const int SAM_SOCKET_CONNECTION_MAX_IDLE = 3600; // in seconds
|
const int SAM_SOCKET_CONNECTION_MAX_IDLE = 3600; // in seconds
|
||||||
const int SAM_CONNECT_TIMEOUT = 5; // in seconds
|
const int SAM_CONNECT_TIMEOUT = 5; // in seconds
|
||||||
const int SAM_NAMING_LOOKUP_TIMEOUT = 5; // in seconds
|
const int SAM_NAMING_LOOKUP_TIMEOUT = 5; // in seconds
|
||||||
|
const int SAM_SESSION_READINESS_CHECK_INTERVAL = 20; // in seconds
|
||||||
const char SAM_HANDSHAKE[] = "HELLO VERSION";
|
const char SAM_HANDSHAKE[] = "HELLO VERSION";
|
||||||
const char SAM_HANDSHAKE_REPLY[] = "HELLO REPLY RESULT=OK VERSION=3.0\n";
|
const char SAM_HANDSHAKE_REPLY[] = "HELLO REPLY RESULT=OK VERSION=3.0\n";
|
||||||
const char SAM_SESSION_CREATE[] = "SESSION CREATE";
|
const char SAM_SESSION_CREATE[] = "SESSION CREATE";
|
||||||
|
@ -95,6 +96,8 @@ namespace client
|
||||||
void HandleStreamDestinationRequestTimer (const boost::system::error_code& ecode, i2p::data::IdentHash ident);
|
void HandleStreamDestinationRequestTimer (const boost::system::error_code& ecode, i2p::data::IdentHash ident);
|
||||||
void HandleNamingLookupDestinationRequestTimer (const boost::system::error_code& ecode, i2p::data::IdentHash ident);
|
void HandleNamingLookupDestinationRequestTimer (const boost::system::error_code& ecode, i2p::data::IdentHash ident);
|
||||||
void SendNamingLookupReply (const i2p::data::LeaseSet * leaseSet);
|
void SendNamingLookupReply (const i2p::data::LeaseSet * leaseSet);
|
||||||
|
void HandleSessionReadinessCheckTimer (const boost::system::error_code& ecode);
|
||||||
|
void SendSessionCreateReplyOk ();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue