modules/admin-full: allow vlan 0 for /proc/switch interface
[project/luci.git] / modules / admin-full / luasrc / model / cbi / admin_network / vlan.lua
index 866cfe7..e58ac9e 100644 (file)
@@ -20,11 +20,15 @@ m.uci:foreach("network", "switch",
                local switch_name = x.name or x['.name']
                local has_vlan4k  = nil
                local has_ptpvid  = nil
+               local has_jumbo3  = nil
+               local min_vid     = 1
                local max_vid     = 16
                local num_vlans   = 16
                local num_ports   = 5
                local cpu_port    = 5
 
+               local enable_vlan4k = false
+
                -- Parse some common switch properties from swconfig help output.
                local swc = io.popen("swconfig dev %q help 2>/dev/null" % switch_name)
                if swc then
@@ -47,18 +51,27 @@ m.uci:foreach("network", "switch",
                                        num_ports, cpu_port, num_vlans =
                                                line:match("ports: (%d+) %(cpu @ (%d+)%), vlans: (%d+)")
 
-                                       num_ports = tonumber(num_ports or  5)
-                                       num_vlans = tonumber(num_vlans or 16)
-                                       cpu_port  = tonumber(cpu_port  or  5)
+                                       num_ports = tonumber(num_ports) or  5
+                                       num_vlans = tonumber(num_vlans) or 16
+                                       cpu_port  = tonumber(cpu_port)  or  5
 
                                elseif line:match(": pvid") or line:match(": tag") or line:match(": vid") then
                                        if is_vlan_attr then has_vlan4k = line:match(": (%w+)") end
                                        if is_port_attr then has_ptpvid = line:match(": (%w+)") end
 
+                               elseif line:match(": enable_vlan4k") then
+                                       enable_vlan4k = true
+
+                               elseif line:match(": max_length") then
+                                       has_jumbo3 = true
                                end
                        end
 
                        swc:close()
+
+               -- We have no swconfig, assume /proc/switch
+               else
+                       min_vid = 0
                end
 
 
@@ -93,15 +106,20 @@ m.uci:foreach("network", "switch",
                s = m:section(NamedSection, x['.name'], "switch", translatef("Switch %q", switch_name))
                s.addremove = false
 
-               s:option(Flag, "enable", translate("Enable this switch"))
-                       .cfgvalue = function(self, section) return Flag.cfgvalue(self, section) or self.enabled end
+               s:option(Flag, "enable", translate("Enable this switch")).default = "1"
+               s:option(Flag, "enable_vlan", translate("Enable VLAN functionality")).default = "1"
 
-               s:option(Flag, "enable_vlan", translate("Enable VLAN functionality"))
-                       .cfgvalue = function(self, section) return Flag.cfgvalue(self, section) or self.enabled end
+               if enable_vlan4k then
+                       s:option(Flag, "enable_vlan4k", translate("Enable 4K VLANs"))
+               end
 
-               s:option(Flag, "reset", translate("Reset switch during setup"))
-                       .cfgvalue = function(self, section) return Flag.cfgvalue(self, section) or self.enabled end
+               if has_jumbo3 then
+                       j = s:option(Flag, "max_length", translate("Enable Jumbo Frame passthrough"))
+                       j.enabled = "3"
+                       j.rmempty = true
+               end
 
+               s:option(Flag, "reset", translate("Reset switch during setup")).default = "1"
 
                -- VLAN table
                s = m:section(TypedSection, "switch_vlan", translatef("VLANs on %q", switch_name))
@@ -206,11 +224,11 @@ m.uci:foreach("network", "switch",
                vid.validate = function(self, value, section)
                        local v = tonumber(value)
                        local m = has_vlan4k and 4094 or (num_vlans - 1)
-                       if v ~= nil and v > 0 and v <= m then
+                       if v ~= nil and v >= min_vid and v <= m then
                                return value
                        else
                                return nil,
-                                       translatef("Invalid VLAN ID given! Only IDs between %d and %d are allowed.", 1, m)
+                                       translatef("Invalid VLAN ID given! Only IDs between %d and %d are allowed.", min_vid, m)
                        end
                end