summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Henry <josephjah@gmail.com>2018-07-11 16:55:13 -0700
committerJoseph Henry <josephjah@gmail.com>2018-07-11 16:55:13 -0700
commit65b0030342704cdbace07693a22d3e8048f7f244 (patch)
tree6f4b2e72fc2d5a27c3e2ba286cf2c3a782b68aa2
parentf302fac423db6cc0e5e8c1758a74a7d7b7d8bf04 (diff)
downloadinfinitytier-65b0030342704cdbace07693a22d3e8048f7f244.tar.gz
infinitytier-65b0030342704cdbace07693a22d3e8048f7f244.zip
Added basic QoS rule handling
-rw-r--r--include/ZeroTierOne.h10
-rw-r--r--node/Network.cpp8
-rw-r--r--rule-compiler/rule-compiler.js5
3 files changed, 21 insertions, 2 deletions
diff --git a/include/ZeroTierOne.h b/include/ZeroTierOne.h
index 5b228e17..e4157b96 100644
--- a/include/ZeroTierOne.h
+++ b/include/ZeroTierOne.h
@@ -745,6 +745,11 @@ enum ZT_VirtualNetworkRuleType
ZT_NETWORK_RULE_ACTION_BREAK = 5,
/**
+ * Place a matching frame in the specified QoS bucket
+ */
+ ZT_NETWORK_RULE_ACTION_PRIORITY = 6,
+
+ /**
* Maximum ID for an ACTION, anything higher is a MATCH
*/
ZT_NETWORK_RULE_ACTION__MAX_ID = 15,
@@ -934,6 +939,11 @@ typedef struct
uint32_t flags;
uint16_t length;
} fwd;
+
+ /**
+ * Quality of Service (QoS) bucket we want a frame to be placed in
+ */
+ uint8_t qosBucket;
} v;
} ZT_VirtualNetworkRule;
diff --git a/node/Network.cpp b/node/Network.cpp
index a5c2fc3e..69a74281 100644
--- a/node/Network.cpp
+++ b/node/Network.cpp
@@ -29,6 +29,8 @@
#include <stdlib.h>
#include <math.h>
+#include "../include/ZeroTierDebug.h"
+
#include "Constants.hpp"
#include "../version.h"
#include "Network.hpp"
@@ -107,7 +109,7 @@ static _doZtFilterResult _doZtFilter(
Address &cc, // MUTABLE -- set to TEE destination if TEE action is taken or left alone otherwise
unsigned int &ccLength, // MUTABLE -- set to length of packet payload to TEE
bool &ccWatch, // MUTABLE -- set to true for WATCH target as opposed to normal TEE
- uint8_t &qosBucket) // MUTABLE -- set to the value of the argument provided to the matching action
+ uint8_t &qosBucket) // MUTABLE -- set to the value of the argument provided to PRIORITY
{
// Set to true if we are a TEE/REDIRECT/WATCH target
bool superAccept = false;
@@ -125,6 +127,10 @@ static _doZtFilterResult _doZtFilter(
if ((unsigned int)rt <= (unsigned int)ZT_NETWORK_RULE_ACTION__MAX_ID) {
if (thisSetMatches) {
switch(rt) {
+ case ZT_NETWORK_RULE_ACTION_PRIORITY:
+ qosBucket = (rules[rn].v.qosBucket >= 0 || rules[rn].v.qosBucket <= 8) ? rules[rn].v.qosBucket : 4; // 4 = default bucket (no priority)
+ return DOZTFILTER_ACCEPT;
+
case ZT_NETWORK_RULE_ACTION_DROP:
return DOZTFILTER_DROP;
diff --git a/rule-compiler/rule-compiler.js b/rule-compiler/rule-compiler.js
index bd84824e..38134b74 100644
--- a/rule-compiler/rule-compiler.js
+++ b/rule-compiler/rule-compiler.js
@@ -65,7 +65,8 @@ const OPEN_BLOCK_KEYWORDS = {
'tee': true,
'watch': true,
'redirect': true,
- 'break': true
+ 'break': true,
+ 'priority': true
};
// Reserved words that can't be used as tag, capability, or rule set names
@@ -81,6 +82,7 @@ const RESERVED_WORDS = {
'watch': true,
'redirect': true,
'break': true,
+ 'priority': true,
'ztsrc': true,
'ztdest': true,
@@ -131,6 +133,7 @@ const KEYWORD_TO_API_MAP = {
'watch': 'ACTION_WATCH',
'redirect': 'ACTION_REDIRECT',
'break': 'ACTION_BREAK',
+ 'priority': 'ACTION_PRIORITY',
'ztsrc': 'MATCH_SOURCE_ZEROTIER_ADDRESS',
'ztdest': 'MATCH_DEST_ZEROTIER_ADDRESS',