fixes, fully translated tomato, with english dictionary and Polish translation
[tomato.git] / release / src / router / www / basic-network.asp
blob6cbc9cc3593c6a6fe8a52b8798aab37684ded926
1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN'>
2 <!--
3 Tomato GUI
4 Copyright (C) 2006-2010 Jonathan Zarate
5 http://www.polarcloud.com/tomato/
7 For use with Tomato Firmware only.
8 No part of this file may be used without permission.
9 -->
10 <html>
11 <head>
12 <meta http-equiv='content-type' content='text/html;charset=utf-8'>
13 <meta name='robots' content='noindex,nofollow'>
14 <title>[<% ident(); %>] <% translate("Basic"); %>: <% translate("Network"); %></title>
15 <link rel='stylesheet' type='text/css' href='tomato.css'>
16 <link rel='stylesheet' type='text/css' href='color.css'>
17 <script type='text/javascript' src='tomato.js'></script>
19 <!-- / / / -->
21 <script type='text/javascript' src='debug.js'></script>
23 <script type='text/javascript' src='md5.js'></script>
24 <script type='text/javascript' src='wireless.jsx?_http_id=<% nv(http_id); %>'></script>
25 <script type='text/javascript'>
26 // <% nvram("dhcp_lease,dhcp_num,dhcp_start,dhcpd_startip,dhcpd_endip,l2tp_server_ip,lan_gateway,lan_ipaddr,lan_netmask,lan_proto,mtu_enable,ppp_demand,ppp_idletime,ppp_passwd,ppp_redialperiod,ppp_service,ppp_username,ppp_custom,pptp_server_ip,pptp_dhcp,wl_security_mode,wan_dns,wan_gateway,wan_ipaddr,wan_mtu,wan_netmask,wan_proto,wan_wins,wl_wds_enable,wl_channel,wl_closed,wl_crypto,wl_key,wl_key1,wl_key2,wl_key3,wl_key4,wl_lazywds,wl_mode,wl_net_mode,wl_passphrase,wl_radio,wl_radius_ipaddr,wl_radius_port,wl_ssid,wl_wds,wl_wep_bit,wl_wpa_gtk_rekey,wl_wpa_psk,wl_radius_key,wl_auth,wl_hwaddr,wan_islan,t_features,wl_nbw_cap,wl_nctrlsb,wl_nband,wl_phytype"); %>
28 W('<style type=\'text/css\'>');
29 for (var u = 0; u < wl_ifaces.length; ++u) {
30 W('#spin'+wl_unit(u)+', ');
32 W('#spin {');
33 W(' visibility: hidden;');
34 W(' vertical-align: middle;');
35 W('}');
36 W('</style>');
38 var xob = null;
39 var refresher = [];
40 var nphy = features('11n');
42 if ((!fixIP(nvram.dhcpd_startip)) || (!fixIP(nvram.dhcpd_endip))) {
43 var x = nvram.lan_ipaddr.split('.').splice(0, 3).join('.') + '.';
44 nvram.dhcpd_startip = x + nvram.dhcp_start;
45 nvram.dhcpd_endip = x + ((nvram.dhcp_start * 1) + (nvram.dhcp_num * 1) - 1);
48 var ghz = [];
49 var bands = [];
50 var nm_loaded = [], ch_loaded = [], max_channel = [];
52 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
53 var b;
54 b = [];
55 for (var i = 0; i < wl_bands[uidx].length; ++i) {
56 b.push([wl_bands[uidx][i] + '', (wl_bands[uidx][i] == '1') ? '5 GHz' : '2.4 GHz']);
58 bands.push(b);
60 b = [];
61 ghz.push(b);
63 nm_loaded.push(0);
64 ch_loaded.push(0);
65 max_channel.push(0);
66 refresher.push(null);
69 function selectedBand(uidx)
71 if (bands[uidx].length > 1) {
72 var e = E('_f_wl'+u+'_nband');
73 return (e.value + '' == '' ? eval('nvram.wl'+u+'_nband') : e.value);
74 } else if (bands[uidx].length > 0) {
75 return bands[uidx][0][0] || '0';
76 } else {
77 return '0';
81 function refreshNetModes(uidx)
83 var e, i, buf, val;
85 if (uidx >= wl_ifaces.length) return;
86 var u = wl_unit(uidx);
88 var m = [['mixed','<% translate("Auto"); %>']];
89 if (selectedBand(uidx) == '1') {
90 m.push(['a-only','<% translate("A Only"); %>']);
91 if (nphy) {
92 m.push(['n-only','<% translate("N Only"); %>']);
95 else {
96 m.push(['b-only','<% translate("B Only"); %>']);
97 m.push(['g-only','<% translate("G Only"); %>']);
98 if (nphy) {
99 m.push(['bg-mixed','<% translate("B/G Mixed"); %>']);
100 m.push(['n-only','<% translate("N Only"); %>']);
104 e = E('_wl'+u+'_net_mode');
105 buf = '';
106 val = (!nm_loaded[uidx] || (e.value + '' == '')) ? eval('nvram.wl'+u+'_net_mode') : e.value;
107 if (val == 'disabled') val = 'mixed';
108 for (i = 0; i < m.length; ++i)
109 buf += '<option value="' + m[i][0] + '"' + ((m[i][0] == val) ? ' selected' : '') + '>' + m[i][1] + '</option>';
111 e = E('__wl'+u+'_net_mode');
112 buf = '<select name="wl'+u+'_net_mode" onchange="verifyFields(this, 1)" id = "_wl'+u+'_net_mode">' + buf + '</select>';
113 elem.setInnerHTML(e, buf);
114 nm_loaded[uidx] = 1;
117 function refreshChannels(uidx)
119 if (refresher[uidx] != null) return;
120 if (u >= wl_ifaces.length) return;
121 var u = wl_unit(uidx);
123 refresher[uidx] = new XmlHttp();
124 refresher[uidx].onCompleted = function(text, xml) {
125 try {
126 var e, i, buf, val;
128 var wl_channels = [];
129 eval(text);
131 ghz[uidx] = [];
132 max_channel[uidx] = 0;
133 for (i = 0; i < wl_channels.length; ++i) {
134 ghz[uidx].push([wl_channels[i][0] + '',
135 (wl_channels[i][0]) ? ((wl_channels[i][1]) ? wl_channels[i][0] + ' - ' + (wl_channels[i][1] / 1000.0).toFixed(3) + ' GHz' : wl_channels[i][0] + '') : '<% translate("Auto"); %>']);
136 max_channel[uidx] = wl_channels[i][0] * 1;
139 e = E('_wl'+u+'_channel');
140 buf = '';
141 val = (!ch_loaded[uidx] || (e.value + '' == '')) ? eval('nvram.wl'+u+'_channel') : e.value;
142 for (i = 0; i < ghz[uidx].length; ++i)
143 buf += '<option value="' + ghz[uidx][i][0] + '"' + ((ghz[uidx][i][0] == val) ? ' selected' : '') + '>' + ghz[uidx][i][1] + '</option>';
145 e = E('__wl'+u+'_channel');
146 buf = '<select name="wl'+u+'_channel" onchange="verifyFields(this, 1)" id = "_wl'+u+'_channel">' + buf + '</select>';
147 elem.setInnerHTML(e, buf);
148 ch_loaded[uidx] = 1;
150 refresher[uidx] = null;
151 verifyFields(null, 1);
153 catch (x) {
155 refresher[uidx] = null;
158 var bw, sb, e;
160 e = E('_f_wl'+u+'_nctrlsb');
161 sb = (e.value + '' == '' ? eval('nvram.wl'+u+'_nctrlsb') : e.value);
162 e = E('_wl'+u+'_nbw_cap');
163 bw = (e.value + '' == '' ? eval('nvram.wl'+u+'_nbw_cap') : e.value) == '0' ? '20' : '40';
165 refresher[uidx].onError = function(ex) { alert(ex); refresher[uidx] = null; reloadPage(); }
166 refresher[uidx].post('update.cgi', 'exec=wlchannels&arg0=' + u + '&arg1=' + (nphy ? '1' : '0') +
167 '&arg2=' + bw + '&arg3=' + selectedBand(uidx) + '&arg4=' + sb);
170 function spin(x, unit)
172 for (var u = 0; u < wl_ifaces.length; ++u) {
173 E('_f_wl'+wl_unit(u)+'_scan').disabled = x;
175 var e = E('_f_wl'+unit+'_scan');
176 if (x) e.value = '<% translate("Scan"); %> ' + (wscan.tries + 1);
177 else e.value = '<% translate("Scan"); %>';
178 E('spin'+unit).style.visibility = x ? 'visible' : 'hidden';
181 function scan()
183 if (xob) return;
185 var unit = wscan.unit;
186 var uidx = wl_uidx(unit);
188 xob = new XmlHttp();
189 xob.onCompleted = function(text, xml) {
190 try {
191 var i;
193 wlscandata = [];
194 eval(text);
196 for (i = 0; i < wlscandata.length; ++i) {
197 var data = wlscandata[i];
198 var ch = data[2];
199 var mac = data[0];
201 if (!wscan.inuse[ch]) {
202 wscan.inuse[ch] = {
203 count: 0,
204 rssi: -999,
205 ssid: ''
209 if (!wscan.seen[mac]) {
210 wscan.seen[mac] = 1;
211 ++wscan.inuse[ch].count;
214 if (data[4] > wscan.inuse[ch].rssi) {
215 wscan.inuse[ch].rssi = data[4];
216 wscan.inuse[ch].ssid = data[1];
219 var e = E('_wl'+unit+'_channel');
220 for (i = 1; i < ghz[uidx].length; ++i) {
221 var s = ghz[uidx][i][1];
222 var u = wscan.inuse[ghz[uidx][i][0]];
223 if (u) s += ' (' + u.count + ' AP' + (u.count == 1 ? '' : 's') + ' / <% translate("strongest"); %>: "' + escapeHTML(ellipsis(u.ssid, 15)) + '" ' + u.rssi + ' dBm)';
224 e.options[i].innerHTML = s;
226 e.style.width = '400px';
228 xob = null;
230 if (wscan.tries < 4) {
231 ++wscan.tries;
232 setTimeout(scan, 1000);
233 return;
236 catch (x) {
238 spin(0, unit);
240 xob.onError = function(x) {
241 alert('error: ' + x);
242 spin(0, unit);
243 xob = null;
246 spin(1, unit);
247 xob.post('update.cgi', 'exec=wlscan&arg0='+unit);
250 function scanButton(u)
252 if (xob) return;
254 wscan = {
255 unit: u,
256 seen: [],
257 inuse: [],
258 tries: 0
261 scan();
264 function joinAddr(a) {
265 var r, i, s;
267 r = [];
268 for (i = 0; i < a.length; ++i) {
269 s = a[i];
270 if ((s != '00:00:00:00:00:00') && (s != '0.0.0.0')) r.push(s);
272 return r.join(' ');
275 function random_x(max)
277 var c = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
278 var s = '';
279 while (max-- > 0) s += c.substr(Math.floor(c.length * Math.random()), 1);
280 return s;
283 function random_psk(id)
285 var e = E(id);
286 e.value = random_x(63);
287 verifyFields(null, 1);
290 function random_wep(u)
292 E('_wl'+u+'_passphrase').value = random_x(16);
293 generate_wep(u);
296 function v_wep(e, quiet)
298 var s = e.value;
300 if (((s.length == 5) || (s.length == 13)) && (s.length == (e.maxLength >> 1))) {
301 // no checking
303 else {
304 s = s.toUpperCase().replace(/[^0-9A-F]/g, '');
305 if (s.length != e.maxLength) {
306 ferror.set(e, '<% translate("Invalid WEP key. Expecting"); %> ' + e.maxLength + ' <% translate("hex or"); %> ' + (e.maxLength >> 1) + ' <% translate("ASCII characters"); %>.', quiet);
307 return 0;
311 e.value = s;
312 ferror.clear(e);
313 return 1;
316 // compatible w/ Linksys' and Netgear's (key 1) method for 128-bits
317 function generate_wep(u)
319 function _wepgen(pass, i)
321 while (pass.length < 64) pass += pass;
322 return hex_md5(pass.substr(0, 64)).substr(i, (E('_wl'+u+'_wep_bit').value == 128) ? 26 : 10);
325 var e = E('_wl'+u+'_passphrase');
326 var pass = e.value;
327 if (!v_length(e, false, 3)) return;
328 E('_wl'+u+'_key1').value = _wepgen(pass, 0);
329 pass += '#$%';
330 E('_wl'+u+'_key2').value = _wepgen(pass, 2);
331 pass += '!@#';
332 E('_wl'+u+'_key3').value = _wepgen(pass, 4);
333 pass += '%&^';
334 E('_wl'+u+'_key4').value = _wepgen(pass, 6);
335 verifyFields(null, 1);
338 function verifyFields(focused, quiet)
340 var i;
341 var ok = 1;
342 var a, b, c, d, e;
343 var u, uidx;
344 var wmode, sm2;
346 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
347 u = wl_unit(uidx);
348 if (focused == E('_f_wl'+u+'_nband')) {
349 refreshNetModes(uidx);
350 refreshChannels(uidx);
352 else if (focused == E('_f_wl'+u+'_nctrlsb') || focused == E('_wl'+u+'_nbw_cap')) {
353 refreshChannels(uidx);
357 // --- visibility ---
359 var vis = {
360 _wan_proto: 1,
361 _ppp_username: 1,
362 _ppp_passwd: 1,
363 _ppp_service: 1,
364 _ppp_custom: 1,
365 _l2tp_server_ip: 1,
366 _wan_ipaddr: 1,
367 _wan_netmask: 1,
368 _wan_gateway: 1,
369 _pptp_server_ip: 1,
370 _f_pptp_dhcp: 1,
371 _ppp_demand: 1,
372 _ppp_idletime: 1,
373 _ppp_redialperiod: 1,
374 _mtu_enable: 1,
375 _f_wan_mtu: 1,
376 _f_wan_islan: 0,
378 _dhcp_lease: 1,
379 _f_dhcpd_enable: 1,
380 _dhcpd_startip: 1,
381 _dhcpd_endip: 1,
382 _f_dns_1: 1,
383 _f_dns_2: 1,
384 _f_dns_3: 1,
385 _lan_gateway: 1,
386 _lan_ipaddr: 1,
387 _lan_netmask: 1,
388 _wan_wins: 1
391 var wl_vis = [];
392 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
393 a = {
394 _f_wl_radio: 1,
395 _f_wl_mode: 1,
396 _f_wl_nband: (bands[uidx].length > 1) ? 1 : 0,
397 _wl_net_mode: 1,
398 _wl_ssid: 1,
399 _f_wl_bcast: 1,
400 _wl_channel: 1,
401 _wl_nbw_cap: nphy ? 1 : 0,
402 _f_wl_nctrlsb: nphy ? 1 : 0,
403 _f_wl_scan: 1,
405 _wl_security_mode: 1,
406 _wl_crypto: 1,
407 _wl_wpa_psk: 1,
408 _f_wl_psk_random1: 1,
409 _f_wl_psk_random2: 1,
410 _wl_wpa_gtk_rekey: 1,
411 _wl_radius_key: 1,
412 _wl_radius_ipaddr: 1,
413 _wl_radius_port: 1,
414 _wl_wep_bit: 1,
415 _wl_passphrase: 1,
416 _f_wl_wep_gen: 1,
417 _f_wl_wep_random: 1,
418 _wl_key1: 1,
419 _wl_key2: 1,
420 _wl_key3: 1,
421 _wl_key4: 1,
423 _f_wl_lazywds: 1,
424 _f_wl_wds_0: 1
426 wl_vis.push(a);
429 var wan = E('_wan_proto').value;
431 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
432 wmode = E('_f_wl'+wl_unit(uidx)+'_mode').value;
434 if (wmode == 'wet') {
435 wan = 'disabled';
436 vis._wan_proto = 0;
437 vis._f_dhcpd_enable = 0;
438 vis._dhcp_lease = 0;
441 if ((wan == 'disabled') || (wmode == 'sta') || (wmode == 'wet')) {
442 vis._f_wan_islan = 1;
446 switch (wan) {
447 case 'disabled':
448 vis._ppp_username = 0;
449 vis._ppp_service = 0;
450 vis._ppp_custom = 0;
451 vis._l2tp_server_ip = 0;
452 vis._wan_ipaddr = 0;
453 vis._wan_netmask = 0;
454 vis._wan_gateway = 0;
455 vis._pptp_server_ip = 0;
456 vis._f_pptp_dhcp = 0;
457 vis._ppp_demand = 0;
458 vis._mtu_enable = 0;
459 vis._f_wan_mtu = 0;
460 break;
461 case 'dhcp':
462 vis._l2tp_server_ip = 0;
463 vis._ppp_demand = 0;
464 vis._ppp_service = 0;
465 vis._ppp_username = 0;
466 vis._ppp_custom = 0;
467 vis._pptp_server_ip = 0;
468 vis._f_pptp_dhcp = 0;
469 vis._wan_gateway = 0;
470 vis._wan_ipaddr = 0;
471 vis._wan_netmask = 0;
473 vis._lan_gateway = 0;
474 break;
475 case 'pppoe':
476 vis._l2tp_server_ip = 0;
477 vis._pptp_server_ip = 0;
478 vis._f_pptp_dhcp = 0;
479 vis._wan_gateway = 0;
480 vis._wan_ipaddr = 0;
481 vis._wan_netmask = 0;
483 vis._lan_gateway = 0;
484 break;
485 case 'static':
486 vis._l2tp_server_ip = 0;
487 vis._ppp_demand = 0;
488 vis._ppp_service = 0;
489 vis._ppp_username = 0;
490 vis._ppp_custom = 0;
491 vis._pptp_server_ip = 0;
492 vis._f_pptp_dhcp = 0;
494 vis._lan_gateway = 0;
495 break;
496 case 'pptp':
497 vis._l2tp_server_ip = 0;
498 vis._ppp_service = 0;
499 vis._wan_gateway = (!E('_f_pptp_dhcp').checked);
500 vis._wan_ipaddr = (!E('_f_pptp_dhcp').checked);
502 vis._lan_gateway = 0;
503 break;
504 case 'l2tp':
505 vis._pptp_server_ip = 0;
506 vis._ppp_service = 0;
507 vis._wan_gateway = (!E('_f_pptp_dhcp').checked);
508 vis._wan_ipaddr = (!E('_f_pptp_dhcp').checked);
510 vis._lan_gateway = 0;
511 break;
514 vis._ppp_idletime = (E('_ppp_demand').value == 1) && vis._ppp_demand
515 vis._ppp_redialperiod = !vis._ppp_idletime && vis._ppp_demand;
517 if (vis._mtu_enable) {
518 if (E('_mtu_enable').value == 0) {
519 vis._f_wan_mtu = 2;
520 a = E('_f_wan_mtu');
521 switch (E('_wan_proto').value) {
522 case 'pppoe':
523 a.value = 1492;
524 break;
525 case 'pptp':
526 case 'l2tp':
527 a.value = 1460;
528 break;
529 default:
530 a.value = 1500;
531 break;
536 if (!E('_f_dhcpd_enable').checked) vis._dhcp_lease = 0;
538 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
539 u = wl_unit(uidx);
540 wmode = E('_f_wl'+u+'_mode').value;
542 if (!E('_f_wl'+u+'_radio').checked) {
543 for (a in wl_vis[uidx]) {
544 wl_vis[uidx][a] = 2;
546 wl_vis[uidx]._f_wl_radio = 1;
547 wl_vis[uidx]._wl_nbw_cap = nphy ? 2 : 0;
548 wl_vis[uidx]._f_wl_nband = (bands[uidx].length > 1) ? 2 : 0;
551 switch (wmode) {
552 case 'apwds':
553 case 'wds':
554 break;
555 case 'wet':
556 case 'sta':
557 wl_vis[uidx]._f_wl_bcast = 0;
558 wl_vis[uidx]._wl_channel = 0;
559 wl_vis[uidx]._wl_nbw_cap = 0;
560 default:
561 wl_vis[uidx]._f_wl_lazywds = 0;
562 wl_vis[uidx]._f_wl_wds_0 = 0;
563 break;
566 sm2 = E('_wl'+u+'_security_mode').value;
567 switch (sm2) {
568 case 'disabled':
569 wl_vis[uidx]._wl_crypto = 0;
570 wl_vis[uidx]._wl_wep_bit = 0;
571 wl_vis[uidx]._wl_wpa_psk = 0;
572 wl_vis[uidx]._wl_radius_key = 0;
573 wl_vis[uidx]._wl_radius_ipaddr = 0;
574 wl_vis[uidx]._wl_wpa_gtk_rekey = 0;
575 break;
576 case 'wep':
577 wl_vis[uidx]._wl_crypto = 0;
578 wl_vis[uidx]._wl_wpa_psk = 0;
579 wl_vis[uidx]._wl_radius_key = 0;
580 wl_vis[uidx]._wl_radius_ipaddr = 0;
581 wl_vis[uidx]._wl_wpa_gtk_rekey = 0;
582 break;
583 case 'radius':
584 wl_vis[uidx]._wl_crypto = 0;
585 wl_vis[uidx]._wl_wpa_psk = 0;
586 break;
587 default: // wpa*
588 wl_vis[uidx]._wl_wep_bit = 0;
589 if (sm2.indexOf('personal') != -1) {
590 wl_vis[uidx]._wl_radius_key = 0;
591 wl_vis[uidx]._wl_radius_ipaddr = 0;
593 else {
594 wl_vis[uidx]._wl_wpa_psk = 0;
596 break;
599 if ((E('_f_wl'+u+'_lazywds').value == 1) && (wl_vis[uidx]._f_wl_wds_0 == 1)) {
600 wl_vis[uidx]._f_wl_wds_0 = 2;
603 if (wl_vis[uidx]._wl_nbw_cap != 0) {
604 switch (E('_wl'+u+'_net_mode').value) {
605 case 'b-only':
606 case 'g-only':
607 case 'a-only':
608 case 'bg-mixed':
609 wl_vis[uidx]._wl_nbw_cap = 2;
610 if (E('_wl'+u+'_nbw_cap').value != '0') {
611 E('_wl'+u+'_nbw_cap').value = 0;
612 refreshChannels(uidx);
614 break;
616 // avoid Enterprise-TKIP with 40MHz
617 if ((sm2 == 'wpa_enterprise') && (E('_wl'+u+'_crypto').value == 'tkip')) {
618 wl_vis[uidx]._wl_nbw_cap = 2;
619 if (E('_wl'+u+'_nbw_cap').value != '0') {
620 E('_wl'+u+'_nbw_cap').value = 0;
621 refreshChannels(uidx);
626 wl_vis[uidx]._f_wl_nctrlsb = (E('_wl'+u+'_nbw_cap').value == 0) ? 0 : wl_vis[uidx]._wl_nbw_cap;
628 /* REMOVE-BEGIN
629 This is ugly...
630 Special case - 2.4GHz band, currently running in B/G-only mode,
631 with N/Auto and 40MHz selected in the GUI.
632 Channel list is not filtered in this case by the wl driver,
633 and includes all channels available with 20MHz channel width.
634 REMOVE-END */
635 b = selectedBand(uidx);
636 if (wl_vis[uidx]._wl_channel == 1 && wl_vis[uidx]._f_wl_nctrlsb != 0 &&
637 ((b == '2') || (wl_vis[uidx]._f_wl_nband == 0 && b == '0'))) {
638 switch (eval('nvram.wl'+u+'_net_mode')) {
639 case 'b-only':
640 case 'g-only':
641 case 'bg-mixed':
642 i = E('_wl'+u+'_channel').value * 1;
643 if (i > 0 && i < 5) {
644 E('_f_wl'+u+'_nctrlsb').value = 'lower';
645 wl_vis[uidx]._f_wl_nctrlsb = 2;
647 else if (i > max_channel[uidx] - 4) {
648 E('_f_wl'+u+'_nctrlsb').value = 'upper';
649 wl_vis[uidx]._f_wl_nctrlsb = 2;
651 break;
655 wl_vis[uidx]._f_wl_scan = wl_vis[uidx]._wl_channel;
656 wl_vis[uidx]._f_wl_psk_random1 = wl_vis[uidx]._wl_wpa_psk;
657 wl_vis[uidx]._f_wl_psk_random2 = wl_vis[uidx]._wl_radius_key;
658 wl_vis[uidx]._wl_radius_port = wl_vis[uidx]._wl_radius_ipaddr;
659 wl_vis[uidx]._wl_key1 = wl_vis[uidx]._wl_key2 = wl_vis[uidx]._wl_key3 = wl_vis[uidx]._wl_key4 = wl_vis[uidx]._f_wl_wep_gen = wl_vis[uidx]._f_wl_wep_random = wl_vis[uidx]._wl_passphrase = wl_vis[uidx]._wl_wep_bit;
661 for (i = 1; i < 10; ++i) {
662 wl_vis[uidx]['_f_wl_wds_' + i] = wl_vis[uidx]._f_wl_wds_0;
664 } // for each wl_iface
668 vis._ppp_passwd = vis._ppp_username;
669 vis._dhcpd_startip = vis._dhcpd_endip = vis._wan_wins = vis._dhcp_lease;
671 for (a in vis) {
672 b = E(a);
673 c = vis[a];
674 b.disabled = (c != 1);
675 PR(b).style.display = c ? '' : 'none';
678 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
679 for (a in wl_vis[uidx]) {
680 i = 3;
681 if (a.substr(0, 6) == '_f_wl_') i = 5;
682 b = E(a.substr(0, i) + wl_unit(uidx) + a.substr(i, a.length));
683 c = wl_vis[uidx][a];
684 b.disabled = (c != 1);
685 PR(b).style.display = c ? '' : 'none';
689 // --- verify ---
691 ferror.clear('_wan_proto');
693 var wlclnt = 0;
694 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
695 u = wl_unit(uidx);
696 wmode = E('_f_wl'+u+'_mode').value;
697 sm2 = E('_wl'+u+'_security_mode').value;
699 /* REMOVE-BEGIN
700 if ((wl_vis[uidx]._f_wl_mode == 1) && (wmode != 'ap') && (sm2.substr(0, 4) == 'wpa2')) {
701 ferror.set('_wl'+u+'_security_mode', 'WPA2 is supported only in AP mode.', quiet || !ok);
702 ok = 0;
704 else ferror.clear('_wl'+u+'_security_mode');
705 REMOVE-END */
707 // --- N standard does not support WPA+TKIP ---
708 a = E('_wl'+u+'_crypto');
709 switch (E('_wl'+u+'_net_mode').value) {
710 case 'mixed':
711 case 'n-only':
712 if (nphy && (a.value == 'tkip') && (sm2.indexOf('wpa') != -1)) {
713 ferror.set(a, '<% translate("TKIP encryption is not supported with WPA / WPA2 in N mode"); %>.', quiet || !ok);
714 ok = 0;
716 else ferror.clear(a);
717 break;
720 a = E('_wl'+u+'_net_mode');
721 ferror.clear(a);
722 b = E('_f_wl'+u+'_mode');
723 ferror.clear(b);
724 if ((wmode == 'sta') || (wmode == 'wet')) {
725 ++wlclnt;
726 if (wlclnt > 1) {
727 ferror.set(b, '<% translate("Only one wireless interface can be configured in client mode"); %>.', quiet || !ok);
728 ok = 0;
730 else if (a.value == 'n-only') {
731 ferror.set(a, '<% translate("N-only is not supported in wireless client modes, use Auto"); %>.', quiet || !ok);
732 ok = 0;
736 a = E('_wl'+u+'_wpa_psk');
737 ferror.clear(a);
738 if (wl_vis[uidx]._wl_wpa_psk == 1) {
739 if ((a.value.length < 8) || ((a.value.length == 64) && (a.value.search(/[^0-9A-Fa-f]/) != -1))) {
740 ferror.set('_wl'+u+'_wpa_psk', '<% translate("Invalid pre-shared key. Please enter at least 8 characters or 64 hexadecimal digits"); %>.', quiet || !ok);
741 ok = 0;
745 // wl channel
746 if (((wmode == 'wds') || (wmode == 'apwds')) && (wl_vis[uidx]._wl_channel == 1) && (E('_wl'+u+'_channel').value == '0')) {
747 ferror.set('_wl'+u+'_channel', '<% translate("Fixed wireless channel required in WDS mode"); %>.', quiet || !ok);
748 ok = 0;
750 else ferror.clear('_wl'+u+'_channel');
752 if (E('_f_wl'+u+'_mode').value == 'sta') {
753 if ((wan == 'disabled') && (E('_f_wl'+u+'_radio').checked)) {
754 ferror.set('_wan_proto', '<% translate("Wireless Client mode requires a valid WAN setting (usually DHCP)"); %>.', quiet || !ok);
755 ok = 0;
760 // domain name or IP address
761 a = ['_l2tp_server_ip', '_pptp_server_ip'];
762 for (i = a.length - 1; i >= 0; --i)
763 if ((vis[a[i]]) && ((!v_length(a[i], 1, 1)) || ((!v_ip(a[i], 1)) && (!v_domain(a[i], 1))))) {
764 if (!quiet && ok) ferror.show(a[i]);
765 ok = 0;
768 // IP address
769 a = ['_wan_gateway','_wan_ipaddr','_lan_ipaddr', '_dhcpd_startip', '_dhcpd_endip'];
770 for (i = a.length - 1; i >= 0; --i)
771 if ((vis[a[i]]) && (!v_ip(a[i], quiet || !ok))) ok = 0;
773 // IP address, blank -> 0.0.0.0
774 a = ['_f_dns_1', '_f_dns_2', '_f_dns_3','_wan_wins','_lan_gateway'];
775 for (i = a.length - 1; i >= 0; --i)
776 if ((vis[a[i]]) && (!v_dns(a[i], quiet || !ok))) ok = 0;
778 // netmask
779 a = ['_wan_netmask','_lan_netmask'];
780 for (i = a.length - 1; i >= 0; --i)
781 if ((vis[a[i]]) && (!v_netmask(a[i], quiet || !ok))) ok = 0;
783 // range
784 a = [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500],
785 ['_dhcp_lease', 1, 10080]];
786 for (i = a.length - 1; i >= 0; --i) {
787 v = a[i];
788 if ((vis[v[0]]) && (!v_range(v[0], quiet || !ok, v[1], v[2]))) ok = 0;
791 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
792 u = wl_unit(uidx);
794 // IP address
795 a = ['_radius_ipaddr'];
796 for (i = a.length - 1; i >= 0; --i) {
797 if ((wl_vis[uidx]['_wl'+a[i]]) && (!v_ip('_wl'+u+a[i], quiet || !ok))) ok = 0;
800 // range
801 a = [['_wpa_gtk_rekey', 60, 7200], ['_radius_port', 1, 65535]];
802 for (i = a.length - 1; i >= 0; --i) {
803 v = a[i];
804 if ((wl_vis[uidx]['_wl'+v[0]]) && (!v_range('_wl'+u+v[0], quiet || !ok, v[1], v[2]))) ok = 0;
807 // length
808 a = [['_ssid', 1], ['_radius_key', 1]];
809 for (i = a.length - 1; i >= 0; --i) {
810 v = a[i];
811 if ((wl_vis[uidx]['_wl'+v[0]]) && (!v_length('_wl'+u+v[0], quiet || !ok, v[1], E('_wl'+u+v[0]).maxlength))) ok = 0;
814 if (wl_vis[uidx]._wl_key1) {
815 a = (E('_wl'+u+'_wep_bit').value == 128) ? 26 : 10;
816 for (i = 1; i <= 4; ++i) {
817 b = E('_wl'+u+'_key' + i);
818 b.maxLength = a;
819 if ((b.value.length > 0) || (E('_f_wl'+u+'_wepidx_' + i).checked)) {
820 if (!v_wep(b, quiet || !ok)) ok = 0;
822 else ferror.clear(b);
826 ferror.clear('_f_wl'+u+'_wds_0');
827 if (wl_vis[uidx]._f_wl_wds_0 == 1) {
828 b = 0;
829 for (i = 0; i < 10; ++i) {
830 a = E('_f_wl'+u+'_wds_' + i);
831 if (!v_macz(a, quiet || !ok)) ok = 0;
832 else if (!isMAC0(a.value)) b = 1;
834 if (!b) {
835 ferror.set('_f_wl'+u+'_wds_0', '<% translate("WDS MAC address required"); %>.', quiet || !ok);
836 ok = 0;
841 a = E('_dhcpd_startip');
842 b = E('_dhcpd_endip');
843 ferror.clear(a);
844 ferror.clear(b);
846 if ((vis._dhcp_lease) && (!a._error_msg) && (!b._error_msg)) {
847 c = aton(E('_lan_netmask').value);
848 d = aton(E('_lan_ipaddr').value) & c;
849 e = '<% translate("Invalid IP address or subnet mask"); %>';
850 if ((aton(a.value) & c) != d) {
851 ferror.set(a, e, quiet || !ok);
852 ok = 0;
854 if ((aton(b.value) & c) != d) {
855 ferror.set(b, e, quiet || !ok);
856 ok = 0;
860 if ((vis._dhcp_lease) && (!a._error_msg) && (!b._error_msg)) {
861 if (aton(a.value) > aton(b.value)) {
862 c = a.value;
863 a.value = b.value;
864 b.value = c;
867 elem.setInnerHTML('dhcp_count', '(' + ((aton(b.value) - aton(a.value)) + 1) + ')');
870 return ok;
873 function earlyInit()
875 verifyFields(null, 1);
878 function save()
880 var a, b, c;
881 var i;
882 var u, uidx, wmode, sm2, wradio;
884 if (!verifyFields(null, false)) return;
886 var fom = E('_fom');
888 fom.lan_proto.value = fom.f_dhcpd_enable.checked ? 'dhcp' : 'static';
890 fom.wan_mtu.value = fom.f_wan_mtu.value;
891 fom.wan_mtu.disabled = fom.f_wan_mtu.disabled;
893 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
894 u = wl_unit(uidx);
895 wmode = E('_f_wl'+u+'_mode').value;
896 sm2 = E('_wl'+u+'_security_mode').value;
897 wradio = E('_f_wl'+u+'_radio').checked;
899 E('_wl'+u+'_nband').value = selectedBand(uidx);
901 if (wmode == 'apwds') E('_wl'+u+'_mode').value = 'ap';
902 else E('_wl'+u+'_mode').value = wmode;
904 if (wmode == 'wet') {
905 fom.wan_proto.value = 'disabled';
906 fom.wan_proto.disabled = 0;
907 fom.lan_proto.value = 'static';
910 a = [];
911 for (i = 0; i < 10; ++i) a.push(E('_f_wl'+u+'_wds_' + i).value);
912 E('_wl'+u+'_wds').value = joinAddr(a);
914 if (wmode.indexOf('wds') != -1) {
915 E('_wl'+u+'_wds_enable').value = 1;
916 E('_wl'+u+'_lazywds').value = E('_f_wl'+u+'_lazywds').value;
917 if (E('_wl'+u+'_lazywds').value == 1) E('_wl'+u+'_wds').value = '';
919 else {
920 E('_wl'+u+'_wds_enable').value = 0;
921 E('_wl'+u+'_wds').value = '';
922 E('_wl'+u+'_lazywds').value = 0;
925 E('_wl'+u+'_radio').value = wradio ? 1 : 0;
926 E('_wl'+u+'_auth').value = eval('nvram.wl'+u+'_auth');
928 e = E('_wl'+u+'_akm');
929 switch (sm2) {
930 case 'disabled':
931 case 'radius':
932 case 'wep':
933 e.value = '';
934 break;
935 default:
936 c = [];
938 if (sm2.indexOf('personal') != -1) {
939 if (sm2.indexOf('wpa2_') == -1) c.push('psk');
940 if (sm2.indexOf('wpa_') == -1) c.push('psk2');
942 else {
943 if (sm2.indexOf('wpa2_') == -1) c.push('wpa');
944 if (sm2.indexOf('wpa_') == -1) c.push('wpa2');
946 c = c.join(' ');
947 e.value = c;
948 break;
950 E('_wl'+u+'_auth_mode').value = (sm2 == 'radius') ? 'radius' : 'none';
951 E('_wl'+u+'_wep').value = ((sm2 == 'radius') || (sm2 == 'wep')) ? 'enabled': 'disabled';
953 if (sm2.indexOf('wpa') != -1) E('_wl'+u+'_auth').value = 0;
955 E('_wl'+u+'_nreqd').value = 0;
956 E('_wl'+u+'_gmode').value = 1;
957 E('_wl'+u+'_nmode').value = 0;
958 E('_wl'+u+'_nmcsidx').value = -2; // Legacy Rate
959 E('_wl'+u+'_nbw').value = 0;
960 switch (E('_wl'+u+'_net_mode').value) {
961 case 'b-only':
962 E('_wl'+u+'_gmode').value = 0;
963 break;
964 case 'g-only':
965 E('_wl'+u+'_gmode').value = 4;
966 break;
967 case 'bg-mixed':
968 break;
969 case 'a-only':
970 E('_wl'+u+'_nmcsidx').value = -1; // Auto
971 break;
972 case 'n-only':
973 if (selectedBand(uidx) == '1') { // 5 GHz
974 E('_wl'+u+'_nmode').value = -1;
975 E('_wl'+u+'_nmcsidx').value = -1;
976 } else {
977 E('_wl'+u+'_nmode').value = 1;
978 E('_wl'+u+'_nmcsidx').value = 32;
980 E('_wl'+u+'_nreqd').value = 1;
981 break;
982 default: // Auto
983 E('_wl'+u+'_nmode').value = -1;
984 E('_wl'+u+'_nmcsidx').value = -1;
985 break;
988 E('_wl'+u+'_nctrlsb').value = eval('nvram.wl'+u+'_nctrlsb');
989 if (E('_wl'+u+'_nmode').value != 0) {
990 E('_wl'+u+'_nctrlsb').value = E('_f_wl'+u+'_nctrlsb').value;
991 E('_wl'+u+'_nbw').value = (E('_wl'+u+'_nbw_cap').value == 0) ? 20 : 40;
994 E('_wl'+u+'_closed').value = E('_f_wl'+u+'_bcast').checked ? 0 : 1;
996 a = fields.radio.selected(eval('fom.f_wl'+u+'_wepidx'));
997 if (a) E('_wl'+u+'_key').value = a.value;
1000 fom.wan_islan.value = fom.f_wan_islan.checked ? 1 : 0;
1001 fom.pptp_dhcp.value = fom.f_pptp_dhcp.checked ? 1 : 0;
1003 fom.wan_dns.value = joinAddr([fom.f_dns_1.value, fom.f_dns_2.value, fom.f_dns_3.value]);
1005 if (nvram.lan_ipaddr != fom.lan_ipaddr.value) {
1006 fom._moveip.value = 1;
1007 form.submit(fom);
1009 else {
1010 form.submit(fom, 1);
1014 function init()
1016 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1017 refreshNetModes(uidx);
1018 refreshChannels(uidx);
1021 </script>
1023 </head>
1024 <body onload='init()'>
1025 <form id='_fom' method='post' action='tomato.cgi'>
1026 <table id='container' cellspacing=0>
1027 <tr><td colspan=2 id='header'>
1028 <div class='title'>Tomato</div>
1029 <div class='version'><% translate("Version"); %> <% version(); %></div>
1030 </td></tr>
1031 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
1032 <td id='content'>
1033 <div id='ident'><% ident(); %></div>
1035 <!-- / / / -->
1037 <input type='hidden' name='_nextpage' value='basic-network.asp'>
1038 <input type='hidden' name='_nextwait' value='10'>
1039 <input type='hidden' name='_service' value='*'>
1040 <input type='hidden' name='_moveip' value='0'>
1042 <input type='hidden' name='wan_mtu'>
1043 <input type='hidden' name='wan_islan'>
1044 <input type='hidden' name='pptp_dhcp'>
1045 <input type='hidden' name='lan_proto'>
1046 <input type='hidden' name='wan_dns'>
1049 <div class='section-title'><% translate("WAN / Internet"); %></div>
1050 <div class='section'>
1051 <script type='text/javascript'>
1052 createFieldTable('', [
1053 { title: '<% translate("Type"); %>', name: 'wan_proto', type: 'select', options: [['dhcp','DHCP'],['pppoe','PPPoE'],['static','<% translate("Static"); %>'],['pptp','PPTP'],['l2tp','L2TP'],['disabled','<% translate("Disabled"); %>']],
1054 value: nvram.wan_proto },
1055 { title: '<% translate("Username"); %>', name: 'ppp_username', type: 'text', maxlen: 60, size: 64, value: nvram.ppp_username },
1056 { title: '<% translate("Password"); %>', name: 'ppp_passwd', type: 'password', maxlen: 60, size: 64, peekaboo: 1, value: nvram.ppp_passwd },
1057 { title: '<% translate("Service Name"); %>', name: 'ppp_service', type: 'text', maxlen: 50, size: 64, value: nvram.ppp_service },
1058 { title: '<% translate("L2TP Server"); %>', name: 'l2tp_server_ip', type: 'text', maxlen: 128, size: 64, value: nvram.l2tp_server_ip },
1059 { title: '<% translate("Use DHCP"); %>', name: 'f_pptp_dhcp', type: 'checkbox', value: (nvram.pptp_dhcp == 1) },
1060 { title: '<% translate("IP Address"); %>', name: 'wan_ipaddr', type: 'text', maxlen: 15, size: 17, value: nvram.wan_ipaddr },
1061 { title: '<% translate("Subnet Mask"); %>', name: 'wan_netmask', type: 'text', maxlen: 15, size: 17, value: nvram.wan_netmask },
1062 { title: '<% translate("Gateway"); %>', name: 'wan_gateway', type: 'text', maxlen: 15, size: 17, value: nvram.wan_gateway },
1063 { title: '<% translate("PPTP Gateway"); %>', name: 'pptp_server_ip', type: 'text', maxlen: 128, size: 64, value: nvram.pptp_server_ip },
1064 { title: '<% translate("Options"); %>', name: 'ppp_custom', type: 'text', maxlen: 256, size: 64, value: nvram.ppp_custom },
1065 { title: '<% translate("Connect Mode"); %>', name: 'ppp_demand', type: 'select', options: [['1', '<% translate("Connect On Demand"); %>'],['0', '<% translate("Keep Alive"); %>']],
1066 value: nvram.ppp_demand },
1067 { title: '<% translate("Max Idle Time"); %>', indent: 2, name: 'ppp_idletime', type: 'text', maxlen: 5, size: 7, suffix: ' <i>(<% translate("minutes"); %>)</i>',
1068 value: nvram.ppp_idletime },
1069 { title: '<% translate("Check Interval"); %>', indent: 2, name: 'ppp_redialperiod', type: 'text', maxlen: 5, size: 7, suffix: ' <i>(<% translate("seconds"); %>)</i>',
1070 value: nvram.ppp_redialperiod },
1071 { title: 'MTU', multi: [
1072 { name: 'mtu_enable', type: 'select', options: [['0', '<% translate("Default"); %>'],['1','<% translate("Manual"); %>']], value: nvram.mtu_enable },
1073 { name: 'f_wan_mtu', type: 'text', maxlen: 4, size: 6, value: nvram.wan_mtu } ] },
1074 { title: '<% translate("Use WAN port for LAN"); %>', name: 'f_wan_islan', type: 'checkbox', value: (nvram.wan_islan == 1) }
1076 </script>
1077 </div>
1079 <div class='section-title'>LAN</div>
1080 <div class='section'>
1081 <script type='text/javascript'>
1082 dns = nvram.wan_dns.split(/\s+/);
1083 ipp = nvram.lan_ipaddr.split('.').splice(0, 3).join('.');
1085 createFieldTable('', [
1086 { title: '<% translate("Router IP Address"); %>', name: 'lan_ipaddr', type: 'text', maxlen: 15, size: 17, value: nvram.lan_ipaddr },
1087 { title: '<% translate("Subnet Mask"); %>', name: 'lan_netmask', type: 'text', maxlen: 15, size: 17, value: nvram.lan_netmask },
1088 { title: '<% translate("Default Gateway"); %>', name: 'lan_gateway', type: 'text', maxlen: 15, size: 17, value: nvram.lan_gateway },
1089 { title: '<% translate("Static DNS"); %>', suffix: '&nbsp; <i>(IP:port)</i>', name: 'f_dns_1', type: 'text', maxlen: 21, size: 25, value: dns[0] || '0.0.0.0' },
1090 { title: '', name: 'f_dns_2', type: 'text', maxlen: 21, size: 25, value: dns[1] || '0.0.0.0' },
1091 { title: '', name: 'f_dns_3', type: 'text', maxlen: 21, size: 25, value: dns[2] || '0.0.0.0' },
1092 { title: '<% translate("DHCP Server"); %>', name: 'f_dhcpd_enable', type: 'checkbox', value: (nvram.lan_proto == 'dhcp') },
1093 { title: '<% translate("IP Address Range"); %>', indent: 2, multi: [
1094 { name: 'dhcpd_startip', type: 'text', maxlen: 15, size: 17, value: nvram.dhcpd_startip, suffix: ' - ' },
1095 { name: 'dhcpd_endip', type: 'text', maxlen: 15, size: 17, value: nvram.dhcpd_endip, suffix: ' <i id="dhcp_count"></i>' }
1096 ] },
1098 { title: '<% translate("Lease Time"); %>', indent: 2, name: 'dhcp_lease', type: 'text', maxlen: 6, size: 8, suffix: ' <i>(<% translate("minutes"); %>)</i>',
1099 value: (nvram.dhcp_lease > 0) ? nvram.dhcp_lease : 1440 },
1100 { title: '<% translate("WINS"); %>', indent: 2, name: 'wan_wins', type: 'text', maxlen: 15, size: 17, value: nvram.wan_wins }
1102 </script>
1103 </div>
1105 <script type='text/javascript'>
1107 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1109 var u = wl_unit(uidx);
1111 W('<input type=\'hidden\' id=\'_wl'+u+'_mode\' name=\'wl'+u+'_mode\'>');
1112 W('<input type=\'hidden\' id=\'_wl'+u+'_nband\' name=\'wl'+u+'_nband\'>');
1113 W('<input type=\'hidden\' id=\'_wl'+u+'_wds_enable\' name=\'wl'+u+'_wds_enable\'>');
1114 W('<input type=\'hidden\' id=\'_wl'+u+'_wds\' name=\'wl'+u+'_wds\'>');
1115 W('<input type=\'hidden\' id=\'_wl'+u+'_radio\' name=\'wl'+u+'_radio\'>');
1116 W('<input type=\'hidden\' id=\'_wl'+u+'_closed\' name=\'wl'+u+'_closed\'>');
1117 W('<input type=\'hidden\' id=\'_wl'+u+'_key\' name=\'wl'+u+'_key\'>');
1118 W('<input type=\'hidden\' id=\'_wl'+u+'_gmode\' name=\'wl'+u+'_gmode\'>');
1119 W('<input type=\'hidden\' id=\'_wl'+u+'_akm\' name=\'wl'+u+'_akm\'>');
1120 W('<input type=\'hidden\' id=\'_wl'+u+'_auth\' name=\'wl'+u+'_auth\'>');
1121 W('<input type=\'hidden\' id=\'_wl'+u+'_auth_mode\' name=\'wl'+u+'_auth_mode\'>');
1122 W('<input type=\'hidden\' id=\'_wl'+u+'_wep\' name=\'wl'+u+'_wep\'>');
1123 W('<input type=\'hidden\' id=\'_wl'+u+'_lazywds\' name=\'wl'+u+'_lazywds\'>');
1124 W('<input type=\'hidden\' id=\'_wl'+u+'_nmode\' name=\'wl'+u+'_nmode\'>');
1125 W('<input type=\'hidden\' id=\'_wl'+u+'_nmcsidx\' name=\'wl'+u+'_nmcsidx\'>');
1126 W('<input type=\'hidden\' id=\'_wl'+u+'_nreqd\' name=\'wl'+u+'_nreqd\'>');
1127 W('<input type=\'hidden\' id=\'_wl'+u+'_nctrlsb\' name=\'wl'+u+'_nctrlsb\'>');
1128 W('<input type=\'hidden\' id=\'_wl'+u+'_nbw\' name=\'wl'+u+'_nbw\'>');
1130 W('<div class=\'section-title\'><% translate("Wireless"); %>');
1131 if (wl_ifaces.length > 1)
1132 W(' (' + wl_display_ifname(uidx) + ')');
1133 W('</div>');
1135 W('<div class=\'section\'>');
1137 f = [
1138 { title: '<% translate("Enable Wireless"); %>', name: 'f_wl'+u+'_radio', type: 'checkbox',
1139 value: (eval('nvram.wl'+u+'_radio') == '1') && (eval('nvram.wl'+u+'_net_mode') != 'disabled') },
1140 { title: '<% translate("MAC Address"); %>', text: '<a href="advanced-mac.asp">' + eval('nvram.wl'+u+'_hwaddr') + '</a>' },
1141 { title: '<% translate("Wireless Mode"); %>', name: 'f_wl'+u+'_mode', type: 'select',
1142 options: [['ap', '<% translate("Access Point"); %>'],['apwds', '<% translate("Access Point + WDS"); %>'],['sta', '<% translate("Wireless Client"); %>'],['wet', '<% translate("Wireless Ethernet Bridge"); %>'],['wds', 'WDS']],
1143 value: ((eval('nvram.wl'+u+'_mode') == 'ap') && (eval('nvram.wl'+u+'_wds_enable') == '1')) ? 'apwds' : eval('nvram.wl'+u+'_mode') },
1144 { title: '<% translate("Radio Band"); %>', name: 'f_wl'+u+'_nband', type: 'select', options: bands[uidx],
1145 value: eval('nvram.wl'+u+'_nband') || '0' == '0' ? bands[uidx][0][0] : eval('nvram.wl'+u+'_nband') },
1146 { title: '<% translate("Wireless Network Mode"); %>', name: 'wl'+u+'_net_mode', type: 'select',
1147 value: (eval('nvram.wl'+u+'_net_mode') == 'disabled') ? 'mixed' : eval('nvram.wl'+u+'_net_mode'),
1148 options: [], prefix: '<span id="__wl'+u+'_net_mode">', suffix: '</span>' },
1149 { title: '<% translate("SSID"); %>', name: 'wl'+u+'_ssid', type: 'text', maxlen: 32, size: 34, value: eval('nvram.wl'+u+'_ssid') },
1150 { title: '<% translate("Broadcast"); %>', indent: 2, name: 'f_wl'+u+'_bcast', type: 'checkbox', value: (eval('nvram.wl'+u+'_closed') == '0') },
1151 { title: '<% translate("Channel"); %>', name: 'wl'+u+'_channel', type: 'select', options: ghz[uidx], prefix: '<span id="__wl'+u+'_channel">', suffix: '</span> <input type="button" id="_f_wl'+u+'_scan" value="<% translate("Scan"); %>" onclick="scanButton('+u+')"> <img src="spin.gif" id="spin'+u+'">',
1152 value: eval('nvram.wl'+u+'_channel') },
1153 { title: '<% translate("Channel Width"); %>', name: 'wl'+u+'_nbw_cap', type: 'select', options: [['0','20 MHz'],['1','40 MHz']],
1154 value: eval('nvram.wl'+u+'_nbw_cap') },
1155 { title: '<% translate("Control Sideband"); %>', name: 'f_wl'+u+'_nctrlsb', type: 'select', options: [['lower','<% translate("Lower"); %>'],['upper','<% translate("Upper"); %>']],
1156 value: eval('nvram.wl'+u+'_nctrlsb') == 'none' ? 'lower' : eval('nvram.wl'+u+'_nctrlsb') },
1157 null,
1158 { title: '<% translate("Security"); %>', name: 'wl'+u+'_security_mode', type: 'select',
1159 options: [['disabled','<% translate("Disabled"); %>'],['wep','WEP'],['wpa_personal','WPA Personal'],['wpa_enterprise','WPA Enterprise'],['wpa2_personal','WPA2 Personal'],['wpa2_enterprise','WPA2 Enterprise'],['wpaX_personal','WPA / WPA2 Personal'],['wpaX_enterprise','WPA / WPA2 Enterprise'],['radius','Radius']],
1160 value: eval('nvram.wl'+u+'_security_mode') },
1161 { title: '<% translate("Encryption"); %>', indent: 2, name: 'wl'+u+'_crypto', type: 'select',
1162 options: [['tkip','TKIP'],['aes','AES'],['tkip+aes','TKIP / AES']], value: eval('nvram.wl'+u+'_crypto') },
1163 { title: '<% translate("Shared Key"); %>', indent: 2, name: 'wl'+u+'_wpa_psk', type: 'password', maxlen: 64, size: 66, peekaboo: 1,
1164 suffix: ' <input type="button" id="_f_wl'+u+'_psk_random1" value="<% translate("Random"); %>" onclick="random_psk(\'_wl'+u+'_wpa_psk\')">',
1165 value: eval('nvram.wl'+u+'_wpa_psk') },
1166 { title: '<% translate("Shared Key"); %>', indent: 2, name: 'wl'+u+'_radius_key', type: 'password', maxlen: 80, size: 32, peekaboo: 1,
1167 suffix: ' <input type="button" id="_f_wl'+u+'_psk_random2" value="<% translate("Random"); %>" onclick="random_psk(\'_wl'+u+'_radius_key\')">',
1168 value: eval('nvram.wl'+u+'_radius_key') },
1169 { title: '<% translate("Group Key Renewal"); %>', indent: 2, name: 'wl'+u+'_wpa_gtk_rekey', type: 'text', maxlen: 4, size: 6, suffix: ' <i>(<% translate("seconds"); %>)</i>',
1170 value: eval('nvram.wl'+u+'_wpa_gtk_rekey') },
1171 { title: '<% translate("Radius Server"); %>', indent: 2, multi: [
1172 { name: 'wl'+u+'_radius_ipaddr', type: 'text', maxlen: 15, size: 17, value: eval('nvram.wl'+u+'_radius_ipaddr') },
1173 { name: 'wl'+u+'_radius_port', type: 'text', maxlen: 5, size: 7, prefix: ' : ', value: eval('nvram.wl'+u+'_radius_port') } ] },
1174 { title: '<% translate("Encryption"); %>', indent: 2, name: 'wl'+u+'_wep_bit', type: 'select', options: [['128','128-bits'],['64','64-bits']],
1175 value: eval('nvram.wl'+u+'_wep_bit') },
1176 { title: '<% translate("Passphrase"); %>', indent: 2, name: 'wl'+u+'_passphrase', type: 'text', maxlen: 16, size: 20,
1177 suffix: ' <input type="button" id="_f_wl'+u+'_wep_gen" value="Generate" onclick="generate_wep('+u+')"> <input type="button" id="_f_wl'+u+'_wep_random" value="<% translate("Random"); %>" onclick="random_wep('+u+')">',
1178 value: eval('nvram.wl'+u+'_passphrase') }
1181 for (i = 1; i <= 4; ++i) {
1182 f.push(
1183 { title: ('<% translate("Key"); %> ' + i), indent: 2, name: ('wl'+u+'_key' + i), type: 'text', maxlen: 26, size: 34,
1184 suffix: '<input type="radio" onchange="verifyFields(this,1)" onclick="verifyFields(this,1)" name="f_wl'+u+'_wepidx" id="_f_wl'+u+'_wepidx_' + i + '" value="' + i + '"' + ((eval('nvram.wl'+u+'_key') == i) ? ' checked>' : '>'),
1185 value: nvram['wl'+u+'_key' + i] });
1188 f.push(null,
1189 { title: 'WDS', name: 'f_wl'+u+'_lazywds', type: 'select',
1190 options: [['0','<% translate("Link With"); %>...'],['1','<% translate("Automatic"); %>']], value: nvram['wl'+u+'_lazywds'] } );
1191 wds = eval('nvram.wl'+u+'_wds').split(/\s+/);
1192 for (i = 0; i < 10; i += 2) {
1193 f.push({ title: (i ? '' : '<% translate("MAC Address"); %>'), indent: 2, multi: [
1194 { name: 'f_wl'+u+'_wds_' + i, type: 'text', maxlen: 17, size: 20, value: wds[i] || '00:00:00:00:00:00' },
1195 { name: 'f_wl'+u+'_wds_' + (i + 1), type: 'text', maxlen: 17, size: 20, value: wds[i + 1] || '00:00:00:00:00:00' } ] } );
1198 createFieldTable('', f);
1199 W('</div>');
1202 // for each wlif
1203 </script>
1206 <!-- / / / -->
1208 </td></tr>
1209 <tr><td id='footer' colspan=2>
1210 <span id='footer-msg'></span>
1211 <input type='button' value='<% translate("Save"); %>' id='save-button' onclick='save()'>
1212 <input type='button' value='<% translate("Cancel"); %>' id='cancel-button' onclick='reloadPage();'>
1213 </td></tr>
1214 </table>
1215 </form>
1216 <script type='text/javascript'>earlyInit()</script>
1217 <div style='height:100px'></div>
1218 </body>
1219 </html>