return (
x:match("^wmaster%d") or x:match("^wifi%d") or x:match("^hwsim%d") or
x:match("^imq%d") or x:match("^mon.wlan%d") or x:match("^6in4-%w") or
- x:match("^3g-%w") or x:match("^ppp-%w") or x:match("^pppoe-%w") or
- x:match("^pppoa-%w") or x == "lo"
+ x:match("^6to4-%w") or x:match("^3g-%w") or x:match("^ppp-%w") or
+ x:match("^pppoe-%w") or x:match("^pppoa-%w") or x == "sit0" or x == "lo"
)
end
end
function add_network(self, n, options)
- if n and #n > 0 and n:match("^[a-zA-Z0-9_]+$") and not self:get_network(n) then
+ local oldnet = self:get_network(n)
+ if n and #n > 0 and n:match("^[a-zA-Z0-9_]+$") and not oldnet then
if uci_r:section("network", "interface", n, options) then
return network(n)
end
+ elseif oldnet and oldnet:is_empty() then
+ if options then
+ local k, v
+ for k, v in pairs(options) do
+ oldnet:set(k, v)
+ end
+ end
+ return oldnet
end
end
function del_network(self, n)
local r = uci_r:delete("network", n)
if r then
- uci_r:foreach("network", "alias",
- function(s)
- if s.interface == n then
- uci_r:delete("network", s['.name'])
- end
- end)
+ uci_r:delete_all("network", "alias",
+ function(s) return (s.interface == n) end)
- uci_r:foreach("network", "route",
- function(s)
- if s.interface == n then
- uci_r:delete("network", s['.name'])
- end
- end)
+ uci_r:delete_all("network", "route",
+ function(s) return (s.interface == n) end)
- uci_r:foreach("network", "route6",
- function(s)
- if s.interface == n then
- uci_r:delete("network", s['.name'])
- end
- end)
+ uci_r:delete_all("network", "route6",
+ function(s) return (s.interface == n) end)
uci_r:foreach("wireless", "wifi-iface",
function(s)
uci_r:delete("wireless", s['.name'], "network")
end
end)
-
- uci_r:delete("network", n)
end
return r
end
elseif self:is_virtual() then
return p .. "-" .. self.sid
else
- local dev = self:_get("ifname") or
- uci_r:get("network", self.sid, "ifname")
+ local num = { }
+ local dev = uci_r:get("network", self.sid, "ifname") or
+ uci_s:get("network", self.sid, "ifname")
- dev = dev and dev:match("%S+")
+ dev = (type(dev) == "table") and dev[1] or dev
+ dev = (dev ~= nil) and dev:match("%S+")
if not dev then
uci_r:foreach("wireless", "wifi-iface",
end
function network.device(self)
- local dev = self:_get("device")
+ local dev = uci_r:get("network", self.sid, "device") or
+ uci_s:get("network", self.sid, "device")
+
+ dev = (type(dev) == "table") and dev[1] or dev
+
if not dev or dev:match("[^%w%-%.%s]") then
- dev = uci_r:get("network", self.sid, "ifname")
+ dev = uci_r:get("network", self.sid, "ifname") or
+ uci_s:get("network", self.sid, "ifname")
+
+ dev = (type(dev) == "table") and dev[1] or dev
end
+
return dev
end
return self.sid
end
+function network.uptime(self)
+ local cnt = tonumber(uci_s:get("network", self.sid, "connect_time"))
+ if cnt ~= nil then
+ return nxo.sysinfo().uptime - cnt
+ else
+ return 0
+ end
+end
+
function network.is_bridge(self)
return (self:type() == "bridge")
end
function network.is_virtual(self)
local p = self:proto()
return (
- p == "3g" or p == "6in4" or p == "ppp" or
+ p == "3g" or p == "6in4" or p == "6to4" or p == "ppp" or
p == "pppoe" or p == "pppoa"
)
end
if not self.network then
local net
for _, net in ipairs(_M:get_networks()) do
- if net:contains_interface(self.ifname) then
+ if net:contains_interface(self.ifname) or
+ net:ifname() == self.ifname
+ then
self.network = net
return net
end
function wifinet.__init__(self, net, data)
self.sid = net
- local dev = uci_s:get("wireless", self.sid, "ifname")
- if not dev then
- local num = { }
- uci_r: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'] == self.sid then
- dev = "%s.network%d" %{ s.device, num[s.device] }
- return false
- end
+ local num = { }
+ local netid
+ uci_r: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'] == self.sid then
+ netid = "%s.network%d" %{ s.device, num[s.device] }
+ return false
end
- end)
- end
+ end
+ end)
+ local dev = uci_s:get("wireless", self.sid, "ifname") or netid
+
+ self.netid = netid
self.wdev = dev
self.iwinfo = dev and sys.wifi.getiwinfo(dev) or { }
self.iwdata = data or uci_s:get_all("wireless", self.sid) or
end
function wifinet.ifname(self)
- return self.iwinfo.ifname or self.wdev
+ local ifname = self.iwinfo.ifname
+ if not ifname or ifname:match("^wifi%d") or ifname:match("^radio%d") then
+ ifname = self.wdev
+ end
+ return ifname
end
function wifinet.get_device(self)
function wifinet.active_mode(self)
local m = _stror(self.iwinfo.mode, self.iwdata.mode) or "ap"
- if m == "ap" then m = "AP"
+ if m == "ap" then m = "Master"
elseif m == "sta" then m = "Client"
elseif m == "adhoc" then m = "Ad-Hoc"
elseif m == "mesh" then m = "Mesh"
end
function wifinet.adminlink(self)
- return dsp.build_url("admin", "network", "wireless",
- self.iwdata.device, self.wdev)
+ return dsp.build_url("admin", "network", "wireless", self.netid)
end
function wifinet.get_network(self)