From 7a7ae4cc833088113e299abc729df52503d96c42 Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 2 Dec 2016 11:17:22 -0500 Subject: [PATCH] select ipv4 peers for peer test --- NetDb.cpp | 6 +++--- NetDb.h | 2 +- SSU.cpp | 4 ++-- SSU.h | 2 +- Transports.cpp | 25 ++++++++++++++----------- 5 files changed, 21 insertions(+), 18 deletions(-) diff --git a/NetDb.cpp b/NetDb.cpp index 5a622441..e75cf217 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -1008,12 +1008,12 @@ namespace data }); } - std::shared_ptr NetDb::GetRandomPeerTestRouter () const + std::shared_ptr NetDb::GetRandomPeerTestRouter (bool v4only) const { return GetRandomRouter ( - [](std::shared_ptr router)->bool + [v4only](std::shared_ptr router)->bool { - return !router->IsHidden () && router->IsPeerTesting (); + return !router->IsHidden () && router->IsPeerTesting () && router->IsSSU (v4only); }); } diff --git a/NetDb.h b/NetDb.h index ba65b1e4..954cc74e 100644 --- a/NetDb.h +++ b/NetDb.h @@ -69,7 +69,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 GetRandomPeerTestRouter (bool v4only = true) const; std::shared_ptr GetRandomIntroducer () 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, diff --git a/SSU.cpp b/SSU.cpp index cd0c0292..198fed4b 100644 --- a/SSU.cpp +++ b/SSU.cpp @@ -342,9 +342,9 @@ namespace transport return nullptr; } - void SSUServer::CreateSession (std::shared_ptr router, bool peerTest) + void SSUServer::CreateSession (std::shared_ptr router, bool peerTest, bool v4only) { - auto address = router->GetSSUAddress (!context.SupportsV6 ()); + auto address = router->GetSSUAddress (v4only || !context.SupportsV6 ()); if (address) CreateSession (router, address->host, address->port, peerTest); else diff --git a/SSU.h b/SSU.h index 7016e23e..9d8e2878 100644 --- a/SSU.h +++ b/SSU.h @@ -42,7 +42,7 @@ namespace transport ~SSUServer (); void Start (); void Stop (); - void CreateSession (std::shared_ptr router, bool peerTest = false); + void CreateSession (std::shared_ptr router, bool peerTest = false, bool v4only = false); void CreateSession (std::shared_ptr router, const boost::asio::ip::address& addr, int port, bool peerTest = false); void CreateDirectSession (std::shared_ptr router, boost::asio::ip::udp::endpoint remoteEndpoint, bool peerTest); diff --git a/Transports.cpp b/Transports.cpp index d06d8670..1b9d52a1 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -519,7 +519,7 @@ namespace transport void Transports::DetectExternalIP () { if (RoutesRestricted()) - { + { LogPrint(eLogInfo, "Transports: restricted routes enabled, not detecting ip"); i2p::context.SetStatus (eRouterStatusOK); return; @@ -527,13 +527,14 @@ namespace transport if (m_SSUServer) { bool nat; i2p::config::GetOption("nat", nat); - if (nat) + bool isv4 = i2p::context.SupportsV4 (); + if (nat && isv4) i2p::context.SetStatus (eRouterStatusTesting); for (int i = 0; i < 5; i++) { - auto router = i2p::data::netdb.GetRandomPeerTestRouter (); - if (router && router->IsSSU (!context.SupportsV6 ())) - m_SSUServer->CreateSession (router, true); // peer test + auto router = i2p::data::netdb.GetRandomPeerTestRouter (isv4); // v4 only if v4 + if (router) + m_SSUServer->CreateSession (router, true, isv4); // peer test else { // if not peer test capable routers found pick any @@ -549,23 +550,25 @@ namespace transport void Transports::PeerTest () { - if (RoutesRestricted()) return; + if (RoutesRestricted() || !i2p::context.SupportsV4 ()) return; if (m_SSUServer) - { + { bool statusChanged = false; for (int i = 0; i < 5; i++) { - auto router = i2p::data::netdb.GetRandomPeerTestRouter (); - if (router && router->IsSSU (!context.SupportsV6 ())) + auto router = i2p::data::netdb.GetRandomPeerTestRouter (true); // v4 only + if (router) { if (!statusChanged) { statusChanged = true; i2p::context.SetStatus (eRouterStatusTesting); // first time only } - m_SSUServer->CreateSession (router, true); // peer test + m_SSUServer->CreateSession (router, true, true); // peer test v4 } - } + } + if (!statusChanged) + LogPrint (eLogWarning, "Can't find routers for peer test"); } }