libs/core: fix undefined tostring() in network model
[project/luci.git] / libs / core / luasrc / model / network.lua
index b1db9db..d682aa9 100644 (file)
@@ -17,8 +17,11 @@ limitations under the License.
 
 ]]--
 
-local type, next, pairs, ipairs, loadfile, table, tonumber, math, i18n
-       = type, next, pairs, ipairs, loadfile, table, tonumber, math, luci.i18n
+local type, next, pairs, ipairs, loadfile, table
+       = type, next, pairs, ipairs, loadfile, table
+
+local tonumber, tostring, math, i18n
+       = tonumber, tostring, math, luci.i18n
 
 local require = require
 
@@ -279,6 +282,13 @@ function ifnameof(self, x)
        end
 end
 
+function get_protocol(self, protoname, netname)
+       local v = _protocols[protoname]
+       if v then
+               return v(netname or "__dummy__")
+       end
+end
+
 function get_protocols(self)
        local p = { }
        local _, v
@@ -442,6 +452,7 @@ function get_interfaces(self)
        local ifaces = { }
        local seen = { }
        local nfs = { }
+       local baseof = { }
 
        -- find normal interfaces
        _uci_real:foreach("network", "interface",
@@ -463,9 +474,26 @@ function get_interfaces(self)
        -- find vlan interfaces
        _uci_real:foreach("network", "switch_vlan",
                function(s)
-                       local base = s.device or "-"
-                       if not base:match("^eth%d") then
-                               base = "eth0"
+                       if not s.device then
+                               return
+                       end
+
+                       local base = baseof[s.device]
+                       if not base then
+                               if not s.device:match("^eth%d") then
+                                       local l
+                                       for l in utl.execi("swconfig dev %q help 2>/dev/null" % s.device) do
+                                               if not base then
+                                                       base = l:match("^%w+: (%w+)")
+                                               end
+                                       end
+                                       if not base or not base:match("^eth%d") then
+                                               base = "eth0"
+                                       end
+                               else
+                                       base = s.device
+                               end
+                               baseof[s.device] = base
                        end
 
                        local vid = tonumber(s.vid or s.vlan)
@@ -748,7 +776,7 @@ function protocol.is_floating(self)
 end
 
 function protocol.is_empty(self)
-       if self:is_virtual() then
+       if self:is_floating() then
                return false
        else
                local rv = true
@@ -812,17 +840,17 @@ function protocol.get_interface(self)
        else
                local ifn = nil
                local num = { }
-               for ifn in utl.imatch(_uci_state:get("network", self.sid, "ifname")) do
+               for ifn in utl.imatch(_uci_real:get("network", self.sid, "ifname")) do
                        ifn = ifn:match("^[^:/]+")
                        return ifn and interface(ifn, self)
                end
                ifn = nil
-               _uci_state:foreach("wireless", "wifi-iface",
+               _uci_real:foreach("wireless", "wifi-iface",
                        function(s)
                                if s.device then
                                        num[s.device] = num[s.device] and num[s.device] + 1 or 1
                                        if s.network == self.sid then
-                                               ifn = s.ifname or "%s.network%d" %{ s.device, num[s.device] }
+                                               ifn = "%s.network%d" %{ s.device, num[s.device] }
                                                return false
                                        end
                                end
@@ -902,7 +930,10 @@ interface = utl.class()
 
 function interface.__init__(self, ifname, network)
        local wif = _wifi_lookup(ifname)
-       if wif then self.wif = wifinet(wif) end
+       if wif then 
+               self.wif    = wifinet(wif) 
+               self.ifname = _uci_state:get("wireless", wif, "ifname")
+       end
 
        self.ifname  = self.ifname or ifname
        self.dev     = _interfaces[self.ifname]
@@ -1332,7 +1363,12 @@ function wifinet.country(self)
 end
 
 function wifinet.txpower(self)
-       return self.iwinfo.txpower or 0
+       local pwr = (self.iwinfo.txpower or 0)
+       return pwr + self:txpower_offset()
+end
+
+function wifinet.txpower_offset(self)
+       return self.iwinfo.txpower_offset or 0
 end
 
 function wifinet.signal_level(self, s, n)
@@ -1383,8 +1419,9 @@ function wifinet.adminlink(self)
 end
 
 function wifinet.get_network(self)
-       if _uci_real:get("network", self.iwdata.network) == "interface" then
-               return network(self.iwdata.network)
+       local net = tostring(self.iwdata.network)
+       if net and _uci_real:get("network", net) == "interface" then
+               return network(net)
        end
 end