|
@@ -227,6 +227,16 @@ static json _renderRule(ZT_VirtualNetworkRule &rule)
|
|
|
r["id"] = rule.v.tag.id;
|
|
|
r["value"] = rule.v.tag.value;
|
|
|
break;
|
|
|
+ case ZT_NETWORK_RULE_MATCH_INTEGER_RANGE:
|
|
|
+ r["type"] = "INTEGER_RANGE";
|
|
|
+ OSUtils::ztsnprintf(tmp,sizeof(tmp),"%.16llx",rule.v.intRange.start);
|
|
|
+ r["start"] = tmp;
|
|
|
+ OSUtils::ztsnprintf(tmp,sizeof(tmp),"%.16llx",rule.v.intRange.start + (uint64_t)rule.v.intRange.end);
|
|
|
+ r["end"] = tmp;
|
|
|
+ r["idx"] = rule.v.intRange.idx;
|
|
|
+ r["little"] = ((rule.v.intRange.format & 0x80) != 0);
|
|
|
+ r["bits"] = (rule.v.intRange.format & 63) + 1;
|
|
|
+ break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
@@ -417,7 +427,26 @@ static bool _parseRule(json &r,ZT_VirtualNetworkRule &rule)
|
|
|
} else if (t == "MATCH_TAG_RECEIVER") {
|
|
|
rule.t |= ZT_NETWORK_RULE_MATCH_TAG_RECEIVER;
|
|
|
tag = true;
|
|
|
+ } else if (t == "INTEGER_RANGE") {
|
|
|
+ json &s = r["start"];
|
|
|
+ if (s.is_string()) {
|
|
|
+ std::string tmp = s;
|
|
|
+ rule.v.intRange.start = Utils::hexStrToU64(tmp.c_str());
|
|
|
+ } else {
|
|
|
+ rule.v.intRange.start = OSUtils::jsonInt(s,0ULL);
|
|
|
+ }
|
|
|
+ json &e = r["end"];
|
|
|
+ if (e.is_string()) {
|
|
|
+ std::string tmp = e;
|
|
|
+ rule.v.intRange.end = (uint32_t)(Utils::hexStrToU64(tmp.c_str()) - rule.v.intRange.start);
|
|
|
+ } else {
|
|
|
+ rule.v.intRange.end = (uint32_t)(OSUtils::jsonInt(e,0ULL) - rule.v.intRange.start);
|
|
|
+ }
|
|
|
+ rule.v.intRange.idx = (uint16_t)OSUtils::jsonInt(r["idx"],0ULL);
|
|
|
+ rule.v.intRange.format = (OSUtils::jsonBool(r["little"],false)) ? 0x80 : 0x00;
|
|
|
+ rule.v.intRange.format |= (uint8_t)((OSUtils::jsonInt(r["bits"],1ULL) - 1) & 63);
|
|
|
}
|
|
|
+
|
|
|
if (tag) {
|
|
|
rule.v.tag.id = (uint32_t)(OSUtils::jsonInt(r["id"],0ULL) & 0xffffffffULL);
|
|
|
rule.v.tag.value = (uint32_t)(OSUtils::jsonInt(r["value"],0ULL) & 0xffffffffULL);
|