diff --git a/libi2pd/NetDb.cpp b/libi2pd/NetDb.cpp index a71bb891..a1d97cba 100644 --- a/libi2pd/NetDb.cpp +++ b/libi2pd/NetDb.cpp @@ -1168,12 +1168,13 @@ namespace data }); } - std::shared_ptr NetDb::GetRandomIntroducer (bool v4) const + std::shared_ptr NetDb::GetRandomIntroducer (bool v4, const std::set& excluded) const { return GetRandomRouter ( - [v4](std::shared_ptr router)->bool + [v4, &excluded](std::shared_ptr router)->bool { - return router->IsIntroducer (v4) && !router->IsHidden () && !router->IsFloodfill (); // floodfills don't send relay tag + return router->IsIntroducer (v4) && !excluded.count (router->GetIdentHash ()) && + !router->IsHidden () && !router->IsFloodfill (); // floodfills don't send relay tag }); } diff --git a/libi2pd/NetDb.hpp b/libi2pd/NetDb.hpp index 244ff39b..364cae4b 100644 --- a/libi2pd/NetDb.hpp +++ b/libi2pd/NetDb.hpp @@ -87,7 +87,7 @@ namespace data std::shared_ptr GetHighBandwidthRandomRouter (std::shared_ptr compatibleWith, bool reverse) const; std::shared_ptr GetRandomPeerTestRouter (bool v4, const std::set& excluded) const; std::shared_ptr GetRandomSSUV6Router () const; // TODO: change to v6 peer test later - std::shared_ptr GetRandomIntroducer (bool v4) const; + std::shared_ptr GetRandomIntroducer (bool v4, const std::set& excluded) const; std::shared_ptr GetClosestFloodfill (const IdentHash& destination, const std::set& excluded, bool closeThanUsOnly = false) const; std::vector GetClosestFloodfills (const IdentHash& destination, size_t num, std::set& excluded, bool closeThanUsOnly = false) const; diff --git a/libi2pd/SSU.cpp b/libi2pd/SSU.cpp index 49ce7e3e..9d75a069 100644 --- a/libi2pd/SSU.cpp +++ b/libi2pd/SSU.cpp @@ -778,6 +778,7 @@ namespace transport i2p::context.RemoveIntroducer (it); } + std::set excluded; if (numIntroducers < SSU_MAX_NUM_INTRODUCERS) { // create new @@ -809,16 +810,16 @@ namespace transport newList.push_back (ep); if (newList.size () >= SSU_MAX_NUM_INTRODUCERS) break; } + excluded.insert (it1->GetRemoteIdentity ()->GetIdentHash ()); } } introducers = newList; if (introducers.size () < SSU_MAX_NUM_INTRODUCERS) { - std::set > requested; for (auto i = introducers.size (); i < SSU_MAX_NUM_INTRODUCERS; i++) { - auto introducer = i2p::data::netdb.GetRandomIntroducer (v4); - if (introducer && !requested.count (introducer)) // not requested already + auto introducer = i2p::data::netdb.GetRandomIntroducer (v4, excluded); + if (introducer) { auto address = v4 ? introducer->GetSSUAddress (true) : introducer->GetSSUV6Address (); if (address && !address->host.is_unspecified () && address->port) @@ -827,7 +828,7 @@ namespace transport if (std::find (introducers.begin (), introducers.end (), ep) == introducers.end ()) // not connected yet { CreateDirectSession (introducer, ep, false); - requested.insert (introducer); + excluded.insert (introducer->GetIdentHash ()); } } }