From c3ca069981b9d29786ed04bd21cc19b614e3bf4c Mon Sep 17 00:00:00 2001 From: jack9603301 Date: Sat, 26 Dec 2020 17:34:33 +0800 Subject: mirror: T3150: When configuring QOS, the setting procedure of port mirroring is wrong In e8957b5, we used json to parse the `tc qdisc` filter to determine whether it needs to be deleted (reduction of exception mechanism), but now we find that the json output by this command will output unparsed json in some cases, so We have to go back to the processing of the exception mechanism --- python/vyos/ifconfig/interface.py | 48 ++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 28 deletions(-) (limited to 'python') diff --git a/python/vyos/ifconfig/interface.py b/python/vyos/ifconfig/interface.py index e5c51134b..9a1483a1e 100644 --- a/python/vyos/ifconfig/interface.py +++ b/python/vyos/ifconfig/interface.py @@ -23,8 +23,6 @@ from copy import deepcopy from glob import glob from ipaddress import IPv4Network -from ipaddress import IPv6Address -from ipaddress import IPv6Network from netifaces import ifaddresses # this is not the same as socket.AF_INET/INET6 from netifaces import AF_INET @@ -37,10 +35,8 @@ from vyos.configdict import get_vlan_ids from vyos.template import render from vyos.util import mac2eui64 from vyos.util import dict_search -from vyos.util import cmd from vyos.util import read_file from vyos.template import is_ipv4 -from vyos.template import is_ipv6 from vyos.validate import is_intf_addr_assigned from vyos.validate import is_ipv6_link_local from vyos.validate import assert_boolean @@ -1012,34 +1008,22 @@ class Interface(Control): if os.path.isfile(config_file): os.remove(config_file) - def get_tc_config(self,objectname): - # Parse configuration - get_tc_cmd = f'tc -j {objectname}' - tmp = cmd(get_tc_cmd, shell=True) - return json.loads(tmp) - - def del_tc_qdisc(self,dev,kind,handle): - tc_qdisc = self.get_tc_config('qdisc') - for rule in tc_qdisc: - old_dev = rule['dev'] - old_handle = rule['handle'] - old_kind = rule['kind'] - if old_dev == dev and old_handle == handle and old_kind == kind: - if 'root' in rule and rule['root']: - delete_tc_cmd = f'tc qdisc del dev {dev} handle {handle} root {kind}' - self._cmd(delete_tc_cmd) - else: - delete_tc_cmd = f'tc qdisc del dev {dev} handle {handle} {kind}' - self._cmd(delete_tc_cmd) - def apply_mirror(self): # Please refer to the document for details # https://man7.org/linux/man-pages/man8/tc.8.html # https://man7.org/linux/man-pages/man8/tc-mirred.8.html ifname = self._config['ifname'] # Remove existing mirroring rules - self.del_tc_qdisc(ifname,'ingress','ffff:') - self.del_tc_qdisc(ifname,'prio','1:') + try: + delete_tc_cmd = f'tc qdisc del dev {ifname} handle ffff: ingress' + self._cmd(delete_tc_cmd) + except: + pass + try: + delete_tc_cmd = f'tc qdisc del dev {ifname} handle 1: root prio' + self._cmd(delete_tc_cmd) + except: + pass # Setting up packet mirroring ingress_mirror = dict_search('mirror.ingress', self._config) @@ -1075,8 +1059,16 @@ class Interface(Control): # The rule must be completely deleted first for rule in mirror_rules: for intf, dire in rule.items(): - self.del_tc_qdisc(intf,'ingress','ffff:') - self.del_tc_qdisc(intf,'prio','1:') + try: + delete_tc_cmd = f'tc qdisc del dev {intf} handle ffff: ingress' + self._cmd(delete_tc_cmd) + except: + pass + try: + delete_tc_cmd = f'tc qdisc del dev {intf} handle 1: root prio' + self._cmd(delete_tc_cmd) + except: + pass # Setting mirror rules for rule in mirror_rules: -- cgit v1.2.3