$Id$
]]--
+local iface = "ap"
+local ap = true
+
local fs = require "nixio.fs"
local sys = require "luci.sys"
local cursor = require "luci.model.uci".inst
local state = require "luci.model.uci".inst_state
cursor:unload("wireless")
-local device = cursor:get("wireless", "ap", "device")
+
+local device = cursor:get("wireless", iface, "device")
local hwtype = cursor:get("wireless", device, "type")
local nsantenna = cursor:get("wireless", device, "antenna")
local iw = nil
-local tx_powers = nil
-local chan = sys.wifi.channels()
+local tx_powers = {}
+local chan = {}
state:foreach("wireless", "wifi-iface",
function(s)
if s.device == device and not iw then
iw = sys.wifi.getiwinfo(s.ifname or s.device)
- chan = sys.wifi.channels(s.ifname or s.device)
+ chan = iw and iw.freqlist or { }
tx_powers = iw.txpwrlist or { }
end
end)
+
+local m
-m = Map("wireless", "Configure Access Point",
-"The private Access Point is about to be created. You only need to provide "..
-"a network name and a password to finish this step and - if you like - tweak "..
-"some of the advanced settings.")
+
+if ap then
+m = Map("wireless", translate("Configure Access Point"))
+end
--- Device Settings ---
s = m:section(NamedSection, device, "wifi-device", "Device Configuration")
ch = s:taboption("general", Value, "channel", translate("Channel"))
ch:value("auto", translate("automatic"))
for _, f in ipairs(chan) do
- ch:value(f.channel, "%i (%.3f GHz)" %{ f.channel, f.mhz })
+ ch:value(f.channel, "%i (%.3f GHz)" %{ f.channel, f.mhz / 1000 })
end
s:tab("expert", translate("Expert Settings"))
if hwtype == "mac80211" then
+ local macaddr = cursor:get("wireless", device, "macaddr") or "!"
+ local hwmode = cursor:get("wireless", device, "hwmode")
+ local modes = {}
+ local phy
+ local allowed = {}
+ for entry in fs.glob("/sys/class/ieee80211/*") do
+ if (fs.readfile(entry .. "/macaddress") or ""):find(macaddr) == 1 then
+ phy = entry:sub(22)
+ end
+ end
+ if phy then
+ local iwp = io.popen("iw phy " .. phy .. " info")
+ local iwin = iwp:read("*a")
+
+ if iwp then
+ iwp:close()
+ local htcap = iwin:match("HT capabilities:%s*0x([0-9a-fA-F]+)")
+ allowed.n = (htcap and tonumber(htcap, 16) or 0) > 0
+ allowed.g = iwin:find("2412 MHz")
+ allowed.a = iwin:find("5180 MHz")
+ end
+ end
+
+ if next(allowed) then
+ mode = s:taboption("expert", ListValue, "hwmode", translate("Communication Protocol"))
+ if allowed.n and allowed.g then
+ mode:value("11ng", "802.11n (2.4 GHz)")
+ end
+ if allowed.n and allowed.a then
+ mode:value("11na", "802.11n (5 GHz)")
+ end
+ if allowed.a then
+ mode:value("11a", "802.11a (5 GHz)")
+ end
+ if allowed.g then
+ mode:value("11g", "802.11g (2.4 GHz)")
+ mode:value("11bg", "802.11b+g (2.4 GHz)")
+ mode:value("11b", "802.11b (2.4 GHz)")
+ end
+ end
+
tp = s:taboption("expert",
(tx_powers and #tx_powers > 0) and ListValue or Value,
"txpower", translate("Transmission Power"), "dBm")
-s = m:section(NamedSection, "ap", "wifi-iface", "Access Point Details")
+s = m:section(NamedSection, iface, "wifi-iface", translate("Interface Details"))
s.addremove = false
s:tab("general", translate("General Settings"))
s:tab("expert", translate("Expert Settings"))
-s:taboption("general", Value, "ssid", translate("Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>)"))
+
+
+local ssid = s:taboption("general", Value, "ssid", translate("Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>)"))
mode = s:taboption("expert", ListValue, "mode", translate("Operating Mode"))
mode.override_values = true
if hwtype == "mac80211" then
- -- Empty
-elseif hwtype == "atheros" then
- mode:value("ap-wds", "%s (%s)" % {translate("Access Point"), translate("WDS")})
- mode:value("wds", translate("Static WDS"))
-
- function mode.write(self, section, value)
- if value == "ap-wds" then
- ListValue.write(self, section, "ap")
- self.map:set(section, "wds", 1)
- else
- ListValue.write(self, section, value)
- self.map:del(section, "wds")
- end
- end
+ mode:value("mesh", translate("Mesh (802.11s)"))
+ local meshid = s:taboption("expert", Value, "mesh_id", translate("Mesh ID"))
+ meshid:depends("mode", "mesh")
- function mode.cfgvalue(self, section)
- local mode = ListValue.cfgvalue(self, section)
- local wds = self.map:get(section, "wds") == "1"
- return mode == "ap" and wds and "ap-wds" or mode
- end
+ s:taboption("expert", Flag, "wds", translate("Enable Bridging and Repeating (WDS)")):depends("mode", "ap")
+ s:taboption("expert", Flag, "powersave", translate("Enable Powersaving")):depends("mode", "ap")
+elseif hwtype == "atheros" then
+ -- mode:value("wds", translate("Static WDS"))
mp = s:taboption("expert", ListValue, "macpolicy", translate("MAC-Address Filter"))
mp:value("", translate("disable"))
ml = s:taboption("expert", DynamicList, "maclist", translate("MAC-List"))
ml:depends({macpolicy="allow"})
ml:depends({macpolicy="deny"})
-
+
+ s:taboption("expert", Flag, "wds", translate("Enable Bridging and Repeating (WDS)"))
- hidden = s:taboption("expert", Flag, "hidden", translate("Hide Access Point"))
- hidden:depends({mode="ap"})
- hidden:depends({mode="ap-wds"})
-
- isolate = s:taboption("expert", Flag, "isolate", translate("Prevent communication between clients"))
- isolate:depends({mode="ap"})
+ if ap then
+ hidden = s:taboption("expert", Flag, "hidden", translate("Hide Access Point"))
+ hidden:depends({mode="ap"})
+ hidden:depends({mode="ap-wds"})
+
+ isolate = s:taboption("expert", Flag, "isolate", translate("Prevent communication between clients"))
+ isolate:depends({mode="ap"})
+ end
s:taboption("expert", Flag, "bursting", translate("Allow Burst Transmissions"))
elseif hwtype == "broadcom" then
- mode:value("wds", translate("WDS"))
-
- hidden = s:taboption("expert", Flag, "hidden", translate("Hide Access Point"))
- hidden:depends({mode="ap"})
- hidden:depends({mode="wds"})
+ if ap then
+ hidden = s:taboption("expert", Flag, "hidden", translate("Hide Access Point"))
+ hidden:depends({mode="ap"})
+ hidden:depends({mode="wds"})
- isolate = s:taboption("expert", Flag, "isolate", translate("Prevent communication between clients"))
- isolate:depends({mode="ap"})
+ isolate = s:taboption("expert", Flag, "isolate", translate("Prevent communication between clients"))
+ isolate:depends({mode="ap"})
+ end
elseif hwtype == "prism2" then
- mode:value("wds", translate("WDS"))
-
mp = s:taboption("expert", ListValue, "macpolicy", translate("MAC-Address Filter"))
mp:value("", translate("disable"))
mp:value("deny", translate("Allow listed only"))
ml:depends({macpolicy="allow"})
ml:depends({macpolicy="deny"})
- hidden = s:taboption("expert", Flag, "hidden", translate("Hide Access Point"))
- hidden:depends({mode="ap"})
- hidden:depends({mode="wds"})
+ if ap then
+ hidden = s:taboption("expert", Flag, "hidden", translate("Hide Access Point"))
+ hidden:depends({mode="ap"})
+ hidden:depends({mode="wds"})
+ end
end
-- Encryption --
-
+encr.default = "wep" -- Early default
encr.override_values = true
encr.override_depends = true
encr:value("none", "No Encryption")
-encr:value("wep", "WEP", {mode="ap"}, {mode="sta"}, {mode="ap-wds"})
+encr:value("wep", "WEP", {mode="ap"})
if hwtype == "atheros" or hwtype == "mac80211" or hwtype == "prism2" then
local hostapd = fs.access("/usr/sbin/hostapd") or os.getenv("LUCI_SYSROOT")
-
- if hostapd then
- --s:taboption("expert", Flag, "_alloweap", "Allow EAP / 802.11i authentication")
-
- encr:value("psk", "WPA", {mode="ap"}, {mode="ap-wds"})
- encr:value("wpa", "WPA-EAP", {mode="ap"}, {mode="ap-wds"})
- encr:value("psk-mixed", "WPA + WPA2", {mode="ap"}, {mode="ap-wds"})
- encr:value("psk2", "WPA2", {mode="ap"}, {mode="ap-wds"})
- encr:value("wpa2", "WPA2-EAP (802.11i)", {mode="ap"}, {mode="ap-wds"})
+ local supplicant = fs.access("/usr/sbin/wpa_supplicant") or os.getenv("LUCI_SYSROOT")
+
+ if hostapd and not supplicant then
+ encr:value("psk", "WPA", {mode="ap"})
+ encr:value("wpa", "WPA-EAP", {mode="ap"})
+ encr:value("psk-mixed", "WPA + WPA2", {mode="ap"})
+ encr:value("psk2", "WPA2", {mode="ap"})
+ encr:value("wpa2", "WPA2-EAP (802.11i)", {mode="ap"})
encr.default = "psk-mixed"
+ elseif not hostapd and supplicant then
+ encr:value("psk", "WPA", {mode="mesh"})
+ encr:value("psk2", "WPA2", {mode="mesh"})
+ encr.default = "psk2"
+ elseif hostapd and supplicant then
+ encr:value("psk", "WPA", {mode="ap"}, {mode="mesh"})
+ encr:value("wpa", "WPA-EAP", {mode="ap"})
+ encr:value("psk-mixed", "WPA + WPA2", {mode="ap"})
+ encr:value("psk2", "WPA2", {mode="ap"}, {mode="mesh"})
+ encr:value("wpa2", "WPA2-EAP (802.11i)", {mode="ap"})
+ encr.default = "psk-mixed"
end
elseif hwtype == "broadcom" then
encr:value("psk", "WPA")
server = s:taboption("general", Value, "server", translate("Radius-Server"))
server:depends({mode="ap", encryption="wpa"})
server:depends({mode="ap", encryption="wpa2"})
-server:depends({mode="ap-wds", encryption="wpa"})
-server:depends({mode="ap-wds", encryption="wpa2"})
server.rmempty = true
port = s:taboption("general", Value, "port", translate("Radius-Port"))
port:depends({mode="ap", encryption="wpa"})
port:depends({mode="ap", encryption="wpa2"})
-port:depends({mode="ap-wds", encryption="wpa"})
-port:depends({mode="ap-wds", encryption="wpa2"})
port.rmempty = true
key = s:taboption("general", Value, "key", translate("Password"))
key:depends("encryption", "psk-mixed")
key:depends({mode="ap", encryption="wpa"})
key:depends({mode="ap", encryption="wpa2"})
-key:depends({mode="ap-wds", encryption="wpa"})
-key:depends({mode="ap-wds", encryption="wpa2"})
key.rmempty = true
key.password = true
nasid = s:taboption("general", Value, "nasid", translate("NAS ID"))
nasid:depends({mode="ap", encryption="wpa"})
nasid:depends({mode="ap", encryption="wpa2"})
- nasid:depends({mode="ap-wds", encryption="wpa"})
- nasid:depends({mode="ap-wds", encryption="wpa2"})
nasid.rmempty = true
end
return m