diff --git a/NetDb.cpp b/NetDb.cpp index e2d1d3b5..21660eb6 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -885,6 +885,15 @@ namespace data }); } + std::shared_ptr NetDb::GetRandomPeerTestRouter () const + { + return GetRandomRouter ( + [](std::shared_ptr router)->bool + { + return !router->IsHidden () && router->IsPeerTesting (); + }); + } + std::shared_ptr NetDb::GetHighBandwidthRandomRouter (std::shared_ptr compatibleWith) const { return GetRandomRouter ( diff --git a/NetDb.h b/NetDb.h index ee0411de..6a0211d5 100644 --- a/NetDb.h +++ b/NetDb.h @@ -80,6 +80,7 @@ namespace data std::shared_ptr GetRandomRouter () const; std::shared_ptr GetRandomRouter (std::shared_ptr compatibleWith) const; std::shared_ptr GetHighBandwidthRandomRouter (std::shared_ptr compatibleWith) const; + std::shared_ptr GetRandomPeerTestRouter () const; std::shared_ptr GetClosestFloodfill (const IdentHash& destination, const std::set& excluded) const; std::shared_ptr GetClosestNonFloodfill (const IdentHash& destination, const std::set& excluded) const; void SetUnreachable (const IdentHash& ident, bool unreachable); diff --git a/Transports.cpp b/Transports.cpp index f54edf0b..c9b981c9 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -384,13 +384,25 @@ namespace transport void Transports::DetectExternalIP () { - i2p::context.SetStatus (eRouterStatusTesting); - for (int i = 0; i < 5; i++) + if (m_SSUServer) { - auto router = i2p::data::netdb.GetRandomRouter (); - if (router && router->IsSSU () && m_SSUServer) - m_SSUServer->GetSession (router, true); // peer test - } + i2p::context.SetStatus (eRouterStatusTesting); + for (int i = 0; i < 5; i++) + { + auto router = i2p::data::netdb.GetRandomPeerTestRouter (); + if (router) + m_SSUServer->GetSession (router, true); // peer test + else + { + // if not peer test capable routers found pick any + router = i2p::data::netdb.GetRandomRouter (); + if (router && router->IsSSU ()) + m_SSUServer->GetSession (router); // no peer test + } + } + } + else + LogPrint (eLogError, "Can't detect external IP. SSU is not available"); } DHKeysPair * Transports::GetNextDHKeysPair ()