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(); %>] Basic: Network
</title>
15 <link rel='stylesheet' type='text/css' href='tomato.css'
>
17 <script type='text/javascript' src='tomato.js'
></script>
21 <style type='text/css'
>
38 vertical-align: middle
;
42 <script type='text/javascript' src='debug.js'
></script>
44 <script type='text/javascript' src='md5.js'
></script>
45 <script type='text/javascript' src='wireless.jsx?_http_id=<%
nv(http_id
); %>'
></script>
46 <script type='text/javascript' src='interfaces.js'
></script>
47 <script type='text/javascript'
>
48 // <% 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,lan_ifname,lan_stp,lan1_ifname,lan1_ipaddr,lan1_netmask,lan1_proto,lan1_stp,dhcp1_start,dhcp1_num,dhcp1_lease,dhcpd1_startip,dhcpd1_endip,lan2_ifname,lan2_ipaddr,lan2_netmask,lan2_proto,lan2_stp,dhcp2_start,dhcp2_num,dhcp2_lease,dhcpd2_startip,dhcpd2_endip,lan3_ifname,lan3_ipaddr,lan3_netmask,lan3_proto,lan3_stp,dhcp3_start,dhcp3_num,dhcp3_lease,dhcpd3_startip,dhcpd3_endip,ppp_mlppp,modem_ipaddr,modem_pin,modem_dev,modem_init,modem_apn,cstats_enable"); %>
51 var lg
= new TomatoGrid();
52 lg
.setup = function() {
53 this.init('lan-grid', '', 4, [
54 { type
: 'select', options
: [[0, '0'],[1, '1'],[2, '2'],[3, '3']], prefix
: '<div class="centered">', suffix
: '</div>' },
55 { type
: 'checkbox', prefix
: '<div class="centered">', suffix
: '</div>' },
56 { type
: 'text', maxlen
: 15, size
: 17 },
57 { type
: 'text', maxlen
: 15, size
: 17 },
58 { type
: 'checkbox', prefix
: '<div class="centered">', suffix
: '</div>' },
59 { multi
: [ { type
: 'text', maxlen
: 15, size
: 17}, { type
: 'text', maxlen
: 15, size
: 17 } ] },
60 { type
: 'text', maxlen
: 6, size
: 8 }] );
61 this.headerSet(['Bridge', 'STP', 'IP Address', 'Netmask', 'DHCP', 'IP Range <i>(first/last)</i>', 'Lease Time <i>(mins)</i>']);
64 for (var i
= 0 ; i
<= MAX_BRIDGE_ID
; i
++) {
65 var j
= (i
== 0) ? '' : i
.toString();
66 if (nvram
['lan' + j
+ '_ifname'].length
> 0) {
67 if ((!fixIP(nvram
['dhcpd' + j
+ '_startip'])) || (!fixIP(nvram
['dhcpd' + j
+ '_endip']))) {
68 if ((fixIP(nvram
['lan' + j
+ '_ipaddr'])) && (fixIP(nvram
['lan' + j
+ '_netmask'])) && (nvram
['dhcp' + j
+ '_start'] != '')) {
69 var n
= getNetworkAddress(nvram
['lan' + j
+ '_ipaddr'], nvram
['lan' + j
+ '_netmask']);
70 nvram
['dhcpd' + j
+ '_startip'] = getAddress(('0.0.0.' + nvram
['dhcp' + j
+ '_start'] * 1), n
);
71 nvram
['dhcpd' + j
+ '_endip'] = getAddress(('0.0.0.' + ((nvram
['dhcp' + j
+ '_start'] * 1) + (nvram
['dhcp' + j
+ '_num'] *1) - 1)), n
);
76 nvram
['lan' + j
+ '_stp'],
77 nvram
['lan' + j
+ '_ipaddr'],
78 nvram
['lan' + j
+ '_netmask'],
79 (nvram
['lan' + j
+ '_proto'] == 'dhcp') ? '1' : '0',
80 nvram
['dhcpd' + j
+ '_startip'],
81 nvram
['dhcpd' + j
+ '_endip'],
82 (nvram
['lan' + j
+ '_proto'] == 'dhcp') ? (((nvram
['dhcp' + j
+ '_lease'])*1 == 0) ? '1440' : (nvram
['dhcp' + j
+ '_lease']).toString()) : ''
89 elem
.removeClass(lg
.header
.cells
[lg
.sortColumn
], 'sortasc', 'sortdes');
94 lg
.dataToView = function(data
) {
95 return ['br' + data
[0],
96 (data
[1].toString() == '1') ? '<small><i>Enabled</i></small>' : '<small><i>Disabled</i></small>',
99 (data
[4].toString() == '1') ? '<small><i>Enabled</i></small>' : '<small><i>Disabled</i></small>',
100 (data
[5].toString() + ((numberOfBitsOnNetMask(data
[3])>=24) ? (' - ' + data
[6].split('.').splice(3, 1).toString()) : ('<br>' + data
[6].toString()) )),
101 (((data
[7] != null) && (data
[7] != '')) ? data
[7] : '') ];
104 lg
.dataToFieldValues = function (data
) {
106 (data
[1] != 0) ? 'checked' : '',
109 (data
[4].toString() == '1') ? 'checked' : '',
112 data
[7].toString() ];
115 lg
.fieldValuesToData = function(row
) {
116 var f
= fields
.getAll(row
);
118 f
[1].checked
? 1 : 0,
121 f
[4].checked
? 1 : 0,
127 lg
.resetNewEditor = function() {
128 var f
= fields
.getAll(this.newEditor
);
129 f
[0].selectedIndex
=0;
130 var t
= MAX_BRIDGE_ID
;
131 while((this.countBridge(f
[0].selectedIndex
) > 0) && (t
> 0)) {
132 f
[0].selectedIndex
= (f
[0].selectedIndex
%(MAX_BRIDGE_ID
))+1;
135 for(var j
=0; j
<= MAX_BRIDGE_ID
; j
++) {
136 f
[0].options
[j
].disabled
= (this.countBridge(j
) > 0);
149 ferror
.clearAll(fields
.getAll(this.newEditor
));
152 lg
.onCancel = function() {
155 this.disableNewEditor(false);
157 this.resetNewEditor();
160 lg
.onAdd = function() {
166 if (!this.verifyFields(this.newEditor
, false)) return;
168 data
= this.fieldValuesToData(this.newEditor
);
169 this.insertData(-1, data
);
171 this.disableNewEditor(false);
172 this.resetNewEditor();
177 lg
.onOK = function() {
180 if (!this.verifyFields(this.editor
, false)) return;
182 data
= this.fieldValuesToData(this.editor
);
183 view
= this.dataToView(data
);
185 this.source
.setRowData(data
);
186 for (i
= 0; i
< this.source
.cells
.length
; ++i
) {
187 this.source
.cells
[i
].innerHTML
= view
[i
];
192 this.disableNewEditor(false);
195 this.resetNewEditor();
198 lg
.onDelete = function() {
200 elem
.remove(this.source
);
202 this.disableNewEditor(false);
204 this.resetNewEditor();
207 lg
.countElem = function(f
, v
) {
208 var data
= this.getAllData();
210 for (var i
= 0; i
< data
.length
; ++i
) {
211 total
+= (data
[i
][f
] == v
) ? 1 : 0;
216 lg
.countBridge = function (v
) {
217 return this.countElem(0,v
);
220 lg
.countOverlappingNetworks = function (ip
) {
221 var data
= this.getAllData();
223 for (var i
= 0; i
< data
.length
; ++i
) {
224 var net
= getNetworkAddress(data
[i
][2], data
[i
][3]);
225 var brd
= getBroadcastAddress(net
, data
[i
][3]);
226 total
+= ((aton(ip
) <= aton(brd
)) && (aton(ip
) >= aton(net
))) ? 1 : 0;
231 lg
.verifyFields = function(row
, quiet
) {
235 f
= fields
.getAll(row
);
237 for(var j
=0; j
<= MAX_BRIDGE_ID
; j
++) {
238 f
[0].options
[j
].disabled
= (this.countBridge(j
) > 0);
241 if(this.countBridge(f
[0].selectedIndex
) > 0) {
242 ferror
.set(f
[0], 'Cannot add another entry for bridge br' + f
[0].selectedIndex
, quiet
);
248 if(!v_ip(f
[2], quiet
|| !ok
))
250 // if we have a properly defined IP address - 0.0.0.0 is NOT a valid IP address for our intents/purposes!
251 if ((f
[2].value
!= '') && (f
[2].value
!= '0.0.0.0')) {
252 // allow DHCP to be enabled
255 if(!v_netmask(f
[3], quiet
|| !ok
)) {
258 // must be class B-equivalent or smaller network when cstats/iptraffic is enabled
259 if ((nvram
.cstats_enable
== '1') && (numberOfBitsOnNetMask(f
[3].value
) < 16)) {
260 ferror
.set(f
[3], 'Netmask must have at least 16 bits set (255.255.0.0) with IP Traffic monitoring enabled', quiet
);
266 if(f
[2].value
== getNetworkAddress(f
[2].value
, f
[3].value
)) {
267 var s
= 'Invalid IP address or subnet mask (the address of the network cannot be used)';
268 ferror
.set(f
[2], s
, quiet
);
269 ferror
.set(f
[3], s
, quiet
);
272 if(f
[2].value
== getBroadcastAddress(getNetworkAddress(f
[2].value
, f
[3].value
), f
[3].value
)) {
273 var s
= 'Invalid IP address or subnet mask (the broadcast address cannot be used)';
274 ferror
.set(f
[2], s
, quiet
);
275 ferror
.set(f
[3], s
, quiet
);
278 if (this.countOverlappingNetworks(f
[2].value
) > 0) {
279 var s
= 'Invalid IP address or subnet mask (conflicts/overlaps with another LAN bridge)';
280 ferror
.set(f
[2], s
, quiet
);
281 ferror
.set(f
[3], s
, quiet
);
292 if( (f
[4].checked
) && (v_ip(f
[2], 1)) && (v_netmask(f
[3],1)) ) {
296 // first/last IP still unset?
297 if (f
[5].value
== '') {
299 var m
= aton(f
[2].value
) & aton(f
[3].value
);
300 var o
= (m
) ^ (~ aton(f
[3].value
))
308 } while (((l
= fixIP(ntoa(m
), 1)) == null) || (l
== f
[2].value
) );
311 if (f
[6].value
== '') {
313 var m
= aton(f
[2].value
) & aton(f
[3].value
);
314 var o
= (m
) ^ (~ aton(f
[3].value
));
322 } while (((l
= fixIP(ntoa(o
), 1)) == null) || (l
== f
[2].value
) );
326 if ((getNetworkAddress(f
[5].value
, f
[3].value
) != getNetworkAddress(f
[2].value
, f
[3].value
)) ||
327 (f
[5].value
== getBroadcastAddress(getNetworkAddress(f
[2].value
, f
[3].value
), f
[3].value
)) ||
328 (f
[5].value
== getNetworkAddress(f
[2].value
, f
[3].value
)) ||
329 (f
[2].value
== f
[5].value
)) {
330 ferror
.set(f
[5], 'Invalid first IP address or subnet mask', quiet
|| !ok
);
336 if ((getNetworkAddress(f
[6].value
, f
[3].value
) != getNetworkAddress(f
[2].value
, f
[3].value
)) ||
337 (f
[6].value
== getBroadcastAddress(getNetworkAddress(f
[2].value
, f
[3].value
), f
[3].value
)) ||
338 (f
[6].value
== getNetworkAddress(f
[2].value
, f
[3].value
)) ||
339 (f
[2].value
== f
[6].value
)) {
340 ferror
.set(f
[6], 'Invalid last IP address or subnet mask', quiet
|| !ok
);
345 // validate range, swap first/last IP if needed
346 if (aton(f
[6].value
) < aton(f
[5].value
)) {
348 f
[5].value
= f
[6].value
;
352 if (parseInt(f
[7].value
*1) == 0)
353 f
[7].value
= 1440; // from nvram/defaults.c
354 if(!v_mins(f
[7], quiet
|| !ok
, 1, 10080))
368 W('<style type=\'text/css\'>');
369 for (var u
= 0; u
< wl_ifaces
.length
; ++u
) {
370 W('#spin'+wl_unit(u
)+', ');
373 W(' visibility: hidden;');
374 W(' vertical-align: middle;');
380 var nphy
= features('11n');
383 if ((!fixIP(nvram
.dhcpd_startip
)) || (!fixIP(nvram
.dhcpd_endip
))) {
384 var x
= nvram
.lan_ipaddr
.split('.').splice(0, 3).join('.') + '.';
385 nvram
.dhcpd_startip
= x
+ nvram
.dhcp_start
;
386 nvram
.dhcpd_endip
= x
+ ((nvram
.dhcp_start
* 1) + (nvram
.dhcp_num
* 1) - 1);
392 var nm_loaded
= [], ch_loaded
= [], max_channel
= [];
394 for (var uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
395 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
396 if (wl_sunit(uidx
)<0) {
399 for (var i
= 0; i
< wl_bands
[uidx
].length
; ++i
) {
400 b
.push([wl_bands
[uidx
][i
] + '', (wl_bands
[uidx
][i
] == '1') ? '5 GHz' : '2.4 GHz']);
410 refresher
.push(null);
414 function selectedBand(uidx
)
416 if (bands
[uidx
].length
> 1) {
417 var e
= E('_f_wl'+u
+'_nband');
418 return (e
.value
+ '' == '' ? eval('nvram.wl'+u
+'_nband') : e
.value
);
419 } else if (bands
[uidx
].length
> 0) {
420 return bands
[uidx
][0][0] || '0';
426 function refreshNetModes(uidx
)
430 if (uidx
>= wl_ifaces
.length
) return;
431 var u
= wl_unit(uidx
);
433 var m
= [['mixed','Auto']];
434 if (selectedBand(uidx
) == '1') {
435 m
.push(['a-only','A Only']);
437 m
.push(['n-only','N Only']);
441 m
.push(['b-only','B Only']);
442 m
.push(['g-only','G Only']);
444 m
.push(['bg-mixed','B/G Mixed']);
445 m
.push(['n-only','N Only']);
449 e
= E('_wl'+u
+'_net_mode');
451 val
= (!nm_loaded
[uidx
] || (e
.value
+ '' == '')) ? eval('nvram.wl'+u
+'_net_mode') : e
.value
;
452 if (val
== 'disabled') val
= 'mixed';
453 for (i
= 0; i
< m
.length
; ++i
)
454 buf
+= '<option value="' + m
[i
][0] + '"' + ((m
[i
][0] == val
) ? ' selected' : '') + '>' + m
[i
][1] + '</option>';
456 e
= E('__wl'+u
+'_net_mode');
457 buf
= '<select name="wl'+u
+'_net_mode" onchange="verifyFields(this, 1)" id = "_wl'+u
+'_net_mode">' + buf
+ '</select>';
458 elem
.setInnerHTML(e
, buf
);
462 function refreshChannels(uidx
)
464 if (refresher
[uidx
] != null) return;
465 if (u
>= wl_ifaces
.length
) return;
466 var u
= wl_unit(uidx
);
468 refresher
[uidx
] = new XmlHttp();
469 refresher
[uidx
].onCompleted = function(text
, xml
) {
473 var wl_channels
= [];
477 max_channel
[uidx
] = 0;
478 for (i
= 0; i
< wl_channels
.length
; ++i
) {
479 ghz
[uidx
].push([wl_channels
[i
][0] + '',
480 (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] + '') : 'Auto']);
481 max_channel
[uidx
] = wl_channels
[i
][0] * 1;
484 e
= E('_wl'+u
+'_channel');
486 val
= (!ch_loaded
[uidx
] || (e
.value
+ '' == '')) ? eval('nvram.wl'+u
+'_channel') : e
.value
;
487 for (i
= 0; i
< ghz
[uidx
].length
; ++i
)
488 buf
+= '<option value="' + ghz
[uidx
][i
][0] + '"' + ((ghz
[uidx
][i
][0] == val
) ? ' selected' : '') + '>' + ghz
[uidx
][i
][1] + '</option>';
490 e
= E('__wl'+u
+'_channel');
491 buf
= '<select name="wl'+u
+'_channel" onchange="verifyFields(this, 1)" id = "_wl'+u
+'_channel">' + buf
+ '</select>';
492 elem
.setInnerHTML(e
, buf
);
495 refresher
[uidx
] = null;
496 verifyFields(null, 1);
500 refresher
[uidx
] = null;
505 e
= E('_f_wl'+u
+'_nctrlsb');
506 sb
= (e
.value
+ '' == '' ? eval('nvram.wl'+u
+'_nctrlsb') : e
.value
);
507 e
= E('_wl'+u
+'_nbw_cap');
508 bw
= (e
.value
+ '' == '' ? eval('nvram.wl'+u
+'_nbw_cap') : e
.value
) == '0' ? '20' : '40';
510 refresher
[uidx
].onError = function(ex
) { alert(ex
); refresher
[uidx
] = null; reloadPage(); }
511 refresher
[uidx
].post('update.cgi', 'exec=wlchannels&arg0=' + u
+ '&arg1=' + (nphy
? '1' : '0') +
512 '&arg2=' + bw
+ '&arg3=' + selectedBand(uidx
) + '&arg4=' + sb
);
515 function spin(x
, unit
)
517 for (var u
= 0; u
< wl_ifaces
.length
; ++u
) {
518 E('_f_wl'+wl_unit(u
)+'_scan').disabled
= x
;
520 var e
= E('_f_wl'+unit
+'_scan');
521 if (x
) e
.value
= 'Scan ' + (wscan
.tries
+ 1);
522 else e
.value
= 'Scan';
523 E('spin'+unit
).style
.visibility
= x
? 'visible' : 'hidden';
530 var unit
= wscan
.unit
;
531 var uidx
= wl_uidx(unit
);
534 xob
.onCompleted = function(text
, xml
) {
541 for (i
= 0; i
< wlscandata
.length
; ++i
) {
542 var data
= wlscandata
[i
];
546 if (!wscan
.inuse
[ch
]) {
554 if (!wscan
.seen
[mac
]) {
556 ++wscan
.inuse
[ch
].count
;
559 if (data
[4] > wscan
.inuse
[ch
].rssi
) {
560 wscan
.inuse
[ch
].rssi
= data
[4];
561 wscan
.inuse
[ch
].ssid
= data
[1];
564 var e
= E('_wl'+unit
+'_channel');
565 for (i
= 1; i
< ghz
[uidx
].length
; ++i
) {
566 var s
= ghz
[uidx
][i
][1];
567 var u
= wscan
.inuse
[ghz
[uidx
][i
][0]];
568 if (u
) s
+= ' (' + u
.count
+ ' AP' + (u
.count
== 1 ? '' : 's') + ' / strongest: "' + escapeHTML(ellipsis(u
.ssid
, 15)) + '" ' + u
.rssi
+ ' dBm)';
569 e
.options
[i
].innerHTML
= s
;
571 e
.style
.width
= '400px';
575 if (wscan
.tries
< 4) {
577 setTimeout(scan
, 1000);
585 xob
.onError = function(x
) {
586 alert('error: ' + x
);
592 xob
.post('update.cgi', 'exec=wlscan&arg0='+unit
);
595 function scanButton(u
)
609 function joinAddr(a
) {
613 for (i
= 0; i
< a
.length
; ++i
) {
615 if ((s
!= '00:00:00:00:00:00') && (s
!= '0.0.0.0')) r
.push(s
);
620 function random_x(max
)
622 var c
= '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
624 while (max
-- > 0) s
+= c
.substr(Math
.floor(c
.length
* Math
.random()), 1);
628 function random_psk(id
)
631 e
.value
= random_x(63);
632 verifyFields(null, 1);
635 function random_wep(u
)
637 E('_wl'+u
+'_passphrase').value
= random_x(16);
641 function v_wep(e
, quiet
)
645 if (((s
.length
== 5) || (s
.length
== 13)) && (s
.length
== (e
.maxLength
>> 1))) {
649 s
= s
.toUpperCase().replace(/[^0-9A-F]/g, '');
650 if (s
.length
!= e
.maxLength
) {
651 ferror
.set(e
, 'Invalid WEP key. Expecting ' + e
.maxLength
+ ' hex or ' + (e
.maxLength
>> 1) + ' ASCII characters.', quiet
);
661 // compatible w/ Linksys' and Netgear's (key 1) method for 128-bits
662 function generate_wep(u
)
664 function _wepgen(pass
, i
)
666 while (pass
.length
< 64) pass
+= pass
;
667 return hex_md5(pass
.substr(0, 64)).substr(i
, (E('_wl'+u
+'_wep_bit').value
== 128) ? 26 : 10);
670 var e
= E('_wl'+u
+'_passphrase');
672 if (!v_length(e
, false, 3)) return;
673 E('_wl'+u
+'_key1').value
= _wepgen(pass
, 0);
675 E('_wl'+u
+'_key2').value
= _wepgen(pass
, 2);
677 E('_wl'+u
+'_key3').value
= _wepgen(pass
, 4);
679 E('_wl'+u
+'_key4').value
= _wepgen(pass
, 6);
680 verifyFields(null, 1);
683 function verifyFields(focused
, quiet
)
691 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
692 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
693 if (wl_sunit(uidx
)<0) {
695 if (focused
== E('_f_wl'+u
+'_nband')) {
696 refreshNetModes(uidx
);
697 refreshChannels(uidx
);
699 else if (focused
== E('_f_wl'+u
+'_nctrlsb') || focused
== E('_wl'+u
+'_nbw_cap')) {
700 refreshChannels(uidx
);
705 // --- visibility ---
721 _ppp_redialperiod
: 1,
748 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
749 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
750 if (wl_sunit(uidx
)<0) {
754 _f_wl_nband
: (bands
[uidx
].length
> 1) ? 1 : 0,
759 _wl_nbw_cap
: nphy
? 1 : 0,
760 _f_wl_nctrlsb
: nphy
? 1 : 0,
763 _wl_security_mode
: 1,
766 _f_wl_psk_random1
: 1,
767 _f_wl_psk_random2
: 1,
768 _wl_wpa_gtk_rekey
: 1,
770 _wl_radius_ipaddr
: 1,
788 var wan
= E('_wan_proto').value
;
790 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
791 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
792 if (wl_sunit(uidx
)<0) {
793 wmode
= E('_f_wl'+wl_unit(uidx
)+'_mode').value
;
795 if (wmode
== 'wet') {
799 vis
._f_dhcpd_enable
= 0;
804 if ((wan
== 'disabled') || (wmode
== 'sta') || (wmode
== 'wet')) {
805 vis
._f_wan_islan
= 1;
812 vis
._ppp_username
= 0;
813 vis
._ppp_service
= 0;
815 vis
._l2tp_server_ip
= 0;
817 vis
._wan_netmask
= 0;
818 vis
._wan_gateway
= 0;
819 vis
._pptp_server_ip
= 0;
820 vis
._f_pptp_dhcp
= 0;
824 vis
._f_ppp_mlppp
= 0;
825 vis
._modem_ipaddr
= 0;
832 vis
._l2tp_server_ip
= 0;
834 vis
._ppp_service
= 0;
835 vis
._ppp_username
= 0;
837 vis
._pptp_server_ip
= 0;
838 vis
._f_pptp_dhcp
= 0;
839 vis
._wan_gateway
= 0;
841 vis
._wan_netmask
= 0;
842 vis
._f_ppp_mlppp
= 0;
843 vis
._modem_ipaddr
= 1;
845 vis
._lan_gateway
= 0;
852 vis
._l2tp_server_ip
= 0;
853 vis
._pptp_server_ip
= 0;
854 vis
._f_pptp_dhcp
= 0;
855 vis
._wan_gateway
= 0;
857 vis
._wan_netmask
= 0;
858 vis
._modem_ipaddr
= 1;
860 vis
._lan_gateway
= 0;
867 vis
._ppp_service
= 0;
869 vis
._l2tp_server_ip
= 0;
870 vis
._pptp_server_ip
= 0;
871 vis
._f_pptp_dhcp
= 0;
872 vis
._wan_gateway
= 0;
874 vis
._wan_netmask
= 0;
875 vis
._lan_gateway
= 0;
876 vis
._modem_ipaddr
= 0;
877 vis
._f_wan_islan
= 1;
880 vis
._l2tp_server_ip
= 0;
882 vis
._ppp_service
= 0;
883 vis
._ppp_username
= 0;
885 vis
._pptp_server_ip
= 0;
886 vis
._f_pptp_dhcp
= 0;
887 vis
._f_ppp_mlppp
= 0;
888 vis
._modem_ipaddr
= 1;
890 vis
._lan_gateway
= 0;
897 vis
._l2tp_server_ip
= 0;
898 vis
._ppp_service
= 0;
899 vis
._wan_gateway
= (!E('_f_pptp_dhcp').checked
);
900 vis
._wan_ipaddr
= (!E('_f_pptp_dhcp').checked
);
901 vis
._modem_ipaddr
= 0;
903 vis
._lan_gateway
= 0;
910 vis
._pptp_server_ip
= 0;
911 vis
._ppp_service
= 0;
912 vis
._wan_gateway
= (!E('_f_pptp_dhcp').checked
);
913 vis
._wan_ipaddr
= (!E('_f_pptp_dhcp').checked
);
914 vis
._modem_ipaddr
= 0;
916 vis
._lan_gateway
= 0;
924 vis
._ppp_idletime
= (E('_ppp_demand').value
== 1) && vis
._ppp_demand
925 vis
._ppp_redialperiod
= !vis
._ppp_idletime
&& vis
._ppp_demand
;
927 if (vis
._mtu_enable
) {
928 if (E('_mtu_enable').value
== 0) {
931 switch (E('_wan_proto').value
) {
947 if (!E('_f_dhcpd_enable').checked
) vis
._dhcp_lease
= 0;
950 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
951 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
952 if (wl_sunit(uidx
)<0) {
954 wmode
= E('_f_wl'+u
+'_mode').value
;
956 if (!E('_f_wl'+u
+'_radio').checked
) {
957 for (a
in wl_vis
[uidx
]) {
960 wl_vis
[uidx
]._f_wl_radio
= 1;
961 wl_vis
[uidx
]._wl_nbw_cap
= nphy
? 2 : 0;
962 wl_vis
[uidx
]._f_wl_nband
= (bands
[uidx
].length
> 1) ? 2 : 0;
971 wl_vis
[uidx
]._f_wl_bcast
= 0;
972 wl_vis
[uidx
]._wl_channel
= 0;
973 wl_vis
[uidx
]._wl_nbw_cap
= 0;
974 vis
._modem_ipaddr
= 0;
976 wl_vis
[uidx
]._f_wl_lazywds
= 0;
977 wl_vis
[uidx
]._f_wl_wds_0
= 0;
981 sm2
= E('_wl'+u
+'_security_mode').value
;
984 wl_vis
[uidx
]._wl_crypto
= 0;
985 wl_vis
[uidx
]._wl_wep_bit
= 0;
986 wl_vis
[uidx
]._wl_wpa_psk
= 0;
987 wl_vis
[uidx
]._wl_radius_key
= 0;
988 wl_vis
[uidx
]._wl_radius_ipaddr
= 0;
989 wl_vis
[uidx
]._wl_wpa_gtk_rekey
= 0;
992 wl_vis
[uidx
]._wl_crypto
= 0;
993 wl_vis
[uidx
]._wl_wpa_psk
= 0;
994 wl_vis
[uidx
]._wl_radius_key
= 0;
995 wl_vis
[uidx
]._wl_radius_ipaddr
= 0;
996 wl_vis
[uidx
]._wl_wpa_gtk_rekey
= 0;
999 wl_vis
[uidx
]._wl_crypto
= 0;
1000 wl_vis
[uidx
]._wl_wpa_psk
= 0;
1003 wl_vis
[uidx
]._wl_wep_bit
= 0;
1004 if (sm2
.indexOf('personal') != -1) {
1005 wl_vis
[uidx
]._wl_radius_key
= 0;
1006 wl_vis
[uidx
]._wl_radius_ipaddr
= 0;
1009 wl_vis
[uidx
]._wl_wpa_psk
= 0;
1014 if ((E('_f_wl'+u
+'_lazywds').value
== 1) && (wl_vis
[uidx
]._f_wl_wds_0
== 1)) {
1015 wl_vis
[uidx
]._f_wl_wds_0
= 2;
1018 if (wl_vis
[uidx
]._wl_nbw_cap
!= 0) {
1019 switch (E('_wl'+u
+'_net_mode').value
) {
1024 wl_vis
[uidx
]._wl_nbw_cap
= 2;
1025 if (E('_wl'+u
+'_nbw_cap').value
!= '0') {
1026 E('_wl'+u
+'_nbw_cap').value
= 0;
1027 refreshChannels(uidx
);
1031 // avoid Enterprise-TKIP with 40MHz
1032 if ((sm2
== 'wpa_enterprise') && (E('_wl'+u
+'_crypto').value
== 'tkip')) {
1033 wl_vis
[uidx
]._wl_nbw_cap
= 2;
1034 if (E('_wl'+u
+'_nbw_cap').value
!= '0') {
1035 E('_wl'+u
+'_nbw_cap').value
= 0;
1036 refreshChannels(uidx
);
1041 wl_vis
[uidx
]._f_wl_nctrlsb
= (E('_wl'+u
+'_nbw_cap').value
== 0) ? 0 : wl_vis
[uidx
]._wl_nbw_cap
;
1045 Special case - 2.4GHz band, currently running in B/G-only mode,
1046 with N/Auto and 40MHz selected in the GUI.
1047 Channel list is not filtered in this case by the wl driver,
1048 and includes all channels available with 20MHz channel width.
1050 b
= selectedBand(uidx
);
1051 if (wl_vis
[uidx
]._wl_channel
== 1 && wl_vis
[uidx
]._f_wl_nctrlsb
!= 0 &&
1052 ((b
== '2') || (wl_vis
[uidx
]._f_wl_nband
== 0 && b
== '0'))) {
1053 switch (eval('nvram.wl'+u
+'_net_mode')) {
1057 i
= E('_wl'+u
+'_channel').value
* 1;
1058 if (i
> 0 && i
< 5) {
1059 E('_f_wl'+u
+'_nctrlsb').value
= 'lower';
1060 wl_vis
[uidx
]._f_wl_nctrlsb
= 2;
1062 else if (i
> max_channel
[uidx
] - 4) {
1063 E('_f_wl'+u
+'_nctrlsb').value
= 'upper';
1064 wl_vis
[uidx
]._f_wl_nctrlsb
= 2;
1070 wl_vis
[uidx
]._f_wl_scan
= wl_vis
[uidx
]._wl_channel
;
1071 wl_vis
[uidx
]._f_wl_psk_random1
= wl_vis
[uidx
]._wl_wpa_psk
;
1072 wl_vis
[uidx
]._f_wl_psk_random2
= wl_vis
[uidx
]._wl_radius_key
;
1073 wl_vis
[uidx
]._wl_radius_port
= wl_vis
[uidx
]._wl_radius_ipaddr
;
1074 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
;
1076 for (i
= 1; i
< 10; ++i
) {
1077 wl_vis
[uidx
]['_f_wl_wds_' + i
] = wl_vis
[uidx
]._f_wl_wds_0
;
1080 } // for each wl_iface
1082 vis
._ppp_passwd
= vis
._ppp_username
;
1084 vis
._dhcpd_startip
= vis
._dhcpd_endip
= vis
._wan_wins
= vis
._dhcp_lease
;
1093 b
.disabled
= (c
!= 1);
1094 PR(b
).style
.display
= c
? '' : 'none';
1097 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1098 if(wl_ifaces
[uidx
][0].indexOf('.') < 0) {
1099 for (a
in wl_vis
[uidx
]) {
1101 if (a
.substr(0, 6) == '_f_wl_') i
= 5;
1102 b
= E(a
.substr(0, i
) + wl_unit(uidx
) + a
.substr(i
, a
.length
));
1103 c
= wl_vis
[uidx
][a
];
1104 b
.disabled
= (c
!= 1);
1105 PR(b
).style
.display
= c
? '' : 'none';
1112 ferror
.clear('_wan_proto');
1115 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1116 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1117 if (wl_sunit(uidx
)<0) {
1119 wmode
= E('_f_wl'+u
+'_mode').value
;
1120 sm2
= E('_wl'+u
+'_security_mode').value
;
1123 if ((wl_vis[uidx]._f_wl_mode == 1) && (wmode != 'ap') && (sm2.substr(0, 4) == 'wpa2')) {
1124 ferror.set('_wl'+u+'_security_mode', 'WPA2 is supported only in AP mode.', quiet || !ok);
1127 else ferror.clear('_wl'+u+'_security_mode');
1130 // --- N standard does not support WPA+TKIP ---
1131 a
= E('_wl'+u
+'_crypto');
1132 switch (E('_wl'+u
+'_net_mode').value
) {
1135 if (nphy
&& (a
.value
== 'tkip') && (sm2
.indexOf('wpa') != -1)) {
1136 ferror
.set(a
, 'TKIP encryption is not supported with WPA / WPA2 in N mode.', quiet
|| !ok
);
1139 else ferror
.clear(a
);
1143 a
= E('_wl'+u
+'_net_mode');
1145 b
= E('_f_wl'+u
+'_mode');
1147 if ((wmode
== 'sta') || (wmode
== 'wet')) {
1150 ferror
.set(b
, 'Only one wireless interface can be configured in client mode.', quiet
|| !ok
);
1153 else if (a
.value
== 'n-only') {
1154 ferror
.set(a
, 'N-only is not supported in wireless client modes, use Auto.', quiet
|| !ok
);
1159 a
= E('_wl'+u
+'_wpa_psk');
1161 if (wl_vis
[uidx
]._wl_wpa_psk
== 1) {
1162 if ((a
.value
.length
< 8) || ((a
.value
.length
== 64) && (a
.value
.search(/[^0-9A-Fa-f]/) != -1))) {
1163 ferror
.set('_wl'+u
+'_wpa_psk', 'Invalid pre-shared key. Please enter at least 8 characters or 64 hexadecimal digits.', quiet
|| !ok
);
1169 if (((wmode
== 'wds') || (wmode
== 'apwds')) && (wl_vis
[uidx
]._wl_channel
== 1) && (E('_wl'+u
+'_channel').value
== '0')) {
1170 ferror
.set('_wl'+u
+'_channel', 'Fixed wireless channel required in WDS mode.', quiet
|| !ok
);
1173 else ferror
.clear('_wl'+u
+'_channel');
1175 if (E('_f_wl'+u
+'_mode').value
== 'sta') {
1176 if (((wan
== 'disabled') || (wan
== 'ppp3g')) && (E('_f_wl'+u
+'_radio').checked
)) {
1177 ferror
.set('_wan_proto', 'Wireless Client mode requires a valid WAN setting (usually DHCP).', quiet
|| !ok
);
1184 // domain name or IP address
1185 a
= ['_l2tp_server_ip', '_pptp_server_ip'];
1186 for (i
= a
.length
- 1; i
>= 0; --i
)
1187 if ((vis
[a
[i
]]) && ((!v_length(a
[i
], 1, 1)) || ((!v_ip(a
[i
], 1)) && (!v_domain(a
[i
], 1))))) {
1188 if (!quiet
&& ok
) ferror
.show(a
[i
]);
1194 a
= ['_wan_gateway','_wan_ipaddr','_lan_ipaddr', '_dhcpd_startip', '_dhcpd_endip'];
1197 a
= ['_wan_gateway','_wan_ipaddr'];
1199 for (i
= a
.length
- 1; i
>= 0; --i
)
1200 if ((vis
[a
[i
]]) && (!v_ip(a
[i
], quiet
|| !ok
))) ok
= 0;
1202 // IP address, blank -> 0.0.0.0
1203 a
= ['_f_dns_1', '_f_dns_2', '_f_dns_3','_wan_wins','_lan_gateway', '_modem_ipaddr'];
1204 for (i
= a
.length
- 1; i
>= 0; --i
)
1205 if ((vis
[a
[i
]]) && (!v_dns(a
[i
], quiet
|| !ok
))) ok
= 0;
1209 a
= ['_wan_netmask','_lan_netmask'];
1212 a
= ['_wan_netmask'];
1214 for (i
= a
.length
- 1; i
>= 0; --i
)
1215 if ((vis
[a
[i
]]) && (!v_netmask(a
[i
], quiet
|| !ok
))) ok
= 0;
1219 a
= [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500],
1220 ['_dhcp_lease', 1, 10080]];
1223 a
= [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500]];
1225 for (i
= a
.length
- 1; i
>= 0; --i
) {
1227 if ((vis
[v
[0]]) && (!v_range(v
[0], quiet
|| !ok
, v
[1], v
[2]))) ok
= 0;
1230 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1231 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1232 if (wl_sunit(uidx
)<0) {
1236 a
= ['_radius_ipaddr'];
1237 for (i
= a
.length
- 1; i
>= 0; --i
) {
1238 if ((wl_vis
[uidx
]['_wl'+a
[i
]]) && (!v_ip('_wl'+u
+a
[i
], quiet
|| !ok
))) ok
= 0;
1242 a
= [['_wpa_gtk_rekey', 60, 7200], ['_radius_port', 1, 65535]];
1243 for (i
= a
.length
- 1; i
>= 0; --i
) {
1245 if ((wl_vis
[uidx
]['_wl'+v
[0]]) && (!v_range('_wl'+u
+v
[0], quiet
|| !ok
, v
[1], v
[2]))) ok
= 0;
1249 a
= [['_ssid', 1], ['_radius_key', 1]];
1250 for (i
= a
.length
- 1; i
>= 0; --i
) {
1252 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;
1255 if (wl_vis
[uidx
]._wl_key1
) {
1256 a
= (E('_wl'+u
+'_wep_bit').value
== 128) ? 26 : 10;
1257 for (i
= 1; i
<= 4; ++i
) {
1258 b
= E('_wl'+u
+'_key' + i
);
1260 if ((b
.value
.length
> 0) || (E('_f_wl'+u
+'_wepidx_' + i
).checked
)) {
1261 if (!v_wep(b
, quiet
|| !ok
)) ok
= 0;
1263 else ferror
.clear(b
);
1267 ferror
.clear('_f_wl'+u
+'_wds_0');
1268 if (wl_vis
[uidx
]._f_wl_wds_0
== 1) {
1270 for (i
= 0; i
< 10; ++i
) {
1271 a
= E('_f_wl'+u
+'_wds_' + i
);
1272 if (!v_macz(a
, quiet
|| !ok
)) ok
= 0;
1273 else if (!isMAC0(a
.value
)) b
= 1;
1276 ferror
.set('_f_wl'+u
+'_wds_0', 'WDS MAC address required.', quiet
|| !ok
);
1284 a
= E('_dhcpd_startip');
1285 b
= E('_dhcpd_endip');
1289 if ((vis
._dhcp_lease
) && (!a
._error_msg
) && (!b
._error_msg
)) {
1290 c
= aton(E('_lan_netmask').value
);
1291 d
= aton(E('_lan_ipaddr').value
) & c
;
1292 e
= 'Invalid IP address or subnet mask';
1293 if ((aton(a
.value
) & c
) != d
) {
1294 ferror
.set(a
, e
, quiet
|| !ok
);
1297 if ((aton(b
.value
) & c
) != d
) {
1298 ferror
.set(b
, e
, quiet
|| !ok
);
1303 if ((vis
._dhcp_lease
) && (!a
._error_msg
) && (!b
._error_msg
)) {
1304 if (aton(a
.value
) > aton(b
.value
)) {
1310 elem
.setInnerHTML('dhcp_count', '(' + ((aton(b
.value
) - aton(a
.value
)) + 1) + ')');
1314 /* TODO: same validation for builds with VLAN-GUI enabled */
1316 ferror
.clear('_modem_ipaddr');
1317 a
= E('_modem_ipaddr');
1318 b
= E('_lan_ipaddr');
1319 c
= E('_lan_netmask');
1320 if ( vis
['_modem_ipaddr'] && !(a
._error_msg
|| b
._error_msg
|| c
._error_msg
) && a
.value
!= "0.0.0.0" ) {
1322 if ( (aton(a
.value
) & c
) == (aton(b
.value
) & c
) ) {
1323 ferror
.set('_modem_ipaddr', 'Modem IP address may not be within your local address space.', quiet
);
1332 function earlyInit()
1334 verifyFields(null, 1);
1340 if (lg
.isEditing()) return;
1341 lg
.resetNewEditor();
1346 var u
, uidx
, wmode
, sm2
, wradio
;
1348 if (!verifyFields(null, false)) return;
1350 var fom
= E('_fom');
1352 fom
.wan_mtu
.value
= fom
.f_wan_mtu
.value
;
1353 fom
.wan_mtu
.disabled
= fom
.f_wan_mtu
.disabled
;
1356 fom
.lan_proto
.value
= fom
.f_dhcpd_enable
.checked
? 'dhcp' : 'static';
1359 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1360 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1361 if (wl_sunit(uidx
)<0) {
1363 wmode
= E('_f_wl'+u
+'_mode').value
;
1364 sm2
= E('_wl'+u
+'_security_mode').value
;
1365 wradio
= E('_f_wl'+u
+'_radio').checked
;
1367 E('_wl'+u
+'_nband').value
= selectedBand(uidx
);
1369 if (wmode
== 'apwds') E('_wl'+u
+'_mode').value
= 'ap';
1370 else E('_wl'+u
+'_mode').value
= wmode
;
1372 if (wmode
== 'wet') {
1373 fom
.wan_proto
.value
= 'disabled';
1374 fom
.wan_proto
.disabled
= 0;
1376 fom
.lan_proto
.value
= 'static';
1380 // TODO - what's required ? integrate with tomatogrid?
1386 for (i
= 0; i
< 10; ++i
) a
.push(E('_f_wl'+u
+'_wds_' + i
).value
);
1387 E('_wl'+u
+'_wds').value
= joinAddr(a
);
1389 if (wmode
.indexOf('wds') != -1) {
1390 E('_wl'+u
+'_wds_enable').value
= 1;
1391 E('_wl'+u
+'_lazywds').value
= E('_f_wl'+u
+'_lazywds').value
;
1392 if (E('_wl'+u
+'_lazywds').value
== 1) E('_wl'+u
+'_wds').value
= '';
1395 E('_wl'+u
+'_wds_enable').value
= 0;
1396 E('_wl'+u
+'_wds').value
= '';
1397 E('_wl'+u
+'_lazywds').value
= 0;
1400 E('_wl'+u
+'_radio').value
= wradio
? 1 : 0;
1401 E('_wl'+u
+'_auth').value
= eval('nvram.wl'+u
+'_auth');
1403 e
= E('_wl'+u
+'_akm');
1413 if (sm2
.indexOf('personal') != -1) {
1414 if (sm2
.indexOf('wpa2_') == -1) c
.push('psk');
1415 if (sm2
.indexOf('wpa_') == -1) c
.push('psk2');
1418 if (sm2
.indexOf('wpa2_') == -1) c
.push('wpa');
1419 if (sm2
.indexOf('wpa_') == -1) c
.push('wpa2');
1425 E('_wl'+u
+'_auth_mode').value
= (sm2
== 'radius') ? 'radius' : 'none';
1426 E('_wl'+u
+'_wep').value
= ((sm2
== 'radius') || (sm2
== 'wep')) ? 'enabled': 'disabled';
1428 if (sm2
.indexOf('wpa') != -1) E('_wl'+u
+'_auth').value
= 0;
1430 E('_wl'+u
+'_nreqd').value
= 0;
1431 E('_wl'+u
+'_gmode').value
= 1;
1432 E('_wl'+u
+'_nmode').value
= 0;
1433 E('_wl'+u
+'_nmcsidx').value
= -2; // Legacy Rate
1434 E('_wl'+u
+'_nbw').value
= 0;
1435 switch (E('_wl'+u
+'_net_mode').value
) {
1437 E('_wl'+u
+'_gmode').value
= 0;
1440 E('_wl'+u
+'_gmode').value
= 4;
1445 E('_wl'+u
+'_nmcsidx').value
= -1; // Auto
1448 if (selectedBand(uidx
) == '1') { // 5 GHz
1449 E('_wl'+u
+'_nmode').value
= -1;
1450 E('_wl'+u
+'_nmcsidx').value
= -1;
1452 E('_wl'+u
+'_nmode').value
= 1;
1453 E('_wl'+u
+'_nmcsidx').value
= 32;
1455 E('_wl'+u
+'_nreqd').value
= 1;
1458 E('_wl'+u
+'_nmode').value
= -1;
1459 E('_wl'+u
+'_nmcsidx').value
= -1;
1463 E('_wl'+u
+'_nctrlsb').value
= eval('nvram.wl'+u
+'_nctrlsb');
1464 if (E('_wl'+u
+'_nmode').value
!= 0) {
1465 E('_wl'+u
+'_nctrlsb').value
= E('_f_wl'+u
+'_nctrlsb').value
;
1466 E('_wl'+u
+'_nbw').value
= (E('_wl'+u
+'_nbw_cap').value
== 0) ? 20 : 40;
1469 E('_wl'+u
+'_closed').value
= E('_f_wl'+u
+'_bcast').checked
? 0 : 1;
1471 a
= fields
.radio
.selected(eval('fom.f_wl'+u
+'_wepidx'));
1472 if (a
) E('_wl'+u
+'_key').value
= a
.value
;
1476 fom
.wan_islan
.value
= fom
.f_wan_islan
.checked
? 1 : 0;
1477 fom
.pptp_dhcp
.value
= fom
.f_pptp_dhcp
.checked
? 1 : 0;
1479 fom
.wan_dns
.value
= joinAddr([fom
.f_dns_1
.value
, fom
.f_dns_2
.value
, fom
.f_dns_3
.value
]);
1482 // initialize/wipe out relevant fields
1483 for (var i
= 0 ; i
<= MAX_BRIDGE_ID
; i
++) {
1484 var j
= (i
== 0) ? '' : i
.toString();
1485 fom
['lan' + j
+ '_ifname'].value
= '';
1486 fom
['lan' + j
+ '_ipaddr'].value
= '';
1487 fom
['lan' + j
+ '_netmask'].value
= '';
1488 fom
['lan' + j
+ '_proto'].value
= '';
1489 fom
['lan' + j
+ '_stp'].value
= '';
1490 fom
['dhcp' + j
+ '_start'].value
= '';
1491 fom
['dhcp' + j
+ '_num'].value
= '';
1492 fom
['dhcp' + j
+ '_lease'].value
= '';
1493 fom
['dhcpd' + j
+ '_startip'].value
= '';
1494 fom
['dhcpd' + j
+ '_endip'].value
= '';
1497 var d
= lg
.getAllData();
1498 for (var i
= 0; i
< d
.length
; ++i
) {
1500 if (lg
.countOverlappingNetworks(d
[i
][2]) > 1) {
1501 var s
= 'Cannot proceed: two or more LAN bridges have conflicting IP addresses or overlapping subnets';
1503 var e
= E('footer-msg');
1505 e
.style
.visibility
= 'visible';
1509 e
.style
.visibility
= 'hidden';
1514 var j
= (parseInt(d
[i
][0]) == 0) ? '' : d
[i
][0].toString();
1515 fom
['lan' + j
+ '_ifname'].value
= 'br' + d
[i
][0];
1516 fom
['lan' + j
+ '_stp'].value
= d
[i
][1];
1517 fom
['lan' + j
+ '_ipaddr'].value
= d
[i
][2];
1518 fom
['lan' + j
+ '_netmask'].value
= d
[i
][3];
1519 fom
['lan' + j
+ '_proto'].value
= (d
[i
][4] != '0') ? 'dhcp' : 'static';
1520 fom
['dhcp' + j
+ '_start'].value
= (d
[i
][4] != '0') ? (d
[i
][5]).split('.').splice(3, 1) : '';
1521 fom
['dhcp' + j
+ '_num'].value
= (d
[i
][4] != '0') ? d
[i
][6].split('.').splice(3, 1) - (d
[i
][5]).split('.').splice(3, 1) + 1 : ''; // presuming /24 subnet (legacy)
1522 fom
['dhcp' + j
+ '_lease'].value
= (d
[i
][4] != '0') ? d
[i
][7] : '';
1523 fom
['dhcpd' + j
+ '_startip'].value
= (d
[i
][4] != '0') ? d
[i
][5] : '';
1524 fom
['dhcpd' + j
+ '_endip'].value
= (d
[i
][4] != '0') ? d
[i
][6] : '';
1527 alert('lan' + j
+ '_ifname=' + fom
['lan' + j
+ '_ifname'].value
+ '\n' +
1528 'lan' + j
+ '_stp=' + fom
['lan' + j
+ '_stp'].value
+ '\n' +
1529 'lan' + j
+ '_ipaddr=' + fom
['lan' + j
+ '_ipaddr'].value
+ '\n' +
1530 'lan' + j
+ '_netmask=' + fom
['lan' + j
+ '_netmask'].value
+ '\n' +
1531 'lan' + j
+ '_proto=' + fom
['lan' + j
+ '_proto'].value
+ '\n' +
1532 'dhcp' + j
+ '_start=' + fom
['dhcp' + j
+ '_start'].value
+ '\n' +
1533 'dhcp' + j
+ '_num=' + fom
['dhcp' + j
+ '_num'].value
+ '\n' +
1534 'dhcp' + j
+ '_lease=' + fom
['dhcp' + j
+ '_lease'].value
+ '\n' +
1535 'dhcpd' + j
+ '_startip=' + fom
['dhcpd' + j
+ '_startip'].value
+ '\n' +
1536 'dhcpd' + j
+ '_endip=' + fom
['dhcpd' + j
+ '_endip'].value
);
1540 var e
= E('footer-msg');
1541 var t
= fixIP(fom
['lan_ipaddr'].value
);
1542 if ((fom
['lan_ifname'].value
!= 'br0') || (fom
['lan_ipaddr'].value
== '0.0.0.0') || (!t
)) {
1543 e
.innerHTML
= 'Bridge br0 must be always defined and have a valid IP address set.';
1544 e
.style
.visibility
= 'visible';
1548 e
.style
.visibility
= 'hidden';
1555 // if ((nvram.lan_ipaddr != fom.lan_ipaddr.value) || (nvram.lan1_ipaddr != fom.lan1_ipaddr.value) ||
1556 // (nvram.lan2_ipaddr != fom.lan2_ipaddr.value) || (nvram.lan3_ipaddr != fom.lan3_ipaddr.value)){
1559 fom
.ppp_mlppp
.value
= fom
.f_ppp_mlppp
.checked
? 1 : 0;
1561 if (nvram
.lan_ipaddr
!= fom
.lan_ipaddr
.value
) {
1562 fom
._moveip
.value
= 1;
1566 form
.submit(fom
, 1);
1572 for (var uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1573 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1574 if (wl_sunit(uidx
)<0) {
1575 refreshNetModes(uidx
);
1576 refreshChannels(uidx
);
1583 <body onload='init()'
>
1584 <form id='_fom' method='post' action='tomato.cgi'
>
1585 <table id='container' cellspacing=
0>
1586 <tr><td colspan=
2 id='header'
>
1587 <div class='title'
>Tomato
</div>
1588 <div class='version'
>Version <%
version(); %></div>
1590 <tr id='body'
><td id='navi'
><script type='text/javascript'
>navi()</script></td>
1592 <div id='ident'
><%
ident(); %></div>
1596 <input type='hidden' name='_nextpage' value='basic-network.asp'
>
1597 <input type='hidden' name='_nextwait' value='
10'
>
1598 <input type='hidden' name='_service' value='*'
>
1599 <input type='hidden' name='_moveip' value='
0'
>
1601 <input type='hidden' name='wan_mtu'
>
1602 <input type='hidden' name='wan_islan'
>
1603 <input type='hidden' name='pptp_dhcp'
>
1604 <!-- NOVLAN-BEGIN -->
1605 <input type='hidden' name='lan_proto'
>
1607 <input type='hidden' name='wan_dns'
>
1608 <input type='hidden' name='ppp_mlppp'
>
1611 <script type='text/javascript'
>
1613 for (var i
= 0 ; i
<= MAX_BRIDGE_ID
; i
++) {
1614 var j
= (i
== 0) ? '' : i
.toString();
1615 W('<input type=\'hidden\' id=\'lan' + j
+ '_ifname\' name=\'lan' + j
+ '_ifname\'>');
1616 W('<input type=\'hidden\' id=\'lan' + j
+ '_ipaddr\' name=\'lan' + j
+ '_ipaddr\'>');
1617 W('<input type=\'hidden\' id=\'lan' + j
+ '_netmask\' name=\'lan' + j
+ '_netmask\'>');
1618 W('<input type=\'hidden\' id=\'lan' + j
+ '_proto\' name=\'lan' + j
+ '_proto\'>');
1619 W('<input type=\'hidden\' id=\'lan' + j
+ '_stp\' name=\'lan' + j
+ '_stp\'>');
1620 W('<input type=\'hidden\' id=\'dhcp' + j
+ '_start\' name=\'dhcp' + j
+ '_start\'>');
1621 W('<input type=\'hidden\' id=\'dhcp' + j
+ '_num\' name=\'dhcp' + j
+ '_num\'>');
1622 W('<input type=\'hidden\' id=\'dhcp' + j
+ '_lease\' name=\'dhcp' + j
+ '_lease\'>');
1623 W('<input type=\'hidden\' id=\'dhcpd' + j
+ '_startip\' name=\'dhcpd' + j
+ '_startip\'>');
1624 W('<input type=\'hidden\' id=\'dhcpd' + j
+ '_endip\' name=\'dhcpd' + j
+ '_endip\'>');
1629 <div class='section-title'
>WAN / Internet
</div>
1630 <div class='section'
>
1631 <script type='text/javascript'
>
1632 createFieldTable('', [
1633 { title
: 'Type', name
: 'wan_proto', type
: 'select', options
: [['dhcp','DHCP'],['pppoe','PPPoE'],['static','Static'],['pptp','PPTP'],['l2tp','L2TP'],
1636 ['ppp3g','3G Modem'],
1639 ['disabled','Disabled']],
1640 value
: nvram
.wan_proto
},
1641 { title
: 'Modem device', name
: 'modem_dev', type
: 'select', options
: [['ttyUSB0', '/dev/ttyUSB0'],['ttyUSB1', '/dev/ttyUSB1'],['ttyUSB2', '/dev/ttyUSB2'],['ttyUSB3', '/dev/ttyUSB3'],['ttyUSB4', '/dev/ttyUSB4'],['ttyUSB5', '/dev/ttyUSB5']], value
: nvram
.modem_dev
},
1642 { title
: 'PIN Code', name
: 'modem_pin', type
: 'text', maxlen
: 6, size
: 8, value
: nvram
.modem_pin
},
1643 { title
: 'Modem init string', name
: 'modem_init', type
: 'text', maxlen
: 25, size
: 32, value
: nvram
.modem_init
},
1644 { title
: 'APN', name
: 'modem_apn', type
: 'text', maxlen
: 25, size
: 32, value
: nvram
.modem_apn
},
1645 { title
: 'Username', name
: 'ppp_username', type
: 'text', maxlen
: 60, size
: 64, value
: nvram
.ppp_username
},
1646 { title
: 'Password', name
: 'ppp_passwd', type
: 'password', maxlen
: 60, size
: 64, peekaboo
: 1, value
: nvram
.ppp_passwd
},
1647 { title
: 'Service Name', name
: 'ppp_service', type
: 'text', maxlen
: 50, size
: 64, value
: nvram
.ppp_service
},
1648 { title
: 'L2TP Server', name
: 'l2tp_server_ip', type
: 'text', maxlen
: 128, size
: 64, value
: nvram
.l2tp_server_ip
},
1649 { title
: 'Use DHCP', name
: 'f_pptp_dhcp', type
: 'checkbox', value
: (nvram
.pptp_dhcp
== 1) },
1650 { title
: 'IP Address', name
: 'wan_ipaddr', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.wan_ipaddr
},
1651 { title
: 'Subnet Mask', name
: 'wan_netmask', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.wan_netmask
},
1652 { title
: 'Gateway', name
: 'wan_gateway', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.wan_gateway
},
1653 { title
: 'PPTP Gateway', name
: 'pptp_server_ip', type
: 'text', maxlen
: 128, size
: 64, value
: nvram
.pptp_server_ip
},
1654 { title
: 'Options', name
: 'ppp_custom', type
: 'text', maxlen
: 256, size
: 64, value
: nvram
.ppp_custom
},
1655 { title
: 'Connect Mode', name
: 'ppp_demand', type
: 'select', options
: [['1', 'Connect On Demand'],['0', 'Keep Alive']],
1656 value
: nvram
.ppp_demand
},
1657 { title
: 'Max Idle Time', indent
: 2, name
: 'ppp_idletime', type
: 'text', maxlen
: 5, size
: 7, suffix
: ' <i>(minutes)</i>',
1658 value
: nvram
.ppp_idletime
},
1659 { title
: 'Check Interval', indent
: 2, name
: 'ppp_redialperiod', type
: 'text', maxlen
: 5, size
: 7, suffix
: ' <i>(seconds)</i>',
1660 value
: nvram
.ppp_redialperiod
},
1661 { title
: 'MTU', multi
: [
1662 { name
: 'mtu_enable', type
: 'select', options
: [['0', 'Default'],['1','Manual']], value
: nvram
.mtu_enable
},
1663 { name
: 'f_wan_mtu', type
: 'text', maxlen
: 4, size
: 6, value
: nvram
.wan_mtu
} ] },
1664 { title
: 'Single Line MLPPP', name
: 'f_ppp_mlppp', type
: 'checkbox', value
: (nvram
.ppp_mlppp
== 1) },
1666 { title
: 'Route Modem IP', name
: 'modem_ipaddr', type
: 'text', maxlen
: 15, size
: 17, suffix
: ' <i>(must be in different subnet to router, 0.0.0.0 to disable)</i>', value
: nvram
.modem_ipaddr
},
1669 { title
: 'Use WAN port for LAN', name
: 'f_wan_islan', type
: 'checkbox', value
: (nvram
.wan_islan
== 1) }
1672 { title
: 'Bridge WAN port to primary LAN (br0)', name
: 'f_wan_islan', type
: 'checkbox', value
: (nvram
.wan_islan
== 1) }
1679 <div class='section-title'
>LAN
</div>
1680 <div class='section'
>
1682 <table class='tomato-grid' cellspacing=
1 id='lan-grid'
></table>
1684 <script type='text/javascript'
>lg
.setup();</script>
1687 <script type='text/javascript'
>
1688 dns
= nvram
.wan_dns
.split(/\s+/);
1690 //ipp = nvram.lan_ipaddr.split('.').splice(0, 3).join('.');
1692 createFieldTable('', [
1694 { title
: 'Router IP Address', name
: 'lan_ipaddr', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.lan_ipaddr
},
1695 { title
: 'Subnet Mask', name
: 'lan_netmask', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.lan_netmask
},
1697 { title
: 'Default Gateway', name
: 'lan_gateway', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.lan_gateway
},
1698 { title
: 'Static DNS', suffix
: ' <i>(IP:port)</i>', name
: 'f_dns_1', type
: 'text', maxlen
: 21, size
: 25, value
: dns
[0] || '0.0.0.0' },
1699 { title
: '', name
: 'f_dns_2', type
: 'text', maxlen
: 21, size
: 25, value
: dns
[1] || '0.0.0.0' },
1700 { title
: '', name
: 'f_dns_3', type
: 'text', maxlen
: 21, size
: 25, value
: dns
[2] || '0.0.0.0' },
1702 { title
: 'DHCP Server', name
: 'f_dhcpd_enable', type
: 'checkbox', value
: (nvram
.lan_proto
== 'dhcp') },
1703 { title
: 'IP Address Range', indent
: 2, multi
: [
1704 { name
: 'dhcpd_startip', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.dhcpd_startip
, suffix
: ' - ' },
1705 { name
: 'dhcpd_endip', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.dhcpd_endip
, suffix
: ' <i id="dhcp_count"></i>' }
1708 { title
: 'Lease Time', indent
: 2, name
: 'dhcp_lease', type
: 'text', maxlen
: 6, size
: 8, suffix
: ' <i>(minutes)</i>',
1709 value
: (nvram
.dhcp_lease
> 0) ? nvram
.dhcp_lease
: 1440 },
1710 { title
: 'WINS', indent
: 2, name
: 'wan_wins', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.wan_wins
}
1713 { title
: 'WINS <i>(for DHCP)</i>', name
: 'wan_wins', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.wan_wins
}
1719 <script type='text/javascript'
>
1721 for (var uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1722 //if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1723 if (wl_sunit(uidx
)<0) {
1724 var u
= wl_unit(uidx
);
1726 W('<input type=\'hidden\' id=\'_wl'+u
+'_mode\' name=\'wl'+u
+'_mode\'>');
1727 W('<input type=\'hidden\' id=\'_wl'+u
+'_nband\' name=\'wl'+u
+'_nband\'>');
1728 W('<input type=\'hidden\' id=\'_wl'+u
+'_wds_enable\' name=\'wl'+u
+'_wds_enable\'>');
1729 W('<input type=\'hidden\' id=\'_wl'+u
+'_wds\' name=\'wl'+u
+'_wds\'>');
1730 W('<input type=\'hidden\' id=\'_wl'+u
+'_radio\' name=\'wl'+u
+'_radio\'>');
1731 W('<input type=\'hidden\' id=\'_wl'+u
+'_closed\' name=\'wl'+u
+'_closed\'>');
1732 W('<input type=\'hidden\' id=\'_wl'+u
+'_key\' name=\'wl'+u
+'_key\'>');
1733 W('<input type=\'hidden\' id=\'_wl'+u
+'_gmode\' name=\'wl'+u
+'_gmode\'>');
1734 W('<input type=\'hidden\' id=\'_wl'+u
+'_akm\' name=\'wl'+u
+'_akm\'>');
1735 W('<input type=\'hidden\' id=\'_wl'+u
+'_auth\' name=\'wl'+u
+'_auth\'>');
1736 W('<input type=\'hidden\' id=\'_wl'+u
+'_auth_mode\' name=\'wl'+u
+'_auth_mode\'>');
1737 W('<input type=\'hidden\' id=\'_wl'+u
+'_wep\' name=\'wl'+u
+'_wep\'>');
1738 W('<input type=\'hidden\' id=\'_wl'+u
+'_lazywds\' name=\'wl'+u
+'_lazywds\'>');
1739 W('<input type=\'hidden\' id=\'_wl'+u
+'_nmode\' name=\'wl'+u
+'_nmode\'>');
1740 W('<input type=\'hidden\' id=\'_wl'+u
+'_nmcsidx\' name=\'wl'+u
+'_nmcsidx\'>');
1741 W('<input type=\'hidden\' id=\'_wl'+u
+'_nreqd\' name=\'wl'+u
+'_nreqd\'>');
1742 W('<input type=\'hidden\' id=\'_wl'+u
+'_nctrlsb\' name=\'wl'+u
+'_nctrlsb\'>');
1743 W('<input type=\'hidden\' id=\'_wl'+u
+'_nbw\' name=\'wl'+u
+'_nbw\'>');
1745 W('<div class=\'section-title\'>Wireless');
1746 // if (wl_ifaces.length > 1)
1747 W(' (' + wl_display_ifname(uidx
) + ')');
1750 W('<div class=\'section\'>');
1753 { title
: 'Enable Wireless', name
: 'f_wl'+u
+'_radio', type
: 'checkbox',
1754 value
: (eval('nvram.wl'+u
+'_radio') == '1') && (eval('nvram.wl'+u
+'_net_mode') != 'disabled') },
1755 { title
: 'MAC Address', text
: '<a href="advanced-mac.asp">' + eval('nvram.wl'+u
+'_hwaddr') + '</a>' },
1756 { title
: 'Wireless Mode', name
: 'f_wl'+u
+'_mode', type
: 'select',
1757 options
: [['ap', 'Access Point'],['apwds', 'Access Point + WDS'],['sta', 'Wireless Client'],['wet', 'Wireless Ethernet Bridge'],['wds', 'WDS']],
1758 value
: ((eval('nvram.wl'+u
+'_mode') == 'ap') && (eval('nvram.wl'+u
+'_wds_enable') == '1')) ? 'apwds' : eval('nvram.wl'+u
+'_mode') },
1759 { title
: 'Radio Band', name
: 'f_wl'+u
+'_nband', type
: 'select', options
: bands
[uidx
],
1760 value
: eval('nvram.wl'+u
+'_nband') || '0' == '0' ? bands
[uidx
][0][0] : eval('nvram.wl'+u
+'_nband') },
1761 { title
: 'Wireless Network Mode', name
: 'wl'+u
+'_net_mode', type
: 'select',
1762 value
: (eval('nvram.wl'+u
+'_net_mode') == 'disabled') ? 'mixed' : eval('nvram.wl'+u
+'_net_mode'),
1763 options
: [], prefix
: '<span id="__wl'+u
+'_net_mode">', suffix
: '</span>' },
1764 { title
: 'SSID', name
: 'wl'+u
+'_ssid', type
: 'text', maxlen
: 32, size
: 34, value
: eval('nvram.wl'+u
+'_ssid') },
1765 { title
: 'Broadcast', indent
: 2, name
: 'f_wl'+u
+'_bcast', type
: 'checkbox', value
: (eval('nvram.wl'+u
+'_closed') == '0') },
1766 { title
: '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="Scan" onclick="scanButton('+u
+')"> <img src="spin.gif" id="spin'+u
+'">',
1767 value
: eval('nvram.wl'+u
+'_channel') },
1768 { title
: 'Channel Width', name
: 'wl'+u
+'_nbw_cap', type
: 'select', options
: [['0','20 MHz'],['1','40 MHz']],
1769 value
: eval('nvram.wl'+u
+'_nbw_cap') },
1770 { title
: 'Control Sideband', name
: 'f_wl'+u
+'_nctrlsb', type
: 'select', options
: [['lower','Lower'],['upper','Upper']],
1771 value
: eval('nvram.wl'+u
+'_nctrlsb') == 'none' ? 'lower' : eval('nvram.wl'+u
+'_nctrlsb') },
1773 { title
: 'Security', name
: 'wl'+u
+'_security_mode', type
: 'select',
1774 options
: [['disabled','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']],
1775 value
: eval('nvram.wl'+u
+'_security_mode') },
1776 { title
: 'Encryption', indent
: 2, name
: 'wl'+u
+'_crypto', type
: 'select',
1777 options
: [['tkip','TKIP'],['aes','AES'],['tkip+aes','TKIP / AES']], value
: eval('nvram.wl'+u
+'_crypto') },
1778 { title
: 'Shared Key', indent
: 2, name
: 'wl'+u
+'_wpa_psk', type
: 'password', maxlen
: 64, size
: 66, peekaboo
: 1,
1779 suffix
: ' <input type="button" id="_f_wl'+u
+'_psk_random1" value="Random" onclick="random_psk(\'_wl'+u
+'_wpa_psk\')">',
1780 value
: eval('nvram.wl'+u
+'_wpa_psk') },
1781 { title
: 'Shared Key', indent
: 2, name
: 'wl'+u
+'_radius_key', type
: 'password', maxlen
: 80, size
: 32, peekaboo
: 1,
1782 suffix
: ' <input type="button" id="_f_wl'+u
+'_psk_random2" value="Random" onclick="random_psk(\'_wl'+u
+'_radius_key\')">',
1783 value
: eval('nvram.wl'+u
+'_radius_key') },
1784 { title
: 'Group Key Renewal', indent
: 2, name
: 'wl'+u
+'_wpa_gtk_rekey', type
: 'text', maxlen
: 4, size
: 6, suffix
: ' <i>(seconds)</i>',
1785 value
: eval('nvram.wl'+u
+'_wpa_gtk_rekey') },
1786 { title
: 'Radius Server', indent
: 2, multi
: [
1787 { name
: 'wl'+u
+'_radius_ipaddr', type
: 'text', maxlen
: 15, size
: 17, value
: eval('nvram.wl'+u
+'_radius_ipaddr') },
1788 { name
: 'wl'+u
+'_radius_port', type
: 'text', maxlen
: 5, size
: 7, prefix
: ' : ', value
: eval('nvram.wl'+u
+'_radius_port') } ] },
1789 { title
: 'Encryption', indent
: 2, name
: 'wl'+u
+'_wep_bit', type
: 'select', options
: [['128','128-bits'],['64','64-bits']],
1790 value
: eval('nvram.wl'+u
+'_wep_bit') },
1791 { title
: 'Passphrase', indent
: 2, name
: 'wl'+u
+'_passphrase', type
: 'text', maxlen
: 16, size
: 20,
1792 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="Random" onclick="random_wep('+u
+')">',
1793 value
: eval('nvram.wl'+u
+'_passphrase') }
1796 for (i
= 1; i
<= 4; ++i
) {
1798 { title
: ('Key ' + i
), indent
: 2, name
: ('wl'+u
+'_key' + i
), type
: 'text', maxlen
: 26, size
: 34,
1799 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>' : '>'),
1800 value
: nvram
['wl'+u
+'_key' + i
] });
1804 { title
: 'WDS', name
: 'f_wl'+u
+'_lazywds', type
: 'select',
1805 options
: [['0','Link With...'],['1','Automatic']], value
: nvram
['wl'+u
+'_lazywds'] } );
1806 wds
= eval('nvram.wl'+u
+'_wds').split(/\s+/);
1807 for (i
= 0; i
< 10; i
+= 2) {
1808 f
.push({ title
: (i
? '' : 'MAC Address'), indent
: 2, multi
: [
1809 { name
: 'f_wl'+u
+'_wds_' + i
, type
: 'text', maxlen
: 17, size
: 20, value
: wds
[i
] || '00:00:00:00:00:00' },
1810 { name
: 'f_wl'+u
+'_wds_' + (i
+ 1), type
: 'text', maxlen
: 17, size
: 20, value
: wds
[i
+ 1] || '00:00:00:00:00:00' } ] } );
1813 createFieldTable('', f
);
1823 <tr><td id='footer' colspan=
2>
1824 <span id='footer-msg'
></span>
1825 <input type='button' value='Save' id='save-button' onclick='save()'
>
1826 <input type='button' value='Cancel' id='cancel-button' onclick='reloadPage();'
>
1830 <script type='text/javascript'
>earlyInit()</script>
1831 <div style='height:
100px'
></div>