luci-base: rework wireless state handling (#1179)
- fix mapping of ubus wireless state to uci declared vifs - fix leaking foreign vif info into per-phy iwinfo stats Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
parent
f2162a9a66
commit
f9b8d7ff7b
2 changed files with 218 additions and 184 deletions
|
@ -6,14 +6,12 @@ local type, next, pairs, ipairs, loadfile, table, select
|
||||||
|
|
||||||
local tonumber, tostring, math = tonumber, tostring, math
|
local tonumber, tostring, math = tonumber, tostring, math
|
||||||
|
|
||||||
local require = require
|
local pcall, require, setmetatable = pcall, require, setmetatable
|
||||||
|
|
||||||
local nxo = require "nixio"
|
local nxo = require "nixio"
|
||||||
local nfs = require "nixio.fs"
|
local nfs = require "nixio.fs"
|
||||||
local ipc = require "luci.ip"
|
local ipc = require "luci.ip"
|
||||||
local sys = require "luci.sys"
|
|
||||||
local utl = require "luci.util"
|
local utl = require "luci.util"
|
||||||
local dsp = require "luci.dispatcher"
|
|
||||||
local uci = require "luci.model.uci"
|
local uci = require "luci.model.uci"
|
||||||
local lng = require "luci.i18n"
|
local lng = require "luci.i18n"
|
||||||
local jsc = require "luci.jsonc"
|
local jsc = require "luci.jsonc"
|
||||||
|
@ -108,6 +106,13 @@ function _set(c, s, o, v)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function _wifi_state()
|
||||||
|
if not next(_ubuswificache) then
|
||||||
|
_ubuswificache = utl.ubus("network.wireless", "status", {}) or {}
|
||||||
|
end
|
||||||
|
return _ubuswificache
|
||||||
|
end
|
||||||
|
|
||||||
function _wifi_iface(x)
|
function _wifi_iface(x)
|
||||||
local _, p
|
local _, p
|
||||||
for _, p in ipairs(IFACE_PATTERNS_WIRELESS) do
|
for _, p in ipairs(IFACE_PATTERNS_WIRELESS) do
|
||||||
|
@ -118,58 +123,155 @@ function _wifi_iface(x)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
function _wifi_state(key, val, field)
|
local function _wifi_iwinfo_by_ifname(ifname, force_phy_only)
|
||||||
local radio, radiostate, ifc, ifcstate
|
local stat, iwinfo = pcall(require, "iwinfo")
|
||||||
|
local iwtype = stat and type(ifname) == "string" and iwinfo.type(ifname)
|
||||||
|
local is_nonphy_op = {
|
||||||
|
bitrate = true,
|
||||||
|
quality = true,
|
||||||
|
quality_max = true,
|
||||||
|
mode = true,
|
||||||
|
ssid = true,
|
||||||
|
bssid = true,
|
||||||
|
assoclist = true,
|
||||||
|
encryption = true
|
||||||
|
}
|
||||||
|
|
||||||
if not next(_ubuswificache) then
|
if iwtype then
|
||||||
_ubuswificache = utl.ubus("network.wireless", "status", {}) or {}
|
-- if we got a type but no real netdev, we're referring to a phy
|
||||||
|
local phy_only = force_phy_only or (ipc.link(ifname).type ~= 1)
|
||||||
|
|
||||||
-- workaround extended section format
|
return setmetatable({}, {
|
||||||
for radio, radiostate in pairs(_ubuswificache) do
|
__index = function(t, k)
|
||||||
for ifc, ifcstate in pairs(radiostate.interfaces) do
|
if k == "ifname" then
|
||||||
if ifcstate.section and ifcstate.section:sub(1, 1) == '@' then
|
return ifname
|
||||||
local s = _uci:get_all('wireless.%s' % ifcstate.section)
|
elseif phy_only and is_nonphy_op[k] then
|
||||||
if s then
|
return nil
|
||||||
ifcstate.section = s['.name']
|
elseif iwinfo[iwtype][k] then
|
||||||
end
|
return iwinfo[iwtype][k](ifname)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for radio, radiostate in pairs(_ubuswificache) do
|
local function _wifi_sid_by_netid(netid)
|
||||||
for ifc, ifcstate in pairs(radiostate.interfaces) do
|
if type(netid) == "string" then
|
||||||
if ifcstate[key] == val then
|
local radioname, netidx = netid:match("^(%w+)%.network(%d+)$")
|
||||||
return ifcstate[field]
|
if radioname and netidx then
|
||||||
end
|
local i, n = 0, nil
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function _wifi_lookup(ifn)
|
netidx = tonumber(netidx)
|
||||||
-- got a radio#.network# pseudo iface, locate the corresponding section
|
|
||||||
local radio, ifnidx = ifn:match("^(%w+)%.network(%d+)$")
|
|
||||||
if radio and ifnidx then
|
|
||||||
local sid = nil
|
|
||||||
local num = 0
|
|
||||||
|
|
||||||
ifnidx = tonumber(ifnidx)
|
|
||||||
_uci:foreach("wireless", "wifi-iface",
|
_uci:foreach("wireless", "wifi-iface",
|
||||||
function(s)
|
function(s)
|
||||||
if s.device == radio then
|
if s.device == radioname then
|
||||||
num = num + 1
|
i = i + 1
|
||||||
if num == ifnidx then
|
if i == netidx then
|
||||||
sid = s['.name']
|
n = s[".name"]
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
return sid
|
return n
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- looks like wifi, try to locate the section via ubus state
|
function _wifi_sid_by_ifname(ifn)
|
||||||
elseif _wifi_iface(ifn) then
|
local sid = _wifi_sid_by_netid(ifn)
|
||||||
return _wifi_state("ifname", ifn, "section")
|
if sid then
|
||||||
|
return sid
|
||||||
|
end
|
||||||
|
|
||||||
|
local _, _, netstate = _wifi_state_by_ifname(ifn)
|
||||||
|
if netstate and type(netstate.section) == "string" then
|
||||||
|
return netstate.section
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function _wifi_netid_by_sid(sid)
|
||||||
|
local t, n = _uci:get("wireless", sid)
|
||||||
|
if t == "wifi-iface" and n ~= nil then
|
||||||
|
local radioname = _uci:get("wireless", n, "device")
|
||||||
|
if type(radioname) == "string" then
|
||||||
|
local i, netid = 0, nil
|
||||||
|
|
||||||
|
_uci:foreach("wireless", "wifi-iface",
|
||||||
|
function(s)
|
||||||
|
if s.device == radioname then
|
||||||
|
i = i + 1
|
||||||
|
if s[".name"] == n then
|
||||||
|
netid = "%s.network%d" %{ radioname, i }
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
return netid, radioname
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function _wifi_netid_by_netname(name)
|
||||||
|
local netid = nil
|
||||||
|
|
||||||
|
_uci:foreach("wireless", "wifi-iface",
|
||||||
|
function(s)
|
||||||
|
local net
|
||||||
|
for net in utl.imatch(s.network) do
|
||||||
|
if net == name then
|
||||||
|
netid = _wifi_netid_by_sid(s[".name"])
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
return netid
|
||||||
|
end
|
||||||
|
|
||||||
|
local function _wifi_state_by_sid(sid)
|
||||||
|
local t1, n1 = _uci:get("wireless", sid)
|
||||||
|
if t1 == "wifi-iface" and n1 ~= nil then
|
||||||
|
local radioname, radiostate
|
||||||
|
for radioname, radiostate in pairs(_wifi_state()) do
|
||||||
|
if type(radiostate) == "table" and
|
||||||
|
type(radiostate.interfaces) == "table"
|
||||||
|
then
|
||||||
|
local netidx, netstate
|
||||||
|
for netidx, netstate in ipairs(radiostate.interfaces) do
|
||||||
|
if type(netstate) == "table" and
|
||||||
|
type(netstate.section) == "string"
|
||||||
|
then
|
||||||
|
local t2, n2 = _uci:get("wireless", netstate.section)
|
||||||
|
if t1 == t2 and n1 == n2 then
|
||||||
|
return radioname, radiostate, netstate
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function _wifi_state_by_ifname(ifname)
|
||||||
|
if type(ifname) == "string" then
|
||||||
|
local radioname, radiostate
|
||||||
|
for radioname, radiostate in pairs(_wifi_state()) do
|
||||||
|
if type(radiostate) == "table" and
|
||||||
|
type(radiostate.interfaces) == "table"
|
||||||
|
then
|
||||||
|
local netidx, netstate
|
||||||
|
for netidx, netstate in ipairs(radiostate.interfaces) do
|
||||||
|
if type(netstate) == "table" and
|
||||||
|
type(netstate.ifname) == "string" and
|
||||||
|
netstate.ifname == ifname
|
||||||
|
then
|
||||||
|
return radioname, radiostate, netstate
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -524,20 +626,8 @@ function get_interface(self, i)
|
||||||
if _interfaces[i] or _wifi_iface(i) then
|
if _interfaces[i] or _wifi_iface(i) then
|
||||||
return interface(i)
|
return interface(i)
|
||||||
else
|
else
|
||||||
local ifc
|
local netid = _wifi_netid_by_netname(i)
|
||||||
local num = { }
|
return netid and interface(netid)
|
||||||
_uci: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['.name'] == i then
|
|
||||||
ifc = interface(
|
|
||||||
"%s.network%d" %{s.device, num[s.device] })
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
return ifc
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -644,7 +734,7 @@ function get_wifidevs(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
function get_wifinet(self, net)
|
function get_wifinet(self, net)
|
||||||
local wnet = _wifi_lookup(net)
|
local wnet = _wifi_sid_by_ifname(net)
|
||||||
if wnet then
|
if wnet then
|
||||||
return wifinet(wnet)
|
return wifinet(wnet)
|
||||||
end
|
end
|
||||||
|
@ -660,7 +750,7 @@ function add_wifinet(self, net, options)
|
||||||
end
|
end
|
||||||
|
|
||||||
function del_wifinet(self, net)
|
function del_wifinet(self, net)
|
||||||
local wnet = _wifi_lookup(net)
|
local wnet = _wifi_sid_by_ifname(net)
|
||||||
if wnet then
|
if wnet then
|
||||||
_uci:delete("wireless", wnet)
|
_uci:delete("wireless", wnet)
|
||||||
return true
|
return true
|
||||||
|
@ -784,22 +874,7 @@ function protocol.ifname(self)
|
||||||
ifname = self:_ubus("device")
|
ifname = self:_ubus("device")
|
||||||
end
|
end
|
||||||
if not ifname then
|
if not ifname then
|
||||||
local num = { }
|
ifname = _wifi_netid_by_netname(self.sid)
|
||||||
_uci:foreach("wireless", "wifi-iface",
|
|
||||||
function(s)
|
|
||||||
if s.device then
|
|
||||||
num[s.device] = num[s.device]
|
|
||||||
and num[s.device] + 1 or 1
|
|
||||||
|
|
||||||
local net
|
|
||||||
for net in utl.imatch(s.network) do
|
|
||||||
if net == self.sid then
|
|
||||||
ifname = "%s.network%d" %{ s.device, num[s.device] }
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
return ifname
|
return ifname
|
||||||
end
|
end
|
||||||
|
@ -981,24 +1056,17 @@ function protocol.is_empty(self)
|
||||||
if self:is_floating() then
|
if self:is_floating() then
|
||||||
return false
|
return false
|
||||||
else
|
else
|
||||||
local rv = true
|
local empty = true
|
||||||
|
|
||||||
if (self:_get("ifname") or ""):match("%S+") then
|
if (self:_get("ifname") or ""):match("%S+") then
|
||||||
rv = false
|
empty = false
|
||||||
end
|
end
|
||||||
|
|
||||||
_uci:foreach("wireless", "wifi-iface",
|
if empty and _wifi_netid_by_netname(self.sid) then
|
||||||
function(s)
|
empty = false
|
||||||
local n
|
|
||||||
for n in utl.imatch(s.network) do
|
|
||||||
if n == self.sid then
|
|
||||||
rv = false
|
|
||||||
return false
|
|
||||||
end
|
end
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
return rv
|
return empty
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1006,7 +1074,7 @@ function protocol.add_interface(self, ifname)
|
||||||
ifname = _M:ifnameof(ifname)
|
ifname = _M:ifnameof(ifname)
|
||||||
if ifname and not self:is_floating() then
|
if ifname and not self:is_floating() then
|
||||||
-- if its a wifi interface, change its network option
|
-- if its a wifi interface, change its network option
|
||||||
local wif = _wifi_lookup(ifname)
|
local wif = _wifi_sid_by_ifname(ifname)
|
||||||
if wif then
|
if wif then
|
||||||
_append("wireless", wif, "network", self.sid)
|
_append("wireless", wif, "network", self.sid)
|
||||||
|
|
||||||
|
@ -1021,7 +1089,7 @@ function protocol.del_interface(self, ifname)
|
||||||
ifname = _M:ifnameof(ifname)
|
ifname = _M:ifnameof(ifname)
|
||||||
if ifname and not self:is_floating() then
|
if ifname and not self:is_floating() then
|
||||||
-- if its a wireless interface, clear its network option
|
-- if its a wireless interface, clear its network option
|
||||||
local wif = _wifi_lookup(ifname)
|
local wif = _wifi_sid_by_ifname(ifname)
|
||||||
if wif then _filter("wireless", wif, "network", self.sid) end
|
if wif then _filter("wireless", wif, "network", self.sid) end
|
||||||
|
|
||||||
-- remove the interface
|
-- remove the interface
|
||||||
|
@ -1043,21 +1111,7 @@ function protocol.get_interface(self)
|
||||||
ifn = ifn:match("^[^:/]+")
|
ifn = ifn:match("^[^:/]+")
|
||||||
return ifn and interface(ifn, self)
|
return ifn and interface(ifn, self)
|
||||||
end
|
end
|
||||||
ifn = nil
|
ifn = _wifi_netid_by_netname(self.sid)
|
||||||
_uci:foreach("wireless", "wifi-iface",
|
|
||||||
function(s)
|
|
||||||
if s.device then
|
|
||||||
num[s.device] = num[s.device] and num[s.device] + 1 or 1
|
|
||||||
|
|
||||||
local net
|
|
||||||
for net in utl.imatch(s.network) do
|
|
||||||
if net == self.sid then
|
|
||||||
ifn = "%s.network%d" %{ s.device, num[s.device] }
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
return ifn and interface(ifn, self)
|
return ifn and interface(ifn, self)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1077,21 +1131,20 @@ function protocol.get_interfaces(self)
|
||||||
ifaces[#ifaces+1] = nfs[ifn]
|
ifaces[#ifaces+1] = nfs[ifn]
|
||||||
end
|
end
|
||||||
|
|
||||||
local num = { }
|
|
||||||
local wfs = { }
|
local wfs = { }
|
||||||
_uci:foreach("wireless", "wifi-iface",
|
_uci:foreach("wireless", "wifi-iface",
|
||||||
function(s)
|
function(s)
|
||||||
if s.device then
|
if s.device then
|
||||||
num[s.device] = num[s.device] and num[s.device] + 1 or 1
|
|
||||||
|
|
||||||
local net
|
local net
|
||||||
for net in utl.imatch(s.network) do
|
for net in utl.imatch(s.network) do
|
||||||
if net == self.sid then
|
if net == self.sid then
|
||||||
ifn = "%s.network%d" %{ s.device, num[s.device] }
|
ifn = _wifi_netid_by_sid(s[".name"])
|
||||||
|
if ifn then
|
||||||
wfs[ifn] = interface(ifn, self)
|
wfs[ifn] = interface(ifn, self)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
for ifn in utl.kspairs(wfs) do
|
for ifn in utl.kspairs(wfs) do
|
||||||
|
@ -1119,7 +1172,7 @@ function protocol.contains_interface(self, ifname)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local wif = _wifi_lookup(ifname)
|
local wif = _wifi_sid_by_ifname(ifname)
|
||||||
if wif then
|
if wif then
|
||||||
local n
|
local n
|
||||||
for n in utl.imatch(_uci:get("wireless", wif, "network")) do
|
for n in utl.imatch(_uci:get("wireless", wif, "network")) do
|
||||||
|
@ -1134,17 +1187,18 @@ function protocol.contains_interface(self, ifname)
|
||||||
end
|
end
|
||||||
|
|
||||||
function protocol.adminlink(self)
|
function protocol.adminlink(self)
|
||||||
return dsp.build_url("admin", "network", "network", self.sid)
|
local stat, dsp = pcall(require, "luci.dispatcher")
|
||||||
|
return stat and dsp.build_url("admin", "network", "network", self.sid)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
interface = utl.class()
|
interface = utl.class()
|
||||||
|
|
||||||
function interface.__init__(self, ifname, network)
|
function interface.__init__(self, ifname, network)
|
||||||
local wif = _wifi_lookup(ifname)
|
local wif = _wifi_sid_by_ifname(ifname)
|
||||||
if wif then
|
if wif then
|
||||||
self.wif = wifinet(wif)
|
self.wif = wifinet(wif)
|
||||||
self.ifname = _wifi_state("section", wif, "ifname")
|
self.ifname = self.wif:ifname()
|
||||||
end
|
end
|
||||||
|
|
||||||
self.ifname = self.ifname or ifname
|
self.ifname = self.ifname or ifname
|
||||||
|
@ -1332,9 +1386,14 @@ end
|
||||||
|
|
||||||
wifidev = utl.class()
|
wifidev = utl.class()
|
||||||
|
|
||||||
function wifidev.__init__(self, dev)
|
function wifidev.__init__(self, name)
|
||||||
self.sid = dev
|
local t, n = _uci:get("wireless", name)
|
||||||
self.iwinfo = dev and sys.wifi.getiwinfo(dev) or { }
|
if t == "wifi-device" and n ~= nil then
|
||||||
|
self.sid = n
|
||||||
|
self.iwinfo = _wifi_iwinfo_by_ifname(self.sid, true)
|
||||||
|
end
|
||||||
|
self.sid = self.sid or name
|
||||||
|
self.iwinfo = self.iwinfo or { ifname = self.sid }
|
||||||
end
|
end
|
||||||
|
|
||||||
function wifidev.get(self, opt)
|
function wifidev.get(self, opt)
|
||||||
|
@ -1387,7 +1446,7 @@ function wifidev.get_wifinet(self, net)
|
||||||
if _uci:get("wireless", net) == "wifi-iface" then
|
if _uci:get("wireless", net) == "wifi-iface" then
|
||||||
return wifinet(net)
|
return wifinet(net)
|
||||||
else
|
else
|
||||||
local wnet = _wifi_lookup(net)
|
local wnet = _wifi_sid_by_ifname(net)
|
||||||
if wnet then
|
if wnet then
|
||||||
return wifinet(wnet)
|
return wifinet(wnet)
|
||||||
end
|
end
|
||||||
|
@ -1421,7 +1480,7 @@ function wifidev.del_wifinet(self, net)
|
||||||
if utl.instanceof(net, wifinet) then
|
if utl.instanceof(net, wifinet) then
|
||||||
net = net.sid
|
net = net.sid
|
||||||
elseif _uci:get("wireless", net) ~= "wifi-iface" then
|
elseif _uci:get("wireless", net) ~= "wifi-iface" then
|
||||||
net = _wifi_lookup(net)
|
net = _wifi_sid_by_ifname(net)
|
||||||
end
|
end
|
||||||
|
|
||||||
if net and _uci:get("wireless", net, "device") == self.sid then
|
if net and _uci:get("wireless", net, "device") == self.sid then
|
||||||
|
@ -1435,49 +1494,50 @@ end
|
||||||
|
|
||||||
wifinet = utl.class()
|
wifinet = utl.class()
|
||||||
|
|
||||||
function wifinet.__init__(self, net, data)
|
function wifinet.__init__(self, name, data)
|
||||||
self.sid = net
|
local sid, netid, radioname, radiostate, netstate
|
||||||
|
|
||||||
local n = 0
|
|
||||||
local num = { }
|
|
||||||
local netid, sid
|
|
||||||
_uci:foreach("wireless", "wifi-iface",
|
|
||||||
function(s)
|
|
||||||
n = n + 1
|
|
||||||
if s.device then
|
|
||||||
num[s.device] = num[s.device] and num[s.device] + 1 or 1
|
|
||||||
if s['.name'] == self.sid then
|
|
||||||
sid = "@wifi-iface[%d]" % n
|
|
||||||
netid = "%s.network%d" %{ s.device, num[s.device] }
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
|
-- lookup state by radio#.network# notation
|
||||||
|
sid = _wifi_sid_by_netid(name)
|
||||||
if sid then
|
if sid then
|
||||||
local _, k, r, i
|
netid = name
|
||||||
for k, r in pairs(_ubuswificache) do
|
radioname, radiostate, netstate = _wifi_state_by_sid(sid)
|
||||||
if type(r) == "table" and
|
else
|
||||||
type(r.interfaces) == "table"
|
-- lookup state by ifname (e.g. wlan0)
|
||||||
then
|
radioname, radiostate, netstate = _wifi_state_by_ifname(name)
|
||||||
for _, i in ipairs(r.interfaces) do
|
if radioname and radiostate and netstate then
|
||||||
if type(i) == "table" and i.section == sid then
|
sid = netstate.section
|
||||||
self._ubusdata = {
|
netid = _wifi_netid_by_sid(sid)
|
||||||
radio = k,
|
else
|
||||||
dev = r,
|
-- lookup state by uci section id (e.g. cfg053579)
|
||||||
net = i
|
radioname, radiostate, netstate = _wifi_state_by_sid(name)
|
||||||
}
|
if radioname and radiostate and netstate then
|
||||||
end
|
sid = name
|
||||||
|
netid = _wifi_netid_by_sid(sid)
|
||||||
|
else
|
||||||
|
-- no state available, try to resolve from uci
|
||||||
|
netid, radioname = _wifi_netid_by_sid(name)
|
||||||
|
if netid and radioname then
|
||||||
|
sid = name
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local dev = _wifi_state("section", self.sid, "ifname") or netid
|
local iwinfo =
|
||||||
|
(netstate and _wifi_iwinfo_by_ifname(netstate.ifname)) or
|
||||||
|
(radioname and _wifi_iwinfo_by_ifname(radioname)) or
|
||||||
|
{ ifname = (netid or sid or name) }
|
||||||
|
|
||||||
|
self.sid = sid or name
|
||||||
|
self.wdev = iwinfo.ifname
|
||||||
|
self.iwinfo = iwinfo
|
||||||
self.netid = netid
|
self.netid = netid
|
||||||
self.wdev = dev
|
self._ubusdata = {
|
||||||
self.iwinfo = dev and sys.wifi.getiwinfo(dev) or { }
|
radio = radioname,
|
||||||
|
dev = radiostate,
|
||||||
|
net = netstate
|
||||||
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
function wifinet.ubus(self, ...)
|
function wifinet.ubus(self, ...)
|
||||||
|
@ -1664,7 +1724,8 @@ function wifinet.get_i18n(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
function wifinet.adminlink(self)
|
function wifinet.adminlink(self)
|
||||||
return dsp.build_url("admin", "network", "wireless", self.netid)
|
local stat, dsp = pcall(require, "luci.dispatcher")
|
||||||
|
return dsp and dsp.build_url("admin", "network", "wireless", self.netid)
|
||||||
end
|
end
|
||||||
|
|
||||||
function wifinet.get_network(self)
|
function wifinet.get_network(self)
|
||||||
|
|
|
@ -7,6 +7,7 @@ local table = require "table"
|
||||||
local nixio = require "nixio"
|
local nixio = require "nixio"
|
||||||
local fs = require "nixio.fs"
|
local fs = require "nixio.fs"
|
||||||
local uci = require "luci.model.uci"
|
local uci = require "luci.model.uci"
|
||||||
|
local ntm = require "luci.model.network"
|
||||||
|
|
||||||
local luci = {}
|
local luci = {}
|
||||||
luci.util = require "luci.util"
|
luci.util = require "luci.util"
|
||||||
|
@ -451,37 +452,9 @@ end
|
||||||
wifi = {}
|
wifi = {}
|
||||||
|
|
||||||
function wifi.getiwinfo(ifname)
|
function wifi.getiwinfo(ifname)
|
||||||
local stat, iwinfo = pcall(require, "iwinfo")
|
ntm.init()
|
||||||
|
local wnet = ntm.wifinet(ifname)
|
||||||
if ifname then
|
return wnet.iwinfo or { ifname = ifname }
|
||||||
local d, n = ifname:match("^(%w+)%.network(%d+)")
|
|
||||||
local wstate = luci.util.ubus("network.wireless", "status") or { }
|
|
||||||
|
|
||||||
d = d or ifname
|
|
||||||
n = n and tonumber(n) or 1
|
|
||||||
|
|
||||||
if type(wstate[d]) == "table" and
|
|
||||||
type(wstate[d].interfaces) == "table" and
|
|
||||||
type(wstate[d].interfaces[n]) == "table" and
|
|
||||||
type(wstate[d].interfaces[n].ifname) == "string"
|
|
||||||
then
|
|
||||||
ifname = wstate[d].interfaces[n].ifname
|
|
||||||
else
|
|
||||||
ifname = d
|
|
||||||
end
|
|
||||||
|
|
||||||
local t = stat and iwinfo.type(ifname)
|
|
||||||
local x = t and iwinfo[t] or { }
|
|
||||||
return setmetatable({}, {
|
|
||||||
__index = function(t, k)
|
|
||||||
if k == "ifname" then
|
|
||||||
return ifname
|
|
||||||
elseif x[k] then
|
|
||||||
return x[k](ifname)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
})
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue