summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorViacheslav Hletenko <v.gletenko@vyos.io>2023-06-18 12:16:21 +0000
committerViacheslav Hletenko <v.gletenko@vyos.io>2023-06-18 12:16:21 +0000
commit74dcda75e54c3f1e9c1ac000b460a90bb5394852 (patch)
tree5c3e0e6e347c565a9b9e35454b79f047bc9f166c
parent335fff215dd9df2c1a0ba38c7de514b660067f7e (diff)
downloadvyos-1x-74dcda75e54c3f1e9c1ac000b460a90bb5394852.tar.gz
vyos-1x-74dcda75e54c3f1e9c1ac000b460a90bb5394852.zip
T5071: QoS add class match DSCP value
QoS DSCP match is skipped Add it set qos policy shaper test class 23 match 10 ip dscp 'network' tc filter replace dev eth0 parent 1: protocol all u32 match ip dsfield 224 0xff flowid 1:17
-rw-r--r--python/vyos/qos/base.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/python/vyos/qos/base.py b/python/vyos/qos/base.py
index 353eb91b3..26ec65535 100644
--- a/python/vyos/qos/base.py
+++ b/python/vyos/qos/base.py
@@ -27,6 +27,40 @@ class QoSBase:
_debug = False
_direction = ['egress']
_parent = 0xffff
+ _dsfields = {
+ "default": 0x0,
+ "lowdelay": 0x10,
+ "throughput": 0x08,
+ "reliability": 0x04,
+ "mincost": 0x02,
+ "priority": 0x20,
+ "immediate": 0x40,
+ "flash": 0x60,
+ "flash-override": 0x80,
+ "critical": 0x0A,
+ "internet": 0xC0,
+ "network": 0xE0,
+ "AF11": 0x28,
+ "AF12": 0x30,
+ "AF13": 0x38,
+ "AF21": 0x48,
+ "AF22": 0x50,
+ "AF23": 0x58,
+ "AF31": 0x68,
+ "AF32": 0x70,
+ "AF33": 0x78,
+ "AF41": 0x88,
+ "AF42": 0x90,
+ "AF43": 0x98,
+ "CS1": 0x20,
+ "CS2": 0x40,
+ "CS3": 0x60,
+ "CS4": 0x80,
+ "CS5": 0xA0,
+ "CS6": 0xC0,
+ "CS7": 0xE0,
+ "EF": 0xB8
+ }
def __init__(self, interface):
if os.path.exists('/tmp/vyos.qos.debug'):
@@ -48,6 +82,12 @@ class QoSBase:
return tmp[-1]
return None
+ def _get_dsfield(self, value):
+ if value in self._dsfields:
+ return self._dsfields[value]
+ else:
+ return value
+
def _build_base_qdisc(self, config : dict, cls_id : int):
"""
Add/replace qdisc for every class (also default is a class). This is
@@ -204,6 +244,14 @@ class QoSBase:
tmp = get_protocol_by_name(tmp)
filter_cmd += f' match {tc_af} protocol {tmp} 0xff'
+ tmp = dict_search(f'{af}.dscp', match_config)
+ if tmp:
+ tmp = self._get_dsfield(tmp)
+ if af == 'ip':
+ filter_cmd += f' match {tc_af} dsfield {tmp} 0xff'
+ elif af == 'ipv6':
+ filter_cmd += f' match u16 {tmp} 0x0ff0 at 0'
+
# Will match against total length of an IPv4 packet and
# payload length of an IPv6 packet.
#