diff --git a/daemon/HTTPServer.cpp b/daemon/HTTPServer.cpp index 0847f85d..89960e0c 100644 --- a/daemon/HTTPServer.cpp +++ b/daemon/HTTPServer.cpp @@ -263,6 +263,9 @@ namespace http { case eRouterErrorOffline: s << " - Offline"; break; + case eRouterErrorSymmetricNAT: + s << " - Symmetric NAT"; + break; default: ; } break; diff --git a/libi2pd/RouterContext.h b/libi2pd/RouterContext.h index 3c8e6d9d..228da788 100644 --- a/libi2pd/RouterContext.h +++ b/libi2pd/RouterContext.h @@ -39,7 +39,8 @@ namespace i2p { eRouterErrorNone = 0, eRouterErrorClockSkew = 1, - eRouterErrorOffline = 2 + eRouterErrorOffline = 2, + eRouterErrorSymmetricNAT = 3 }; class RouterContext: public i2p::garlic::GarlicDestination diff --git a/libi2pd/SSU.h b/libi2pd/SSU.h index b674e8ac..bfcfed4e 100644 --- a/libi2pd/SSU.h +++ b/libi2pd/SSU.h @@ -63,6 +63,7 @@ namespace transport void DeleteAllSessions (); boost::asio::io_service& GetService () { return m_Service; }; + uint16_t GetPort () const { return m_Endpoint.port (); }; void SetLocalAddress (const boost::asio::ip::address& localAddress); void Send (const uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& to); diff --git a/libi2pd/SSUSession.cpp b/libi2pd/SSUSession.cpp index 8db317ed..e1e48b75 100644 --- a/libi2pd/SSUSession.cpp +++ b/libi2pd/SSUSession.cpp @@ -684,6 +684,8 @@ namespace transport buf += 2; // our port LogPrint (eLogInfo, "SSU: Our external address is ", ourIP.to_string (), ":", ourPort); i2p::context.UpdateAddress (ourIP); + if (ourPort != m_Server.GetPort ()) + i2p::context.SetError (eRouterErrorSymmetricNAT); uint32_t nonce = bufbe32toh (buf); buf += 4; // nonce auto it = m_RelayRequests.find (nonce);