From 20369cf6d5777709410dbe20d6dda6ad3a531b11 Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 21 Mar 2014 15:54:55 -0400 Subject: [PATCH] mark failed tunnels --- Tunnel.cpp | 28 +++++++++++++--------------- Tunnel.h | 5 ++++- TunnelPool.cpp | 19 ++++++++++--------- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/Tunnel.cpp b/Tunnel.cpp index 0ebd6345..e199a8d3 100644 --- a/Tunnel.cpp +++ b/Tunnel.cpp @@ -14,7 +14,8 @@ namespace i2p namespace tunnel { - Tunnel::Tunnel (TunnelConfig * config): m_Config (config), m_Pool (nullptr), m_IsEstablished (false) + Tunnel::Tunnel (TunnelConfig * config): m_Config (config), m_Pool (nullptr), + m_IsEstablished (false), m_IsFailed (false) { } @@ -225,11 +226,14 @@ namespace tunnel InboundTunnel * tunnel = nullptr; size_t minReceived = 0; for (auto it : m_InboundTunnels) + { + if (it.second->IsFailed ()) continue; if (!tunnel || it.second->GetNumReceivedBytes () < minReceived) { tunnel = it.second; minReceived = it.second->GetNumReceivedBytes (); - } + } + } return tunnel; } @@ -240,7 +244,7 @@ namespace tunnel for (auto it : m_InboundTunnels) { if (i >= num) break; - if (it.second->GetNextIdentHash () != i2p::context.GetRouterInfo ().GetIdentHash ()) + if (!it.second->IsFailed () && it.second->GetNextIdentHash () != i2p::context.GetRouterInfo ().GetIdentHash ()) { // exclude one hop tunnels v.push_back (it.second); @@ -254,23 +258,17 @@ namespace tunnel { CryptoPP::RandomNumberGenerator& rnd = i2p::context.GetRandomNumberGenerator (); uint32_t ind = rnd.GenerateWord32 (0, m_OutboundTunnels.size () - 1), i = 0; + OutboundTunnel * tunnel = nullptr; for (auto it: m_OutboundTunnels) { if (i >= ind) return it; - else i++; - } - return nullptr; - - // TODO: implement it base on profiling - /*OutboundTunnel * tunnel = nullptr; - size_t minSent = 0; - for (auto it : m_OutboundTunnels) - if (!tunnel || it->GetNumSentBytes () < minSent) + if (!it->IsFailed ()) { tunnel = it; - minSent = it->GetNumSentBytes (); - } - return tunnel;*/ + i++; + } + } + return tunnel; } TunnelPool * Tunnels::CreateTunnelPool (i2p::data::LocalDestination * localDestination) diff --git a/Tunnel.h b/Tunnel.h index 4374c631..0dddf447 100644 --- a/Tunnel.h +++ b/Tunnel.h @@ -37,6 +37,9 @@ namespace tunnel TunnelConfig * GetTunnelConfig () const { return m_Config; } bool IsEstablished () const { return m_IsEstablished; }; + bool IsFailed () const { return m_IsEstablished; }; + void SetFailed (bool failed) { m_IsFailed = failed; } + TunnelPool * GetTunnelPool () const { return m_Pool; }; void SetTunnelPool (TunnelPool * pool) { m_Pool = pool; }; @@ -57,7 +60,7 @@ namespace tunnel TunnelConfig * m_Config; TunnelPool * m_Pool; // pool, tunnel belongs to, or null - bool m_IsEstablished; + bool m_IsEstablished, m_IsFailed; CryptoPP::ECB_Mode::Decryption m_ECBDecryption; CryptoPP::CBC_Mode::Decryption m_CBCDecryption; diff --git a/TunnelPool.cpp b/TunnelPool.cpp index d1da6e6d..ab91963d 100644 --- a/TunnelPool.cpp +++ b/TunnelPool.cpp @@ -31,8 +31,6 @@ namespace tunnel void TunnelPool::TunnelCreated (InboundTunnel * createdTunnel) { m_InboundTunnels.insert (createdTunnel); - if (m_LocalDestination) - m_LocalDestination->UpdateLeaseSet (); } void TunnelPool::TunnelExpired (InboundTunnel * expiredTunnel) @@ -54,10 +52,10 @@ namespace tunnel void TunnelPool::TunnelExpired (OutboundTunnel * expiredTunnel) { if (expiredTunnel) - { + { expiredTunnel->SetTunnelPool (nullptr); m_OutboundTunnels.erase (expiredTunnel); - } + } if (expiredTunnel == m_LastOutboundTunnel) m_LastOutboundTunnel = nullptr; } @@ -69,8 +67,11 @@ namespace tunnel for (auto it : m_InboundTunnels) { if (i >= num) break; - v.push_back (it); - i++; + if (!it->IsFailed ()) + { + v.push_back (it); + i++; + } } return v; } @@ -82,7 +83,7 @@ namespace tunnel if (m_LastOutboundTunnel && tunnel == m_LastOutboundTunnel) { for (auto it: m_OutboundTunnels) - if (it != m_LastOutboundTunnel) + if (it != m_LastOutboundTunnel && !it->IsFailed ()) { tunnel = it; break; @@ -109,8 +110,8 @@ namespace tunnel { LogPrint ("Tunnel test ", (int)it.first, " failed"); // both outbound and inbound tunnels considered as invalid - TunnelExpired (it.second.first); - TunnelExpired (it.second.second); + it.second.first->SetFailed (true); + it.second.second->SetFailed (true); } m_Tests.clear (); auto it1 = m_OutboundTunnels.begin ();