diff options
author | Christian Breunig <christian@breunig.cc> | 2023-06-18 20:23:11 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-18 20:23:11 +0200 |
commit | 062b1e857bb70f75315826fee756784244fbd463 (patch) | |
tree | 5c3e0e6e347c565a9b9e35454b79f047bc9f166c | |
parent | 335fff215dd9df2c1a0ba38c7de514b660067f7e (diff) | |
parent | 74dcda75e54c3f1e9c1ac000b460a90bb5394852 (diff) | |
download | vyos-1x-062b1e857bb70f75315826fee756784244fbd463.tar.gz vyos-1x-062b1e857bb70f75315826fee756784244fbd463.zip |
Merge pull request #2048 from sever-sever/T5071
T5071: QoS add class match DSCP value
-rw-r--r-- | python/vyos/qos/base.py | 48 |
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. # |