+ end)
+
+ local dev = _uci_state: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_state:get_all("wireless", self.sid) or
+ _uci_real:get_all("wireless", self.sid) or { }
+end
+
+function wifinet.get(self, opt)
+ return _get("wireless", self.sid, opt)
+end
+
+function wifinet.set(self, opt, val)
+ return _set("wireless", self.sid, opt, val)
+end
+
+function wifinet.mode(self)
+ return _uci_state:get("wireless", self.sid, "mode") or "ap"
+end
+
+function wifinet.ssid(self)
+ return _uci_state:get("wireless", self.sid, "ssid")
+end
+
+function wifinet.bssid(self)
+ return _uci_state:get("wireless", self.sid, "bssid")
+end
+
+function wifinet.network(self)
+ return _uci_state:get("wifinet", self.sid, "network")
+end
+
+function wifinet.id(self)
+ return self.netid
+end
+
+function wifinet.name(self)
+ return self.sid
+end
+
+function wifinet.ifname(self)
+ 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)
+ if self.iwdata.device then
+ return wifidev(self.iwdata.device)
+ end
+end
+
+function wifinet.is_up(self)
+ return (self.iwdata.up == "1")
+end
+
+function wifinet.active_mode(self)
+ local m = _stror(self.iwinfo.mode, self.iwdata.mode) or "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"
+ elseif m == "monitor" then m = "Monitor"
+ end
+
+ return m
+end
+
+function wifinet.active_mode_i18n(self)
+ return i18n.translate(self:active_mode())
+end
+
+function wifinet.active_ssid(self)
+ return _stror(self.iwinfo.ssid, self.iwdata.ssid)
+end
+
+function wifinet.active_bssid(self)
+ return _stror(self.iwinfo.bssid, self.iwdata.bssid) or "00:00:00:00:00:00"
+end
+
+function wifinet.active_encryption(self)
+ local enc = self.iwinfo and self.iwinfo.encryption
+ return enc and enc.description or "-"
+end
+
+function wifinet.assoclist(self)
+ return self.iwinfo.assoclist or { }
+end
+
+function wifinet.frequency(self)
+ local freq = self.iwinfo.frequency
+ if freq and freq > 0 then
+ return "%.03f" % (freq / 1000)
+ end
+end
+
+function wifinet.bitrate(self)
+ local rate = self.iwinfo.bitrate
+ if rate and rate > 0 then
+ return (rate / 1000)
+ end
+end
+
+function wifinet.channel(self)
+ return self.iwinfo.channel or
+ tonumber(_uci_state:get("wireless", self.iwdata.device, "channel"))
+end
+
+function wifinet.signal(self)
+ return self.iwinfo.signal or 0
+end
+
+function wifinet.noise(self)
+ return self.iwinfo.noise or 0
+end
+
+function wifinet.country(self)
+ return self.iwinfo.country or "00"
+end
+
+function wifinet.txpower(self)
+ 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)
+ if self:active_bssid() ~= "00:00:00:00:00:00" then
+ local signal = s or self:signal()
+ local noise = n or self:noise()
+
+ if signal < 0 and noise < 0 then
+ local snr = -1 * (noise - signal)
+ return math.floor(snr / 5)
+ else
+ return 0