diff --git a/libi2pd/SSU2.cpp b/libi2pd/SSU2.cpp index 59ffaf42..f8f6e69d 100644 --- a/libi2pd/SSU2.cpp +++ b/libi2pd/SSU2.cpp @@ -6,6 +6,7 @@ * See full license text in LICENSE file at top of project tree */ +#include #include "Log.h" #include "RouterContext.h" #include "Transports.h" @@ -576,18 +577,27 @@ namespace transport auto ts = i2p::util::GetSecondsSinceEpoch (); std::shared_ptr r; uint32_t relayTag = 0; - for (auto& it: address->ssu->introducers) - { - if (it.iTag && ts < it.iExp) - { - r = i2p::data::netdb.FindRouter (it.iKey); - if (r && r->IsReachableFrom (i2p::context.GetRouterInfo ())) - { - relayTag = it.iTag; - if (relayTag) break; - } - } - } + if (!address->ssu->introducers.empty ()) + { + std::vector indicies; + for (int i = 0; i < (int)address->ssu->introducers.size (); i++) indicies.push_back(i); + if (indicies.size () > 1) + std::shuffle (indicies.begin(), indicies.end(), std::mt19937(std::random_device()())); + + for (auto i: indicies) + { + const auto& introducer = address->ssu->introducers[indicies[i]]; + if (introducer.iTag && ts < introducer.iExp) + { + r = i2p::data::netdb.FindRouter (introducer.iKey); + if (r && r->IsReachableFrom (i2p::context.GetRouterInfo ())) + { + relayTag = introducer.iTag; + if (relayTag) break; + } + } + } + } if (r) { if (relayTag) diff --git a/libi2pd/SSU2Session.cpp b/libi2pd/SSU2Session.cpp index 5f1b4bb5..ddeebbe8 100644 --- a/libi2pd/SSU2Session.cpp +++ b/libi2pd/SSU2Session.cpp @@ -1070,6 +1070,7 @@ namespace transport const uint8_t * introKey, uint64_t token) { // we are Charlie + LogPrint (eLogDebug, "SSU2: Sending HolePunch to ", ep); Header header; uint8_t h[32], payload[SSU2_MAX_PACKET_SIZE]; // fill packet @@ -1641,11 +1642,14 @@ namespace transport SendHolePunch (bufbe32toh (buf + 33), ep, addr->i, token); } else + { + LogPrint (eLogWarning, "SSU2: RelayIntro unsupported address"); code = eSSU2RelayResponseCodeCharlieUnsupportedAddress; + } } else { - LogPrint (eLogWarning, "SSU2: RelayInfo unknown address"); + LogPrint (eLogWarning, "SSU2: RelayIntro unknown address"); code = eSSU2RelayResponseCodeCharlieAliceIsUnknown; } }