--[[ LuCI - Lua Configuration Interface Copyright 2009 Steven Barth Copyright 2009 Jo-Philipp Wich Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 $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", iface, "device") local hwtype = cursor:get("wireless", device, "type") local nsantenna = cursor:get("wireless", device, "antenna") local iw = nil local tx_powers = {} local chan = sys.wifi.channels() 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) tx_powers = iw.txpwrlist or { } end end) local m if ap then m = Map("wireless", translate("Configure Access Point")) end --- Device Settings --- s = m:section(NamedSection, device, "wifi-device", "Device Configuration") s.addremove = false s:tab("general", translate("General Settings")) 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 / 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") tp.rmempty = true tp:value("", translate("automatic")) for _, p in ipairs(iw and iw.txpwrlist or {}) do tp:value(p.dbm, "%i dBm (%i mW)" %{ p.dbm, p.mw }) end elseif hwtype == "atheros" then tp = s:taboption("expert", (#tx_powers > 0) and ListValue or Value, "txpower", translate("Transmission Power"), "dBm") tp.rmempty = true tp:value("", translate("automatic")) for _, p in ipairs(iw.txpwrlist) do tp:value(p.dbm, "%i dBm (%i mW)" %{ p.dbm, p.mw }) end mode = s:taboption("expert", ListValue, "hwmode", translate("Communication Protocol")) mode:value("", translate("automatic")) mode:value("11g", "802.11g") mode:value("11b", "802.11b") mode:value("11bg", "802.11b+g") mode:value("11a", "802.11a") mode:value("11gst", "802.11g + Turbo") mode:value("11ast", "802.11a + Turbo") if nsantenna then -- NanoFoo local ant = s:taboption("expert", ListValue, "antenna", translate("Transmitter Antenna")) ant:value("auto") ant:value("vertical") ant:value("horizontal") ant:value("external") ant.default = "auto" end elseif hwtype == "broadcom" then tp = s:taboption("expert", (#tx_powers > 0) and ListValue or Value, "txpower", translate("Transmit Power"), "dBm") tp.rmempty = true tp:value("", translate("automatic")) for _, p in ipairs(iw.txpwrlist) do tp:value(p.dbm, "%i dBm (%i mW)" %{ p.dbm, p.mw }) end mp = s:taboption("expert", ListValue, "macfilter", translate("MAC-Address Filter")) mp:value("", translate("disable")) mp:value("allow", translate("Allow listed only")) mp:value("deny", translate("Allow all except listed")) ml = s:taboption("expert", DynamicList, "maclist", translate("MAC-List")) ml:depends({macfilter="allow"}) ml:depends({macfilter="deny"}) s:taboption("expert", Flag, "frameburst", translate("Allow Burst Transmissions")) elseif hwtype == "prism2" then s:taboption("expert", Value, "txpower", translate("Transmission Power"), "att units").rmempty = true end 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")) local ssid = s:taboption("general", Value, "ssid", translate("Network Name (ESSID)")) mode = s:taboption("expert", ListValue, "mode", translate("Operating Mode")) mode.override_values = true mode:value("ap", translate("Access Point")) encr = s:taboption("expert", ListValue, "encryption", translate("Encryption")) if hwtype == "mac80211" then mode:value("mesh", translate("Mesh (802.11s)")) local meshid = s:taboption("expert", Value, "mesh_id", translate("Mesh ID")) meshid:depends("mode", "mesh") 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")) mp:value("deny", translate("Allow listed only")) mp:value("allow", translate("Allow all except listed")) 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)")) 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 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"}) end elseif hwtype == "prism2" then mp = s:taboption("expert", ListValue, "macpolicy", translate("MAC-Address Filter")) mp:value("", translate("disable")) mp:value("deny", translate("Allow listed only")) mp:value("allow", translate("Allow all except listed")) ml = s:taboption("expert", DynamicList, "maclist", translate("MAC-List")) ml:depends({macpolicy="allow"}) ml:depends({macpolicy="deny"}) 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"}) if hwtype == "atheros" or hwtype == "mac80211" or hwtype == "prism2" then local hostapd = fs.access("/usr/sbin/hostapd") or os.getenv("LUCI_SYSROOT") 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") encr:value("psk+psk2", "WPA + WPA2") encr:value("psk2", "WPA2") encr.default = "psk+psk2" end server = s:taboption("general", Value, "server", translate("Radius-Server")) server:depends({mode="ap", encryption="wpa"}) server:depends({mode="ap", 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.rmempty = true key = s:taboption("general", Value, "key", translate("Password")) key:depends("encryption", "wep") key:depends("encryption", "psk") key:depends("encryption", "psk2") key:depends("encryption", "psk+psk2") key:depends("encryption", "psk-mixed") key:depends({mode="ap", encryption="wpa"}) key:depends({mode="ap", encryption="wpa2"}) key.rmempty = true key.password = true if hwtype == "atheros" or hwtype == "mac80211" or hwtype == "prism2" then nasid = s:taboption("general", Value, "nasid", translate("NAS ID")) nasid:depends({mode="ap", encryption="wpa"}) nasid:depends({mode="ap", encryption="wpa2"}) nasid.rmempty = true end return m