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