mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-06 12:33:44 +02:00
Add a tags both equal match.
This commit is contained in:
parent
adeb7e7da0
commit
45c4ccb153
4 changed files with 22 additions and 1 deletions
|
@ -287,6 +287,12 @@ static json _renderRule(ZT_VirtualNetworkRule &rule)
|
||||||
r["id"] = rule.v.tag.id;
|
r["id"] = rule.v.tag.id;
|
||||||
r["value"] = rule.v.tag.value;
|
r["value"] = rule.v.tag.value;
|
||||||
break;
|
break;
|
||||||
|
case ZT_NETWORK_RULE_MATCH_TAGS_EQUAL:
|
||||||
|
r["type"] = "MATCH_TAGS_EQUAL";
|
||||||
|
r["not"] = ((rule.t & 0x80) != 0);
|
||||||
|
r["id"] = rule.v.tag.id;
|
||||||
|
r["value"] = rule.v.tag.value;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -458,6 +464,11 @@ static bool _parseRule(json &r,ZT_VirtualNetworkRule &rule)
|
||||||
rule.v.tag.id = (uint32_t)(_jI(r["id"],0ULL) & 0xffffffffULL);
|
rule.v.tag.id = (uint32_t)(_jI(r["id"],0ULL) & 0xffffffffULL);
|
||||||
rule.v.tag.value = (uint32_t)(_jI(r["value"],0ULL) & 0xffffffffULL);
|
rule.v.tag.value = (uint32_t)(_jI(r["value"],0ULL) & 0xffffffffULL);
|
||||||
return true;
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -658,6 +658,11 @@ enum ZT_VirtualNetworkRuleType
|
||||||
*/
|
*/
|
||||||
ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_XOR = 55,
|
ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_XOR = 55,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Match if local and remote tags both equal a value
|
||||||
|
*/
|
||||||
|
ZT_NETWORK_RULE_MATCH_TAGS_EQUAL = 56,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maximum ID allowed for a MATCH entry in the rules table
|
* Maximum ID allowed for a MATCH entry in the rules table
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -340,6 +340,7 @@ public:
|
||||||
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_AND:
|
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_AND:
|
||||||
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_OR:
|
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_OR:
|
||||||
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_XOR:
|
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_XOR:
|
||||||
|
case ZT_NETWORK_RULE_MATCH_TAGS_EQUAL:
|
||||||
rules[ruleCount].v.tag.id = b.template at<uint32_t>(p);
|
rules[ruleCount].v.tag.id = b.template at<uint32_t>(p);
|
||||||
rules[ruleCount].v.tag.value = b.template at<uint32_t>(p + 4);
|
rules[ruleCount].v.tag.value = b.template at<uint32_t>(p + 4);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -511,7 +511,8 @@ static _doZtFilterResult _doZtFilter(
|
||||||
case ZT_NETWORK_RULE_MATCH_TAGS_DIFFERENCE:
|
case ZT_NETWORK_RULE_MATCH_TAGS_DIFFERENCE:
|
||||||
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_AND:
|
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_AND:
|
||||||
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_OR:
|
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_OR:
|
||||||
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_XOR: {
|
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_XOR:
|
||||||
|
case ZT_NETWORK_RULE_MATCH_TAGS_EQUAL: {
|
||||||
const Tag *const localTag = std::lower_bound(&(nconf.tags[0]),&(nconf.tags[nconf.tagCount]),rules[rn].v.tag.id,Tag::IdComparePredicate());
|
const Tag *const localTag = std::lower_bound(&(nconf.tags[0]),&(nconf.tags[nconf.tagCount]),rules[rn].v.tag.id,Tag::IdComparePredicate());
|
||||||
if ((localTag != &(nconf.tags[nconf.tagCount]))&&(localTag->id() == rules[rn].v.tag.id)) {
|
if ((localTag != &(nconf.tags[nconf.tagCount]))&&(localTag->id() == rules[rn].v.tag.id)) {
|
||||||
const Tag *const remoteTag = ((membership) ? membership->getTag(nconf,rules[rn].v.tag.id) : (const Tag *)0);
|
const Tag *const remoteTag = ((membership) ? membership->getTag(nconf,rules[rn].v.tag.id) : (const Tag *)0);
|
||||||
|
@ -531,6 +532,9 @@ static _doZtFilterResult _doZtFilter(
|
||||||
} else if (rt == ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_XOR) {
|
} else if (rt == ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_XOR) {
|
||||||
thisRuleMatches = (uint8_t)((ltv ^ rtv) == rules[rn].v.tag.value);
|
thisRuleMatches = (uint8_t)((ltv ^ rtv) == rules[rn].v.tag.value);
|
||||||
FILTER_TRACE("%u %s %c TAG %u local:%.8x ^ remote:%.8x == %.8x -> %u",rn,_rtn(rt),(((rules[rn].t & 0x80) != 0) ? '!' : '='),(unsigned int)rules[rn].v.tag.id,ltv,rtv,(unsigned int)rules[rn].v.tag.value,(unsigned int)thisRuleMatches);
|
FILTER_TRACE("%u %s %c TAG %u local:%.8x ^ remote:%.8x == %.8x -> %u",rn,_rtn(rt),(((rules[rn].t & 0x80) != 0) ? '!' : '='),(unsigned int)rules[rn].v.tag.id,ltv,rtv,(unsigned int)rules[rn].v.tag.value,(unsigned int)thisRuleMatches);
|
||||||
|
} else if (rt == ZT_NETWORK_RULE_MATCH_TAGS_EQUAL) {
|
||||||
|
thisRuleMatches = (uint8_t)((ltv == rules[rn].v.tag.value)&&(rtv == rules[rn].v.tag.value));
|
||||||
|
FILTER_TRACE("%u %s %c TAG %u local:%.8x and remote:%.8x == %.8x -> %u",rn,_rtn(rt),(((rules[rn].t & 0x80) != 0) ? '!' : '='),(unsigned int)rules[rn].v.tag.id,ltv,rtv,(unsigned int)rules[rn].v.tag.value,(unsigned int)thisRuleMatches);
|
||||||
} else { // sanity check, can't really happen
|
} else { // sanity check, can't really happen
|
||||||
thisRuleMatches = 0;
|
thisRuleMatches = 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue