X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=modules%2Fluci-mod-admin-full%2Fluasrc%2Fmodel%2Fcbi%2Fadmin_network%2Fifaces.lua;h=8be354b448c17a4c2a943b86c8e0661ab43fea85;hb=6ec0353201435e0d0d7d32820d8ba600b4ca7b5b;hp=4fc71cefab5cdbf2b82f36d6e49bb6aaf157a036;hpb=a94e2000cdf88ecb19e339ac87fb596822ab46af;p=project%2Fluci.git diff --git a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua index 4fc71cefab..8be354b448 100644 --- a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua +++ b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua @@ -16,6 +16,7 @@ local has_firewall = fs.access("/etc/config/firewall") m = Map("network", translate("Interfaces") .. " - " .. arg[1]:upper(), translate("On this page you can configure the network interfaces. You can bridge several interfaces by ticking the \"bridge interfaces\" field and enter the names of several network interfaces separated by spaces. You can also use VLAN notation INTERFACE.VLANNR (e.g.: eth0.1).")) m.redirect = luci.dispatcher.build_url("admin", "network", "network") m:chain("wireless") +m:chain("luci") if has_firewall then m:chain("firewall") @@ -27,18 +28,52 @@ fw.init(m.uci) local net = nw:get_network(arg[1]) +local function set_ifstate(name, option, value) + local found = false + + m.uci:foreach("luci", "ifstate", function (s) + if s.interface == name then + m.uci:set("luci", s[".name"], option, value) + found = true + return false + end + end) + + if not found then + local sid = m.uci:add("luci", "ifstate") + m.uci:set("luci", sid, "interface", name) + m.uci:set("luci", sid, option, value) + end + + m.uci:save("luci") +end + +local function get_ifstate(name, option) + local val + + m.uci:foreach("luci", "ifstate", function (s) + if s.interface == name then + val = s[option] + return false + end + end) + + return val +end + local function backup_ifnames(is_bridge) - if not net:is_floating() and not m:get(net:name(), "_orig_ifname") then + if not net:is_floating() and not get_ifstate(net:name(), "ifname") then local ifcs = net:get_interfaces() or { net:get_interface() } if ifcs then local _, ifn local ifns = { } for _, ifn in ipairs(ifcs) do - ifns[#ifns+1] = ifn:name() + local wif = ifn:get_wifinet() + ifns[#ifns+1] = wif and wif:id() or ifn:name() end if #ifns > 0 then - m:set(net:name(), "_orig_ifname", table.concat(ifns, " ")) - m:set(net:name(), "_orig_bridge", tostring(net:is_bridge())) + set_ifstate(net:name(), "ifname", table.concat(ifns, " ")) + set_ifstate(net:name(), "bridge", tostring(net:is_bridge())) end end end @@ -84,10 +119,10 @@ if m:formvalue("cbid.network.%s._switch" % net:name()) then elseif net:is_floating() and not proto:is_floating() then -- if we have backup data, then re-add all orphaned interfaces -- from it and restore the bridge choice - local br = (m:get(net:name(), "_orig_bridge") == "true") + local br = (get_ifstate(net:name(), "bridge") == "true") local ifn local ifns = { } - for ifn in ut.imatch(m:get(net:name(), "_orig_ifname")) do + for ifn in ut.imatch(get_ifstate(net:name(), "ifname")) do ifn = nw:get_interface(ifn) if ifn and not ifn:get_network() then proto:add_interface(ifn) @@ -114,9 +149,7 @@ if m:formvalue("cbid.network.%s._switch" % net:name()) then for k, v in pairs(m:get(net:name())) do if k:sub(1,1) ~= "." and k ~= "type" and - k ~= "ifname" and - k ~= "_orig_ifname" and - k ~= "_orig_bridge" + k ~= "ifname" then m:del(net:name(), k) end @@ -239,6 +272,11 @@ if not net:is_virtual() then translate("Enables the Spanning Tree Protocol on this bridge")) stp:depends("type", "bridge") stp.rmempty = true + + igmp = s:taboption("physical", Flag, "igmp_snooping", translate("Enable IGMP snooping"), + translate("Enables IGMP snooping on this bridge")) + igmp:depends("type", "bridge") + igmp.rmempty = true end @@ -247,6 +285,7 @@ if not net:is_floating() then ifname_single.template = "cbi/network_ifacelist" ifname_single.widget = "radio" ifname_single.nobridges = true + ifname_single.noaliases = false ifname_single.rmempty = false ifname_single.network = arg[1] ifname_single:depends("type", "") @@ -257,12 +296,18 @@ if not net:is_floating() then end function ifname_single.write(self, s, val) - local i + local _, i local new_ifs = { } local old_ifs = { } - for _, i in ipairs(net:get_interfaces() or { net:get_interface() }) do - old_ifs[#old_ifs+1] = i:name() + local alias = net:is_alias() + + if alias then + old_ifs[1] = '@' .. alias + else + for _, i in ipairs(net:get_interfaces() or { net:get_interface() }) do + old_ifs[#old_ifs+1] = i:name() + end end for i in ut.imatch(val) do @@ -297,6 +342,7 @@ if not net:is_virtual() then ifname_multi = s:taboption("physical", Value, "ifname_multi", translate("Interface")) ifname_multi.template = "cbi/network_ifacelist" ifname_multi.nobridges = true + ifname_multi.noaliases = true ifname_multi.rmempty = false ifname_multi.network = arg[1] ifname_multi.widget = "checkbox" @@ -313,7 +359,6 @@ if has_firewall then fwzone.template = "cbi/firewall_zonelist" fwzone.network = arg[1] - fwzone.rmempty = false function fwzone.cfgvalue(self, section) self.iface = section @@ -322,22 +367,16 @@ if has_firewall then end function fwzone.write(self, section, value) - local zone = fw:get_zone(value) - - if not zone and value == '-' then - value = m:formvalue(self:cbid(section) .. ".newzone") - if value and #value > 0 then - zone = fw:add_zone(value) - else - fw:del_network(section) - end - end - + local zone = fw:get_zone(value) or fw:add_zone(value) if zone then fw:del_network(section) zone:add_network(section) end end + + function fwzone.remove(self, section) + fw:del_network(section) + end end