NIU: Allow automatic unbridging of LAN ethernet for WAN use
authorSteven Barth <steven@midlink.org>
Mon, 23 Nov 2009 15:37:54 +0000 (15:37 +0000)
committerSteven Barth <steven@midlink.org>
Mon, 23 Nov 2009 15:37:54 +0000 (15:37 +0000)
modules/niu/luasrc/model/cbi/niu/network/lan1.lua
modules/niu/luasrc/model/cbi/niu/network/wan.lua
modules/niu/luasrc/model/cbi/niu/network/wandevice.lua
modules/niu/luasrc/niulib.lua

index e4005bbcff27cce5ce1ff4e0d7944d186c505c0a..423b4dfbe8036e1f823cc7d51cc5d56db9799990 100644 (file)
@@ -42,8 +42,8 @@ s:tab("expert", translate("Expert Settings"))
 
 p = s:taboption("expert", ListValue, "proto", translate("Connection Protocol"))
 p.default = "static"
-p:value("dhcp", "DHCP")
 p:value("static", translate("Static Ethernet"))
+p:value("dhcp", "DHCP")
 
 mac = s:taboption("expert", Value, "macaddr", translate("<abbr title=\"Media Access Control\">MAC</abbr>-Address"))
 
index 1724c4a8e13bc22b95488f14d99d978fc294c2e4..cb97cc1aaedb301975475475845ab00d15882af1 100644 (file)
@@ -21,7 +21,21 @@ local function deviceroute(self)
        
        if wd:find("ethernet:") == 1 then
                cursor:set("network", "wan", "defaultroute", "1")
-               cursor:set("network", "wan", "ifname", wd:sub(10))
+               if wd:find("!", 10) == 10 then  --Unbridge from LAN
+                       local ethdev = wd:sub(11)
+                       local ifname = cursor:get("network", "lan", "ifname")
+                       local newifname = {}
+                       for k in ifname:gmatch("[^ ]+") do
+                               if k ~= ifname then
+                                       newifname[#newifname+1] = k
+                               end
+                       end
+                       cursor:set("network", "lan", "ifname", table.concat(newifname, " "))
+                       cursor:set("network", "wan", "_wandev", "ethernet:" .. ethdev)
+                       cursor:set("network", "wan", "ifname", ethdev)
+               else
+                       cursor:set("network", "wan", "ifname", wd:sub(10))
+               end
                self:set_route("etherwan")
        else
                cursor:delete("network", "wan", "ifname")
index 9287ba8d0f0a3077a6ebe27f9b32cfcc11214344..8917b97c08cc7e1527356729d0a48d7691f6cdc7 100644 (file)
@@ -19,7 +19,10 @@ s = m:section(NamedSection, "wan", "interface", "Internet Connection Device")
 s.anonymous = true
 s.addremove = false
 
-l = s:option(ListValue, "_wandev", "Internet Connection via")
+s:tab("general", translate("General Settings"))
+s:tab("expert", translate("Expert Settings"))
+
+l = s:taboption("general", ListValue, "_wandev", "Internet Connection via")
 
 for _, ifc in ipairs(niulib.eth_get_available("wan")) do
        l:value("ethernet:%s" % ifc, "Cable / DSL / Ethernet-Adapter (%s)" % ifc)
@@ -29,7 +32,16 @@ for _, wifi in ipairs(niulib.wifi_get_available("client")) do
        l:value("wlan:%s" % wifi, "WLAN-Adapter (%s)" % wifi)
 end
 
+for _, ifc in ipairs(niulib.eth_get_bridged("lan")) do
+       l:value("ethernet:!%s" % ifc, "Used Ethernet-Adapter (%s)" % ifc, {_showused = "1"})
+end
 
 l:value("none", "No Internet Connection")
 
+v = s:taboption("expert", ListValue, "_showused", translate("Show ethernet adapters in use"))
+v:value("", translate("never"))
+v:value("1", translate("from LAN-bridge, unbridge on-demand"))
+
+
+
 return m
index aef542aa6ef70df4cd54f506c058e6fe20c868b0..dc3df5ed43de47e8d42f8dcdfff22e95e2bf255d 100644 (file)
@@ -15,7 +15,9 @@ $Id$
 local ipairs, pairs, require = ipairs, pairs, require
 local os = require "os"
 
-local cursor = require "luci.model.uci".inst
+local uci = require "luci.model.uci"
+local cursor = uci.inst
+local state = uci.inst_state
 
 
 module "luci.niulib"
@@ -36,6 +38,20 @@ function eth_get_available(except)
        return ifs
 end
 
+function eth_get_bridged(except)
+       local devs = state:get("network", except, "device")
+       
+       local ifs = {}
+       local cnt = 0
+       for x in devs:gmatch("[^ ]+") do
+               cnt = cnt + 1
+               if x:find("eth") == 1 then
+                       ifs[#ifs+1] = x
+               end
+       end
+       return cnt > 1 and ifs or {}
+end
+
 function wifi_get_available(except)
        cursor:unload("wireless")