|
|
|
|
@ -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; |
|
|
|
|
@ -154,146 +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(); |
|
|
|
|
default: |
|
|
|
|
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); |
|
|
|
|
r["mask"] = 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_RANDOM: |
|
|
|
|
r["type"] = "MATCH_RANDOM"; |
|
|
|
|
r["not"] = ((rule.t & 0x80) != 0); |
|
|
|
|
r["probability"] = (unsigned long)rule.v.randomProbability; |
|
|
|
|
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; |
|
|
|
|
break; |
|
|
|
|
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_XOR: |
|
|
|
|
r["type"] = "MATCH_TAGS_BITWISE_XOR"; |
|
|
|
|
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_EQUAL: |
|
|
|
|
r["type"] = "MATCH_TAGS_EQUAL"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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["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["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; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -301,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; |
|
|
|
|
@ -352,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")); |
|
|
|
|
@ -402,6 +395,10 @@ 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); |
|
|
|
|
@ -470,6 +467,7 @@ static bool _parseRule(json &r,ZT_VirtualNetworkRule &rule)
|
|
|
|
|
rule.v.tag.value = (uint32_t)(_jI(r["value"],0ULL) & 0xffffffffULL); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|