From fb15c72be2dc239be32a29db04b6f5ea777d9261 Mon Sep 17 00:00:00 2001 From: orignal Date: Mon, 18 Aug 2014 14:37:19 -0400 Subject: [PATCH] wait for 10 seconds before delete a pending tunnel --- I2NPProtocol.cpp | 9 ++------- Tunnel.cpp | 46 +++++++++++++++++++--------------------------- Tunnel.h | 1 + 3 files changed, 22 insertions(+), 34 deletions(-) diff --git a/I2NPProtocol.cpp b/I2NPProtocol.cpp index 3c289af5..a4d3a853 100644 --- a/I2NPProtocol.cpp +++ b/I2NPProtocol.cpp @@ -310,13 +310,11 @@ namespace i2p if (tunnel->HandleTunnelBuildResponse (buf, len)) { LogPrint ("Inbound tunnel ", tunnel->GetTunnelID (), " has been created"); + tunnel->SetState (i2p::tunnel::eTunnelStateEstablished); i2p::tunnel::tunnels.AddInboundTunnel (static_cast(tunnel)); } else - { LogPrint ("Inbound tunnel ", tunnel->GetTunnelID (), " has been declined"); - delete tunnel; - } } else { @@ -368,14 +366,11 @@ namespace i2p if (tunnel->HandleTunnelBuildResponse (buf, len)) { LogPrint ("Outbound tunnel ", tunnel->GetTunnelID (), " has been created"); + tunnel->SetState (i2p::tunnel::eTunnelStateEstablished); i2p::tunnel::tunnels.AddOutboundTunnel (static_cast(tunnel)); } else - { LogPrint ("Outbound tunnel ", tunnel->GetTunnelID (), " has been declined"); - i2p::transports.CloseSession (tunnel->GetTunnelConfig ()->GetFirstHop ()->router); - delete tunnel; - } } else LogPrint ("Pending tunnel for message ", replyMsgID, " not found"); diff --git a/Tunnel.cpp b/Tunnel.cpp index 6c46b6c9..369e2bba 100644 --- a/Tunnel.cpp +++ b/Tunnel.cpp @@ -217,9 +217,9 @@ namespace tunnel delete it.second; m_TransitTunnels.clear (); - for (auto& it : m_PendingTunnels) + /*for (auto& it : m_PendingTunnels) delete it.second; - m_PendingTunnels.clear (); + m_PendingTunnels.clear ();*/ for (auto& it: m_Pools) delete it.second; @@ -246,11 +246,7 @@ namespace tunnel { auto it = m_PendingTunnels.find(replyMsgID); if (it != m_PendingTunnels.end ()) - { - Tunnel * t = it->second; - m_PendingTunnels.erase (it); - return t; - } + return it->second; return nullptr; } @@ -372,33 +368,29 @@ namespace tunnel void Tunnels::ManageTunnels () { - // check pending tunnel. if something is still there, wipe it out - // because it wouldn't be responded anyway - for (auto& it : m_PendingTunnels) + // check pending tunnel. delete non-successive + uint64_t ts = i2p::util::GetSecondsSinceEpoch (); + for (auto it = m_PendingTunnels.begin (); it != m_PendingTunnels.end ();) { - LogPrint ("Pending tunnel build request ", it.first, " has not been responded. Deleted"); - if (it.second->GetTunnelConfig ()->GetFirstHop ()->isGateway) // outbound - i2p::transports.CloseSession (it.second->GetTunnelConfig ()->GetFirstHop ()->router); - delete it.second; + if (it->second->GetState () == eTunnelStatePending) + { + if (ts > it->second->GetCreationTime () + TUNNEL_CREATION_TIMEOUT) + { + LogPrint ("Pending tunnel build request ", it->first, " was not successive. Deleted"); + delete it->second; + it = m_PendingTunnels.erase (it); + } + else + it++; + } + else + it = m_PendingTunnels.erase (it); } - m_PendingTunnels.clear (); ManageInboundTunnels (); ManageOutboundTunnels (); ManageTransitTunnels (); ManageTunnelPools (); - - /* if (!m_IsTunnelCreated) - { - InboundTunnel * inboundTunnel = CreateOneHopInboundTestTunnel (); - if (inboundTunnel) - CreateOneHopOutboundTestTunnel (inboundTunnel); - inboundTunnel = CreateTwoHopsInboundTestTunnel (); - if (inboundTunnel) - CreateTwoHopsOutboundTestTunnel (inboundTunnel); - - m_IsTunnelCreated = true; - }*/ } void Tunnels::ManageOutboundTunnels () diff --git a/Tunnel.h b/Tunnel.h index 0d9f1544..042d55f9 100644 --- a/Tunnel.h +++ b/Tunnel.h @@ -22,6 +22,7 @@ namespace i2p namespace tunnel { const int TUNNEL_EXPIRATION_TIMEOUT = 660; // 11 minutes + const int TUNNEL_CREATION_TIMEOUT = 10; // 10 seconds const int STANDARD_NUM_RECORDS = 5; // in VariableTunnelBuild message enum TunnelState