diff --git a/Profiling.h b/Profiling.h index 1f175dc7..2f9d80c5 100644 --- a/Profiling.h +++ b/Profiling.h @@ -24,6 +24,8 @@ namespace data void Save (); void Load (); + + bool IsBad () const { return !m_NumTunnelsAgreed && m_NumTunnelsDeclined >= 5; }; void TunnelBuildResponse (uint8_t ret); diff --git a/TunnelPool.cpp b/TunnelPool.cpp index 82de6267..12f1a41d 100644 --- a/TunnelPool.cpp +++ b/TunnelPool.cpp @@ -261,8 +261,13 @@ namespace tunnel std::shared_ptr TunnelPool::SelectNextHop (std::shared_ptr prevHop) const { bool isExploratory = (m_LocalDestination == &i2p::context); // TODO: implement it better - auto hop = isExploratory ? i2p::data::netdb.GetRandomRouter (prevHop): + auto hop = isExploratory ? i2p::data::netdb.GetRandomRouter (prevHop): i2p::data::netdb.GetHighBandwidthRandomRouter (prevHop); + if (!isExploratory && hop && hop->GetProfile ()->IsBad ()) + { + LogPrint (eLogInfo, "Selected peer for tunnel has bad profile. Selecting another"); + hop = i2p::data::netdb.GetHighBandwidthRandomRouter (prevHop); + } if (!hop) hop = i2p::data::netdb.GetRandomRouter ();