From 772551c45da254c221ae9237423c7adb3978190e Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Thu, 11 Feb 2016 10:39:39 -0800 Subject: [PATCH] Try +1 and +2 existing surfaces for symmetric NATs. --- node/SelfAwareness.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/node/SelfAwareness.cpp b/node/SelfAwareness.cpp index cf43a6441..dde77ee57 100644 --- a/node/SelfAwareness.cpp +++ b/node/SelfAwareness.cpp @@ -150,14 +150,24 @@ std::vector SelfAwareness::getSymmetricNatPredictions() // More than one global IPv4 surface means this is a symmetric NAT std::vector r; for(std::set::iterator i(surfaces.begin());i!=surfaces.end();++i) { - InetAddress nextPort(*i); - unsigned int p = nextPort.port(); - if (p >= 65535) + InetAddress ipp(*i); + unsigned int p = ipp.port(); + + // Try 1+ surface ports + if (p >= 0xffff) p = 1025; else ++p; - nextPort.setPort(p); - if (surfaces.count(nextPort) == 0) - r.push_back(nextPort); + ipp.setPort(p); + if ((surfaces.count(ipp) == 0)&&(std::find(r.begin(),r.end(),ipp) == r.end())) + r.push_back(ipp); + + // Try 2+ surface ports + if (p >= 0xffff) + p = 1025; + else ++p; + ipp.setPort(p); + if ((surfaces.count(ipp) == 0)&&(std::find(r.begin(),r.end(),ipp) == r.end())) + r.push_back(ipp); } return r; }