From 68b7cbe11dbe14109d9b4c564f2499b574309665 Mon Sep 17 00:00:00 2001
From: jack9603301 <jack9603301@163.com>
Date: Sat, 14 Nov 2020 15:44:12 +0800
Subject: 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)
---
 python/vyos/ifconfig/bridge.py | 37 +++++++++++++++++++++++++++++--------
 1 file changed, 29 insertions(+), 8 deletions(-)

(limited to 'python/vyos/ifconfig')

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)
                         
-- 
cgit v1.2.3