LuCI - Lua Configuration Interface
Copyright 2008 Steven Barth <steven@midlink.org>
-Copyright 2010 Jo-Philipp Wich <xm@subsignal.org>
+Copyright 2010-2011 Jo-Philipp Wich <xm@subsignal.org>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
m.uci:foreach("network", "switch",
function(x)
local switch_name = x.name or x['.name']
+ local has_enable = "enable"
+ local has_reset = nil
+ local has_vlan = nil
+ local has_learn = nil
local has_vlan4k = nil
local has_ptpvid = nil
+ local min_vid = 0
local max_vid = 16
local num_vlans = 16
- local num_ports = 5
+ local num_ports = 6
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
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 6)
+ num_vlans = tonumber(num_vlans or 16)
+ cpu_port = tonumber(cpu_port or 5)
+ min_vid = 1
+ has_enable = nil
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_vlan") then
+ has_vlan = "enable_vlan"
+
+ elseif line:match(": enable_learning") then
+ has_learn = "enable_learning"
+
+ elseif line:match(": reset") then
+ has_reset = "reset"
+
+ elseif line:match(": enable_vlan4k") then
+ enable_vlan4k = true
+
end
end
s = m:section(NamedSection, x['.name'], "switch", translatef("Switch %q", switch_name))
s.addremove = false
- s:option(Flag, "enable", "Enable this switch")
- .cfgvalue = function(self, section) return Flag.cfgvalue(self, section) or self.enabled end
+ if has_enable then
+ x = s:option(Flag, has_enable, translate("Enable this switch"))
+ x.default = x.enabled
+ end
+
+ if has_vlan then
+ x = s:option(Flag, has_vlan, translate("Enable VLAN functionality"))
+ x.default = x.enabled
+ end
+
+ if enable_vlan4k then
+ s:option(Flag, "enable_vlan4k", translate("Enable 4K VLANs"))
+ end
- s:option(Flag, "enable_vlan", "Enable VLAN functionality")
- .cfgvalue = function(self, section) return Flag.cfgvalue(self, section) or self.enabled end
+ if has_learn then
+ x = s:option(Flag, has_learn, translate("Enable learning and aging"))
+ x.default = x.enabled
+ end
- s:option(Flag, "reset", "Reset switch during setup")
- .cfgvalue = function(self, section) return Flag.cfgvalue(self, section) or self.enabled end
+ if has_reset then
+ x = s:option(Flag, has_reset, translate("Reset switch during setup"))
+ x.default = x.enabled
+ end
-- VLAN table
if value == "u" then
if not untagged[self.option] then
untagged[self.option] = true
- else
+ elseif min_vid > 0 or tonumber(self.option) ~= cpu_port then -- enable multiple untagged cpu ports due to weird broadcom default setup
return nil,
translatef("Port %d is untagged in multiple VLANs!", tonumber(self.option) + 1)
end
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
s = m:section(TypedSection, "switch",
translatef("Port PVIDs on %q", switch_name),
translate("Port <abbr title=\"Primary VLAN IDs\">PVIDs</abbr> specify " ..
- "the default VLAN ID added to received untagged frames.<br />" ..
- "Leave the ID field empty to disable auto tagging on the associated port."))
+ "the default VLAN ID added to received untagged frames."))
s.template = "cbi/tblsection"
s.addremove = false