浏览代码

Add a tags both equal match.

Adam Ierymenko 8 年之前
父节点
当前提交
45c4ccb153
共有 4 个文件被更改,包括 22 次插入1 次删除
  1. 11 0
      controller/EmbeddedNetworkController.cpp
  2. 5 0
      include/ZeroTierOne.h
  3. 1 0
      node/Capability.hpp
  4. 5 1
      node/Network.cpp

+ 11 - 0
controller/EmbeddedNetworkController.cpp

@@ -287,6 +287,12 @@ static json _renderRule(ZT_VirtualNetworkRule &rule)
 			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["not"] = ((rule.t & 0x80) != 0);
+			r["id"] = rule.v.tag.id;
+			r["value"] = rule.v.tag.value;
+			break;
 	}
 	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.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;
 }

+ 5 - 0
include/ZeroTierOne.h

@@ -658,6 +658,11 @@ enum ZT_VirtualNetworkRuleType
 	 */
 	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
 	 */

+ 1 - 0
node/Capability.hpp

@@ -340,6 +340,7 @@ public:
 				case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_AND:
 				case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_OR:
 				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.value = b.template at<uint32_t>(p + 4);
 					break;

+ 5 - 1
node/Network.cpp

@@ -511,7 +511,8 @@ static _doZtFilterResult _doZtFilter(
 			case ZT_NETWORK_RULE_MATCH_TAGS_DIFFERENCE:
 			case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_AND:
 			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());
 				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);
@@ -531,6 +532,9 @@ static _doZtFilterResult _doZtFilter(
 						} else if (rt == ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_XOR) {
 							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);
+						} 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
 							thisRuleMatches = 0;
 						}