From 92838fa1b22a66767b63a25a9933a228c72a9c84 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Thu, 17 Jul 2025 17:04:07 -0400 Subject: [PATCH] Controller support for "relays" field. --- controller/EmbeddedNetworkController.cpp | 33 ++++++++++++++++++++---- controller/EmbeddedNetworkController.hpp | 7 ----- node/Address.hpp | 2 -- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/controller/EmbeddedNetworkController.cpp b/controller/EmbeddedNetworkController.cpp index 04f7ac6b2..703b244d3 100644 --- a/controller/EmbeddedNetworkController.cpp +++ b/controller/EmbeddedNetworkController.cpp @@ -16,24 +16,20 @@ #include #include #include -#include #ifndef _WIN32 #include #endif #include "../include/ZeroTierOne.h" -#include "../version.h" #include "EmbeddedNetworkController.hpp" #include "FileDB.hpp" #include "LFDB.hpp" #include #include -#include #include #include #include -#include #include #include #include @@ -44,7 +40,6 @@ #include "../node/CertificateOfMembership.hpp" #include "../node/Dictionary.hpp" -#include "../node/MAC.hpp" #include "../node/NetworkConfig.hpp" #include "../node/Node.hpp" @@ -754,6 +749,24 @@ std::string EmbeddedNetworkController::networkUpdateFromPostData(uint64_t networ network["v6AssignMode"] = nv6m; } + if (b.count("relays")) { + json nrelays = json::array(); + char rtmp[64]; + json& relays = b["relays"]; + if (relays.is_array()) { + for (unsigned long i = 0; i < relays.size(); ++i) { + json& relay = relays[i]; + if (relay.is_string()) { + nrelays.push_back(Address(Utils::hexStrToU64(OSUtils::jsonString(relay, "0").c_str()) & 0xffffffffffULL).toString(rtmp)); + } + } + } + if (nrelays.size() > 0) + network["relays"] = nrelays; + else + network.erase("relays"); + } + if (b.count("routes")) { json& rts = b["routes"]; if (rts.is_array()) { @@ -1815,6 +1828,7 @@ void EmbeddedNetworkController::_request(uint64_t nwid, const InetAddress& fromA json& v6AssignMode = network["v6AssignMode"]; json& ipAssignmentPools = network["ipAssignmentPools"]; json& routes = network["routes"]; + json& relays = network["relays"]; json& rules = network["rules"]; json& capabilities = network["capabilities"]; json& tags = network["tags"]; @@ -1946,6 +1960,15 @@ void EmbeddedNetworkController::_request(uint64_t nwid, const InetAddress& fromA } } + if (relays.is_array()) { + for (unsigned long i = 0; i < relays.size(); ++i) { + Address relay(Address(Utils::hexStrToU64(OSUtils::jsonString(relays[i], "0").c_str()) & 0xffffffffffULL)); + if (! relay.isReserved()) { + nc->addSpecialist(relay, ZT_NETWORKCONFIG_SPECIALIST_TYPE_NETWORK_RELAY); + } + } + } + const bool noAutoAssignIps = OSUtils::jsonBool(member["noAutoAssignIps"], false); if ((v6AssignMode.is_object()) && (! noAutoAssignIps)) { diff --git a/controller/EmbeddedNetworkController.hpp b/controller/EmbeddedNetworkController.hpp index 111417bfb..a4f93ae43 100644 --- a/controller/EmbeddedNetworkController.hpp +++ b/controller/EmbeddedNetworkController.hpp @@ -14,21 +14,14 @@ #ifndef ZT_SQLITENETWORKCONTROLLER_HPP #define ZT_SQLITENETWORKCONTROLLER_HPP -#include "../node/Address.hpp" #include "../node/Constants.hpp" #include "../node/InetAddress.hpp" #include "../node/NetworkController.hpp" -#include "../node/Utils.hpp" #include "../osdep/BlockingQueue.hpp" -#include "../osdep/OSUtils.hpp" -#include "../osdep/Thread.hpp" #include "DB.hpp" #include "DBMirrorSet.hpp" -#include #include -#include -#include #include #include #include diff --git a/node/Address.hpp b/node/Address.hpp index 182ccb7bb..dfce7acb3 100644 --- a/node/Address.hpp +++ b/node/Address.hpp @@ -21,8 +21,6 @@ #include #include #include -#include -#include namespace ZeroTier {