summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorjack9603301 <jack9603301@163.com>2020-11-14 15:44:12 +0800
committerjack9603301 <jack9603301@163.com>2020-11-14 15:44:12 +0800
commit68b7cbe11dbe14109d9b4c564f2499b574309665 (patch)
tree1a1e7476cc77f54f2df34686f13a4f3b39b05b06 /python
parent7106e90daf7c15f167f38f7715facef37c141f4f (diff)
downloadvyos-1x-68b7cbe11dbe14109d9b4c564f2499b574309665.tar.gz
vyos-1x-68b7cbe11dbe14109d9b4c564f2499b574309665.zip
bridge: T3042: Better fix implementation errors
In #601, I provided a basic patch. Under this patch, I rely on vif to detect the vlan id range that the bridge should flow through, which may lead to greater redundancy in the configuration, so I am considering detecting effective vlan filters In setting the range of vlan id that is required to flow through the bridge, I use set() to complete the deduplication of this vlan id and set it to the bridge uniformly (at the same time, I slightly modified the smoke test script)
Diffstat (limited to 'python')
-rw-r--r--python/vyos/ifconfig/bridge.py37
1 files changed, 29 insertions, 8 deletions
diff --git a/python/vyos/ifconfig/bridge.py b/python/vyos/ifconfig/bridge.py
index 7eac9b886..7c77e050a 100644
--- a/python/vyos/ifconfig/bridge.py
+++ b/python/vyos/ifconfig/bridge.py
@@ -255,6 +255,9 @@ class BridgeIf(Interface):
if member in interfaces():
self.del_port(member)
vlan_filter = 0
+
+ vlan_del = set()
+ vlan_add = set()
tmp = dict_search('member.interface', config)
if tmp:
@@ -286,12 +289,13 @@ class BridgeIf(Interface):
tmp = dict_search('native_vlan_removed', interface_config)
- if tmp and 'native_vlan_removed' not in interface_config:
- vlan_id = tmp
- cmd = f'bridge vlan add dev {interface} vid 1 pvid untagged master'
- self._cmd(cmd)
+ for vlan_id in (tmp or []):
cmd = f'bridge vlan del dev {interface} vid {vlan_id}'
self._cmd(cmd)
+ cmd = f'bridge vlan add dev {interface} vid 1 pvid untagged master'
+ self._cmd(cmd)
+ vlan_del.add(vlan_id)
+ vlan_add.add(1)
tmp = dict_search('allowed_vlan_removed', interface_config)
@@ -299,31 +303,48 @@ class BridgeIf(Interface):
for vlan_id in (tmp or []):
cmd = f'bridge vlan del dev {interface} vid {vlan_id}'
self._cmd(cmd)
+ vlan_del.add(vlan_id)
if 'native_vlan' in interface_config:
vlan_filter = 1
cmd = f'bridge vlan del dev {interface} vid 1'
self._cmd(cmd)
+ vlan_del.add(1)
vlan_id = interface_config['native_vlan']
cmd = f'bridge vlan add dev {interface} vid {vlan_id} pvid untagged master'
self._cmd(cmd)
+ vlan_add.add(vlan_id)
else:
cmd = f'bridge vlan del dev {interface} vid 1'
self._cmd(cmd)
+ vlan_del.add(1)
if 'allowed_vlan' in interface_config:
vlan_filter = 1
for vlan in interface_config['allowed_vlan']:
cmd = f'bridge vlan add dev {interface} vid {vlan} master'
self._cmd(cmd)
+ vlan_add.add(vlan)
- vif = dict_search('vif', config)
- if vif:
- for vlan_id,vif_config in vif.items():
- cmd = f'bridge vlan add dev {ifname} vid {vlan_id} self master'
+ for vlan in vlan_del:
+ if isinstance(vlan,str) and vlan.isnumeric():
+ if int(vlan) == 1:
+ cmd = f'bridge vlan del dev {ifname} vid {vlan} self'
+ self._cmd(cmd)
+ cmd = f'bridge vlan add dev {ifname} vid {vlan} pvid untagged self'
+ self._cmd(cmd)
+ else:
+ cmd = f'bridge vlan del dev {ifname} vid {vlan} self'
+ self._cmd(cmd)
+ else:
+ cmd = f'bridge vlan del dev {ifname} vid {vlan} self'
self._cmd(cmd)
+ for vlan in vlan_add:
+ cmd = f'bridge vlan add dev {ifname} vid {vlan} self'
+ self._cmd(cmd)
+
# enable/disable Vlan Filter
self.set_vlan_filter(vlan_filter)