diff --git a/node/Node.hpp b/node/Node.hpp index 52506ed9e..834f50cc9 100644 --- a/node/Node.hpp +++ b/node/Node.hpp @@ -35,6 +35,7 @@ #include "NetworkController.hpp" #include "Hashtable.hpp" #include "Bond.hpp" +#include "SelfAwareness.hpp" // Bit mask for "expecting reply" hash #define ZT_EXPECTING_REPLIES_BUCKET_MASK1 255 @@ -187,6 +188,8 @@ public: inline const Identity &identity() const { return _RR.identity; } + inline const std::vector SurfaceAddresses() const { return _RR.sa->whoami(); } + inline Bond *bondController() const { return _RR.bc; } /** diff --git a/service/OneService.cpp b/service/OneService.cpp index 1103b7df1..daba4d99b 100644 --- a/service/OneService.cpp +++ b/service/OneService.cpp @@ -1526,7 +1526,7 @@ public: settings["primaryPort"] = OSUtils::jsonInt(settings["primaryPort"],(uint64_t)_primaryPort) & 0xffff; settings["secondaryPort"] = OSUtils::jsonInt(settings["secondaryPort"],(uint64_t)_secondaryPort) & 0xffff; settings["tertiaryPort"] = OSUtils::jsonInt(settings["tertiaryPort"],(uint64_t)_tertiaryPort) & 0xffff; - // Enumerate all external listening address/port pairs + // Enumerate all local address/port pairs that this node is listening on std::vector boundAddrs(_binder.allBoundLocalInterfaceAddresses()); auto boundAddrArray = json::array(); for (int i = 0; i < boundAddrs.size(); i++) { @@ -1535,6 +1535,15 @@ public: boundAddrArray.push_back(ipBuf); } settings["listeningOn"] = boundAddrArray; + // Enumerate all external address/port pairs that are reported for this node + std::vector surfaceAddrs = _node->SurfaceAddresses(); + auto surfaceAddrArray = json::array(); + for (int i = 0; i < surfaceAddrs.size(); i++) { + char ipBuf[64] = { 0 }; + surfaceAddrs[i].toString(ipBuf); + surfaceAddrArray.push_back(ipBuf); + } + settings["surfaceAddresses"] = surfaceAddrArray; #ifdef ZT_USE_MINIUPNPC settings["portMappingEnabled"] = OSUtils::jsonBool(settings["portMappingEnabled"],true);