summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2016-09-30 14:07:00 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2016-09-30 14:07:00 -0700
commit988049f39bf7731c0189544b316850b81b004de3 (patch)
tree80291a78a3eaf560a1ba765150533420aac550c5 /node
parent6651b8310e2c6adc3ef311d07ba497bbcef0165f (diff)
downloadinfinitytier-988049f39bf7731c0189544b316850b81b004de3.tar.gz
infinitytier-988049f39bf7731c0189544b316850b81b004de3.zip
Add new rule to rules engine: random match.
Diffstat (limited to 'node')
-rw-r--r--node/Capability.hpp7
-rw-r--r--node/Network.cpp4
2 files changed, 11 insertions, 0 deletions
diff --git a/node/Capability.hpp b/node/Capability.hpp
index 2cf54b5c..e808ad40 100644
--- a/node/Capability.hpp
+++ b/node/Capability.hpp
@@ -249,6 +249,10 @@ public:
b.append((uint16_t)rules[i].v.frameSize[0]);
b.append((uint16_t)rules[i].v.frameSize[1]);
break;
+ case ZT_NETWORK_RULE_MATCH_RANDOM:
+ b.append((uint8_t)4);
+ b.append((uint32_t)rules[i].v.randomProbability);
+ break;
case ZT_NETWORK_RULE_MATCH_TAGS_DIFFERENCE:
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_AND:
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_OR:
@@ -331,6 +335,9 @@ public:
rules[ruleCount].v.frameSize[0] = b.template at<uint16_t>(p);
rules[ruleCount].v.frameSize[1] = b.template at<uint16_t>(p + 2);
break;
+ case ZT_NETWORK_RULE_MATCH_RANDOM:
+ rules[ruleCount].v.randomProbability = b.template at<uint32_t>(p);
+ break;
case ZT_NETWORK_RULE_MATCH_TAGS_DIFFERENCE:
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_AND:
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_OR:
diff --git a/node/Network.cpp b/node/Network.cpp
index d38a3fdd..fe899dcc 100644
--- a/node/Network.cpp
+++ b/node/Network.cpp
@@ -504,6 +504,10 @@ static _doZtFilterResult _doZtFilter(
thisRuleMatches = (uint8_t)((frameLen >= (unsigned int)rules[rn].v.frameSize[0])&&(frameLen <= (unsigned int)rules[rn].v.frameSize[1]));
FILTER_TRACE("%u %s %c %u in %u-%u -> %u",rn,_rtn(rt),(((rules[rn].t & 0x80) != 0) ? '!' : '='),frameLen,(unsigned int)rules[rn].v.frameSize[0],(unsigned int)rules[rn].v.frameSize[1],(unsigned int)thisRuleMatches);
break;
+ case ZT_NETWORK_RULE_MATCH_RANDOM:
+ thisRuleMatches = (uint8_t)((uint32_t)(RR->node->prng() & 0xffffffffULL) <= rules[rn].v.randomProbability);
+ FILTER_TRACE("%u %s %c -> %u",rn,_rtn(rt),(((rules[rn].t & 0x80) != 0) ? '!' : '='),(unsigned int)thisRuleMatches);
+ break;
case ZT_NETWORK_RULE_MATCH_TAGS_DIFFERENCE:
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_AND:
case ZT_NETWORK_RULE_MATCH_TAGS_BITWISE_OR: