luci-mod-admin-network: fix VLAN "add" button for empty switches
authorJo-Philipp Wich <jo@mein.io>
Tue, 7 May 2019 06:54:23 +0000 (08:54 +0200)
committerJo-Philipp Wich <jo@mein.io>
Tue, 7 May 2019 06:55:22 +0000 (08:55 +0200)
Fixes OpenWrt FS#2270.

Ref: https://bugs.openwrt.org/index.php?do=details&task_id=2270
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-mod-network/luasrc/model/cbi/admin_network/vlan.lua

index d79b3c4704cd23a2fd817b4ba483bb91c0a84195..edeb193ef70460b4eea2c269bb4fbfda08f6cfc6 100644 (file)
@@ -42,6 +42,8 @@ local update_interfaces = function(old_ifname, new_ifname)
        end
 end
 
+local vlan_already_created
+
 m.uci:foreach("network", "switch",
        function(x)
                local sid         = x['.name']
@@ -200,8 +202,29 @@ m.uci:foreach("network", "switch",
 
                -- When creating a new vlan, preset it with the highest found vid + 1.
                s.create = function(self, section, origin)
-                       -- Filter by switch
-                       if m:get(origin, "device") ~= switch_name then
+                       -- VLAN has already been created for another switch
+                       if vlan_already_created then
+                               return
+
+                       -- VLAN add button was pressed in an empty VLAN section so only
+                       -- accept the create event if our switch is without existing VLANs
+                       elseif origin == "" then
+                               local is_empty_switch = true
+
+                               m.uci:foreach("network", "switch_vlan",
+                                       function(s)
+                                               if s.device == switch_name then
+                                                       is_empty_switch = false
+                                                       return false
+                                               end
+                                       end)
+
+                               if not is_empty_switch then
+                                       return
+                               end
+
+                       -- VLAN was created for another switch
+                       elseif m:get(origin, "device") ~= switch_name then
                                return
                        end
 
@@ -227,6 +250,8 @@ m.uci:foreach("network", "switch",
                                m:set(sid, has_vlan4k, max_id + 1)
                        end
 
+                       vlan_already_created = true
+
                        return sid
                end