1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML
4.0//EN'
>
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.
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>
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
)+', ');
33 W(' visibility: hidden;');
34 W(' vertical-align: middle;');
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);
50 var nm_loaded
= [], ch_loaded
= [], max_channel
= [];
52 for (var uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
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']);
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';
81 function refreshNetModes(uidx
)
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"); %>']);
92 m
.push(['n-only','<% translate("N Only"); %>']);
96 m
.push(['b-only','<% translate("B Only"); %>']);
97 m
.push(['g-only','<% translate("G Only"); %>']);
99 m
.push(['bg-mixed','<% translate("B/G Mixed"); %>']);
100 m
.push(['n-only','<% translate("N Only"); %>']);
104 e
= E('_wl'+u
+'_net_mode');
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
);
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
) {
128 var wl_channels
= [];
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');
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
);
150 refresher
[uidx
] = null;
151 verifyFields(null, 1);
155 refresher
[uidx
] = null;
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';
185 var unit
= wscan
.unit
;
186 var uidx
= wl_uidx(unit
);
189 xob
.onCompleted = function(text
, xml
) {
196 for (i
= 0; i
< wlscandata
.length
; ++i
) {
197 var data
= wlscandata
[i
];
201 if (!wscan
.inuse
[ch
]) {
209 if (!wscan
.seen
[mac
]) {
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';
230 if (wscan
.tries
< 4) {
232 setTimeout(scan
, 1000);
240 xob
.onError = function(x
) {
241 alert('error: ' + x
);
247 xob
.post('update.cgi', 'exec=wlscan&arg0='+unit
);
250 function scanButton(u
)
264 function joinAddr(a
) {
268 for (i
= 0; i
< a
.length
; ++i
) {
270 if ((s
!= '00:00:00:00:00:00') && (s
!= '0.0.0.0')) r
.push(s
);
275 function random_x(max
)
277 var c
= '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
279 while (max
-- > 0) s
+= c
.substr(Math
.floor(c
.length
* Math
.random()), 1);
283 function random_psk(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);
296 function v_wep(e
, quiet
)
300 if (((s
.length
== 5) || (s
.length
== 13)) && (s
.length
== (e
.maxLength
>> 1))) {
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
);
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');
327 if (!v_length(e
, false, 3)) return;
328 E('_wl'+u
+'_key1').value
= _wepgen(pass
, 0);
330 E('_wl'+u
+'_key2').value
= _wepgen(pass
, 2);
332 E('_wl'+u
+'_key3').value
= _wepgen(pass
, 4);
334 E('_wl'+u
+'_key4').value
= _wepgen(pass
, 6);
335 verifyFields(null, 1);
338 function verifyFields(focused
, quiet
)
346 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++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 ---
373 _ppp_redialperiod
: 1,
392 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
396 _f_wl_nband
: (bands
[uidx
].length
> 1) ? 1 : 0,
401 _wl_nbw_cap
: nphy
? 1 : 0,
402 _f_wl_nctrlsb
: nphy
? 1 : 0,
405 _wl_security_mode
: 1,
408 _f_wl_psk_random1
: 1,
409 _f_wl_psk_random2
: 1,
410 _wl_wpa_gtk_rekey
: 1,
412 _wl_radius_ipaddr
: 1,
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') {
437 vis
._f_dhcpd_enable
= 0;
441 if ((wan
== 'disabled') || (wmode
== 'sta') || (wmode
== 'wet')) {
442 vis
._f_wan_islan
= 1;
448 vis
._ppp_username
= 0;
449 vis
._ppp_service
= 0;
451 vis
._l2tp_server_ip
= 0;
453 vis
._wan_netmask
= 0;
454 vis
._wan_gateway
= 0;
455 vis
._pptp_server_ip
= 0;
456 vis
._f_pptp_dhcp
= 0;
462 vis
._l2tp_server_ip
= 0;
464 vis
._ppp_service
= 0;
465 vis
._ppp_username
= 0;
467 vis
._pptp_server_ip
= 0;
468 vis
._f_pptp_dhcp
= 0;
469 vis
._wan_gateway
= 0;
471 vis
._wan_netmask
= 0;
473 vis
._lan_gateway
= 0;
476 vis
._l2tp_server_ip
= 0;
477 vis
._pptp_server_ip
= 0;
478 vis
._f_pptp_dhcp
= 0;
479 vis
._wan_gateway
= 0;
481 vis
._wan_netmask
= 0;
483 vis
._lan_gateway
= 0;
486 vis
._l2tp_server_ip
= 0;
488 vis
._ppp_service
= 0;
489 vis
._ppp_username
= 0;
491 vis
._pptp_server_ip
= 0;
492 vis
._f_pptp_dhcp
= 0;
494 vis
._lan_gateway
= 0;
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;
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;
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) {
521 switch (E('_wan_proto').value
) {
536 if (!E('_f_dhcpd_enable').checked
) vis
._dhcp_lease
= 0;
538 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
540 wmode
= E('_f_wl'+u
+'_mode').value
;
542 if (!E('_f_wl'+u
+'_radio').checked
) {
543 for (a
in wl_vis
[uidx
]) {
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;
557 wl_vis
[uidx
]._f_wl_bcast
= 0;
558 wl_vis
[uidx
]._wl_channel
= 0;
559 wl_vis
[uidx
]._wl_nbw_cap
= 0;
561 wl_vis
[uidx
]._f_wl_lazywds
= 0;
562 wl_vis
[uidx
]._f_wl_wds_0
= 0;
566 sm2
= E('_wl'+u
+'_security_mode').value
;
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;
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;
584 wl_vis
[uidx
]._wl_crypto
= 0;
585 wl_vis
[uidx
]._wl_wpa_psk
= 0;
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;
594 wl_vis
[uidx
]._wl_wpa_psk
= 0;
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
) {
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
);
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
;
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.
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')) {
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;
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
;
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
]) {
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
));
684 b
.disabled
= (c
!= 1);
685 PR(b
).style
.display
= c
? '' : 'none';
691 ferror
.clear('_wan_proto');
694 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
696 wmode
= E('_f_wl'+u
+'_mode').value
;
697 sm2
= E('_wl'+u
+'_security_mode').value
;
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);
704 else ferror.clear('_wl'+u+'_security_mode');
707 // --- N standard does not support WPA+TKIP ---
708 a
= E('_wl'+u
+'_crypto');
709 switch (E('_wl'+u
+'_net_mode').value
) {
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
);
716 else ferror
.clear(a
);
720 a
= E('_wl'+u
+'_net_mode');
722 b
= E('_f_wl'+u
+'_mode');
724 if ((wmode
== 'sta') || (wmode
== 'wet')) {
727 ferror
.set(b
, '<% translate("Only one wireless interface can be configured in client mode"); %>.', quiet
|| !ok
);
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
);
736 a
= E('_wl'+u
+'_wpa_psk');
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
);
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
);
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
);
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
]);
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;
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;
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
) {
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
) {
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;
801 a
= [['_wpa_gtk_rekey', 60, 7200], ['_radius_port', 1, 65535]];
802 for (i
= a
.length
- 1; i
>= 0; --i
) {
804 if ((wl_vis
[uidx
]['_wl'+v
[0]]) && (!v_range('_wl'+u
+v
[0], quiet
|| !ok
, v
[1], v
[2]))) ok
= 0;
808 a
= [['_ssid', 1], ['_radius_key', 1]];
809 for (i
= a
.length
- 1; i
>= 0; --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
);
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) {
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;
835 ferror
.set('_f_wl'+u
+'_wds_0', '<% translate("WDS MAC address required"); %>.', quiet
|| !ok
);
841 a
= E('_dhcpd_startip');
842 b
= E('_dhcpd_endip');
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
);
854 if ((aton(b
.value
) & c
) != d
) {
855 ferror
.set(b
, e
, quiet
|| !ok
);
860 if ((vis
._dhcp_lease
) && (!a
._error_msg
) && (!b
._error_msg
)) {
861 if (aton(a
.value
) > aton(b
.value
)) {
867 elem
.setInnerHTML('dhcp_count', '(' + ((aton(b
.value
) - aton(a
.value
)) + 1) + ')');
875 verifyFields(null, 1);
882 var u
, uidx
, wmode
, sm2
, wradio
;
884 if (!verifyFields(null, false)) return;
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
) {
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';
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
= '';
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');
938 if (sm2
.indexOf('personal') != -1) {
939 if (sm2
.indexOf('wpa2_') == -1) c
.push('psk');
940 if (sm2
.indexOf('wpa_') == -1) c
.push('psk2');
943 if (sm2
.indexOf('wpa2_') == -1) c
.push('wpa');
944 if (sm2
.indexOf('wpa_') == -1) c
.push('wpa2');
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
) {
962 E('_wl'+u
+'_gmode').value
= 0;
965 E('_wl'+u
+'_gmode').value
= 4;
970 E('_wl'+u
+'_nmcsidx').value
= -1; // Auto
973 if (selectedBand(uidx
) == '1') { // 5 GHz
974 E('_wl'+u
+'_nmode').value
= -1;
975 E('_wl'+u
+'_nmcsidx').value
= -1;
977 E('_wl'+u
+'_nmode').value
= 1;
978 E('_wl'+u
+'_nmcsidx').value
= 32;
980 E('_wl'+u
+'_nreqd').value
= 1;
983 E('_wl'+u
+'_nmode').value
= -1;
984 E('_wl'+u
+'_nmcsidx').value
= -1;
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;
1010 form
.submit(fom
, 1);
1016 for (var uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1017 refreshNetModes(uidx
);
1018 refreshChannels(uidx
);
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>
1031 <tr id='body'
><td id='navi'
><script type='text/javascript'
>navi()</script></td>
1033 <div id='ident'
><%
ident(); %></div>
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) }
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
: ' <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>' }
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
}
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
) + ')');
1135 W('<div class=\'section\'>');
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') },
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
) {
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
] });
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
);
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();'
>
1216 <script type='text/javascript'
>earlyInit()</script>
1217 <div style='height:
100px'
></div>