1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML
4.0//EN'
>
4 Copyright (C) 2006-2010 Jonathan Zarate
5 http://www.polarcloud.com/tomato/
8 Copyright (C) 2011 Augusto Bott
9 http://code.google.com/p/tomato-sdhc-vlan/
11 For use with Tomato Firmware only.
12 No part of this file may be used without permission.
16 <meta http-equiv='content-type' content='text/html;charset=utf-
8'
>
17 <meta name='robots' content='noindex,nofollow'
>
18 <title>[<%
ident(); %>] Basic: Network
</title>
19 <link rel='stylesheet' type='text/css' href='tomato.css'
>
21 <script type='text/javascript' src='tomato.js'
></script>
25 <style type='text/css'
>
42 vertical-align: middle
;
46 <script type='text/javascript' src='debug.js'
></script>
48 <script type='text/javascript' src='md5.js'
></script>
49 <script type='text/javascript' src='wireless.jsx?_http_id=<%
nv(http_id
); %>'
></script>
50 <script type='text/javascript' src='interfaces.js'
></script>
51 <script type='text/javascript'
>
53 // <% 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_mlppp,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"); %>
56 var lg
= new TomatoGrid();
57 lg
.setup = function() {
58 this.init('lan-grid', '', 4, [
59 { type
: 'select', options
: [[0, '0'],[1, '1'],[2, '2'],[3, '3']], prefix
: '<div class="centered">', suffix
: '</div>' },
60 { type
: 'checkbox', prefix
: '<div class="centered">', suffix
: '</div>' },
61 { type
: 'text', maxlen
: 15, size
: 17 },
62 { type
: 'text', maxlen
: 15, size
: 17 },
63 { type
: 'checkbox', prefix
: '<div class="centered">', suffix
: '</div>' },
64 { multi
: [ { type
: 'text', maxlen
: 15, size
: 17}, { type
: 'text', maxlen
: 15, size
: 17 } ] },
65 { type
: 'text', maxlen
: 6, size
: 8 }] );
66 this.headerSet(['Bridge', 'STP', 'IP Address', 'Netmask', 'DHCP', 'IP Range <i>(first/last)</i>', 'Lease Time <i>(mins)</i>']);
69 for (var i
= 0 ; i
<= MAX_BRIDGE_ID
; i
++) {
70 var j
= (i
== 0) ? '' : i
.toString();
71 if (nvram
['lan' + j
+ '_ifname'].length
> 0) {
72 if ((!fixIP(nvram
['dhcpd' + j
+ '_startip'])) || (!fixIP(nvram
['dhcpd' + j
+ '_endip']))) {
73 var x
= nvram
['lan' + j
+ '_ipaddr'].split('.').splice(0, 3).join('.') + '.';
74 nvram
['dhcpd' + j
+ '_startip'] = x
+ nvram
['dhcp' + j
+ '_start'];
75 nvram
['dhcpd' + j
+ '_endip'] = x
+ ((nvram
['dhcp' + j
+ '_start'] * 1) + (nvram
['dhcp' + j
+ '_num'] * 1) - 1);
79 nvram
['lan' + j
+ '_stp'],
80 nvram
['lan' + j
+ '_ipaddr'],
81 nvram
['lan' + j
+ '_netmask'],
82 (nvram
['lan' + j
+ '_proto'] == 'dhcp') ? '1' : '0',
83 (nvram
['dhcp' + j
+ '_start'] != '') ? fixIP(getNetworkAddress(nvram
['lan' + j
+ '_ipaddr'], nvram
['lan' + j
+ '_netmask']).split('.').splice(0, 3).join('.') + '.' + nvram
['dhcp' + j
+ '_start']) : '',
84 (nvram
['dhcp' + j
+ '_start'] != '') ? parseInt(nvram
['dhcp' + j
+ '_start']) + parseInt(nvram
['dhcp' + j
+ '_num']) - 1 : '',
85 (nvram
['lan' + j
+ '_proto'] == 'dhcp') ? (((nvram
['dhcp' + j
+ '_lease'])*1 == 0) ? '1440' : (nvram
['dhcp' + j
+ '_lease']).toString()) : ''
92 elem
.removeClass(lg
.header
.cells
[lg
.sortColumn
], 'sortasc', 'sortdes');
97 lg
.dataToView = function(data
) {
98 return ['br' + data
[0],
99 (data
[1].toString() == '1') ? '<small><i>Enabled</i></small>' : '<small><i>Disabled</i></small>',
102 (data
[4].toString() == '1') ? '<small><i>Enabled</i></small>' : '<small><i>Disabled</i></small>',
103 (((data
[5] != null) && (data
[5] != '')) ? (data
[5] + ' - ') : '') + (((data
[6] != null) && (data
[6] != '')) ? data
[6] : ''),
104 (((data
[7] != null) && (data
[7] != '')) ? data
[7] : '') ];
107 lg
.dataToFieldValues = function (data
) {
109 (data
[1] != 0) ? 'checked' : '',
112 (data
[4].toString() == '1') ? 'checked' : '',
114 (data
[6] != '') ? fixIP(getNetworkAddress(data
[2], data
[3]).split('.').splice(0, 3).join('.') + '.' + parseInt(data
[6])) : '',
115 data
[7].toString() ];
118 lg
.fieldValuesToData = function(row
) {
119 var f
= fields
.getAll(row
);
120 var g
= f
[6].value
.split('.');
122 f
[1].checked
? 1 : 0,
125 f
[4].checked
? 1 : 0,
127 (g
[3] != null) ? g
[3] : '',
131 lg
.resetNewEditor = function() {
132 var f
= fields
.getAll(this.newEditor
);
133 f
[0].selectedIndex
=0;
134 var t
= MAX_BRIDGE_ID
;
135 while((this.countBridge(f
[0].selectedIndex
) > 0) && (t
> 0)) {
136 f
[0].selectedIndex
= (f
[0].selectedIndex
%(MAX_BRIDGE_ID
))+1;
139 for(var j
=0; j
<= MAX_BRIDGE_ID
; j
++) {
140 f
[0].options
[j
].disabled
= (this.countBridge(j
) > 0);
153 ferror
.clearAll(fields
.getAll(this.newEditor
));
156 lg
.onCancel = function() {
159 this.disableNewEditor(false);
161 this.resetNewEditor();
164 lg
.onAdd = function() {
170 if (!this.verifyFields(this.newEditor
, false)) return;
172 data
= this.fieldValuesToData(this.newEditor
);
173 this.insertData(-1, data
);
175 this.disableNewEditor(false);
176 this.resetNewEditor();
181 lg
.onOK = function() {
184 if (!this.verifyFields(this.editor
, false)) return;
186 data
= this.fieldValuesToData(this.editor
);
187 view
= this.dataToView(data
);
189 this.source
.setRowData(data
);
190 for (i
= 0; i
< this.source
.cells
.length
; ++i
) {
191 this.source
.cells
[i
].innerHTML
= view
[i
];
196 this.disableNewEditor(false);
199 this.resetNewEditor();
202 lg
.onDelete = function() {
204 elem
.remove(this.source
);
206 this.disableNewEditor(false);
208 this.resetNewEditor();
211 lg
.countElem = function(f
, v
) {
212 var data
= this.getAllData();
214 for (var i
= 0; i
< data
.length
; ++i
) {
215 total
+= (data
[i
][f
] == v
) ? 1 : 0;
220 lg
.countBridge = function (v
) {
221 return this.countElem(0,v
);
224 lg
.countOverlappingNetworks = function (ip
) {
225 var data
= this.getAllData();
227 for (var i
= 0; i
< data
.length
; ++i
) {
228 var net
= getNetworkAddress(data
[i
][2], data
[i
][3]);
229 var brd
= getBroadcastAddress(net
, data
[i
][3]);
230 total
+= ((aton(ip
) <= aton(brd
)) && (aton(ip
) >= aton(net
))) ? 1 : 0;
235 lg
.verifyFields = function(row
, quiet
) {
239 f
= fields
.getAll(row
);
241 for(var j
=0; j
<= MAX_BRIDGE_ID
; j
++) {
242 f
[0].options
[j
].disabled
= (this.countBridge(j
) > 0);
245 if(this.countBridge(f
[0].selectedIndex
) > 0) {
246 ferror
.set(f
[0], 'Cannot add another entry for bridge br' + f
[0].selectedIndex
, quiet
);
252 if(!v_ip(f
[2], quiet
|| !ok
))
254 // if we have a properly defined IP address - 0.0.0.0 is NOT a valid IP address for our intents/purposes!
255 if ((f
[2].value
!= '') && (f
[2].value
!= '0.0.0.0')) {
256 // allow DHCP to be enabled
259 if(!v_netmask(f
[3], quiet
|| !ok
)) {
262 // must be 22 bits or smaller network
263 if (numberOfBitsOnNetMask(f
[3].value
) < 22) {
264 ferror
.set(f
[3], 'Netmask must have at least 22 bits set (255.255.252.0)', quiet
);
270 if(f
[2].value
== getNetworkAddress(f
[2].value
, f
[3].value
)) {
271 var s
= 'Invalid IP address or subnet mask (the address of the network cannot be used)';
272 ferror
.set(f
[2], s
, quiet
);
273 ferror
.set(f
[3], s
, quiet
);
276 if(f
[2].value
== getBroadcastAddress(getNetworkAddress(f
[2].value
, f
[3].value
), f
[3].value
)) {
277 var s
= 'Invalid IP address or subnet mask (the broadcast address cannot be used)';
278 ferror
.set(f
[2], s
, quiet
);
279 ferror
.set(f
[3], s
, quiet
);
282 if (this.countOverlappingNetworks(f
[2].value
) > 0) {
283 var s
= 'Invalid IP address or subnet mask (conflicts/overlaps with another LAN bridge)';
284 ferror
.set(f
[2], s
, quiet
);
285 ferror
.set(f
[3], s
, quiet
);
296 if( (f
[4].checked
) && (v_ip(f
[2], 1)) && (v_netmask(f
[3],1)) ) {
300 // first/last IP still unset?
301 if (f
[5].value
== '') {
303 var m
= aton(f
[2].value
) & aton(f
[3].value
);
304 var o
= (m
) ^ (~ aton(f
[3].value
))
312 } while (((l
= fixIP(ntoa(m
), 1)) == null) || (l
== f
[2].value
) );
315 if (f
[6].value
== '') {
317 var m
= aton(f
[2].value
) & aton(f
[3].value
);
318 var o
= (m
) ^ (~ aton(f
[3].value
));
326 } while (((l
= fixIP(ntoa(o
), 1)) == null) || (l
== f
[2].value
) );
330 if ((getNetworkAddress(f
[5].value
, f
[3].value
) != getNetworkAddress(f
[2].value
, f
[3].value
)) ||
331 (f
[5].value
== getBroadcastAddress(getNetworkAddress(f
[2].value
, f
[3].value
), f
[3].value
)) ||
332 (f
[5].value
== getNetworkAddress(f
[2].value
, f
[3].value
)) ||
333 (f
[2].value
== f
[5].value
)) {
334 ferror
.set(f
[5], 'Invalid first IP address or subnet mask', quiet
|| !ok
);
340 if ((getNetworkAddress(f
[6].value
, f
[3].value
) != getNetworkAddress(f
[2].value
, f
[3].value
)) ||
341 (f
[6].value
== getBroadcastAddress(getNetworkAddress(f
[2].value
, f
[3].value
), f
[3].value
)) ||
342 (f
[6].value
== getNetworkAddress(f
[2].value
, f
[3].value
)) ||
343 (f
[2].value
== f
[6].value
)) {
344 ferror
.set(f
[6], 'Invalid last IP address or subnet mask', quiet
|| !ok
);
349 // validate range, swap first/last IP if needed
350 if (aton(f
[6].value
) < aton(f
[5].value
)) {
352 f
[5].value
= f
[6].value
;
356 if (parseInt(f
[7].value
*1) == 0)
357 f
[7].value
= 1440; // from nvram/defaults.c
358 if(!v_mins(f
[7], quiet
|| !ok
, 1, 10080))
372 W('<style type=\'text/css\'>');
373 for (var u
= 0; u
< wl_ifaces
.length
; ++u
) {
374 W('#spin'+wl_unit(u
)+', ');
377 W(' visibility: hidden;');
378 W(' vertical-align: middle;');
384 var nphy
= features('11n');
387 if ((!fixIP(nvram
.dhcpd_startip
)) || (!fixIP(nvram
.dhcpd_endip
))) {
388 var x
= nvram
.lan_ipaddr
.split('.').splice(0, 3).join('.') + '.';
389 nvram
.dhcpd_startip
= x
+ nvram
.dhcp_start
;
390 nvram
.dhcpd_endip
= x
+ ((nvram
.dhcp_start
* 1) + (nvram
.dhcp_num
* 1) - 1);
396 var nm_loaded
= [], ch_loaded
= [], max_channel
= [];
398 for (var uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
399 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
400 if (wl_sunit(uidx
)<0) {
403 for (var i
= 0; i
< wl_bands
[uidx
].length
; ++i
) {
404 b
.push([wl_bands
[uidx
][i
] + '', (wl_bands
[uidx
][i
] == '1') ? '5 GHz' : '2.4 GHz']);
414 refresher
.push(null);
418 function selectedBand(uidx
)
420 if (bands
[uidx
].length
> 1) {
421 var e
= E('_f_wl'+u
+'_nband');
422 return (e
.value
+ '' == '' ? eval('nvram.wl'+u
+'_nband') : e
.value
);
423 } else if (bands
[uidx
].length
> 0) {
424 return bands
[uidx
][0][0] || '0';
430 function refreshNetModes(uidx
)
434 if (uidx
>= wl_ifaces
.length
) return;
435 var u
= wl_unit(uidx
);
437 var m
= [['mixed','Auto']];
438 if (selectedBand(uidx
) == '1') {
439 m
.push(['a-only','A Only']);
441 m
.push(['n-only','N Only']);
445 m
.push(['b-only','B Only']);
446 m
.push(['g-only','G Only']);
448 m
.push(['bg-mixed','B/G Mixed']);
449 m
.push(['n-only','N Only']);
453 e
= E('_wl'+u
+'_net_mode');
455 val
= (!nm_loaded
[uidx
] || (e
.value
+ '' == '')) ? eval('nvram.wl'+u
+'_net_mode') : e
.value
;
456 if (val
== 'disabled') val
= 'mixed';
457 for (i
= 0; i
< m
.length
; ++i
)
458 buf
+= '<option value="' + m
[i
][0] + '"' + ((m
[i
][0] == val
) ? ' selected' : '') + '>' + m
[i
][1] + '</option>';
460 e
= E('__wl'+u
+'_net_mode');
461 buf
= '<select name="wl'+u
+'_net_mode" onchange="verifyFields(this, 1)" id = "_wl'+u
+'_net_mode">' + buf
+ '</select>';
462 elem
.setInnerHTML(e
, buf
);
466 function refreshChannels(uidx
)
468 if (refresher
[uidx
] != null) return;
469 if (u
>= wl_ifaces
.length
) return;
470 var u
= wl_unit(uidx
);
472 refresher
[uidx
] = new XmlHttp();
473 refresher
[uidx
].onCompleted = function(text
, xml
) {
477 var wl_channels
= [];
481 max_channel
[uidx
] = 0;
482 for (i
= 0; i
< wl_channels
.length
; ++i
) {
483 ghz
[uidx
].push([wl_channels
[i
][0] + '',
484 (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']);
485 max_channel
[uidx
] = wl_channels
[i
][0] * 1;
488 e
= E('_wl'+u
+'_channel');
490 val
= (!ch_loaded
[uidx
] || (e
.value
+ '' == '')) ? eval('nvram.wl'+u
+'_channel') : e
.value
;
491 for (i
= 0; i
< ghz
[uidx
].length
; ++i
)
492 buf
+= '<option value="' + ghz
[uidx
][i
][0] + '"' + ((ghz
[uidx
][i
][0] == val
) ? ' selected' : '') + '>' + ghz
[uidx
][i
][1] + '</option>';
494 e
= E('__wl'+u
+'_channel');
495 buf
= '<select name="wl'+u
+'_channel" onchange="verifyFields(this, 1)" id = "_wl'+u
+'_channel">' + buf
+ '</select>';
496 elem
.setInnerHTML(e
, buf
);
499 refresher
[uidx
] = null;
500 verifyFields(null, 1);
504 refresher
[uidx
] = null;
509 e
= E('_f_wl'+u
+'_nctrlsb');
510 sb
= (e
.value
+ '' == '' ? eval('nvram.wl'+u
+'_nctrlsb') : e
.value
);
511 e
= E('_wl'+u
+'_nbw_cap');
512 bw
= (e
.value
+ '' == '' ? eval('nvram.wl'+u
+'_nbw_cap') : e
.value
) == '0' ? '20' : '40';
514 refresher
[uidx
].onError = function(ex
) { alert(ex
); refresher
[uidx
] = null; reloadPage(); }
515 refresher
[uidx
].post('update.cgi', 'exec=wlchannels&arg0=' + u
+ '&arg1=' + (nphy
? '1' : '0') +
516 '&arg2=' + bw
+ '&arg3=' + selectedBand(uidx
) + '&arg4=' + sb
);
519 function spin(x
, unit
)
521 for (var u
= 0; u
< wl_ifaces
.length
; ++u
) {
522 E('_f_wl'+wl_unit(u
)+'_scan').disabled
= x
;
524 var e
= E('_f_wl'+unit
+'_scan');
525 if (x
) e
.value
= 'Scan ' + (wscan
.tries
+ 1);
526 else e
.value
= 'Scan';
527 E('spin'+unit
).style
.visibility
= x
? 'visible' : 'hidden';
534 var unit
= wscan
.unit
;
535 var uidx
= wl_uidx(unit
);
538 xob
.onCompleted = function(text
, xml
) {
545 for (i
= 0; i
< wlscandata
.length
; ++i
) {
546 var data
= wlscandata
[i
];
550 if (!wscan
.inuse
[ch
]) {
558 if (!wscan
.seen
[mac
]) {
560 ++wscan
.inuse
[ch
].count
;
563 if (data
[4] > wscan
.inuse
[ch
].rssi
) {
564 wscan
.inuse
[ch
].rssi
= data
[4];
565 wscan
.inuse
[ch
].ssid
= data
[1];
568 var e
= E('_wl'+unit
+'_channel');
569 for (i
= 1; i
< ghz
[uidx
].length
; ++i
) {
570 var s
= ghz
[uidx
][i
][1];
571 var u
= wscan
.inuse
[ghz
[uidx
][i
][0]];
572 if (u
) s
+= ' (' + u
.count
+ ' AP' + (u
.count
== 1 ? '' : 's') + ' / strongest: "' + escapeHTML(ellipsis(u
.ssid
, 15)) + '" ' + u
.rssi
+ ' dBm)';
573 e
.options
[i
].innerHTML
= s
;
575 e
.style
.width
= '400px';
579 if (wscan
.tries
< 4) {
581 setTimeout(scan
, 1000);
589 xob
.onError = function(x
) {
590 alert('error: ' + x
);
596 xob
.post('update.cgi', 'exec=wlscan&arg0='+unit
);
599 function scanButton(u
)
613 function joinAddr(a
) {
617 for (i
= 0; i
< a
.length
; ++i
) {
619 if ((s
!= '00:00:00:00:00:00') && (s
!= '0.0.0.0')) r
.push(s
);
624 function random_x(max
)
626 var c
= '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
628 while (max
-- > 0) s
+= c
.substr(Math
.floor(c
.length
* Math
.random()), 1);
632 function random_psk(id
)
635 e
.value
= random_x(63);
636 verifyFields(null, 1);
639 function random_wep(u
)
641 E('_wl'+u
+'_passphrase').value
= random_x(16);
645 function v_wep(e
, quiet
)
649 if (((s
.length
== 5) || (s
.length
== 13)) && (s
.length
== (e
.maxLength
>> 1))) {
653 s
= s
.toUpperCase().replace(/[^0-9A-F]/g, '');
654 if (s
.length
!= e
.maxLength
) {
655 ferror
.set(e
, 'Invalid WEP key. Expecting ' + e
.maxLength
+ ' hex or ' + (e
.maxLength
>> 1) + ' ASCII characters.', quiet
);
665 // compatible w/ Linksys' and Netgear's (key 1) method for 128-bits
666 function generate_wep(u
)
668 function _wepgen(pass
, i
)
670 while (pass
.length
< 64) pass
+= pass
;
671 return hex_md5(pass
.substr(0, 64)).substr(i
, (E('_wl'+u
+'_wep_bit').value
== 128) ? 26 : 10);
674 var e
= E('_wl'+u
+'_passphrase');
676 if (!v_length(e
, false, 3)) return;
677 E('_wl'+u
+'_key1').value
= _wepgen(pass
, 0);
679 E('_wl'+u
+'_key2').value
= _wepgen(pass
, 2);
681 E('_wl'+u
+'_key3').value
= _wepgen(pass
, 4);
683 E('_wl'+u
+'_key4').value
= _wepgen(pass
, 6);
684 verifyFields(null, 1);
687 function verifyFields(focused
, quiet
)
695 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
696 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
697 if (wl_sunit(uidx
)<0) {
699 if (focused
== E('_f_wl'+u
+'_nband')) {
700 refreshNetModes(uidx
);
701 refreshChannels(uidx
);
703 else if (focused
== E('_f_wl'+u
+'_nctrlsb') || focused
== E('_wl'+u
+'_nbw_cap')) {
704 refreshChannels(uidx
);
709 // --- visibility ---
725 _ppp_redialperiod
: 1,
747 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
748 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
749 if (wl_sunit(uidx
)<0) {
753 _f_wl_nband
: (bands
[uidx
].length
> 1) ? 1 : 0,
758 _wl_nbw_cap
: nphy
? 1 : 0,
759 _f_wl_nctrlsb
: nphy
? 1 : 0,
762 _wl_security_mode
: 1,
765 _f_wl_psk_random1
: 1,
766 _f_wl_psk_random2
: 1,
767 _wl_wpa_gtk_rekey
: 1,
769 _wl_radius_ipaddr
: 1,
787 var wan
= E('_wan_proto').value
;
789 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
790 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
791 if (wl_sunit(uidx
)<0) {
792 wmode
= E('_f_wl'+wl_unit(uidx
)+'_mode').value
;
794 if (wmode
== 'wet') {
798 vis
._f_dhcpd_enable
= 0;
803 if ((wan
== 'disabled') || (wmode
== 'sta') || (wmode
== 'wet')) {
804 vis
._f_wan_islan
= 1;
811 vis
._ppp_username
= 0;
812 vis
._ppp_service
= 0;
814 vis
._l2tp_server_ip
= 0;
816 vis
._wan_netmask
= 0;
817 vis
._wan_gateway
= 0;
818 vis
._pptp_server_ip
= 0;
819 vis
._f_pptp_dhcp
= 0;
823 vis
._f_ppp_mlppp
= 0;
826 vis
._l2tp_server_ip
= 0;
828 vis
._ppp_service
= 0;
829 vis
._ppp_username
= 0;
831 vis
._pptp_server_ip
= 0;
832 vis
._f_pptp_dhcp
= 0;
833 vis
._wan_gateway
= 0;
835 vis
._wan_netmask
= 0;
836 vis
._f_ppp_mlppp
= 0;
838 vis
._lan_gateway
= 0;
841 vis
._l2tp_server_ip
= 0;
842 vis
._pptp_server_ip
= 0;
843 vis
._f_pptp_dhcp
= 0;
844 vis
._wan_gateway
= 0;
846 vis
._wan_netmask
= 0;
848 vis
._lan_gateway
= 0;
851 vis
._l2tp_server_ip
= 0;
853 vis
._ppp_service
= 0;
854 vis
._ppp_username
= 0;
856 vis
._pptp_server_ip
= 0;
857 vis
._f_pptp_dhcp
= 0;
858 vis
._f_ppp_mlppp
= 0;
860 vis
._lan_gateway
= 0;
863 vis
._l2tp_server_ip
= 0;
864 vis
._ppp_service
= 0;
865 vis
._wan_gateway
= (!E('_f_pptp_dhcp').checked
);
866 vis
._wan_ipaddr
= (!E('_f_pptp_dhcp').checked
);
868 vis
._lan_gateway
= 0;
871 vis
._pptp_server_ip
= 0;
872 vis
._ppp_service
= 0;
873 vis
._wan_gateway
= (!E('_f_pptp_dhcp').checked
);
874 vis
._wan_ipaddr
= (!E('_f_pptp_dhcp').checked
);
876 vis
._lan_gateway
= 0;
880 vis
._ppp_idletime
= (E('_ppp_demand').value
== 1) && vis
._ppp_demand
881 vis
._ppp_redialperiod
= !vis
._ppp_idletime
&& vis
._ppp_demand
;
883 if (vis
._mtu_enable
) {
884 if (E('_mtu_enable').value
== 0) {
887 switch (E('_wan_proto').value
) {
903 if (!E('_f_dhcpd_enable').checked
) vis
._dhcp_lease
= 0;
906 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
907 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
908 if (wl_sunit(uidx
)<0) {
910 wmode
= E('_f_wl'+u
+'_mode').value
;
912 if (!E('_f_wl'+u
+'_radio').checked
) {
913 for (a
in wl_vis
[uidx
]) {
916 wl_vis
[uidx
]._f_wl_radio
= 1;
917 wl_vis
[uidx
]._wl_nbw_cap
= nphy
? 2 : 0;
918 wl_vis
[uidx
]._f_wl_nband
= (bands
[uidx
].length
> 1) ? 2 : 0;
927 wl_vis
[uidx
]._f_wl_bcast
= 0;
928 wl_vis
[uidx
]._wl_channel
= 0;
929 wl_vis
[uidx
]._wl_nbw_cap
= 0;
931 wl_vis
[uidx
]._f_wl_lazywds
= 0;
932 wl_vis
[uidx
]._f_wl_wds_0
= 0;
936 sm2
= E('_wl'+u
+'_security_mode').value
;
939 wl_vis
[uidx
]._wl_crypto
= 0;
940 wl_vis
[uidx
]._wl_wep_bit
= 0;
941 wl_vis
[uidx
]._wl_wpa_psk
= 0;
942 wl_vis
[uidx
]._wl_radius_key
= 0;
943 wl_vis
[uidx
]._wl_radius_ipaddr
= 0;
944 wl_vis
[uidx
]._wl_wpa_gtk_rekey
= 0;
947 wl_vis
[uidx
]._wl_crypto
= 0;
948 wl_vis
[uidx
]._wl_wpa_psk
= 0;
949 wl_vis
[uidx
]._wl_radius_key
= 0;
950 wl_vis
[uidx
]._wl_radius_ipaddr
= 0;
951 wl_vis
[uidx
]._wl_wpa_gtk_rekey
= 0;
954 wl_vis
[uidx
]._wl_crypto
= 0;
955 wl_vis
[uidx
]._wl_wpa_psk
= 0;
958 wl_vis
[uidx
]._wl_wep_bit
= 0;
959 if (sm2
.indexOf('personal') != -1) {
960 wl_vis
[uidx
]._wl_radius_key
= 0;
961 wl_vis
[uidx
]._wl_radius_ipaddr
= 0;
964 wl_vis
[uidx
]._wl_wpa_psk
= 0;
969 if ((E('_f_wl'+u
+'_lazywds').value
== 1) && (wl_vis
[uidx
]._f_wl_wds_0
== 1)) {
970 wl_vis
[uidx
]._f_wl_wds_0
= 2;
973 if (wl_vis
[uidx
]._wl_nbw_cap
!= 0) {
974 switch (E('_wl'+u
+'_net_mode').value
) {
979 wl_vis
[uidx
]._wl_nbw_cap
= 2;
980 if (E('_wl'+u
+'_nbw_cap').value
!= '0') {
981 E('_wl'+u
+'_nbw_cap').value
= 0;
982 refreshChannels(uidx
);
986 // avoid Enterprise-TKIP with 40MHz
987 if ((sm2
== 'wpa_enterprise') && (E('_wl'+u
+'_crypto').value
== 'tkip')) {
988 wl_vis
[uidx
]._wl_nbw_cap
= 2;
989 if (E('_wl'+u
+'_nbw_cap').value
!= '0') {
990 E('_wl'+u
+'_nbw_cap').value
= 0;
991 refreshChannels(uidx
);
996 wl_vis
[uidx
]._f_wl_nctrlsb
= (E('_wl'+u
+'_nbw_cap').value
== 0) ? 0 : wl_vis
[uidx
]._wl_nbw_cap
;
1000 Special case - 2.4GHz band, currently running in B/G-only mode,
1001 with N/Auto and 40MHz selected in the GUI.
1002 Channel list is not filtered in this case by the wl driver,
1003 and includes all channels available with 20MHz channel width.
1005 b
= selectedBand(uidx
);
1006 if (wl_vis
[uidx
]._wl_channel
== 1 && wl_vis
[uidx
]._f_wl_nctrlsb
!= 0 &&
1007 ((b
== '2') || (wl_vis
[uidx
]._f_wl_nband
== 0 && b
== '0'))) {
1008 switch (eval('nvram.wl'+u
+'_net_mode')) {
1012 i
= E('_wl'+u
+'_channel').value
* 1;
1013 if (i
> 0 && i
< 5) {
1014 E('_f_wl'+u
+'_nctrlsb').value
= 'lower';
1015 wl_vis
[uidx
]._f_wl_nctrlsb
= 2;
1017 else if (i
> max_channel
[uidx
] - 4) {
1018 E('_f_wl'+u
+'_nctrlsb').value
= 'upper';
1019 wl_vis
[uidx
]._f_wl_nctrlsb
= 2;
1025 wl_vis
[uidx
]._f_wl_scan
= wl_vis
[uidx
]._wl_channel
;
1026 wl_vis
[uidx
]._f_wl_psk_random1
= wl_vis
[uidx
]._wl_wpa_psk
;
1027 wl_vis
[uidx
]._f_wl_psk_random2
= wl_vis
[uidx
]._wl_radius_key
;
1028 wl_vis
[uidx
]._wl_radius_port
= wl_vis
[uidx
]._wl_radius_ipaddr
;
1029 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
;
1031 for (i
= 1; i
< 10; ++i
) {
1032 wl_vis
[uidx
]['_f_wl_wds_' + i
] = wl_vis
[uidx
]._f_wl_wds_0
;
1035 } // for each wl_iface
1037 vis
._ppp_passwd
= vis
._ppp_username
;
1039 vis
._dhcpd_startip
= vis
._dhcpd_endip
= vis
._wan_wins
= vis
._dhcp_lease
;
1048 b
.disabled
= (c
!= 1);
1049 PR(b
).style
.display
= c
? '' : 'none';
1052 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1053 if(wl_ifaces
[uidx
][0].indexOf('.') < 0) {
1054 for (a
in wl_vis
[uidx
]) {
1056 if (a
.substr(0, 6) == '_f_wl_') i
= 5;
1057 b
= E(a
.substr(0, i
) + wl_unit(uidx
) + a
.substr(i
, a
.length
));
1058 c
= wl_vis
[uidx
][a
];
1059 b
.disabled
= (c
!= 1);
1060 PR(b
).style
.display
= c
? '' : 'none';
1067 ferror
.clear('_wan_proto');
1070 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1071 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1072 if (wl_sunit(uidx
)<0) {
1074 wmode
= E('_f_wl'+u
+'_mode').value
;
1075 sm2
= E('_wl'+u
+'_security_mode').value
;
1078 if ((wl_vis[uidx]._f_wl_mode == 1) && (wmode != 'ap') && (sm2.substr(0, 4) == 'wpa2')) {
1079 ferror.set('_wl'+u+'_security_mode', 'WPA2 is supported only in AP mode.', quiet || !ok);
1082 else ferror.clear('_wl'+u+'_security_mode');
1085 // --- N standard does not support WPA+TKIP ---
1086 a
= E('_wl'+u
+'_crypto');
1087 switch (E('_wl'+u
+'_net_mode').value
) {
1090 if (nphy
&& (a
.value
== 'tkip') && (sm2
.indexOf('wpa') != -1)) {
1091 ferror
.set(a
, 'TKIP encryption is not supported with WPA / WPA2 in N mode.', quiet
|| !ok
);
1094 else ferror
.clear(a
);
1098 a
= E('_wl'+u
+'_net_mode');
1100 b
= E('_f_wl'+u
+'_mode');
1102 if ((wmode
== 'sta') || (wmode
== 'wet')) {
1105 ferror
.set(b
, 'Only one wireless interface can be configured in client mode.', quiet
|| !ok
);
1108 else if (a
.value
== 'n-only') {
1109 ferror
.set(a
, 'N-only is not supported in wireless client modes, use Auto.', quiet
|| !ok
);
1114 a
= E('_wl'+u
+'_wpa_psk');
1116 if (wl_vis
[uidx
]._wl_wpa_psk
== 1) {
1117 if ((a
.value
.length
< 8) || ((a
.value
.length
== 64) && (a
.value
.search(/[^0-9A-Fa-f]/) != -1))) {
1118 ferror
.set('_wl'+u
+'_wpa_psk', 'Invalid pre-shared key. Please enter at least 8 characters or 64 hexadecimal digits.', quiet
|| !ok
);
1124 if (((wmode
== 'wds') || (wmode
== 'apwds')) && (wl_vis
[uidx
]._wl_channel
== 1) && (E('_wl'+u
+'_channel').value
== '0')) {
1125 ferror
.set('_wl'+u
+'_channel', 'Fixed wireless channel required in WDS mode.', quiet
|| !ok
);
1128 else ferror
.clear('_wl'+u
+'_channel');
1130 if (E('_f_wl'+u
+'_mode').value
== 'sta') {
1131 if ((wan
== 'disabled') && (E('_f_wl'+u
+'_radio').checked
)) {
1132 ferror
.set('_wan_proto', 'Wireless Client mode requires a valid WAN setting (usually DHCP).', quiet
|| !ok
);
1139 // domain name or IP address
1140 a
= ['_l2tp_server_ip', '_pptp_server_ip'];
1141 for (i
= a
.length
- 1; i
>= 0; --i
)
1142 if ((vis
[a
[i
]]) && ((!v_length(a
[i
], 1, 1)) || ((!v_ip(a
[i
], 1)) && (!v_domain(a
[i
], 1))))) {
1143 if (!quiet
&& ok
) ferror
.show(a
[i
]);
1149 a
= ['_wan_gateway','_wan_ipaddr','_lan_ipaddr', '_dhcpd_startip', '_dhcpd_endip'];
1152 a
= ['_wan_gateway','_wan_ipaddr'];
1154 for (i
= a
.length
- 1; i
>= 0; --i
)
1155 if ((vis
[a
[i
]]) && (!v_ip(a
[i
], quiet
|| !ok
))) ok
= 0;
1157 // IP address, blank -> 0.0.0.0
1158 a
= ['_f_dns_1', '_f_dns_2', '_f_dns_3','_wan_wins','_lan_gateway'];
1159 for (i
= a
.length
- 1; i
>= 0; --i
)
1160 if ((vis
[a
[i
]]) && (!v_dns(a
[i
], quiet
|| !ok
))) ok
= 0;
1164 a
= ['_wan_netmask','_lan_netmask'];
1167 a
= ['_wan_netmask'];
1169 for (i
= a
.length
- 1; i
>= 0; --i
)
1170 if ((vis
[a
[i
]]) && (!v_netmask(a
[i
], quiet
|| !ok
))) ok
= 0;
1174 a
= [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500],
1175 ['_dhcp_lease', 1, 10080]];
1178 a
= [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500]];
1180 for (i
= a
.length
- 1; i
>= 0; --i
) {
1182 if ((vis
[v
[0]]) && (!v_range(v
[0], quiet
|| !ok
, v
[1], v
[2]))) ok
= 0;
1185 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1186 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1187 if (wl_sunit(uidx
)<0) {
1191 a
= ['_radius_ipaddr'];
1192 for (i
= a
.length
- 1; i
>= 0; --i
) {
1193 if ((wl_vis
[uidx
]['_wl'+a
[i
]]) && (!v_ip('_wl'+u
+a
[i
], quiet
|| !ok
))) ok
= 0;
1197 a
= [['_wpa_gtk_rekey', 60, 7200], ['_radius_port', 1, 65535]];
1198 for (i
= a
.length
- 1; i
>= 0; --i
) {
1200 if ((wl_vis
[uidx
]['_wl'+v
[0]]) && (!v_range('_wl'+u
+v
[0], quiet
|| !ok
, v
[1], v
[2]))) ok
= 0;
1204 a
= [['_ssid', 1], ['_radius_key', 1]];
1205 for (i
= a
.length
- 1; i
>= 0; --i
) {
1207 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;
1210 if (wl_vis
[uidx
]._wl_key1
) {
1211 a
= (E('_wl'+u
+'_wep_bit').value
== 128) ? 26 : 10;
1212 for (i
= 1; i
<= 4; ++i
) {
1213 b
= E('_wl'+u
+'_key' + i
);
1215 if ((b
.value
.length
> 0) || (E('_f_wl'+u
+'_wepidx_' + i
).checked
)) {
1216 if (!v_wep(b
, quiet
|| !ok
)) ok
= 0;
1218 else ferror
.clear(b
);
1222 ferror
.clear('_f_wl'+u
+'_wds_0');
1223 if (wl_vis
[uidx
]._f_wl_wds_0
== 1) {
1225 for (i
= 0; i
< 10; ++i
) {
1226 a
= E('_f_wl'+u
+'_wds_' + i
);
1227 if (!v_macz(a
, quiet
|| !ok
)) ok
= 0;
1228 else if (!isMAC0(a
.value
)) b
= 1;
1231 ferror
.set('_f_wl'+u
+'_wds_0', 'WDS MAC address required.', quiet
|| !ok
);
1239 a
= E('_dhcpd_startip');
1240 b
= E('_dhcpd_endip');
1244 if ((vis
._dhcp_lease
) && (!a
._error_msg
) && (!b
._error_msg
)) {
1245 c
= aton(E('_lan_netmask').value
);
1246 d
= aton(E('_lan_ipaddr').value
) & c
;
1247 e
= 'Invalid IP address or subnet mask';
1248 if ((aton(a
.value
) & c
) != d
) {
1249 ferror
.set(a
, e
, quiet
|| !ok
);
1252 if ((aton(b
.value
) & c
) != d
) {
1253 ferror
.set(b
, e
, quiet
|| !ok
);
1258 if ((vis
._dhcp_lease
) && (!a
._error_msg
) && (!b
._error_msg
)) {
1259 if (aton(a
.value
) > aton(b
.value
)) {
1265 elem
.setInnerHTML('dhcp_count', '(' + ((aton(b
.value
) - aton(a
.value
)) + 1) + ')');
1272 function earlyInit()
1274 verifyFields(null, 1);
1280 if (lg
.isEditing()) return;
1281 lg
.resetNewEditor();
1286 var u
, uidx
, wmode
, sm2
, wradio
;
1288 if (!verifyFields(null, false)) return;
1290 var fom
= E('_fom');
1292 fom
.wan_mtu
.value
= fom
.f_wan_mtu
.value
;
1293 fom
.wan_mtu
.disabled
= fom
.f_wan_mtu
.disabled
;
1296 fom
.lan_proto
.value
= fom
.f_dhcpd_enable
.checked
? 'dhcp' : 'static';
1299 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1300 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1301 if (wl_sunit(uidx
)<0) {
1303 wmode
= E('_f_wl'+u
+'_mode').value
;
1304 sm2
= E('_wl'+u
+'_security_mode').value
;
1305 wradio
= E('_f_wl'+u
+'_radio').checked
;
1307 E('_wl'+u
+'_nband').value
= selectedBand(uidx
);
1309 if (wmode
== 'apwds') E('_wl'+u
+'_mode').value
= 'ap';
1310 else E('_wl'+u
+'_mode').value
= wmode
;
1312 if (wmode
== 'wet') {
1313 fom
.wan_proto
.value
= 'disabled';
1314 fom
.wan_proto
.disabled
= 0;
1316 fom
.lan_proto
.value
= 'static';
1319 // TODO - what's required ? integrate with tomatogrid?
1324 for (i
= 0; i
< 10; ++i
) a
.push(E('_f_wl'+u
+'_wds_' + i
).value
);
1325 E('_wl'+u
+'_wds').value
= joinAddr(a
);
1327 if (wmode
.indexOf('wds') != -1) {
1328 E('_wl'+u
+'_wds_enable').value
= 1;
1329 E('_wl'+u
+'_lazywds').value
= E('_f_wl'+u
+'_lazywds').value
;
1330 if (E('_wl'+u
+'_lazywds').value
== 1) E('_wl'+u
+'_wds').value
= '';
1333 E('_wl'+u
+'_wds_enable').value
= 0;
1334 E('_wl'+u
+'_wds').value
= '';
1335 E('_wl'+u
+'_lazywds').value
= 0;
1338 E('_wl'+u
+'_radio').value
= wradio
? 1 : 0;
1339 E('_wl'+u
+'_auth').value
= eval('nvram.wl'+u
+'_auth');
1341 e
= E('_wl'+u
+'_akm');
1351 if (sm2
.indexOf('personal') != -1) {
1352 if (sm2
.indexOf('wpa2_') == -1) c
.push('psk');
1353 if (sm2
.indexOf('wpa_') == -1) c
.push('psk2');
1356 if (sm2
.indexOf('wpa2_') == -1) c
.push('wpa');
1357 if (sm2
.indexOf('wpa_') == -1) c
.push('wpa2');
1363 E('_wl'+u
+'_auth_mode').value
= (sm2
== 'radius') ? 'radius' : 'none';
1364 E('_wl'+u
+'_wep').value
= ((sm2
== 'radius') || (sm2
== 'wep')) ? 'enabled': 'disabled';
1366 if (sm2
.indexOf('wpa') != -1) E('_wl'+u
+'_auth').value
= 0;
1368 E('_wl'+u
+'_nreqd').value
= 0;
1369 E('_wl'+u
+'_gmode').value
= 1;
1370 E('_wl'+u
+'_nmode').value
= 0;
1371 E('_wl'+u
+'_nmcsidx').value
= -2; // Legacy Rate
1372 E('_wl'+u
+'_nbw').value
= 0;
1373 switch (E('_wl'+u
+'_net_mode').value
) {
1375 E('_wl'+u
+'_gmode').value
= 0;
1378 E('_wl'+u
+'_gmode').value
= 4;
1383 E('_wl'+u
+'_nmcsidx').value
= -1; // Auto
1386 if (selectedBand(uidx
) == '1') { // 5 GHz
1387 E('_wl'+u
+'_nmode').value
= -1;
1388 E('_wl'+u
+'_nmcsidx').value
= -1;
1390 E('_wl'+u
+'_nmode').value
= 1;
1391 E('_wl'+u
+'_nmcsidx').value
= 32;
1393 E('_wl'+u
+'_nreqd').value
= 1;
1396 E('_wl'+u
+'_nmode').value
= -1;
1397 E('_wl'+u
+'_nmcsidx').value
= -1;
1401 E('_wl'+u
+'_nctrlsb').value
= eval('nvram.wl'+u
+'_nctrlsb');
1402 if (E('_wl'+u
+'_nmode').value
!= 0) {
1403 E('_wl'+u
+'_nctrlsb').value
= E('_f_wl'+u
+'_nctrlsb').value
;
1404 E('_wl'+u
+'_nbw').value
= (E('_wl'+u
+'_nbw_cap').value
== 0) ? 20 : 40;
1407 E('_wl'+u
+'_closed').value
= E('_f_wl'+u
+'_bcast').checked
? 0 : 1;
1409 a
= fields
.radio
.selected(eval('fom.f_wl'+u
+'_wepidx'));
1410 if (a
) E('_wl'+u
+'_key').value
= a
.value
;
1414 fom
.wan_islan
.value
= fom
.f_wan_islan
.checked
? 1 : 0;
1415 fom
.pptp_dhcp
.value
= fom
.f_pptp_dhcp
.checked
? 1 : 0;
1417 fom
.wan_dns
.value
= joinAddr([fom
.f_dns_1
.value
, fom
.f_dns_2
.value
, fom
.f_dns_3
.value
]);
1420 // initialize/wipe out relevant fields
1421 for (var i
= 0 ; i
<= MAX_BRIDGE_ID
; i
++) {
1422 var j
= (i
== 0) ? '' : i
.toString();
1423 fom
['lan' + j
+ '_ifname'].value
= '';
1424 fom
['lan' + j
+ '_ipaddr'].value
= '';
1425 fom
['lan' + j
+ '_netmask'].value
= '';
1426 fom
['lan' + j
+ '_proto'].value
= '';
1427 fom
['lan' + j
+ '_stp'].value
= '';
1428 fom
['dhcp' + j
+ '_start'].value
= '';
1429 fom
['dhcp' + j
+ '_num'].value
= '';
1430 fom
['dhcp' + j
+ '_lease'].value
= '';
1431 fom
['dhcpd' + j
+ '_startip'].value
= '';
1432 fom
['dhcpd' + j
+ '_endip'].value
= '';
1435 var d
= lg
.getAllData();
1436 for (var i
= 0; i
< d
.length
; ++i
) {
1438 if (lg
.countOverlappingNetworks(d
[i
][2]) > 1) {
1439 var s
= 'Cannot proceed: two or more LAN bridges have conflicting IP addresses or overlapping subnets';
1441 var e
= E('footer-msg');
1443 e
.style
.visibility
= 'visible';
1447 e
.style
.visibility
= 'hidden';
1452 var j
= (parseInt(d
[i
][0]) == 0) ? '' : d
[i
][0].toString();
1453 fom
['lan' + j
+ '_ifname'].value
= 'br' + d
[i
][0];
1454 fom
['lan' + j
+ '_stp'].value
= d
[i
][1];
1455 fom
['lan' + j
+ '_ipaddr'].value
= d
[i
][2];
1456 fom
['lan' + j
+ '_netmask'].value
= d
[i
][3];
1457 fom
['lan' + j
+ '_proto'].value
= (d
[i
][4] != '0') ? 'dhcp' : 'static';
1458 fom
['dhcp' + j
+ '_start'].value
= (d
[i
][4] != '0') ? (d
[i
][5]).split('.').splice(3, 1) : '';
1459 fom
['dhcp' + j
+ '_num'].value
= (d
[i
][4] != '0') ? d
[i
][6] - fom
['dhcp' + j
+ '_start'].value
+ 1 : '';
1460 fom
['dhcp' + j
+ '_lease'].value
= (d
[i
][4] != '0') ? d
[i
][7] : '';
1461 fom
['dhcpd' + j
+ '_startip'].value
= (d
[i
][4] != '0') ? d
[i
][5] : '';
1462 fom
['dhcpd' + j
+ '_endip'].value
= (d
[i
][4] != '0') ? fixIP(getNetworkAddress(d
[i
][2], d
[i
][3]).split('.').splice(0, 3).join('.') + '.' + parseInt(d
[i
][6])) : '';
1465 alert('lan' + j + '_ifname=' + fom['lan' + j + '_ifname'].value +
1466 ', lan' + j + '_stp=' + fom['lan' + j + '_stp'].value +
1467 ', lan' + j + '_ipaddr=' + fom['lan' + j + '_ipaddr'].value +
1468 ', lan' + j + '_netmask=' + fom['lan' + j + '_netmask'].value +
1469 ', lan' + j + '_proto=' + fom['lan' + j + '_proto'].value +
1470 ', dhcp' + j + '_start=' + fom['dhcp' + j + '_start'].value +
1471 ', dhcp' + j + '_num=' + fom['dhcp' + j + '_num'].value +
1472 ', dhcp' + j + '_lease=' + fom['dhcp' + j + '_lease'].value +
1473 ', dhcpd' + j + '_startip=' + fom['dhcpd' + j + '_startip'].value +
1474 ', dhcpd' + j + '_endip=' + fom['dhcpd' + j + '_endip'].value);
1475 // fixIP(getNetworkAddress(data[2], data[3]).split('.').splice(0, 3).join('.') + '.' + parseInt(data[6]))
1479 var e
= E('footer-msg');
1480 var t
= fixIP(fom
['lan_ipaddr'].value
);
1481 if ((fom
['lan_ifname'].value
!= 'br0') || (fom
['lan_ipaddr'].value
== '0.0.0.0') || (!t
)) {
1482 e
.innerHTML
= 'Bridge br0 must be always defined and have a valid IP address set.';
1483 e
.style
.visibility
= 'visible';
1487 e
.style
.visibility
= 'hidden';
1494 // if ((nvram.lan_ipaddr != fom.lan_ipaddr.value) || (nvram.lan1_ipaddr != fom.lan1_ipaddr.value) ||
1495 // (nvram.lan2_ipaddr != fom.lan2_ipaddr.value) || (nvram.lan3_ipaddr != fom.lan3_ipaddr.value)){
1498 fom
.ppp_mlppp
.value
= fom
.f_ppp_mlppp
.checked
? 1 : 0;
1500 if (nvram
.lan_ipaddr
!= fom
.lan_ipaddr
.value
) {
1501 fom
._moveip
.value
= 1;
1505 form
.submit(fom
, 1);
1511 for (var uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1512 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1513 if (wl_sunit(uidx
)<0) {
1514 refreshNetModes(uidx
);
1515 refreshChannels(uidx
);
1522 <body onload='init()'
>
1523 <form id='_fom' method='post' action='tomato.cgi'
>
1524 <table id='container' cellspacing=
0>
1525 <tr><td colspan=
2 id='header'
>
1526 <div class='title'
>Tomato
</div>
1527 <div class='version'
>Version <%
version(); %></div>
1529 <tr id='body'
><td id='navi'
><script type='text/javascript'
>navi()</script></td>
1531 <div id='ident'
><%
ident(); %></div>
1535 <input type='hidden' name='_nextpage' value='basic-network.asp'
>
1536 <input type='hidden' name='_nextwait' value='
10'
>
1537 <input type='hidden' name='_service' value='*'
>
1538 <input type='hidden' name='_moveip' value='
0'
>
1540 <input type='hidden' name='wan_mtu'
>
1541 <input type='hidden' name='wan_islan'
>
1542 <input type='hidden' name='pptp_dhcp'
>
1543 <!-- NOVLAN-BEGIN -->
1544 <input type='hidden' name='lan_proto'
>
1546 <input type='hidden' name='wan_dns'
>
1547 <input type='hidden' name='ppp_mlppp'
>
1550 <script type='text/javascript'
>
1552 for (var i
= 0 ; i
<= MAX_BRIDGE_ID
; i
++) {
1553 var j
= (i
== 0) ? '' : i
.toString();
1554 W('<input type=\'hidden\' id=\'lan' + j
+ '_ifname\' name=\'lan' + j
+ '_ifname\'>');
1555 W('<input type=\'hidden\' id=\'lan' + j
+ '_ipaddr\' name=\'lan' + j
+ '_ipaddr\'>');
1556 W('<input type=\'hidden\' id=\'lan' + j
+ '_netmask\' name=\'lan' + j
+ '_netmask\'>');
1557 W('<input type=\'hidden\' id=\'lan' + j
+ '_proto\' name=\'lan' + j
+ '_proto\'>');
1558 W('<input type=\'hidden\' id=\'lan' + j
+ '_stp\' name=\'lan' + j
+ '_stp\'>');
1559 W('<input type=\'hidden\' id=\'dhcp' + j
+ '_start\' name=\'dhcp' + j
+ '_start\'>');
1560 W('<input type=\'hidden\' id=\'dhcp' + j
+ '_num\' name=\'dhcp' + j
+ '_num\'>');
1561 W('<input type=\'hidden\' id=\'dhcp' + j
+ '_lease\' name=\'dhcp' + j
+ '_lease\'>');
1562 W('<input type=\'hidden\' id=\'dhcpd' + j
+ '_startip\' name=\'dhcpd' + j
+ '_startip\'>');
1563 W('<input type=\'hidden\' id=\'dhcpd' + j
+ '_endip\' name=\'dhcpd' + j
+ '_endip\'>');
1568 <div class='section-title'
>WAN / Internet
</div>
1569 <div class='section'
>
1570 <script type='text/javascript'
>
1571 createFieldTable('', [
1572 { title
: 'Type', name
: 'wan_proto', type
: 'select', options
: [['dhcp','DHCP'],['pppoe','PPPoE'],['static','Static'],['pptp','PPTP'],['l2tp','L2TP'],['disabled','Disabled']],
1573 value
: nvram
.wan_proto
},
1574 { title
: 'Username', name
: 'ppp_username', type
: 'text', maxlen
: 60, size
: 64, value
: nvram
.ppp_username
},
1575 { title
: 'Password', name
: 'ppp_passwd', type
: 'password', maxlen
: 60, size
: 64, peekaboo
: 1, value
: nvram
.ppp_passwd
},
1576 { title
: 'Service Name', name
: 'ppp_service', type
: 'text', maxlen
: 50, size
: 64, value
: nvram
.ppp_service
},
1577 { title
: 'L2TP Server', name
: 'l2tp_server_ip', type
: 'text', maxlen
: 128, size
: 64, value
: nvram
.l2tp_server_ip
},
1578 { title
: 'Use DHCP', name
: 'f_pptp_dhcp', type
: 'checkbox', value
: (nvram
.pptp_dhcp
== 1) },
1579 { title
: 'IP Address', name
: 'wan_ipaddr', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.wan_ipaddr
},
1580 { title
: 'Subnet Mask', name
: 'wan_netmask', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.wan_netmask
},
1581 { title
: 'Gateway', name
: 'wan_gateway', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.wan_gateway
},
1582 { title
: 'PPTP Gateway', name
: 'pptp_server_ip', type
: 'text', maxlen
: 128, size
: 64, value
: nvram
.pptp_server_ip
},
1583 { title
: 'Options', name
: 'ppp_custom', type
: 'text', maxlen
: 256, size
: 64, value
: nvram
.ppp_custom
},
1584 { title
: 'Connect Mode', name
: 'ppp_demand', type
: 'select', options
: [['1', 'Connect On Demand'],['0', 'Keep Alive']],
1585 value
: nvram
.ppp_demand
},
1586 { title
: 'Max Idle Time', indent
: 2, name
: 'ppp_idletime', type
: 'text', maxlen
: 5, size
: 7, suffix
: ' <i>(minutes)</i>',
1587 value
: nvram
.ppp_idletime
},
1588 { title
: 'Check Interval', indent
: 2, name
: 'ppp_redialperiod', type
: 'text', maxlen
: 5, size
: 7, suffix
: ' <i>(seconds)</i>',
1589 value
: nvram
.ppp_redialperiod
},
1590 { title
: 'MTU', multi
: [
1591 { name
: 'mtu_enable', type
: 'select', options
: [['0', 'Default'],['1','Manual']], value
: nvram
.mtu_enable
},
1592 { name
: 'f_wan_mtu', type
: 'text', maxlen
: 4, size
: 6, value
: nvram
.wan_mtu
} ] },
1593 { title
: 'Single Line MLPPP', name
: 'f_ppp_mlppp', type
: 'checkbox', value
: (nvram
.ppp_mlppp
== 1) },
1595 { title
: 'Use WAN port for LAN', name
: 'f_wan_islan', type
: 'checkbox', value
: (nvram
.wan_islan
== 1) }
1598 { title
: 'Bridge WAN port to primary LAN (br0)', name
: 'f_wan_islan', type
: 'checkbox', value
: (nvram
.wan_islan
== 1) }
1604 <div class='section-title'
>LAN
</div>
1605 <div class='section'
>
1607 <table class='tomato-grid' cellspacing=
1 id='lan-grid'
></table>
1609 <script type='text/javascript'
>lg
.setup();</script>
1612 <script type='text/javascript'
>
1613 dns
= nvram
.wan_dns
.split(/\s+/);
1615 //ipp = nvram.lan_ipaddr.split('.').splice(0, 3).join('.');
1617 createFieldTable('', [
1619 { title
: 'Router IP Address', name
: 'lan_ipaddr', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.lan_ipaddr
},
1620 { title
: 'Subnet Mask', name
: 'lan_netmask', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.lan_netmask
},
1622 { title
: 'Default Gateway', name
: 'lan_gateway', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.lan_gateway
},
1623 { 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' },
1624 { title
: '', name
: 'f_dns_2', type
: 'text', maxlen
: 21, size
: 25, value
: dns
[1] || '0.0.0.0' },
1625 { title
: '', name
: 'f_dns_3', type
: 'text', maxlen
: 21, size
: 25, value
: dns
[2] || '0.0.0.0' },
1627 { title
: 'DHCP Server', name
: 'f_dhcpd_enable', type
: 'checkbox', value
: (nvram
.lan_proto
== 'dhcp') },
1628 { title
: 'IP Address Range', indent
: 2, multi
: [
1629 { name
: 'dhcpd_startip', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.dhcpd_startip
, suffix
: ' - ' },
1630 { name
: 'dhcpd_endip', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.dhcpd_endip
, suffix
: ' <i id="dhcp_count"></i>' }
1633 { title
: 'Lease Time', indent
: 2, name
: 'dhcp_lease', type
: 'text', maxlen
: 6, size
: 8, suffix
: ' <i>(minutes)</i>',
1634 value
: (nvram
.dhcp_lease
> 0) ? nvram
.dhcp_lease
: 1440 },
1635 { title
: 'WINS', indent
: 2, name
: 'wan_wins', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.wan_wins
}
1638 { title
: 'WINS <i>(for DHCP)</i>', name
: 'wan_wins', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.wan_wins
}
1644 <script type='text/javascript'
>
1646 for (var uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1647 //if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1648 if (wl_sunit(uidx
)<0) {
1649 var u
= wl_unit(uidx
);
1651 W('<input type=\'hidden\' id=\'_wl'+u
+'_mode\' name=\'wl'+u
+'_mode\'>');
1652 W('<input type=\'hidden\' id=\'_wl'+u
+'_nband\' name=\'wl'+u
+'_nband\'>');
1653 W('<input type=\'hidden\' id=\'_wl'+u
+'_wds_enable\' name=\'wl'+u
+'_wds_enable\'>');
1654 W('<input type=\'hidden\' id=\'_wl'+u
+'_wds\' name=\'wl'+u
+'_wds\'>');
1655 W('<input type=\'hidden\' id=\'_wl'+u
+'_radio\' name=\'wl'+u
+'_radio\'>');
1656 W('<input type=\'hidden\' id=\'_wl'+u
+'_closed\' name=\'wl'+u
+'_closed\'>');
1657 W('<input type=\'hidden\' id=\'_wl'+u
+'_key\' name=\'wl'+u
+'_key\'>');
1658 W('<input type=\'hidden\' id=\'_wl'+u
+'_gmode\' name=\'wl'+u
+'_gmode\'>');
1659 W('<input type=\'hidden\' id=\'_wl'+u
+'_akm\' name=\'wl'+u
+'_akm\'>');
1660 W('<input type=\'hidden\' id=\'_wl'+u
+'_auth\' name=\'wl'+u
+'_auth\'>');
1661 W('<input type=\'hidden\' id=\'_wl'+u
+'_auth_mode\' name=\'wl'+u
+'_auth_mode\'>');
1662 W('<input type=\'hidden\' id=\'_wl'+u
+'_wep\' name=\'wl'+u
+'_wep\'>');
1663 W('<input type=\'hidden\' id=\'_wl'+u
+'_lazywds\' name=\'wl'+u
+'_lazywds\'>');
1664 W('<input type=\'hidden\' id=\'_wl'+u
+'_nmode\' name=\'wl'+u
+'_nmode\'>');
1665 W('<input type=\'hidden\' id=\'_wl'+u
+'_nmcsidx\' name=\'wl'+u
+'_nmcsidx\'>');
1666 W('<input type=\'hidden\' id=\'_wl'+u
+'_nreqd\' name=\'wl'+u
+'_nreqd\'>');
1667 W('<input type=\'hidden\' id=\'_wl'+u
+'_nctrlsb\' name=\'wl'+u
+'_nctrlsb\'>');
1668 W('<input type=\'hidden\' id=\'_wl'+u
+'_nbw\' name=\'wl'+u
+'_nbw\'>');
1670 W('<div class=\'section-title\'>Wireless');
1671 // if (wl_ifaces.length > 1)
1672 W(' (' + wl_display_ifname(uidx
) + ')');
1675 W('<div class=\'section\'>');
1678 { title
: 'Enable Wireless', name
: 'f_wl'+u
+'_radio', type
: 'checkbox',
1679 value
: (eval('nvram.wl'+u
+'_radio') == '1') && (eval('nvram.wl'+u
+'_net_mode') != 'disabled') },
1680 { title
: 'MAC Address', text
: '<a href="advanced-mac.asp">' + eval('nvram.wl'+u
+'_hwaddr') + '</a>' },
1681 { title
: 'Wireless Mode', name
: 'f_wl'+u
+'_mode', type
: 'select',
1682 options
: [['ap', 'Access Point'],['apwds', 'Access Point + WDS'],['sta', 'Wireless Client'],['wet', 'Wireless Ethernet Bridge'],['wds', 'WDS']],
1683 value
: ((eval('nvram.wl'+u
+'_mode') == 'ap') && (eval('nvram.wl'+u
+'_wds_enable') == '1')) ? 'apwds' : eval('nvram.wl'+u
+'_mode') },
1684 { title
: 'Radio Band', name
: 'f_wl'+u
+'_nband', type
: 'select', options
: bands
[uidx
],
1685 value
: eval('nvram.wl'+u
+'_nband') || '0' == '0' ? bands
[uidx
][0][0] : eval('nvram.wl'+u
+'_nband') },
1686 { title
: 'Wireless Network Mode', name
: 'wl'+u
+'_net_mode', type
: 'select',
1687 value
: (eval('nvram.wl'+u
+'_net_mode') == 'disabled') ? 'mixed' : eval('nvram.wl'+u
+'_net_mode'),
1688 options
: [], prefix
: '<span id="__wl'+u
+'_net_mode">', suffix
: '</span>' },
1689 { title
: 'SSID', name
: 'wl'+u
+'_ssid', type
: 'text', maxlen
: 32, size
: 34, value
: eval('nvram.wl'+u
+'_ssid') },
1690 { title
: 'Broadcast', indent
: 2, name
: 'f_wl'+u
+'_bcast', type
: 'checkbox', value
: (eval('nvram.wl'+u
+'_closed') == '0') },
1691 { 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
+'">',
1692 value
: eval('nvram.wl'+u
+'_channel') },
1693 { title
: 'Channel Width', name
: 'wl'+u
+'_nbw_cap', type
: 'select', options
: [['0','20 MHz'],['1','40 MHz']],
1694 value
: eval('nvram.wl'+u
+'_nbw_cap') },
1695 { title
: 'Control Sideband', name
: 'f_wl'+u
+'_nctrlsb', type
: 'select', options
: [['lower','Lower'],['upper','Upper']],
1696 value
: eval('nvram.wl'+u
+'_nctrlsb') == 'none' ? 'lower' : eval('nvram.wl'+u
+'_nctrlsb') },
1698 { title
: 'Security', name
: 'wl'+u
+'_security_mode', type
: 'select',
1699 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']],
1700 value
: eval('nvram.wl'+u
+'_security_mode') },
1701 { title
: 'Encryption', indent
: 2, name
: 'wl'+u
+'_crypto', type
: 'select',
1702 options
: [['tkip','TKIP'],['aes','AES'],['tkip+aes','TKIP / AES']], value
: eval('nvram.wl'+u
+'_crypto') },
1703 { title
: 'Shared Key', indent
: 2, name
: 'wl'+u
+'_wpa_psk', type
: 'password', maxlen
: 64, size
: 66, peekaboo
: 1,
1704 suffix
: ' <input type="button" id="_f_wl'+u
+'_psk_random1" value="Random" onclick="random_psk(\'_wl'+u
+'_wpa_psk\')">',
1705 value
: eval('nvram.wl'+u
+'_wpa_psk') },
1706 { title
: 'Shared Key', indent
: 2, name
: 'wl'+u
+'_radius_key', type
: 'password', maxlen
: 80, size
: 32, peekaboo
: 1,
1707 suffix
: ' <input type="button" id="_f_wl'+u
+'_psk_random2" value="Random" onclick="random_psk(\'_wl'+u
+'_radius_key\')">',
1708 value
: eval('nvram.wl'+u
+'_radius_key') },
1709 { title
: 'Group Key Renewal', indent
: 2, name
: 'wl'+u
+'_wpa_gtk_rekey', type
: 'text', maxlen
: 4, size
: 6, suffix
: ' <i>(seconds)</i>',
1710 value
: eval('nvram.wl'+u
+'_wpa_gtk_rekey') },
1711 { title
: 'Radius Server', indent
: 2, multi
: [
1712 { name
: 'wl'+u
+'_radius_ipaddr', type
: 'text', maxlen
: 15, size
: 17, value
: eval('nvram.wl'+u
+'_radius_ipaddr') },
1713 { name
: 'wl'+u
+'_radius_port', type
: 'text', maxlen
: 5, size
: 7, prefix
: ' : ', value
: eval('nvram.wl'+u
+'_radius_port') } ] },
1714 { title
: 'Encryption', indent
: 2, name
: 'wl'+u
+'_wep_bit', type
: 'select', options
: [['128','128-bits'],['64','64-bits']],
1715 value
: eval('nvram.wl'+u
+'_wep_bit') },
1716 { title
: 'Passphrase', indent
: 2, name
: 'wl'+u
+'_passphrase', type
: 'text', maxlen
: 16, size
: 20,
1717 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
+')">',
1718 value
: eval('nvram.wl'+u
+'_passphrase') }
1721 for (i
= 1; i
<= 4; ++i
) {
1723 { title
: ('Key ' + i
), indent
: 2, name
: ('wl'+u
+'_key' + i
), type
: 'text', maxlen
: 26, size
: 34,
1724 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>' : '>'),
1725 value
: nvram
['wl'+u
+'_key' + i
] });
1729 { title
: 'WDS', name
: 'f_wl'+u
+'_lazywds', type
: 'select',
1730 options
: [['0','Link With...'],['1','Automatic']], value
: nvram
['wl'+u
+'_lazywds'] } );
1731 wds
= eval('nvram.wl'+u
+'_wds').split(/\s+/);
1732 for (i
= 0; i
< 10; i
+= 2) {
1733 f
.push({ title
: (i
? '' : 'MAC Address'), indent
: 2, multi
: [
1734 { name
: 'f_wl'+u
+'_wds_' + i
, type
: 'text', maxlen
: 17, size
: 20, value
: wds
[i
] || '00:00:00:00:00:00' },
1735 { name
: 'f_wl'+u
+'_wds_' + (i
+ 1), type
: 'text', maxlen
: 17, size
: 20, value
: wds
[i
+ 1] || '00:00:00:00:00:00' } ] } );
1738 createFieldTable('', f
);
1748 <tr><td id='footer' colspan=
2>
1749 <span id='footer-msg'
></span>
1750 <input type='button' value='Save' id='save-button' onclick='save()'
>
1751 <input type='button' value='Cancel' id='cancel-button' onclick='reloadPage();'
>
1755 <script type='text/javascript'
>earlyInit()</script>
1756 <div style='height:
100px'
></div>