modules/admin-full: throw more work-arounds, exceptions, hacks and detections at...
[project/luci.git] / modules / admin-full / luasrc / model / cbi / admin_network / vlan.lua
index c71b9a0..b4ad864 100644 (file)
@@ -2,7 +2,7 @@
 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.
@@ -18,13 +18,20 @@ m = Map("network", translate("Switch"), translate("The network ports on your rou
 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
@@ -47,14 +54,28 @@ 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  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
 
@@ -93,14 +114,29 @@ m.uci:foreach("network", "switch",
                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
@@ -187,7 +223,7 @@ m.uci:foreach("network", "switch",
                        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
@@ -206,11 +242,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
 
@@ -266,8 +302,7 @@ m.uci:foreach("network", "switch",
                        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