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:56:03 +0000 (08:56 +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>
(cherry picked from commit 6b7afabcdd270a5215a225553dda08e0cd1c5e40)

modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua

index 3e46628d3f93094360fdbbef0e57e8739164f5c8..513466db1a4ee544997afaea25a2adde61429aa6 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