|
|
@ -537,17 +537,20 @@ namespace tunnel
|
|
|
|
if (i2p::transport::transports.IsOnline())
|
|
|
|
if (i2p::transport::transports.IsOnline())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
uint64_t ts = i2p::util::GetSecondsSinceEpoch ();
|
|
|
|
uint64_t ts = i2p::util::GetSecondsSinceEpoch ();
|
|
|
|
if (ts - lastTs >= TUNNEL_MANAGE_INTERVAL) // manage tunnels every 15 seconds
|
|
|
|
if (ts - lastTs >= TUNNEL_MANAGE_INTERVAL || // manage tunnels every 15 seconds
|
|
|
|
|
|
|
|
ts + TUNNEL_MANAGE_INTERVAL < lastTs)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ManageTunnels ();
|
|
|
|
ManageTunnels (ts);
|
|
|
|
lastTs = ts;
|
|
|
|
lastTs = ts;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (ts - lastPoolsTs >= TUNNEL_POOLS_MANAGE_INTERVAL) // manage pools every 5 seconds
|
|
|
|
if (ts - lastPoolsTs >= TUNNEL_POOLS_MANAGE_INTERVAL || // manage pools every 5 secondsts
|
|
|
|
|
|
|
|
ts + TUNNEL_POOLS_MANAGE_INTERVAL < lastPoolsTs)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ManageTunnelPools (ts);
|
|
|
|
ManageTunnelPools (ts);
|
|
|
|
lastPoolsTs = ts;
|
|
|
|
lastPoolsTs = ts;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (ts - lastMemoryPoolTs >= TUNNEL_MEMORY_POOL_MANAGE_INTERVAL) // manage memory pool every 2 minutes
|
|
|
|
if (ts - lastMemoryPoolTs >= TUNNEL_MEMORY_POOL_MANAGE_INTERVAL ||
|
|
|
|
|
|
|
|
ts + TUNNEL_MEMORY_POOL_MANAGE_INTERVAL < lastMemoryPoolTs) // manage memory pool every 2 minutes
|
|
|
|
{
|
|
|
|
{
|
|
|
|
m_I2NPTunnelEndpointMessagesMemoryPool.CleanUpMt ();
|
|
|
|
m_I2NPTunnelEndpointMessagesMemoryPool.CleanUpMt ();
|
|
|
|
m_I2NPTunnelMessagesMemoryPool.CleanUpMt ();
|
|
|
|
m_I2NPTunnelMessagesMemoryPool.CleanUpMt ();
|
|
|
@ -589,32 +592,32 @@ namespace tunnel
|
|
|
|
tunnel->SendTunnelDataMsg (msg);
|
|
|
|
tunnel->SendTunnelDataMsg (msg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Tunnels::ManageTunnels ()
|
|
|
|
void Tunnels::ManageTunnels (uint64_t ts)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ManagePendingTunnels ();
|
|
|
|
ManagePendingTunnels (ts);
|
|
|
|
ManageInboundTunnels ();
|
|
|
|
ManageInboundTunnels (ts);
|
|
|
|
ManageOutboundTunnels ();
|
|
|
|
ManageOutboundTunnels (ts);
|
|
|
|
ManageTransitTunnels ();
|
|
|
|
ManageTransitTunnels (ts);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Tunnels::ManagePendingTunnels ()
|
|
|
|
void Tunnels::ManagePendingTunnels (uint64_t ts)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ManagePendingTunnels (m_PendingInboundTunnels);
|
|
|
|
ManagePendingTunnels (m_PendingInboundTunnels, ts);
|
|
|
|
ManagePendingTunnels (m_PendingOutboundTunnels);
|
|
|
|
ManagePendingTunnels (m_PendingOutboundTunnels, ts);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template<class PendingTunnels>
|
|
|
|
template<class PendingTunnels>
|
|
|
|
void Tunnels::ManagePendingTunnels (PendingTunnels& pendingTunnels)
|
|
|
|
void Tunnels::ManagePendingTunnels (PendingTunnels& pendingTunnels, uint64_t ts)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// check pending tunnel. delete failed or timeout
|
|
|
|
// check pending tunnel. delete failed or timeout
|
|
|
|
uint64_t ts = i2p::util::GetSecondsSinceEpoch ();
|
|
|
|
|
|
|
|
for (auto it = pendingTunnels.begin (); it != pendingTunnels.end ();)
|
|
|
|
for (auto it = pendingTunnels.begin (); it != pendingTunnels.end ();)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
auto tunnel = it->second;
|
|
|
|
auto tunnel = it->second;
|
|
|
|
switch (tunnel->GetState ())
|
|
|
|
switch (tunnel->GetState ())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
case eTunnelStatePending:
|
|
|
|
case eTunnelStatePending:
|
|
|
|
if (ts > tunnel->GetCreationTime () + TUNNEL_CREATION_TIMEOUT)
|
|
|
|
if (ts > tunnel->GetCreationTime () + TUNNEL_CREATION_TIMEOUT ||
|
|
|
|
|
|
|
|
ts + TUNNEL_CREATION_TIMEOUT < tunnel->GetCreationTime ())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
LogPrint (eLogDebug, "Tunnel: Pending build request ", it->first, " timeout, deleted");
|
|
|
|
LogPrint (eLogDebug, "Tunnel: Pending build request ", it->first, " timeout, deleted");
|
|
|
|
// update stats
|
|
|
|
// update stats
|
|
|
@ -657,9 +660,7 @@ namespace tunnel
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Tunnels::ManageOutboundTunnels ()
|
|
|
|
void Tunnels::ManageOutboundTunnels (uint64_t ts)
|
|
|
|
{
|
|
|
|
|
|
|
|
uint64_t ts = i2p::util::GetSecondsSinceEpoch ();
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
for (auto it = m_OutboundTunnels.begin (); it != m_OutboundTunnels.end ();)
|
|
|
|
for (auto it = m_OutboundTunnels.begin (); it != m_OutboundTunnels.end ();)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -693,7 +694,6 @@ namespace tunnel
|
|
|
|
++it;
|
|
|
|
++it;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (m_OutboundTunnels.size () < 3)
|
|
|
|
if (m_OutboundTunnels.size () < 3)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -711,14 +711,13 @@ namespace tunnel
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Tunnels::ManageInboundTunnels ()
|
|
|
|
void Tunnels::ManageInboundTunnels (uint64_t ts)
|
|
|
|
{
|
|
|
|
|
|
|
|
uint64_t ts = i2p::util::GetSecondsSinceEpoch ();
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
for (auto it = m_InboundTunnels.begin (); it != m_InboundTunnels.end ();)
|
|
|
|
for (auto it = m_InboundTunnels.begin (); it != m_InboundTunnels.end ();)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
auto tunnel = *it;
|
|
|
|
auto tunnel = *it;
|
|
|
|
if (ts > tunnel->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT)
|
|
|
|
if (ts > tunnel->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT ||
|
|
|
|
|
|
|
|
ts + TUNNEL_EXPIRATION_TIMEOUT < tunnel->GetCreationTime ())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
LogPrint (eLogDebug, "Tunnel: Tunnel with id ", tunnel->GetTunnelID (), " expired");
|
|
|
|
LogPrint (eLogDebug, "Tunnel: Tunnel with id ", tunnel->GetTunnelID (), " expired");
|
|
|
|
auto pool = tunnel->GetTunnelPool ();
|
|
|
|
auto pool = tunnel->GetTunnelPool ();
|
|
|
@ -750,7 +749,6 @@ namespace tunnel
|
|
|
|
it++;
|
|
|
|
it++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (m_InboundTunnels.empty ())
|
|
|
|
if (m_InboundTunnels.empty ())
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -787,13 +785,13 @@ namespace tunnel
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Tunnels::ManageTransitTunnels ()
|
|
|
|
void Tunnels::ManageTransitTunnels (uint64_t ts)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
|
|
|
|
|
|
|
|
for (auto it = m_TransitTunnels.begin (); it != m_TransitTunnels.end ();)
|
|
|
|
for (auto it = m_TransitTunnels.begin (); it != m_TransitTunnels.end ();)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
auto tunnel = *it;
|
|
|
|
auto tunnel = *it;
|
|
|
|
if (ts > tunnel->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT)
|
|
|
|
if (ts > tunnel->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT ||
|
|
|
|
|
|
|
|
ts + TUNNEL_EXPIRATION_TIMEOUT < tunnel->GetCreationTime ())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
LogPrint (eLogDebug, "Tunnel: Transit tunnel with id ", tunnel->GetTunnelID (), " expired");
|
|
|
|
LogPrint (eLogDebug, "Tunnel: Transit tunnel with id ", tunnel->GetTunnelID (), " expired");
|
|
|
|
m_Tunnels.erase (tunnel->GetTunnelID ());
|
|
|
|
m_Tunnels.erase (tunnel->GetTunnelID ());
|
|
|
|