m = Map("wireless", "",
translate("The <em>Device Configuration</em> section covers physical settings of the radio " ..
- "hardware such as channel, transmit power or antenna selection which is shared among all " ..
+ "hardware such as channel, transmit power or antenna selection which are shared among all " ..
"defined wireless networks (if the radio hardware is multi-SSID capable). Per network settings " ..
"like encryption or operation mode are grouped in the <em>Interface Configuration</em>."))
wdev:set("disabled", nil)
nw:commit("wireless")
- luci.sys.call("(env -i /sbin/wifi down; env -i /sbin/wifi up) >/dev/null 2>/dev/null")
+ luci.sys.call("(env -i /bin/ubus call network reload) >/dev/null 2>/dev/null")
luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless", arg[1]))
return
local hwtype = wdev:get("type")
-local htcaps = wdev:get("ht_capab") and true or false
-- NanoFoo
local nsantenna = wdev:get("antenna")
--- Check whether there is a client interface on the same radio,
--- if yes, lock the channel choice as the station will dicatate the freq
-local has_sta = nil
+-- Check whether there are client interfaces on the same radio,
+-- if yes, lock the channel choice as these stations will dicatate the freq
+local found_sta = nil
local _, net
-for _, net in ipairs(wdev:get_wifinets()) do
- if net:mode() == "sta" and net:id() ~= wnet:id() then
- has_sta = net
- break
+if wnet:mode() ~= "sta" then
+ for _, net in ipairs(wdev:get_wifinets()) do
+ if net:mode() == "sta" then
+ if not found_sta then
+ found_sta = {}
+ found_sta.channel = net:channel()
+ found_sta.names = {}
+ end
+ found_sta.names[#found_sta.names+1] = net:shortname()
+ end
end
end
-if has_sta then
+if found_sta then
ch = s:taboption("general", DummyValue, "choice", translate("Channel"))
- ch.value = translatef("Locked to channel %d used by %s",
- has_sta:channel(), has_sta:shortname())
+ ch.value = translatef("Locked to channel %d used by: %s",
+ found_sta.channel, table.concat(found_sta.names, ", "))
else
ch = s:taboption("general", Value, "channel", translate("Channel"))
ch:value("auto", translate("auto"))
- for _, f in ipairs(iw and iw.freqlist) do
+ for _, f in ipairs(iw and iw.freqlist or { }) do
if not f.restricted then
ch:value(f.channel, "%i (%.3f GHz)" %{ f.channel, f.mhz / 1000 })
end
end
end
- mode = s:taboption("advanced", ListValue, "hwmode", translate("Mode"))
- mode:value("", translate("auto"))
- if hw_modes.b then mode:value("11b", "802.11b") end
- if hw_modes.g then mode:value("11g", "802.11g") end
- if hw_modes.a then mode:value("11a", "802.11a") end
+ mode = s:taboption("advanced", ListValue, "hwmode", translate("Band"))
+
+ if hw_modes.ac then
+ if hw_modes.ac then mode:value("11a", "5GHz (802.11n+ac)") end
- if htcaps then
- if hw_modes.g and hw_modes.n then mode:value("11ng", "802.11g+n") end
- if hw_modes.a and hw_modes.n then mode:value("11na", "802.11a+n") end
+ htmode = s:taboption("advanced", ListValue, "htmode", translate("VHT mode (802.11ac)"))
+ htmode:value("", translate("disabled"))
+ htmode:value("VHT20", "20MHz")
+ htmode:value("VHT40", "40MHz")
+ htmode:value("VHT80", "80MHz")
- htmode = s:taboption("advanced", ListValue, "htmode", translate("HT mode"))
- htmode:depends("hwmode", "11na")
- htmode:depends("hwmode", "11ng")
+ elseif hw_modes.n then
+ if hw_modes.g then mode:value("11g", "2.4GHz (802.11g+n)") end
+ if hw_modes.a then mode:value("11a", "5GHz (802.11a+n)") end
+
+ htmode = s:taboption("advanced", ListValue, "htmode", translate("HT mode (802.11n)"))
+ htmode:value("", translate("disabled"))
htmode:value("HT20", "20MHz")
- htmode:value("HT40-", translate("40MHz 2nd channel below"))
- htmode:value("HT40+", translate("40MHz 2nd channel above"))
+ htmode:value("HT40", "40MHz")
+
+ function mode.cfgvalue(...)
+ local v = Value.cfgvalue(...)
+ if v == "11na" then
+ return "11a"
+ elseif v == "11ng" then
+ return "11g"
+ end
+ return v
+ end
- --htcapab = s:taboption("advanced", DynamicList, "ht_capab", translate("HT capabilities"))
- --htcapab:depends("hwmode", "11na")
- --htcapab:depends("hwmode", "11ng")
+ noscan = s:taboption("advanced", Flag, "noscan", translate("Force 40MHz mode"),
+ translate("Always use 40MHz channels even if the secondary channel overlaps. Using this option does not comply with IEEE 802.11n-2009!"))
+ noscan:depends("htmode", "HT40")
+ noscan.default = noscan.disabled
+ else
+ if hw_modes.g then mode:value("11g", "2.4GHz (802.11g)") end
+ if hw_modes.a then mode:value("11a", "5GHz (802.11a)") end
end
local cl = iw and iw.countrylist
password:depends({mode="sta-wds", eap_type="ttls", encryption="wpa"})
end
+if hwtype == "atheros" or hwtype == "mac80211" or hwtype == "prism2" then
+ local wpasupplicant = fs.access("/usr/sbin/wpa_supplicant")
+ local hostcli = fs.access("/usr/sbin/hostapd_cli")
+ if hostcli and wpasupplicant then
+ wps = s:taboption("encryption", Flag, "wps_pushbutton", translate("Enable WPS pushbutton, requires WPA(2)-PSK"))
+ wps.enabled = "1"
+ wps.disabled = "0"
+ wps.rmempty = false
+ wps:depends("encryption", "psk")
+ wps:depends("encryption", "psk2")
+ wps:depends("encryption", "psk-mixed")
+ end
+end
+
return m