summaryrefslogtreecommitdiff
path: root/controller/EmbeddedNetworkController.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'controller/EmbeddedNetworkController.cpp')
-rw-r--r--controller/EmbeddedNetworkController.cpp410
1 files changed, 188 insertions, 222 deletions
diff --git a/controller/EmbeddedNetworkController.cpp b/controller/EmbeddedNetworkController.cpp
index 53b345b4..d9ec76de 100644
--- a/controller/EmbeddedNetworkController.cpp
+++ b/controller/EmbeddedNetworkController.cpp
@@ -56,7 +56,7 @@ using json = nlohmann::json;
#define ZT_NETCONF_MIN_REQUEST_PERIOD 1000
// Nodes are considered active if they've queried in less than this long
-#define ZT_NETCONF_NODE_ACTIVE_THRESHOLD ((ZT_NETWORK_AUTOCONF_DELAY * 2) + 5000)
+#define ZT_NETCONF_NODE_ACTIVE_THRESHOLD (ZT_NETWORK_AUTOCONF_DELAY * 2)
namespace ZeroTier {
@@ -127,7 +127,9 @@ static json _renderRule(ZT_VirtualNetworkRule &rule)
{
char tmp[128];
json r = json::object();
- switch((rule.t) & 0x7f) {
+ const ZT_VirtualNetworkRuleType rt = (ZT_VirtualNetworkRuleType)(rule.t & 0x3f);
+
+ switch(rt) {
case ZT_NETWORK_RULE_ACTION_DROP:
r["type"] = "ACTION_DROP";
break;
@@ -140,6 +142,12 @@ static json _renderRule(ZT_VirtualNetworkRule &rule)
r["flags"] = (unsigned int)rule.v.fwd.flags;
r["length"] = (unsigned int)rule.v.fwd.length;
break;
+ case ZT_NETWORK_RULE_ACTION_WATCH:
+ r["type"] = "ACTION_WATCH";
+ r["address"] = Address(rule.v.fwd.address).toString();
+ r["flags"] = (unsigned int)rule.v.fwd.flags;
+ r["length"] = (unsigned int)rule.v.fwd.length;
+ break;
case ZT_NETWORK_RULE_ACTION_REDIRECT:
r["type"] = "ACTION_REDIRECT";
r["address"] = Address(rule.v.fwd.address).toString();
@@ -148,137 +156,136 @@ static json _renderRule(ZT_VirtualNetworkRule &rule)
case ZT_NETWORK_RULE_ACTION_DEBUG_LOG:
r["type"] = "ACTION_DEBUG_LOG";
break;
- case ZT_NETWORK_RULE_MATCH_SOURCE_ZEROTIER_ADDRESS:
- r["type"] = "MATCH_SOURCE_ZEROTIER_ADDRESS";
- r["not"] = ((rule.t & 0x80) != 0);
- r["zt"] = Address(rule.v.zt).toString();
- break;
- case ZT_NETWORK_RULE_MATCH_DEST_ZEROTIER_ADDRESS:
- r["type"] = "MATCH_DEST_ZEROTIER_ADDRESS";
- r["not"] = ((rule.t & 0x80) != 0);
- r["zt"] = Address(rule.v.zt).toString();
- break;
- case ZT_NETWORK_RULE_MATCH_VLAN_ID:
- r["type"] = "MATCH_VLAN_ID";
- r["not"] = ((rule.t & 0x80) != 0);
- r["vlanId"] = (unsigned int)rule.v.vlanId;
- break;
- case ZT_NETWORK_RULE_MATCH_VLAN_PCP:
- r["type"] = "MATCH_VLAN_PCP";
- r["not"] = ((rule.t & 0x80) != 0);
- r["vlanPcp"] = (unsigned int)rule.v.vlanPcp;
- break;
- case ZT_NETWORK_RULE_MATCH_VLAN_DEI:
- r["type"] = "MATCH_VLAN_DEI";
- r["not"] = ((rule.t & 0x80) != 0);
- r["vlanDei"] = (unsigned int)rule.v.vlanDei;
- break;
- case ZT_NETWORK_RULE_MATCH_ETHERTYPE:
- r["type"] = "MATCH_ETHERTYPE";
- r["not"] = ((rule.t & 0x80) != 0);
- r["etherType"] = (unsigned int)rule.v.etherType;
- break;
- case ZT_NETWORK_RULE_MATCH_MAC_SOURCE:
- r["type"] = "MATCH_MAC_SOURCE";
- r["not"] = ((rule.t & 0x80) != 0);
- Utils::snprintf(tmp,sizeof(tmp),"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",(unsigned int)rule.v.mac[0],(unsigned int)rule.v.mac[1],(unsigned int)rule.v.mac[2],(unsigned int)rule.v.mac[3],(unsigned int)rule.v.mac[4],(unsigned int)rule.v.mac[5]);
- r["mac"] = tmp;
- break;
- case ZT_NETWORK_RULE_MATCH_MAC_DEST:
- r["type"] = "MATCH_MAC_DEST";
- r["not"] = ((rule.t & 0x80) != 0);
- Utils::snprintf(tmp,sizeof(tmp),"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",(unsigned int)rule.v.mac[0],(unsigned int)rule.v.mac[1],(unsigned int)rule.v.mac[2],(unsigned int)rule.v.mac[3],(unsigned int)rule.v.mac[4],(unsigned int)rule.v.mac[5]);
- r["mac"] = tmp;
- break;
- case ZT_NETWORK_RULE_MATCH_IPV4_SOURCE:
- r["type"] = "MATCH_IPV4_SOURCE";
- r["not"] = ((rule.t & 0x80) != 0);
- r["ip"] = InetAddress(&(rule.v.ipv4.ip),4,(unsigned int)rule.v.ipv4.mask).toString();
- break;
- case ZT_NETWORK_RULE_MATCH_IPV4_DEST:
- r["type"] = "MATCH_IPV4_DEST";
- r["not"] = ((rule.t & 0x80) != 0);
- r["ip"] = InetAddress(&(rule.v.ipv4.ip),4,(unsigned int)rule.v.ipv4.mask).toString();
- break;
- case ZT_NETWORK_RULE_MATCH_IPV6_SOURCE:
- r["type"] = "MATCH_IPV6_SOURCE";
- r["not"] = ((rule.t & 0x80) != 0);
- r["ip"] = InetAddress(rule.v.ipv6.ip,16,(unsigned int)rule.v.ipv6.mask).toString();
- break;
- case ZT_NETWORK_RULE_MATCH_IPV6_DEST:
- r["type"] = "MATCH_IPV6_DEST";
- r["not"] = ((rule.t & 0x80) != 0);
- r["ip"] = InetAddress(rule.v.ipv6.ip,16,(unsigned int)rule.v.ipv6.mask).toString();
- break;
- case ZT_NETWORK_RULE_MATCH_IP_TOS:
- r["type"] = "MATCH_IP_TOS";
- r["not"] = ((rule.t & 0x80) != 0);
- r["ipTos"] = (unsigned int)rule.v.ipTos;
- break;
- case ZT_NETWORK_RULE_MATCH_IP_PROTOCOL:
- r["type"] = "MATCH_IP_PROTOCOL";
- r["not"] = ((rule.t & 0x80) != 0);
- r["ipProtocol"] = (unsigned int)rule.v.ipProtocol;
- break;
- case ZT_NETWORK_RULE_MATCH_ICMP:
- r["type"] = "MATCH_ICMP";
- r["not"] = ((rule.t & 0x80) != 0);
- r["type"] = (unsigned int)rule.v.icmp.type;
- if ((rule.v.icmp.flags & 0x01) != 0)
- r["code"] = (unsigned int)rule.v.icmp.code;
- else r["code"] = json();
- break;
- case ZT_NETWORK_RULE_MATCH_IP_SOURCE_PORT_RANGE:
- r["type"] = "MATCH_IP_SOURCE_PORT_RANGE";
- r["not"] = ((rule.t & 0x80) != 0);
- r["start"] = (unsigned int)rule.v.port[0];
- r["end"] = (unsigned int)rule.v.port[1];
- break;
- case ZT_NETWORK_RULE_MATCH_IP_DEST_PORT_RANGE:
- r["type"] = "MATCH_IP_DEST_PORT_RANGE";
- r["not"] = ((rule.t & 0x80) != 0);
- r["start"] = (unsigned int)rule.v.port[0];
- r["end"] = (unsigned int)rule.v.port[1];
- break;
- case ZT_NETWORK_RULE_MATCH_CHARACTERISTICS:
- r["type"] = "MATCH_CHARACTERISTICS";
- r["not"] = ((rule.t & 0x80) != 0);
- Utils::snprintf(tmp,sizeof(tmp),"%.16llx",rule.v.characteristics[0]);
- r["mask"] = tmp;
- Utils::snprintf(tmp,sizeof(tmp),"%.16llx",rule.v.characteristics[1]);
- r["value"] = tmp;
- break;
- case ZT_NETWORK_RULE_MATCH_FRAME_SIZE_RANGE:
- r["type"] = "MATCH_FRAME_SIZE_RANGE";
- r["not"] = ((rule.t & 0x80) != 0);
- r["start"] = (unsigned int)rule.v.frameSize[0];
- r["end"] = (unsigned int)rule.v.frameSize[1];
- break;
- case ZT_NETWORK_RULE_MATCH_TAGS_DIFFERENCE:
- r["type"] = "MATCH_TAGS_DIFFERENCE";
- r["not"] = ((rule.t & 0x80) != 0);
- r["id"] = rule.v.tag.id;
- r["value"] = rule.v.tag.value;
- break;
- case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_AND:
- r["type"] = "MATCH_TAGS_BITWISE_AND";
- r["not"] = ((rule.t & 0x80) != 0);
- r["id"] = rule.v.tag.id;
- r["value"] = rule.v.tag.value;
- break;
- case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_OR:
- r["type"] = "MATCH_TAGS_BITWISE_OR";
- r["not"] = ((rule.t & 0x80) != 0);
- r["id"] = rule.v.tag.id;
- r["value"] = rule.v.tag.value;
+ default:
break;
- case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_XOR:
- r["type"] = "MATCH_TAGS_BITWISE_XOR";
+ }
+
+ if (r.size() == 0) {
+ switch(rt) {
+ case ZT_NETWORK_RULE_MATCH_SOURCE_ZEROTIER_ADDRESS:
+ r["type"] = "MATCH_SOURCE_ZEROTIER_ADDRESS";
+ r["zt"] = Address(rule.v.zt).toString();
+ break;
+ case ZT_NETWORK_RULE_MATCH_DEST_ZEROTIER_ADDRESS:
+ r["type"] = "MATCH_DEST_ZEROTIER_ADDRESS";
+ r["zt"] = Address(rule.v.zt).toString();
+ break;
+ case ZT_NETWORK_RULE_MATCH_VLAN_ID:
+ r["type"] = "MATCH_VLAN_ID";
+ r["vlanId"] = (unsigned int)rule.v.vlanId;
+ break;
+ case ZT_NETWORK_RULE_MATCH_VLAN_PCP:
+ r["type"] = "MATCH_VLAN_PCP";
+ r["vlanPcp"] = (unsigned int)rule.v.vlanPcp;
+ break;
+ case ZT_NETWORK_RULE_MATCH_VLAN_DEI:
+ r["type"] = "MATCH_VLAN_DEI";
+ r["vlanDei"] = (unsigned int)rule.v.vlanDei;
+ break;
+ case ZT_NETWORK_RULE_MATCH_MAC_SOURCE:
+ r["type"] = "MATCH_MAC_SOURCE";
+ Utils::snprintf(tmp,sizeof(tmp),"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",(unsigned int)rule.v.mac[0],(unsigned int)rule.v.mac[1],(unsigned int)rule.v.mac[2],(unsigned int)rule.v.mac[3],(unsigned int)rule.v.mac[4],(unsigned int)rule.v.mac[5]);
+ r["mac"] = tmp;
+ break;
+ case ZT_NETWORK_RULE_MATCH_MAC_DEST:
+ r["type"] = "MATCH_MAC_DEST";
+ Utils::snprintf(tmp,sizeof(tmp),"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",(unsigned int)rule.v.mac[0],(unsigned int)rule.v.mac[1],(unsigned int)rule.v.mac[2],(unsigned int)rule.v.mac[3],(unsigned int)rule.v.mac[4],(unsigned int)rule.v.mac[5]);
+ r["mac"] = tmp;
+ break;
+ case ZT_NETWORK_RULE_MATCH_IPV4_SOURCE:
+ r["type"] = "MATCH_IPV4_SOURCE";
+ r["ip"] = InetAddress(&(rule.v.ipv4.ip),4,(unsigned int)rule.v.ipv4.mask).toString();
+ break;
+ case ZT_NETWORK_RULE_MATCH_IPV4_DEST:
+ r["type"] = "MATCH_IPV4_DEST";
+ r["ip"] = InetAddress(&(rule.v.ipv4.ip),4,(unsigned int)rule.v.ipv4.mask).toString();
+ break;
+ case ZT_NETWORK_RULE_MATCH_IPV6_SOURCE:
+ r["type"] = "MATCH_IPV6_SOURCE";
+ r["ip"] = InetAddress(rule.v.ipv6.ip,16,(unsigned int)rule.v.ipv6.mask).toString();
+ break;
+ case ZT_NETWORK_RULE_MATCH_IPV6_DEST:
+ r["type"] = "MATCH_IPV6_DEST";
+ r["ip"] = InetAddress(rule.v.ipv6.ip,16,(unsigned int)rule.v.ipv6.mask).toString();
+ break;
+ case ZT_NETWORK_RULE_MATCH_IP_TOS:
+ r["type"] = "MATCH_IP_TOS";
+ r["ipTos"] = (unsigned int)rule.v.ipTos;
+ break;
+ case ZT_NETWORK_RULE_MATCH_IP_PROTOCOL:
+ r["type"] = "MATCH_IP_PROTOCOL";
+ r["ipProtocol"] = (unsigned int)rule.v.ipProtocol;
+ break;
+ case ZT_NETWORK_RULE_MATCH_ETHERTYPE:
+ r["type"] = "MATCH_ETHERTYPE";
+ r["etherType"] = (unsigned int)rule.v.etherType;
+ break;
+ case ZT_NETWORK_RULE_MATCH_ICMP:
+ r["type"] = "MATCH_ICMP";
+ r["icmpType"] = (unsigned int)rule.v.icmp.type;
+ if ((rule.v.icmp.flags & 0x01) != 0)
+ r["icmpCode"] = (unsigned int)rule.v.icmp.code;
+ else r["icmpCode"] = json();
+ break;
+ case ZT_NETWORK_RULE_MATCH_IP_SOURCE_PORT_RANGE:
+ r["type"] = "MATCH_IP_SOURCE_PORT_RANGE";
+ r["start"] = (unsigned int)rule.v.port[0];
+ r["end"] = (unsigned int)rule.v.port[1];
+ break;
+ case ZT_NETWORK_RULE_MATCH_IP_DEST_PORT_RANGE:
+ r["type"] = "MATCH_IP_DEST_PORT_RANGE";
+ r["start"] = (unsigned int)rule.v.port[0];
+ r["end"] = (unsigned int)rule.v.port[1];
+ break;
+ case ZT_NETWORK_RULE_MATCH_CHARACTERISTICS:
+ r["type"] = "MATCH_CHARACTERISTICS";
+ Utils::snprintf(tmp,sizeof(tmp),"%.16llx",rule.v.characteristics);
+ r["mask"] = tmp;
+ break;
+ case ZT_NETWORK_RULE_MATCH_FRAME_SIZE_RANGE:
+ r["type"] = "MATCH_FRAME_SIZE_RANGE";
+ r["start"] = (unsigned int)rule.v.frameSize[0];
+ r["end"] = (unsigned int)rule.v.frameSize[1];
+ break;
+ case ZT_NETWORK_RULE_MATCH_RANDOM:
+ r["type"] = "MATCH_RANDOM";
+ r["probability"] = (unsigned long)rule.v.randomProbability;
+ break;
+ case ZT_NETWORK_RULE_MATCH_TAGS_DIFFERENCE:
+ r["type"] = "MATCH_TAGS_DIFFERENCE";
+ r["id"] = rule.v.tag.id;
+ r["value"] = rule.v.tag.value;
+ break;
+ case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_AND:
+ r["type"] = "MATCH_TAGS_BITWISE_AND";
+ r["id"] = rule.v.tag.id;
+ r["value"] = rule.v.tag.value;
+ break;
+ case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_OR:
+ r["type"] = "MATCH_TAGS_BITWISE_OR";
+ r["id"] = rule.v.tag.id;
+ r["value"] = rule.v.tag.value;
+ break;
+ case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_XOR:
+ r["type"] = "MATCH_TAGS_BITWISE_XOR";
+ r["id"] = rule.v.tag.id;
+ r["value"] = rule.v.tag.value;
+ break;
+ case ZT_NETWORK_RULE_MATCH_TAGS_EQUAL:
+ r["type"] = "MATCH_TAGS_EQUAL";
+ r["id"] = rule.v.tag.id;
+ r["value"] = rule.v.tag.value;
+ break;
+ default:
+ break;
+ }
+
+ if (r.size() > 0) {
r["not"] = ((rule.t & 0x80) != 0);
- r["id"] = rule.v.tag.id;
- r["value"] = rule.v.tag.value;
- break;
+ r["or"] = ((rule.t & 0x40) != 0);
+ }
}
+
return r;
}
@@ -286,11 +293,16 @@ static bool _parseRule(json &r,ZT_VirtualNetworkRule &rule)
{
if (!r.is_object())
return false;
+
const std::string t(_jS(r["type"],""));
memset(&rule,0,sizeof(ZT_VirtualNetworkRule));
+
if (_jB(r["not"],false))
rule.t = 0x80;
else rule.t = 0x00;
+ if (_jB(r["or"],false))
+ rule.t |= 0x40;
+
if (t == "ACTION_DROP") {
rule.t |= ZT_NETWORK_RULE_ACTION_DROP;
return true;
@@ -303,6 +315,12 @@ static bool _parseRule(json &r,ZT_VirtualNetworkRule &rule)
rule.v.fwd.flags = (uint32_t)(_jI(r["flags"],0ULL) & 0xffffffffULL);
rule.v.fwd.length = (uint16_t)(_jI(r["length"],0ULL) & 0xffffULL);
return true;
+ } else if (t == "ACTION_WATCH") {
+ rule.t |= ZT_NETWORK_RULE_ACTION_WATCH;
+ rule.v.fwd.address = Utils::hexStrToU64(_jS(r["address"],"0").c_str()) & 0xffffffffffULL;
+ rule.v.fwd.flags = (uint32_t)(_jI(r["flags"],0ULL) & 0xffffffffULL);
+ rule.v.fwd.length = (uint16_t)(_jI(r["length"],0ULL) & 0xffffULL);
+ return true;
} else if (t == "ACTION_REDIRECT") {
rule.t |= ZT_NETWORK_RULE_ACTION_REDIRECT;
rule.v.fwd.address = Utils::hexStrToU64(_jS(r["zt"],"0").c_str()) & 0xffffffffffULL;
@@ -331,10 +349,6 @@ static bool _parseRule(json &r,ZT_VirtualNetworkRule &rule)
rule.t |= ZT_NETWORK_RULE_MATCH_VLAN_DEI;
rule.v.vlanDei = (uint8_t)(_jI(r["vlanDei"],0ULL) & 0xffULL);
return true;
- } else if (t == "MATCH_ETHERTYPE") {
- rule.t |= ZT_NETWORK_RULE_MATCH_ETHERTYPE;
- rule.v.etherType = (uint16_t)(_jI(r["etherType"],0ULL) & 0xffffULL);
- return true;
} else if (t == "MATCH_MAC_SOURCE") {
rule.t |= ZT_NETWORK_RULE_MATCH_MAC_SOURCE;
const std::string mac(_jS(r["mac"],"0"));
@@ -381,10 +395,14 @@ static bool _parseRule(json &r,ZT_VirtualNetworkRule &rule)
rule.t |= ZT_NETWORK_RULE_MATCH_IP_PROTOCOL;
rule.v.ipProtocol = (uint8_t)(_jI(r["ipProtocol"],0ULL) & 0xffULL);
return true;
+ } else if (t == "MATCH_ETHERTYPE") {
+ rule.t |= ZT_NETWORK_RULE_MATCH_ETHERTYPE;
+ rule.v.etherType = (uint16_t)(_jI(r["etherType"],0ULL) & 0xffffULL);
+ return true;
} else if (t == "MATCH_ICMP") {
rule.t |= ZT_NETWORK_RULE_MATCH_ICMP;
- rule.v.icmp.type = (uint8_t)(_jI(r["type"],0ULL) & 0xffULL);
- json &code = r["code"];
+ rule.v.icmp.type = (uint8_t)(_jI(r["icmpType"],0ULL) & 0xffULL);
+ json &code = r["icmpCode"];
if (code.is_null()) {
rule.v.icmp.code = 0;
rule.v.icmp.flags = 0x00;
@@ -406,21 +424,12 @@ static bool _parseRule(json &r,ZT_VirtualNetworkRule &rule)
} else if (t == "MATCH_CHARACTERISTICS") {
rule.t |= ZT_NETWORK_RULE_MATCH_CHARACTERISTICS;
if (r.count("mask")) {
- auto v = r["mask"];
+ json &v = r["mask"];
if (v.is_number()) {
- rule.v.characteristics[0] = v;
+ rule.v.characteristics = v;
} else {
std::string tmp = v;
- rule.v.characteristics[0] = Utils::hexStrToU64(tmp.c_str());
- }
- }
- if (r.count("value")) {
- auto v = r["value"];
- if (v.is_number()) {
- rule.v.characteristics[1] = v;
- } else {
- std::string tmp = v;
- rule.v.characteristics[1] = Utils::hexStrToU64(tmp.c_str());
+ rule.v.characteristics = Utils::hexStrToU64(tmp.c_str());
}
}
return true;
@@ -429,6 +438,9 @@ static bool _parseRule(json &r,ZT_VirtualNetworkRule &rule)
rule.v.frameSize[0] = (uint16_t)(_jI(r["start"],0ULL) & 0xffffULL);
rule.v.frameSize[1] = (uint16_t)(_jI(r["end"],(uint64_t)rule.v.frameSize[0]) & 0xffffULL);
return true;
+ } else if (t == "MATCH_RANDOM") {
+ rule.t |= ZT_NETWORK_RULE_MATCH_RANDOM;
+ rule.v.randomProbability = (uint32_t)(_jI(r["probability"],0ULL) & 0xffffffffULL);
} else if (t == "MATCH_TAGS_DIFFERENCE") {
rule.t |= ZT_NETWORK_RULE_MATCH_TAGS_DIFFERENCE;
rule.v.tag.id = (uint32_t)(_jI(r["id"],0ULL) & 0xffffffffULL);
@@ -449,7 +461,13 @@ static bool _parseRule(json &r,ZT_VirtualNetworkRule &rule)
rule.v.tag.id = (uint32_t)(_jI(r["id"],0ULL) & 0xffffffffULL);
rule.v.tag.value = (uint32_t)(_jI(r["value"],0ULL) & 0xffffffffULL);
return true;
+ } else if (t == "MATCH_TAGS_EQUAL") {
+ rule.t |= ZT_NETWORK_RULE_MATCH_TAGS_EQUAL;
+ rule.v.tag.id = (uint32_t)(_jI(r["id"],0ULL) & 0xffffffffULL);
+ rule.v.tag.value = (uint32_t)(_jI(r["value"],0ULL) & 0xffffffffULL);
+ return true;
}
+
return false;
}
@@ -499,19 +517,6 @@ void EmbeddedNetworkController::threadMain()
lastUpdatedNetworkMemberCache = OSUtils::now();
}
- { // Every 25ms we push up to 50 network refreshes, which amounts to a max of about 300-500kb/sec
- unsigned int count = 0;
- Mutex::Lock _l(_refreshQueue_m);
- while (_refreshQueue.size() > 0) {
- _Refresh &r = _refreshQueue.front();
- if (_node)
- _node->pushNetworkRefresh(r.dest,r.nwid,r.blacklistAddresses,r.blacklistThresholds,r.numBlacklistEntries);
- _refreshQueue.pop_front();
- if (++count >= 50)
- break;
- }
- }
-
Thread::sleep(25);
}
}
@@ -992,12 +997,7 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpGET(
if (!member.size())
return 404;
- char addrs[24];
- Utils::snprintf(addrs,sizeof(addrs),"%.10llx",address);
-
- // Add non-persisted fields
- member["clock"] = OSUtils::now();
-
+ _addMemberNonPersistedFields(member,OSUtils::now());
responseBody = member.dump(2);
responseContentType = "application/json";
@@ -1023,32 +1023,6 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpGET(
return 200;
}
- } else if ((path[2] == "active")&&(path.size() == 3)) {
-
- responseBody = "{";
- std::vector<std::string> members(OSUtils::listSubdirectories((_networkBP(nwid,false) + ZT_PATH_SEPARATOR_S + "member").c_str()));
- const uint64_t threshold = OSUtils::now() - ZT_NETCONF_NODE_ACTIVE_THRESHOLD;
- for(std::vector<std::string>::iterator i(members.begin());i!=members.end();++i) {
- if (i->length() == ZT_ADDRESS_LENGTH_HEX) {
- json member(_readJson(_memberJP(nwid,Address(Utils::hexStrToU64(i->c_str())),false)));
- if (member.size()) {
- auto recentLog = member["recentLog"];
- if ((recentLog.is_array())&&(recentLog.size() > 0)) {
- auto mostRecentLog = recentLog[0];
- if ((mostRecentLog.is_object())&&(_jI(mostRecentLog["ts"],0ULL) >= threshold)) {
- responseBody.append((responseBody.length() == 1) ? "\"" : ",\"");
- responseBody.append(*i);
- responseBody.append("\":");
- responseBody.append(mostRecentLog.dump());
- }
- }
- }
- }
- }
- responseBody.push_back('}');
- responseContentType = "application/json";
- return 200;
-
} else if ((path[2] == "test")&&(path.size() >= 4)) {
Mutex::Lock _l(_circuitTests_m);
@@ -1243,15 +1217,6 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpPOST(
_networkMemberCache[nwid][Address(address)] = member;
}
- {
- Mutex::Lock _l(_refreshQueue_m);
- _refreshQueue.push_back(_Refresh());
- _Refresh &r = _refreshQueue.back();
- r.dest = Address(address);
- r.nwid = nwid;
- r.numBlacklistEntries = 0;
- }
-
// Add non-persisted fields
member["clock"] = now;
@@ -1343,28 +1308,28 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpPOST(
if (b.count("multicastLimit")) network["multicastLimit"] = _jI(b["multicastLimit"],32ULL);
if (b.count("v4AssignMode")) {
- json &nv4m = network["v4AssignMode"];
- if (!nv4m.is_object()) nv4m = json::object();
- if (b["v4AssignMode"].is_string()) { // backward compatibility
- nv4m["zt"] = (_jS(b["v4AssignMode"],"") == "zt");
- } else if (b["v4AssignMode"].is_object()) {
- json &v4m = b["v4AssignMode"];
- if (v4m.count("zt")) nv4m["zt"] = _jB(v4m["zt"],false);
- }
- if (!nv4m.count("zt")) nv4m["zt"] = false;
+ json nv4m;
+ json &v4m = b["v4AssignMode"];
+ if (v4m.is_string()) { // backward compatibility
+ nv4m["zt"] = (_jS(v4m,"") == "zt");
+ } else if (v4m.is_object()) {
+ nv4m["zt"] = _jB(v4m["zt"],false);
+ } else nv4m["zt"] = false;
+ network["v4AssignMode"] = nv4m;
}
if (b.count("v6AssignMode")) {
- json &nv6m = network["v6AssignMode"];
+ json nv6m;
+ json &v6m = b["v6AssignMode"];
if (!nv6m.is_object()) nv6m = json::object();
- if (b["v6AssignMode"].is_string()) { // backward compatibility
- std::vector<std::string> v6m(Utils::split(_jS(b["v6AssignMode"],"").c_str(),",","",""));
- std::sort(v6m.begin(),v6m.end());
- v6m.erase(std::unique(v6m.begin(),v6m.end()),v6m.end());
+ if (v6m.is_string()) { // backward compatibility
+ std::vector<std::string> v6ms(Utils::split(_jS(v6m,"").c_str(),",","",""));
+ std::sort(v6ms.begin(),v6ms.end());
+ v6ms.erase(std::unique(v6ms.begin(),v6ms.end()),v6ms.end());
nv6m["rfc4193"] = false;
nv6m["zt"] = false;
nv6m["6plane"] = false;
- for(std::vector<std::string>::iterator i(v6m.begin());i!=v6m.end();++i) {
+ for(std::vector<std::string>::iterator i(v6ms.begin());i!=v6ms.end();++i) {
if (*i == "rfc4193")
nv6m["rfc4193"] = true;
else if (*i == "zt")
@@ -1372,15 +1337,16 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpPOST(
else if (*i == "6plane")
nv6m["6plane"] = true;
}
- } else if (b["v6AssignMode"].is_object()) {
- json &v6m = b["v6AssignMode"];
+ } else if (v6m.is_object()) {
if (v6m.count("rfc4193")) nv6m["rfc4193"] = _jB(v6m["rfc4193"],false);
if (v6m.count("zt")) nv6m["zt"] = _jB(v6m["zt"],false);
if (v6m.count("6plane")) nv6m["6plane"] = _jB(v6m["6plane"],false);
+ } else {
+ nv6m["rfc4193"] = false;
+ nv6m["zt"] = false;
+ nv6m["6plane"] = false;
}
- if (!nv6m.count("rfc4193")) nv6m["rfc4193"] = false;
- if (!nv6m.count("zt")) nv6m["zt"] = false;
- if (!nv6m.count("6plane")) nv6m["6plane"] = false;
+ network["v6AssignMode"] = nv6m;
}
if (b.count("routes")) {