root/luci/trunk/modules/admin-full/luasrc/model/cbi/admin_network/wifi.lua @ 4363

Revision 4363, 12.6 KB (checked in by Cyrus, 4 years ago)

Fix WPA2-EAP support

  • Property svn:keywords set to Id
Line 
1--[[
2LuCI - Lua Configuration Interface
3
4Copyright 2008 Steven Barth <steven@midlink.org>
5
6Licensed under the Apache License, Version 2.0 (the "License");
7you may not use this file except in compliance with the License.
8You may obtain a copy of the License at
9
10    http://www.apache.org/licenses/LICENSE-2.0
11
12$Id$
13]]--
14require("luci.tools.webadmin")
15arg[1] = arg[1] or ""
16
17m = Map("wireless", translate("networks"), translate("a_w_networks1"))
18
19s = m:section(NamedSection, arg[1], "wifi-device", translate("device") .. " " .. arg[1])
20s.addremove = false
21
22back = s:option(DummyValue, "_overview", translate("overview"))
23back.value = ""
24back.titleref = luci.dispatcher.build_url("admin", "network", "wireless")
25
26
27en = s:option(Flag, "disabled", translate("enable"))
28en.enabled = "0"
29en.disabled = "1"
30en.rmempty = false
31
32function en.cfgvalue(self, section)
33    return Flag.cfgvalue(self, section) or "0"
34end
35
36s:option(DummyValue, "type", translate("type"))
37local hwtype = m:get(arg[1], "type")
38-- NanoFoo
39local nsantenna = m:get(arg[1], "antenna")
40
41ch = s:option(Value, "channel", translate("a_w_channel"))
42for i=1, 14 do
43    ch:value(i, i .. " (2.4 GHz)")
44end
45for i=36, 64, 4 do
46    ch:value(i, i .. " (5 GHz)")
47end
48for i=100, 140, 4 do
49    ch:value(i, i .. " (5 GHz)")
50end
51ch:value(147, 147 .. " (5 GHz)")
52ch:value(151, 151 .. " (5 GHz)")
53ch:value(155, 155 .. " (5 GHz)")
54ch:value(167, 167 .. " (5 GHz)")
55
56s:option(Value, "txpower", translate("a_w_txpwr"), "dBm").rmempty = true
57
58------------------- MAC80211 Device ------------------
59
60if hwtype == "mac80211" then
61
62end
63
64
65------------------- Madwifi Device ------------------
66
67if hwtype == "atheros" then
68    mode = s:option(ListValue, "hwmode", translate("mode"))
69    mode:value("", translate("wifi_auto"))
70    mode:value("11b", "802.11b")
71    mode:value("11g", "802.11g")
72    mode:value("11a", "802.11a")
73    mode:value("11bg", "802.11b+g")
74    mode:value("11gdt", "802.11adt")
75    mode:value("11adt", "802.11adt")
76    mode:value("fh", translate("wifi_fh"))
77
78    s:option(Flag, "diversity", translate("wifi_diversity")).rmempty = false
79
80    if not nsantenna then
81        s:option(Value, "txantenna", translate("wifi_txantenna")).optional = true
82        s:option(Value, "rxantenna", translate("wifi_rxantenna")).optional = true
83    else -- NanoFoo
84        local ant = s:option(ListValue, "antenna", translate("wifi_txantenna"))
85        ant:value("auto")
86        ant:value("vertical")
87        ant:value("horizontal")
88        ant:value("external")
89    end
90    s:option(Value, "distance", translate("wifi_distance"),
91        translate("wifi_distance_desc")).optional = true
92
93    --s:option(Flag, "nosbeacon", translate("wifi_nosbeacon")).optional = true
94end
95
96
97
98------------------- Broadcom Device ------------------
99
100if hwtype == "broadcom" then
101    mp = s:option(ListValue, "macfilter", translate("wifi_macpolicy"))
102    mp.optional = true
103    mp:value("")
104    mp:value("allow", translate("wifi_whitelist"))
105    mp:value("deny", translate("wifi_blacklist"))
106    ml = s:option(DynamicList, "maclist", translate("wifi_maclist"))
107    ml:depends({macfilter="allow"})
108    ml:depends({macfilter="deny"})
109
110    s:option(Value, "txantenna", translate("wifi_txantenna")).optional = true
111    s:option(Value, "rxantenna", translate("wifi_rxantenna")).optional = true
112
113    s:option(Flag, "frameburst", translate("wifi_bursting")).optional = true
114
115    s:option(Value, "distance", translate("wifi_distance")).optional = true
116    --s:option(Value, "slottime", translate("wifi_slottime")).optional = true
117
118    s:option(Value, "country", translate("wifi_country")).optional = true
119    s:option(Value, "maxassoc", translate("wifi_maxassoc")).optional = true
120end
121
122
123----------------------- Interface -----------------------
124
125s = m:section(TypedSection, "wifi-iface", translate("interfaces"))
126s.addremove = true
127s.anonymous = true
128s:depends("device", arg[1])
129s.defaults.device = arg[1]
130
131s:option(Value, "ssid", translate("wifi_essid"))
132
133network = s:option(Value, "network", translate("network"), translate("a_w_network1"))
134network.rmempty = true
135network:value("")
136network.combobox_manual = translate("a_w_netmanual")
137luci.tools.webadmin.cbi_add_networks(network)
138
139function network.write(self, section, value)
140    if not m.uci:get("network", value) then
141        -- avoid "value not defined in enum" because network is not known yet
142        s.override_scheme = true
143
144        m:chain("network")
145        m.uci:set("network", value, "interface")
146        Value.write(self, section, value)
147    else
148        if m.uci:get("network", value) == "interface" then
149            Value.write(self, section, value)
150        end
151    end
152end
153
154
155mode = s:option(ListValue, "mode", translate("mode"))
156mode.override_values = true
157mode:value("ap", translate("a_w_ap"))
158mode:value("adhoc", translate("a_w_adhoc"))
159mode:value("sta", translate("a_w_client"))
160
161bssid = s:option(Value, "bssid", translate("wifi_bssid"))
162
163
164-------------------- MAC80211 Interface ----------------------
165
166if hwtype == "mac80211" then
167    if luci.fs.mtime("/usr/sbin/iw") then
168        mode:value("mesh", "802.11s")
169    end
170
171    mode:value("ahdemo", translate("a_w_ahdemo"))
172    mode:value("monitor", translate("a_w_monitor"))
173    bssid:depends({mode="adhoc"})
174
175    s:option(Value, "frag", translate("wifi_frag")).optional = true
176    s:option(Value, "rts", translate("wifi_rts")).optional = true
177end
178
179
180
181-------------------- Madwifi Interface ----------------------
182
183if hwtype == "atheros" then
184    mode:value("ahdemo", translate("a_w_ahdemo"))
185    mode:value("monitor", translate("a_w_monitor"))
186
187    bssid:depends({mode="adhoc"})
188    bssid:depends({mode="ahdemo"})
189
190    wds = s:option(Flag, "wds", translate("a_w_wds"))
191    wds:depends({mode="ap"})
192    wds:depends({mode="sta"})
193    wds.rmempty = true
194    wdssep = s:option(Flag, "wdssep", translate("wifi_wdssep"))
195    wdssep:depends({mode="ap", wds="1"})
196    wdssep.optional = true
197
198    s:option(Flag, "doth", "802.11h").optional = true
199    hidden = s:option(Flag, "hidden", translate("wifi_hidden"))
200    hidden:depends({mode="ap"})
201    hidden:depends({mode="adhoc"})
202    hidden:depends({mode="wds"})
203    hidden.optional = true
204    isolate = s:option(Flag, "isolate", translate("wifi_isolate"),
205     translate("wifi_isolate_desc"))
206    isolate:depends({mode="ap"})
207    isolate.optional = true
208    s:option(Flag, "bgscan", translate("wifi_bgscan")).optional = true
209
210    mp = s:option(ListValue, "macpolicy", translate("wifi_macpolicy"))
211    mp.optional = true
212    mp:value("")
213    mp:value("deny", translate("wifi_whitelist"))
214    mp:value("allow", translate("wifi_blacklist"))
215    ml = s:option(DynamicList, "maclist", translate("wifi_maclist"))
216    ml:depends({macpolicy="allow"})
217    ml:depends({macpolicy="deny"})
218
219    s:option(Value, "rate", translate("wifi_rate")).optional = true
220    s:option(Value, "mcast_rate", translate("wifi_mcast_rate")).optional = true
221    s:option(Value, "frag", translate("wifi_frag")).optional = true
222    s:option(Value, "rts", translate("wifi_rts")).optional = true
223    s:option(Value, "minrate", translate("wifi_minrate")).optional = true
224    s:option(Value, "maxrate", translate("wifi_maxrate")).optional = true
225    s:option(Flag, "compression", translate("wifi_compression")).optional = true
226
227    s:option(Flag, "bursting", translate("wifi_bursting")).optional = true
228    s:option(Flag, "turbo", translate("wifi_turbo")).optional = true
229    s:option(Value, "ff", translate("wifi_ff")).optional = true
230
231    s:option(Flag, "wmm", translate("wifi_wmm")).optional = true
232    s:option(Flag, "xr", translate("wifi_xr")).optional = true
233    s:option(Flag, "ar", translate("wifi_ar")).optional = true
234
235    local swm = s:option(Flag, "sw_merge", translate("wifi_nosbeacon"))
236    swm:depends({mode="adhoc"})
237    swm.optional = true
238
239    local nos = s:option(Flag, "nosbeacon", translate("wifi_nosbeacon"))
240    nos:depends({mode="sta"})
241    nos.optional = true
242
243    local probereq = s:option(Flag, "probereq", translate("wifi_noprobereq"))
244    probereq.optional = true
245    probereq.enabled  = "0"
246    probereq.disabled = "1"
247end
248
249
250-------------------- Broadcom Interface ----------------------
251
252if hwtype == "broadcom" then
253    mode:value("wds", translate("a_w_wds"))
254    mode:value("monitor", translate("a_w_monitor"))
255
256    hidden = s:option(Flag, "hidden", translate("wifi_hidden"))
257    hidden:depends({mode="ap"})
258    hidden:depends({mode="adhoc"})
259    hidden:depends({mode="wds"})
260    hidden.optional = true
261
262    isolate = s:option(Flag, "isolate", translate("wifi_isolate"),
263     translate("wifi_isolate_desc"))
264    isolate:depends({mode="ap"})
265    isolate.optional = true
266
267    bssid:depends({mode="wds"})
268    bssid:depends({mode="adhoc"})
269end
270
271
272
273------------------- WiFI-Encryption -------------------
274
275encr = s:option(ListValue, "encryption", translate("encryption"))
276encr.override_values = true
277encr:depends({mode="ap"})
278encr:depends({mode="sta"})
279encr:depends({mode="adhoc"})
280encr:depends({mode="ahdemo"})
281encr:depends({mode="wds"})
282encr:depends({mode="mesh"})
283
284encr:value("none", "No Encryption")
285encr:value("wep", "WEP")
286
287if hwtype == "atheros" or hwtype == "mac80211" then
288    local supplicant = luci.fs.mtime("/usr/sbin/wpa_supplicant")
289    local hostapd = luci.fs.mtime("/usr/sbin/hostapd")
290
291    if hostapd and supplicant then
292        encr:value("psk", "WPA-PSK")
293        encr:value("psk2", "WPA2-PSK")
294        encr:value("mixed", "WPA-PSK/WPA2-PSK Mixed Mode")
295        encr:value("wpa", "WPA-EAP", {mode="ap"}, {mode="sta"})
296        encr:value("wpa2", "WPA2-EAP", {mode="ap"}, {mode="sta"})
297    elseif hostapd and not supplicant then
298        encr:value("psk", "WPA-PSK", {mode="ap"}, {mode="adhoc"}, {mode="ahdemo"})
299        encr:value("psk2", "WPA2-PSK", {mode="ap"}, {mode="adhoc"}, {mode="ahdemo"})
300        encr:value("mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="ap"}, {mode="adhoc"}, {mode="ahdemo"})
301        encr:value("wpa", "WPA-EAP", {mode="ap"})
302        encr:value("wpa2", "WPA2-EAP", {mode="ap"})
303        encr.description = translate("wifi_wpareq")
304    elseif not hostapd and supplicant then
305        encr:value("psk", "WPA-PSK", {mode="sta"})
306        encr:value("psk2", "WPA2-PSK", {mode="sta"})
307        encr:value("mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="sta"})
308        encr:value("wpa", "WPA-EAP", {mode="sta"})
309        encr:value("wpa2", "WPA2-EAP", {mode="sta"})
310        encr.description = translate("wifi_wpareq")
311    else
312        encr.description = translate("wifi_wpareq")
313    end
314elseif hwtype == "broadcom" then
315    encr:value("psk", "WPA-PSK")
316    encr:value("psk2", "WPA2-PSK")
317    encr:value("psk+psk2", "WPA-PSK/WPA2-PSK Mixed Mode")
318end
319
320encr:depends("mode", "ap")
321encr:depends("mode", "sta")
322encr:depends("mode", "wds")
323
324server = s:option(Value, "server", translate("a_w_radiussrv"))
325server:depends({mode="ap", encryption="wpa"})
326server:depends({mode="ap", encryption="wpa2"})
327server.rmempty = true
328
329port = s:option(Value, "port", translate("a_w_radiusport"))
330port:depends({mode="ap", encryption="wpa"})
331port:depends({mode="ap", encryption="wpa2"})
332port.rmempty = true
333
334key = s:option(Value, "key", translate("key"))
335key:depends("encryption", "wep")
336key:depends("encryption", "psk")
337key:depends({mode="ap", encryption="wpa"})
338key:depends("encryption", "psk2")
339key:depends({mode="ap", encryption="wpa2"})
340key.rmempty = true
341
342if hwtype == "atheros" or hwtype == "mac80211" then
343    nasid = s:option(Value, "nasid", translate("a_w_nasid"))
344    nasid:depends({mode="ap", encryption="wpa"})
345    nasid:depends({mode="ap", encryption="wpa2"})
346    nasid.rmempty = true
347
348    eaptype = s:option(ListValue, "eap_type", translate("a_w_eaptype"))
349    eaptype:value("TLS")
350    eaptype:value("TTLS")
351    eaptype:value("PEAP")
352    eaptype:depends({mode="sta", encryption="wpa"})
353    eaptype:depends({mode="sta", encryption="wpa2"})
354
355    cacert = s:option(FileUpload, "ca_cert", translate("a_w_cacert"))
356    cacert:depends({mode="sta", encryption="wpa"})
357    cacert:depends({mode="sta", encryption="wpa2"})
358
359    privkey = s:option(FileUpload, "priv_key", translate("a_w_tlsprivkey"))
360    privkey:depends({mode="sta", eap_type="TLS", encryption="wpa2"})
361    privkey:depends({mode="sta", eap_type="TLS", encryption="wpa"})
362
363    privkeypwd = s:option(Value, "priv_key_pwd", translate("a_w_tlsprivkeypwd"))
364    privkeypwd:depends({mode="sta", eap_type="TLS", encryption="wpa2"})
365    privkeypwd:depends({mode="sta", eap_type="TLS", encryption="wpa"})
366
367
368    auth = s:option(Value, "auth", translate("a_w_peapauth"))
369    auth:value("PAP")
370    auth:value("CHAP")
371    auth:value("MSCHAP")
372    auth:value("MSCHAPV2")
373    auth:depends({mode="sta", eap_type="PEAP", encryption="wpa2"})
374    auth:depends({mode="sta", eap_type="PEAP", encryption="wpa"})
375    auth:depends({mode="sta", eap_type="TTLS", encryption="wpa2"})
376    auth:depends({mode="sta", eap_type="TTLS", encryption="wpa"})
377
378
379    identity = s:option(Value, "identity", translate("a_w_peapidentity"))
380    identity:depends({mode="sta", eap_type="PEAP", encryption="wpa2"})
381    identity:depends({mode="sta", eap_type="PEAP", encryption="wpa"})
382    identity:depends({mode="sta", eap_type="TTLS", encryption="wpa2"})
383    identity:depends({mode="sta", eap_type="TTLS", encryption="wpa"})
384
385    password = s:option(Value, "password", translate("a_w_peappassword"))
386    password:depends({mode="sta", eap_type="PEAP", encryption="wpa2"})
387    password:depends({mode="sta", eap_type="PEAP", encryption="wpa"})
388    password:depends({mode="sta", eap_type="TTLS", encryption="wpa2"})
389    password:depends({mode="sta", eap_type="TTLS", encryption="wpa"})
390end
391
392
393return m
Note: See TracBrowser for help on using the browser.