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,dnscrypt_proxy,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"); %>
50 var lg
= new TomatoGrid();
51 lg
.setup = function() {
52 this.init('lan-grid', '', 4, [
53 { type
: 'select', options
: [[0, '0'],[1, '1'],[2, '2'],[3, '3']], prefix
: '<div class="centered">', suffix
: '</div>' },
54 { type
: 'checkbox', prefix
: '<div class="centered">', suffix
: '</div>' },
55 { type
: 'text', maxlen
: 15, size
: 17 },
56 { type
: 'text', maxlen
: 15, size
: 17 },
57 { type
: 'checkbox', prefix
: '<div class="centered">', suffix
: '</div>' },
58 { multi
: [ { type
: 'text', maxlen
: 15, size
: 17}, { type
: 'text', maxlen
: 15, size
: 17 } ] },
59 { type
: 'text', maxlen
: 6, size
: 8 }] );
60 this.headerSet(['Bridge', 'STP', 'IP Address', 'Netmask', 'DHCP', 'IP Range <i>(first/last)</i>', 'Lease Time <i>(mins)</i>']);
63 for (var i
= 0 ; i
<= MAX_BRIDGE_ID
; i
++) {
64 var j
= (i
== 0) ? '' : i
.toString();
65 if (nvram
['lan' + j
+ '_ifname'].length
> 0) {
66 if ((!fixIP(nvram
['dhcpd' + j
+ '_startip'])) || (!fixIP(nvram
['dhcpd' + j
+ '_endip']))) {
67 if ((fixIP(nvram
['lan' + j
+ '_ipaddr'])) && (fixIP(nvram
['lan' + j
+ '_netmask'])) && (nvram
['dhcp' + j
+ '_start'] != '')) {
68 var n
= getNetworkAddress(nvram
['lan' + j
+ '_ipaddr'], nvram
['lan' + j
+ '_netmask']);
69 nvram
['dhcpd' + j
+ '_startip'] = getAddress(('0.0.0.' + nvram
['dhcp' + j
+ '_start'] * 1), n
);
70 nvram
['dhcpd' + j
+ '_endip'] = getAddress(('0.0.0.' + ((nvram
['dhcp' + j
+ '_start'] * 1) + (nvram
['dhcp' + j
+ '_num'] *1) - 1)), n
);
75 nvram
['lan' + j
+ '_stp'],
76 nvram
['lan' + j
+ '_ipaddr'],
77 nvram
['lan' + j
+ '_netmask'],
78 (nvram
['lan' + j
+ '_proto'] == 'dhcp') ? '1' : '0',
79 nvram
['dhcpd' + j
+ '_startip'],
80 nvram
['dhcpd' + j
+ '_endip'],
81 (nvram
['lan' + j
+ '_proto'] == 'dhcp') ? (((nvram
['dhcp' + j
+ '_lease'])*1 == 0) ? '1440' : (nvram
['dhcp' + j
+ '_lease']).toString()) : ''
88 elem
.removeClass(lg
.header
.cells
[lg
.sortColumn
], 'sortasc', 'sortdes');
93 lg
.dataToView = function(data
) {
94 return ['br' + data
[0],
95 (data
[1].toString() == '1') ? '<small><i>Enabled</i></small>' : '<small><i>Disabled</i></small>',
98 (data
[4].toString() == '1') ? '<small><i>Enabled</i></small>' : '<small><i>Disabled</i></small>',
99 (data
[5].toString() + ((numberOfBitsOnNetMask(data
[3])>=24) ? (' - ' + data
[6].split('.').splice(3, 1).toString()) : ('<br>' + data
[6].toString()) )),
100 (((data
[7] != null) && (data
[7] != '')) ? data
[7] : '') ];
103 lg
.dataToFieldValues = function (data
) {
105 (data
[1] != 0) ? 'checked' : '',
108 (data
[4].toString() == '1') ? 'checked' : '',
111 data
[7].toString() ];
114 lg
.fieldValuesToData = function(row
) {
115 var f
= fields
.getAll(row
);
117 f
[1].checked
? 1 : 0,
120 f
[4].checked
? 1 : 0,
126 lg
.resetNewEditor = function() {
127 var f
= fields
.getAll(this.newEditor
);
128 f
[0].selectedIndex
=0;
129 var t
= MAX_BRIDGE_ID
;
130 while((this.countBridge(f
[0].selectedIndex
) > 0) && (t
> 0)) {
131 f
[0].selectedIndex
= (f
[0].selectedIndex
%(MAX_BRIDGE_ID
))+1;
134 for(var j
=0; j
<= MAX_BRIDGE_ID
; j
++) {
135 f
[0].options
[j
].disabled
= (this.countBridge(j
) > 0);
148 ferror
.clearAll(fields
.getAll(this.newEditor
));
151 lg
.onCancel = function() {
154 this.disableNewEditor(false);
156 this.resetNewEditor();
159 lg
.onAdd = function() {
165 if (!this.verifyFields(this.newEditor
, false)) return;
167 data
= this.fieldValuesToData(this.newEditor
);
168 this.insertData(-1, data
);
170 this.disableNewEditor(false);
171 this.resetNewEditor();
176 lg
.onOK = function() {
179 if (!this.verifyFields(this.editor
, false)) return;
181 data
= this.fieldValuesToData(this.editor
);
182 view
= this.dataToView(data
);
184 this.source
.setRowData(data
);
185 for (i
= 0; i
< this.source
.cells
.length
; ++i
) {
186 this.source
.cells
[i
].innerHTML
= view
[i
];
191 this.disableNewEditor(false);
194 this.resetNewEditor();
197 lg
.onDelete = function() {
199 elem
.remove(this.source
);
201 this.disableNewEditor(false);
203 this.resetNewEditor();
206 lg
.countElem = function(f
, v
) {
207 var data
= this.getAllData();
209 for (var i
= 0; i
< data
.length
; ++i
) {
210 total
+= (data
[i
][f
] == v
) ? 1 : 0;
215 lg
.countBridge = function (v
) {
216 return this.countElem(0,v
);
219 lg
.countOverlappingNetworks = function (ip
) {
220 var data
= this.getAllData();
222 for (var i
= 0; i
< data
.length
; ++i
) {
223 var net
= getNetworkAddress(data
[i
][2], data
[i
][3]);
224 var brd
= getBroadcastAddress(net
, data
[i
][3]);
225 total
+= ((aton(ip
) <= aton(brd
)) && (aton(ip
) >= aton(net
))) ? 1 : 0;
230 lg
.verifyFields = function(row
, quiet
) {
234 f
= fields
.getAll(row
);
236 for(var j
=0; j
<= MAX_BRIDGE_ID
; j
++) {
237 f
[0].options
[j
].disabled
= (this.countBridge(j
) > 0);
240 if(this.countBridge(f
[0].selectedIndex
) > 0) {
241 ferror
.set(f
[0], 'Cannot add another entry for bridge br' + f
[0].selectedIndex
, quiet
);
247 if(!v_ip(f
[2], quiet
|| !ok
))
249 // if we have a properly defined IP address - 0.0.0.0 is NOT a valid IP address for our intents/purposes!
250 if ((f
[2].value
!= '') && (f
[2].value
!= '0.0.0.0')) {
251 // allow DHCP to be enabled
254 if(!v_netmask(f
[3], quiet
|| !ok
)) {
257 // must be 22 bits or smaller network
258 if (numberOfBitsOnNetMask(f
[3].value
) < 22) {
259 ferror
.set(f
[3], 'Netmask must have at least 22 bits set (255.255.252.0)', quiet
);
265 if(f
[2].value
== getNetworkAddress(f
[2].value
, f
[3].value
)) {
266 var s
= 'Invalid IP address or subnet mask (the address of the network cannot be used)';
267 ferror
.set(f
[2], s
, quiet
);
268 ferror
.set(f
[3], s
, quiet
);
271 if(f
[2].value
== getBroadcastAddress(getNetworkAddress(f
[2].value
, f
[3].value
), f
[3].value
)) {
272 var s
= 'Invalid IP address or subnet mask (the broadcast address cannot be used)';
273 ferror
.set(f
[2], s
, quiet
);
274 ferror
.set(f
[3], s
, quiet
);
277 if (this.countOverlappingNetworks(f
[2].value
) > 0) {
278 var s
= 'Invalid IP address or subnet mask (conflicts/overlaps with another LAN bridge)';
279 ferror
.set(f
[2], s
, quiet
);
280 ferror
.set(f
[3], s
, quiet
);
291 if( (f
[4].checked
) && (v_ip(f
[2], 1)) && (v_netmask(f
[3],1)) ) {
295 // first/last IP still unset?
296 if (f
[5].value
== '') {
298 var m
= aton(f
[2].value
) & aton(f
[3].value
);
299 var o
= (m
) ^ (~ aton(f
[3].value
))
307 } while (((l
= fixIP(ntoa(m
), 1)) == null) || (l
== f
[2].value
) );
310 if (f
[6].value
== '') {
312 var m
= aton(f
[2].value
) & aton(f
[3].value
);
313 var o
= (m
) ^ (~ aton(f
[3].value
));
321 } while (((l
= fixIP(ntoa(o
), 1)) == null) || (l
== f
[2].value
) );
325 if ((getNetworkAddress(f
[5].value
, f
[3].value
) != getNetworkAddress(f
[2].value
, f
[3].value
)) ||
326 (f
[5].value
== getBroadcastAddress(getNetworkAddress(f
[2].value
, f
[3].value
), f
[3].value
)) ||
327 (f
[5].value
== getNetworkAddress(f
[2].value
, f
[3].value
)) ||
328 (f
[2].value
== f
[5].value
)) {
329 ferror
.set(f
[5], 'Invalid first IP address or subnet mask', quiet
|| !ok
);
335 if ((getNetworkAddress(f
[6].value
, f
[3].value
) != getNetworkAddress(f
[2].value
, f
[3].value
)) ||
336 (f
[6].value
== getBroadcastAddress(getNetworkAddress(f
[2].value
, f
[3].value
), f
[3].value
)) ||
337 (f
[6].value
== getNetworkAddress(f
[2].value
, f
[3].value
)) ||
338 (f
[2].value
== f
[6].value
)) {
339 ferror
.set(f
[6], 'Invalid last IP address or subnet mask', quiet
|| !ok
);
344 // validate range, swap first/last IP if needed
345 if (aton(f
[6].value
) < aton(f
[5].value
)) {
347 f
[5].value
= f
[6].value
;
351 if (parseInt(f
[7].value
*1) == 0)
352 f
[7].value
= 1440; // from nvram/defaults.c
353 if(!v_mins(f
[7], quiet
|| !ok
, 1, 10080))
366 W('<style type=\'text/css\'>');
367 for (var u
= 0; u
< wl_ifaces
.length
; ++u
) {
368 W('#spin'+wl_unit(u
)+', ');
371 W(' visibility: hidden;');
372 W(' vertical-align: middle;');
378 var nphy
= features('11n');
382 var nm_loaded
= [], ch_loaded
= [], max_channel
= [];
384 for (var uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
385 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
386 if (wl_sunit(uidx
)<0) {
389 for (var i
= 0; i
< wl_bands
[uidx
].length
; ++i
) {
390 b
.push([wl_bands
[uidx
][i
] + '', (wl_bands
[uidx
][i
] == '1') ? '5 GHz' : '2.4 GHz']);
400 refresher
.push(null);
404 function selectedBand(uidx
)
406 if (bands
[uidx
].length
> 1) {
407 var e
= E('_f_wl'+u
+'_nband');
408 return (e
.value
+ '' == '' ? eval('nvram.wl'+u
+'_nband') : e
.value
);
409 } else if (bands
[uidx
].length
> 0) {
410 return bands
[uidx
][0][0] || '0';
416 function refreshNetModes(uidx
)
420 if (uidx
>= wl_ifaces
.length
) return;
421 var u
= wl_unit(uidx
);
423 var m
= [['mixed','Auto']];
424 if (selectedBand(uidx
) == '1') {
425 m
.push(['a-only','A Only']);
427 m
.push(['n-only','N Only']);
431 m
.push(['b-only','B Only']);
432 m
.push(['g-only','G Only']);
434 m
.push(['bg-mixed','B/G Mixed']);
435 m
.push(['n-only','N Only']);
439 e
= E('_wl'+u
+'_net_mode');
441 val
= (!nm_loaded
[uidx
] || (e
.value
+ '' == '')) ? eval('nvram.wl'+u
+'_net_mode') : e
.value
;
442 if (val
== 'disabled') val
= 'mixed';
443 for (i
= 0; i
< m
.length
; ++i
)
444 buf
+= '<option value="' + m
[i
][0] + '"' + ((m
[i
][0] == val
) ? ' selected' : '') + '>' + m
[i
][1] + '</option>';
446 e
= E('__wl'+u
+'_net_mode');
447 buf
= '<select name="wl'+u
+'_net_mode" onchange="verifyFields(this, 1)" id = "_wl'+u
+'_net_mode">' + buf
+ '</select>';
448 elem
.setInnerHTML(e
, buf
);
452 function refreshChannels(uidx
)
454 if (refresher
[uidx
] != null) return;
455 if (u
>= wl_ifaces
.length
) return;
456 var u
= wl_unit(uidx
);
458 refresher
[uidx
] = new XmlHttp();
459 refresher
[uidx
].onCompleted = function(text
, xml
) {
463 var wl_channels
= [];
467 max_channel
[uidx
] = 0;
468 for (i
= 0; i
< wl_channels
.length
; ++i
) {
469 ghz
[uidx
].push([wl_channels
[i
][0] + '',
470 (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']);
471 max_channel
[uidx
] = wl_channels
[i
][0] * 1;
474 e
= E('_wl'+u
+'_channel');
476 val
= (!ch_loaded
[uidx
] || (e
.value
+ '' == '')) ? eval('nvram.wl'+u
+'_channel') : e
.value
;
477 for (i
= 0; i
< ghz
[uidx
].length
; ++i
)
478 buf
+= '<option value="' + ghz
[uidx
][i
][0] + '"' + ((ghz
[uidx
][i
][0] == val
) ? ' selected' : '') + '>' + ghz
[uidx
][i
][1] + '</option>';
480 e
= E('__wl'+u
+'_channel');
481 buf
= '<select name="wl'+u
+'_channel" onchange="verifyFields(this, 1)" id = "_wl'+u
+'_channel">' + buf
+ '</select>';
482 elem
.setInnerHTML(e
, buf
);
485 refresher
[uidx
] = null;
486 verifyFields(null, 1);
490 refresher
[uidx
] = null;
495 e
= E('_f_wl'+u
+'_nctrlsb');
496 sb
= (e
.value
+ '' == '' ? eval('nvram.wl'+u
+'_nctrlsb') : e
.value
);
497 e
= E('_wl'+u
+'_nbw_cap');
498 bw
= (e
.value
+ '' == '' ? eval('nvram.wl'+u
+'_nbw_cap') : e
.value
) == '0' ? '20' : '40';
500 refresher
[uidx
].onError = function(ex
) { alert(ex
); refresher
[uidx
] = null; reloadPage(); }
501 refresher
[uidx
].post('update.cgi', 'exec=wlchannels&arg0=' + u
+ '&arg1=' + (nphy
? '1' : '0') +
502 '&arg2=' + bw
+ '&arg3=' + selectedBand(uidx
) + '&arg4=' + sb
);
505 function spin(x
, unit
)
507 for (var u
= 0; u
< wl_ifaces
.length
; ++u
) {
508 E('_f_wl'+wl_unit(u
)+'_scan').disabled
= x
;
510 var e
= E('_f_wl'+unit
+'_scan');
511 if (x
) e
.value
= 'Scan ' + (wscan
.tries
+ 1);
512 else e
.value
= 'Scan';
513 E('spin'+unit
).style
.visibility
= x
? 'visible' : 'hidden';
520 var unit
= wscan
.unit
;
521 var uidx
= wl_uidx(unit
);
524 xob
.onCompleted = function(text
, xml
) {
531 for (i
= 0; i
< wlscandata
.length
; ++i
) {
532 var data
= wlscandata
[i
];
536 if (!wscan
.inuse
[ch
]) {
544 if (!wscan
.seen
[mac
]) {
546 ++wscan
.inuse
[ch
].count
;
549 if (data
[4] > wscan
.inuse
[ch
].rssi
) {
550 wscan
.inuse
[ch
].rssi
= data
[4];
551 wscan
.inuse
[ch
].ssid
= data
[1];
554 var e
= E('_wl'+unit
+'_channel');
555 for (i
= 1; i
< ghz
[uidx
].length
; ++i
) {
556 var s
= ghz
[uidx
][i
][1];
557 var u
= wscan
.inuse
[ghz
[uidx
][i
][0]];
558 if (u
) s
+= ' (' + u
.count
+ ' AP' + (u
.count
== 1 ? '' : 's') + ' / strongest: "' + escapeHTML(ellipsis(u
.ssid
, 15)) + '" ' + u
.rssi
+ ' dBm)';
559 e
.options
[i
].innerHTML
= s
;
561 e
.style
.width
= '400px';
565 if (wscan
.tries
< 4) {
567 setTimeout(scan
, 1000);
575 xob
.onError = function(x
) {
576 alert('error: ' + x
);
582 xob
.post('update.cgi', 'exec=wlscan&arg0='+unit
);
585 function scanButton(u
)
599 function joinAddr(a
) {
603 for (i
= 0; i
< a
.length
; ++i
) {
605 if ((s
!= '00:00:00:00:00:00') && (s
!= '0.0.0.0')) r
.push(s
);
610 function random_x(max
)
612 var c
= '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
614 while (max
-- > 0) s
+= c
.substr(Math
.floor(c
.length
* Math
.random()), 1);
618 function random_psk(id
)
621 e
.value
= random_x(63);
622 verifyFields(null, 1);
625 function random_wep(u
)
627 E('_wl'+u
+'_passphrase').value
= random_x(16);
631 function v_wep(e
, quiet
)
635 if (((s
.length
== 5) || (s
.length
== 13)) && (s
.length
== (e
.maxLength
>> 1))) {
639 s
= s
.toUpperCase().replace(/[^0-9A-F]/g, '');
640 if (s
.length
!= e
.maxLength
) {
641 ferror
.set(e
, 'Invalid WEP key. Expecting ' + e
.maxLength
+ ' hex or ' + (e
.maxLength
>> 1) + ' ASCII characters.', quiet
);
651 // compatible w/ Linksys' and Netgear's (key 1) method for 128-bits
652 function generate_wep(u
)
654 function _wepgen(pass
, i
)
656 while (pass
.length
< 64) pass
+= pass
;
657 return hex_md5(pass
.substr(0, 64)).substr(i
, (E('_wl'+u
+'_wep_bit').value
== 128) ? 26 : 10);
660 var e
= E('_wl'+u
+'_passphrase');
662 if (!v_length(e
, false, 3)) return;
663 E('_wl'+u
+'_key1').value
= _wepgen(pass
, 0);
665 E('_wl'+u
+'_key2').value
= _wepgen(pass
, 2);
667 E('_wl'+u
+'_key3').value
= _wepgen(pass
, 4);
669 E('_wl'+u
+'_key4').value
= _wepgen(pass
, 6);
670 verifyFields(null, 1);
673 function verifyFields(focused
, quiet
)
681 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
682 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
683 if (wl_sunit(uidx
)<0) {
685 if (focused
== E('_f_wl'+u
+'_nband')) {
686 refreshNetModes(uidx
);
687 refreshChannels(uidx
);
689 else if (focused
== E('_f_wl'+u
+'_nctrlsb') || focused
== E('_wl'+u
+'_nbw_cap')) {
690 refreshChannels(uidx
);
695 // --- visibility ---
711 _ppp_redialperiod
: 1,
722 _f_dnscrypt_proxy
: 1,
733 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
734 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
735 if (wl_sunit(uidx
)<0) {
739 _f_wl_nband
: (bands
[uidx
].length
> 1) ? 1 : 0,
744 _wl_nbw_cap
: nphy
? 1 : 0,
745 _f_wl_nctrlsb
: nphy
? 1 : 0,
748 _wl_security_mode
: 1,
751 _f_wl_psk_random1
: 1,
752 _f_wl_psk_random2
: 1,
753 _wl_wpa_gtk_rekey
: 1,
755 _wl_radius_ipaddr
: 1,
773 var wan
= E('_wan_proto').value
;
775 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
776 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
777 if (wl_sunit(uidx
)<0) {
778 wmode
= E('_f_wl'+wl_unit(uidx
)+'_mode').value
;
780 if (wmode
== 'wet') {
785 if ((wan
== 'disabled') || (wmode
== 'sta') || (wmode
== 'wet')) {
786 vis
._f_wan_islan
= 1;
793 vis
._ppp_username
= 0;
794 vis
._ppp_service
= 0;
796 vis
._l2tp_server_ip
= 0;
798 vis
._wan_netmask
= 0;
799 vis
._wan_gateway
= 0;
800 vis
._pptp_server_ip
= 0;
801 vis
._f_pptp_dhcp
= 0;
805 vis
._f_ppp_mlppp
= 0;
806 vis
._modem_ipaddr
= 0;
813 vis
._l2tp_server_ip
= 0;
815 vis
._ppp_service
= 0;
816 vis
._ppp_username
= 0;
818 vis
._pptp_server_ip
= 0;
819 vis
._f_pptp_dhcp
= 0;
820 vis
._wan_gateway
= 0;
822 vis
._wan_netmask
= 0;
823 vis
._f_ppp_mlppp
= 0;
824 vis
._modem_ipaddr
= 1;
826 vis
._lan_gateway
= 0;
833 vis
._l2tp_server_ip
= 0;
834 vis
._pptp_server_ip
= 0;
835 vis
._f_pptp_dhcp
= 0;
836 vis
._wan_gateway
= 0;
838 vis
._wan_netmask
= 0;
839 vis
._modem_ipaddr
= 1;
841 vis
._lan_gateway
= 0;
848 vis
._ppp_service
= 0;
849 vis
._l2tp_server_ip
= 0;
850 vis
._pptp_server_ip
= 0;
851 vis
._f_pptp_dhcp
= 0;
852 vis
._wan_gateway
= 0;
854 vis
._wan_netmask
= 0;
855 vis
._lan_gateway
= 0;
856 vis
._modem_ipaddr
= 0;
857 vis
._f_ppp_mlppp
= 0;
860 vis
._l2tp_server_ip
= 0;
862 vis
._ppp_service
= 0;
863 vis
._ppp_username
= 0;
865 vis
._pptp_server_ip
= 0;
866 vis
._f_pptp_dhcp
= 0;
867 vis
._f_ppp_mlppp
= 0;
868 vis
._modem_ipaddr
= 1;
870 vis
._lan_gateway
= 0;
877 vis
._l2tp_server_ip
= 0;
878 vis
._ppp_service
= 0;
879 vis
._wan_gateway
= (!E('_f_pptp_dhcp').checked
);
880 vis
._wan_ipaddr
= (!E('_f_pptp_dhcp').checked
);
881 vis
._modem_ipaddr
= 0;
883 vis
._lan_gateway
= 0;
890 vis
._pptp_server_ip
= 0;
891 vis
._ppp_service
= 0;
892 vis
._wan_gateway
= (!E('_f_pptp_dhcp').checked
);
893 vis
._wan_ipaddr
= (!E('_f_pptp_dhcp').checked
);
894 vis
._modem_ipaddr
= 0;
896 vis
._lan_gateway
= 0;
904 vis
._ppp_idletime
= (E('_ppp_demand').value
== 1) && vis
._ppp_demand
905 vis
._ppp_redialperiod
= !vis
._ppp_idletime
&& vis
._ppp_demand
;
907 if (vis
._mtu_enable
) {
908 if (E('_mtu_enable').value
== 0) {
911 switch (E('_wan_proto').value
) {
926 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
927 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
928 if (wl_sunit(uidx
)<0) {
930 wmode
= E('_f_wl'+u
+'_mode').value
;
932 if (!E('_f_wl'+u
+'_radio').checked
) {
933 for (a
in wl_vis
[uidx
]) {
936 wl_vis
[uidx
]._f_wl_radio
= 1;
937 wl_vis
[uidx
]._wl_nbw_cap
= nphy
? 2 : 0;
938 wl_vis
[uidx
]._f_wl_nband
= (bands
[uidx
].length
> 1) ? 2 : 0;
947 wl_vis
[uidx
]._f_wl_bcast
= 0;
948 wl_vis
[uidx
]._wl_channel
= 0;
949 wl_vis
[uidx
]._wl_nbw_cap
= 0;
950 vis
._modem_ipaddr
= 0;
952 wl_vis
[uidx
]._f_wl_lazywds
= 0;
953 wl_vis
[uidx
]._f_wl_wds_0
= 0;
957 sm2
= E('_wl'+u
+'_security_mode').value
;
960 wl_vis
[uidx
]._wl_crypto
= 0;
961 wl_vis
[uidx
]._wl_wep_bit
= 0;
962 wl_vis
[uidx
]._wl_wpa_psk
= 0;
963 wl_vis
[uidx
]._wl_radius_key
= 0;
964 wl_vis
[uidx
]._wl_radius_ipaddr
= 0;
965 wl_vis
[uidx
]._wl_wpa_gtk_rekey
= 0;
968 wl_vis
[uidx
]._wl_crypto
= 0;
969 wl_vis
[uidx
]._wl_wpa_psk
= 0;
970 wl_vis
[uidx
]._wl_radius_key
= 0;
971 wl_vis
[uidx
]._wl_radius_ipaddr
= 0;
972 wl_vis
[uidx
]._wl_wpa_gtk_rekey
= 0;
975 wl_vis
[uidx
]._wl_crypto
= 0;
976 wl_vis
[uidx
]._wl_wpa_psk
= 0;
979 wl_vis
[uidx
]._wl_wep_bit
= 0;
980 if (sm2
.indexOf('personal') != -1) {
981 wl_vis
[uidx
]._wl_radius_key
= 0;
982 wl_vis
[uidx
]._wl_radius_ipaddr
= 0;
985 wl_vis
[uidx
]._wl_wpa_psk
= 0;
990 if ((E('_f_wl'+u
+'_lazywds').value
== 1) && (wl_vis
[uidx
]._f_wl_wds_0
== 1)) {
991 wl_vis
[uidx
]._f_wl_wds_0
= 2;
994 if (wl_vis
[uidx
]._wl_nbw_cap
!= 0) {
995 switch (E('_wl'+u
+'_net_mode').value
) {
1000 wl_vis
[uidx
]._wl_nbw_cap
= 2;
1001 if (E('_wl'+u
+'_nbw_cap').value
!= '0') {
1002 E('_wl'+u
+'_nbw_cap').value
= 0;
1003 refreshChannels(uidx
);
1007 // avoid Enterprise-TKIP with 40MHz
1008 if ((sm2
== 'wpa_enterprise') && (E('_wl'+u
+'_crypto').value
== 'tkip')) {
1009 wl_vis
[uidx
]._wl_nbw_cap
= 2;
1010 if (E('_wl'+u
+'_nbw_cap').value
!= '0') {
1011 E('_wl'+u
+'_nbw_cap').value
= 0;
1012 refreshChannels(uidx
);
1017 wl_vis
[uidx
]._f_wl_nctrlsb
= (E('_wl'+u
+'_nbw_cap').value
== 0) ? 0 : wl_vis
[uidx
]._wl_nbw_cap
;
1021 Special case - 2.4GHz band, currently running in B/G-only mode,
1022 with N/Auto and 40MHz selected in the GUI.
1023 Channel list is not filtered in this case by the wl driver,
1024 and includes all channels available with 20MHz channel width.
1026 b
= selectedBand(uidx
);
1027 if (wl_vis
[uidx
]._wl_channel
== 1 && wl_vis
[uidx
]._f_wl_nctrlsb
!= 0 &&
1028 ((b
== '2') || (wl_vis
[uidx
]._f_wl_nband
== 0 && b
== '0'))) {
1029 switch (eval('nvram.wl'+u
+'_net_mode')) {
1033 i
= E('_wl'+u
+'_channel').value
* 1;
1034 if (i
> 0 && i
< 5) {
1035 E('_f_wl'+u
+'_nctrlsb').value
= 'lower';
1036 wl_vis
[uidx
]._f_wl_nctrlsb
= 2;
1038 else if (i
> max_channel
[uidx
] - 4) {
1039 E('_f_wl'+u
+'_nctrlsb').value
= 'upper';
1040 wl_vis
[uidx
]._f_wl_nctrlsb
= 2;
1046 wl_vis
[uidx
]._f_wl_scan
= wl_vis
[uidx
]._wl_channel
;
1047 wl_vis
[uidx
]._f_wl_psk_random1
= wl_vis
[uidx
]._wl_wpa_psk
;
1048 wl_vis
[uidx
]._f_wl_psk_random2
= wl_vis
[uidx
]._wl_radius_key
;
1049 wl_vis
[uidx
]._wl_radius_port
= wl_vis
[uidx
]._wl_radius_ipaddr
;
1050 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
;
1052 for (i
= 1; i
< 10; ++i
) {
1053 wl_vis
[uidx
]['_f_wl_wds_' + i
] = wl_vis
[uidx
]._f_wl_wds_0
;
1056 } // for each wl_iface
1058 vis
._ppp_passwd
= vis
._ppp_username
;
1066 b
.disabled
= (c
!= 1);
1067 PR(b
).style
.display
= c
? '' : 'none';
1070 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1071 if(wl_ifaces
[uidx
][0].indexOf('.') < 0) {
1072 for (a
in wl_vis
[uidx
]) {
1074 if (a
.substr(0, 6) == '_f_wl_') i
= 5;
1075 b
= E(a
.substr(0, i
) + wl_unit(uidx
) + a
.substr(i
, a
.length
));
1076 c
= wl_vis
[uidx
][a
];
1077 b
.disabled
= (c
!= 1);
1078 PR(b
).style
.display
= c
? '' : 'none';
1085 ferror
.clear('_wan_proto');
1088 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1089 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1090 if (wl_sunit(uidx
)<0) {
1092 wmode
= E('_f_wl'+u
+'_mode').value
;
1093 sm2
= E('_wl'+u
+'_security_mode').value
;
1096 if ((wl_vis[uidx]._f_wl_mode == 1) && (wmode != 'ap') && (sm2.substr(0, 4) == 'wpa2')) {
1097 ferror.set('_wl'+u+'_security_mode', 'WPA2 is supported only in AP mode.', quiet || !ok);
1100 else ferror.clear('_wl'+u+'_security_mode');
1103 // --- N standard does not support WPA+TKIP ---
1104 a
= E('_wl'+u
+'_crypto');
1105 switch (E('_wl'+u
+'_net_mode').value
) {
1108 if (nphy
&& (a
.value
== 'tkip') && (sm2
.indexOf('wpa') != -1)) {
1109 ferror
.set(a
, 'TKIP encryption is not supported with WPA / WPA2 in N mode.', quiet
|| !ok
);
1112 else ferror
.clear(a
);
1116 a
= E('_wl'+u
+'_net_mode');
1118 b
= E('_f_wl'+u
+'_mode');
1120 if ((wmode
== 'sta') || (wmode
== 'wet')) {
1123 ferror
.set(b
, 'Only one wireless interface can be configured in client mode.', quiet
|| !ok
);
1126 else if (a
.value
== 'n-only') {
1127 ferror
.set(a
, 'N-only is not supported in wireless client modes, use Auto.', quiet
|| !ok
);
1132 a
= E('_wl'+u
+'_wpa_psk');
1134 if (wl_vis
[uidx
]._wl_wpa_psk
== 1) {
1135 if ((a
.value
.length
< 8) || ((a
.value
.length
== 64) && (a
.value
.search(/[^0-9A-Fa-f]/) != -1))) {
1136 ferror
.set('_wl'+u
+'_wpa_psk', 'Invalid pre-shared key. Please enter at least 8 characters or 64 hexadecimal digits.', quiet
|| !ok
);
1142 if (((wmode
== 'wds') || (wmode
== 'apwds')) && (wl_vis
[uidx
]._wl_channel
== 1) && (E('_wl'+u
+'_channel').value
== '0')) {
1143 ferror
.set('_wl'+u
+'_channel', 'Fixed wireless channel required in WDS mode.', quiet
|| !ok
);
1146 else ferror
.clear('_wl'+u
+'_channel');
1148 if (E('_f_wl'+u
+'_mode').value
== 'sta') {
1149 if ((wan
== 'disabled') && (E('_f_wl'+u
+'_radio').checked
)) {
1150 ferror
.set('_wan_proto', 'Wireless Client mode requires a valid WAN setting (usually DHCP).', quiet
|| !ok
);
1157 // domain name or IP address
1158 a
= ['_l2tp_server_ip', '_pptp_server_ip'];
1159 for (i
= a
.length
- 1; i
>= 0; --i
)
1160 if ((vis
[a
[i
]]) && ((!v_length(a
[i
], 1, 1)) || ((!v_ip(a
[i
], 1)) && (!v_domain(a
[i
], 1))))) {
1161 if (!quiet
&& ok
) ferror
.show(a
[i
]);
1166 a
= ['_wan_gateway','_wan_ipaddr'];
1167 for (i
= a
.length
- 1; i
>= 0; --i
)
1168 if ((vis
[a
[i
]]) && (!v_ip(a
[i
], quiet
|| !ok
))) ok
= 0;
1170 // IP address, blank -> 0.0.0.0
1171 a
= ['_f_dns_1', '_f_dns_2', '_f_dns_3','_wan_wins','_lan_gateway', '_modem_ipaddr'];
1172 for (i
= a
.length
- 1; i
>= 0; --i
)
1173 if ((vis
[a
[i
]]) && (!v_dns(a
[i
], quiet
|| !ok
))) ok
= 0;
1176 a
= ['_wan_netmask'];
1177 for (i
= a
.length
- 1; i
>= 0; --i
)
1178 if ((vis
[a
[i
]]) && (!v_netmask(a
[i
], quiet
|| !ok
))) ok
= 0;
1181 a
= [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500]];
1182 for (i
= a
.length
- 1; i
>= 0; --i
) {
1184 if ((vis
[v
[0]]) && (!v_range(v
[0], quiet
|| !ok
, v
[1], v
[2]))) ok
= 0;
1187 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1188 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1189 if (wl_sunit(uidx
)<0) {
1193 a
= ['_radius_ipaddr'];
1194 for (i
= a
.length
- 1; i
>= 0; --i
) {
1195 if ((wl_vis
[uidx
]['_wl'+a
[i
]]) && (!v_ip('_wl'+u
+a
[i
], quiet
|| !ok
))) ok
= 0;
1199 a
= [['_wpa_gtk_rekey', 60, 7200], ['_radius_port', 1, 65535]];
1200 for (i
= a
.length
- 1; i
>= 0; --i
) {
1202 if ((wl_vis
[uidx
]['_wl'+v
[0]]) && (!v_range('_wl'+u
+v
[0], quiet
|| !ok
, v
[1], v
[2]))) ok
= 0;
1206 a
= [['_ssid', 1], ['_radius_key', 1]];
1207 for (i
= a
.length
- 1; i
>= 0; --i
) {
1209 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;
1212 if (wl_vis
[uidx
]._wl_key1
) {
1213 a
= (E('_wl'+u
+'_wep_bit').value
== 128) ? 26 : 10;
1214 for (i
= 1; i
<= 4; ++i
) {
1215 b
= E('_wl'+u
+'_key' + i
);
1217 if ((b
.value
.length
> 0) || (E('_f_wl'+u
+'_wepidx_' + i
).checked
)) {
1218 if (!v_wep(b
, quiet
|| !ok
)) ok
= 0;
1220 else ferror
.clear(b
);
1224 ferror
.clear('_f_wl'+u
+'_wds_0');
1225 if (wl_vis
[uidx
]._f_wl_wds_0
== 1) {
1227 for (i
= 0; i
< 10; ++i
) {
1228 a
= E('_f_wl'+u
+'_wds_' + i
);
1229 if (!v_macz(a
, quiet
|| !ok
)) ok
= 0;
1230 else if (!isMAC0(a
.value
)) b
= 1;
1233 ferror
.set('_f_wl'+u
+'_wds_0', 'WDS MAC address required.', quiet
|| !ok
);
1243 function earlyInit()
1245 verifyFields(null, 1);
1250 if (lg
.isEditing()) return;
1251 lg
.resetNewEditor();
1255 var u
, uidx
, wmode
, sm2
, wradio
;
1257 if (!verifyFields(null, false)) return;
1259 var fom
= E('_fom');
1261 fom
.wan_mtu
.value
= fom
.f_wan_mtu
.value
;
1262 fom
.wan_mtu
.disabled
= fom
.f_wan_mtu
.disabled
;
1264 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1265 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1266 if (wl_sunit(uidx
)<0) {
1268 wmode
= E('_f_wl'+u
+'_mode').value
;
1269 sm2
= E('_wl'+u
+'_security_mode').value
;
1270 wradio
= E('_f_wl'+u
+'_radio').checked
;
1272 E('_wl'+u
+'_nband').value
= selectedBand(uidx
);
1274 if (wmode
== 'apwds') E('_wl'+u
+'_mode').value
= 'ap';
1275 else E('_wl'+u
+'_mode').value
= wmode
;
1277 if (wmode
== 'wet') {
1278 fom
.wan_proto
.value
= 'disabled';
1279 fom
.wan_proto
.disabled
= 0;
1281 // TODO - what's required ? integrate with tomatogrid?
1286 for (i
= 0; i
< 10; ++i
) a
.push(E('_f_wl'+u
+'_wds_' + i
).value
);
1287 E('_wl'+u
+'_wds').value
= joinAddr(a
);
1289 if (wmode
.indexOf('wds') != -1) {
1290 E('_wl'+u
+'_wds_enable').value
= 1;
1291 E('_wl'+u
+'_lazywds').value
= E('_f_wl'+u
+'_lazywds').value
;
1292 if (E('_wl'+u
+'_lazywds').value
== 1) E('_wl'+u
+'_wds').value
= '';
1295 E('_wl'+u
+'_wds_enable').value
= 0;
1296 E('_wl'+u
+'_wds').value
= '';
1297 E('_wl'+u
+'_lazywds').value
= 0;
1300 E('_wl'+u
+'_radio').value
= wradio
? 1 : 0;
1301 E('_wl'+u
+'_auth').value
= eval('nvram.wl'+u
+'_auth');
1303 e
= E('_wl'+u
+'_akm');
1313 if (sm2
.indexOf('personal') != -1) {
1314 if (sm2
.indexOf('wpa2_') == -1) c
.push('psk');
1315 if (sm2
.indexOf('wpa_') == -1) c
.push('psk2');
1318 if (sm2
.indexOf('wpa2_') == -1) c
.push('wpa');
1319 if (sm2
.indexOf('wpa_') == -1) c
.push('wpa2');
1325 E('_wl'+u
+'_auth_mode').value
= (sm2
== 'radius') ? 'radius' : 'none';
1326 E('_wl'+u
+'_wep').value
= ((sm2
== 'radius') || (sm2
== 'wep')) ? 'enabled': 'disabled';
1328 if (sm2
.indexOf('wpa') != -1) E('_wl'+u
+'_auth').value
= 0;
1330 E('_wl'+u
+'_nreqd').value
= 0;
1331 E('_wl'+u
+'_gmode').value
= 1;
1332 E('_wl'+u
+'_nmode').value
= 0;
1333 E('_wl'+u
+'_nmcsidx').value
= -2; // Legacy Rate
1334 E('_wl'+u
+'_nbw').value
= 0;
1335 switch (E('_wl'+u
+'_net_mode').value
) {
1337 E('_wl'+u
+'_gmode').value
= 0;
1340 E('_wl'+u
+'_gmode').value
= 4;
1345 E('_wl'+u
+'_nmcsidx').value
= -1; // Auto
1348 if (selectedBand(uidx
) == '1') { // 5 GHz
1349 E('_wl'+u
+'_nmode').value
= -1;
1350 E('_wl'+u
+'_nmcsidx').value
= -1;
1352 E('_wl'+u
+'_nmode').value
= 1;
1353 E('_wl'+u
+'_nmcsidx').value
= 32;
1355 E('_wl'+u
+'_nreqd').value
= 1;
1358 E('_wl'+u
+'_nmode').value
= -1;
1359 E('_wl'+u
+'_nmcsidx').value
= -1;
1363 E('_wl'+u
+'_nctrlsb').value
= eval('nvram.wl'+u
+'_nctrlsb');
1364 if (E('_wl'+u
+'_nmode').value
!= 0) {
1365 E('_wl'+u
+'_nctrlsb').value
= E('_f_wl'+u
+'_nctrlsb').value
;
1366 E('_wl'+u
+'_nbw').value
= (E('_wl'+u
+'_nbw_cap').value
== 0) ? 20 : 40;
1369 E('_wl'+u
+'_closed').value
= E('_f_wl'+u
+'_bcast').checked
? 0 : 1;
1371 a
= fields
.radio
.selected(eval('fom.f_wl'+u
+'_wepidx'));
1372 if (a
) E('_wl'+u
+'_key').value
= a
.value
;
1376 fom
.wan_islan
.value
= fom
.f_wan_islan
.checked
? 1 : 0;
1377 fom
.pptp_dhcp
.value
= fom
.f_pptp_dhcp
.checked
? 1 : 0;
1379 fom
.wan_dns
.value
= joinAddr([fom
.f_dns_1
.value
, fom
.f_dns_2
.value
, fom
.f_dns_3
.value
]);
1381 /* DNSCRYPT-BEGIN */
1382 fom
.dnscrypt_proxy
.value
= fom
.f_dnscrypt_proxy
.checked
? 1 : 0;
1385 // initialize/wipe out relevant fields
1386 for (var i
= 0 ; i
<= MAX_BRIDGE_ID
; i
++) {
1387 var j
= (i
== 0) ? '' : i
.toString();
1388 fom
['lan' + j
+ '_ifname'].value
= '';
1389 fom
['lan' + j
+ '_ipaddr'].value
= '';
1390 fom
['lan' + j
+ '_netmask'].value
= '';
1391 fom
['lan' + j
+ '_proto'].value
= '';
1392 fom
['lan' + j
+ '_stp'].value
= '';
1393 fom
['dhcp' + j
+ '_start'].value
= '';
1394 fom
['dhcp' + j
+ '_num'].value
= '';
1395 fom
['dhcp' + j
+ '_lease'].value
= '';
1396 fom
['dhcpd' + j
+ '_startip'].value
= '';
1397 fom
['dhcpd' + j
+ '_endip'].value
= '';
1400 var d
= lg
.getAllData();
1401 for (var i
= 0; i
< d
.length
; ++i
) {
1403 if (lg
.countOverlappingNetworks(d
[i
][2]) > 1) {
1404 var s
= 'Cannot proceed: two or more LAN bridges have conflicting IP addresses or overlapping subnets';
1406 var e
= E('footer-msg');
1408 e
.style
.visibility
= 'visible';
1412 e
.style
.visibility
= 'hidden';
1417 var j
= (parseInt(d
[i
][0]) == 0) ? '' : d
[i
][0].toString();
1418 fom
['lan' + j
+ '_ifname'].value
= 'br' + d
[i
][0];
1419 fom
['lan' + j
+ '_stp'].value
= d
[i
][1];
1420 fom
['lan' + j
+ '_ipaddr'].value
= d
[i
][2];
1421 fom
['lan' + j
+ '_netmask'].value
= d
[i
][3];
1422 fom
['lan' + j
+ '_proto'].value
= (d
[i
][4] != '0') ? 'dhcp' : 'static';
1423 fom
['dhcp' + j
+ '_start'].value
= (d
[i
][4] != '0') ? (d
[i
][5]).split('.').splice(3, 1) : '';
1424 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)
1425 fom
['dhcp' + j
+ '_lease'].value
= (d
[i
][4] != '0') ? d
[i
][7] : '';
1426 fom
['dhcpd' + j
+ '_startip'].value
= (d
[i
][4] != '0') ? d
[i
][5] : '';
1427 fom
['dhcpd' + j
+ '_endip'].value
= (d
[i
][4] != '0') ? d
[i
][6] : '';
1430 alert('lan' + j
+ '_ifname=' + fom
['lan' + j
+ '_ifname'].value
+ '\n' +
1431 'lan' + j
+ '_stp=' + fom
['lan' + j
+ '_stp'].value
+ '\n' +
1432 'lan' + j
+ '_ipaddr=' + fom
['lan' + j
+ '_ipaddr'].value
+ '\n' +
1433 'lan' + j
+ '_netmask=' + fom
['lan' + j
+ '_netmask'].value
+ '\n' +
1434 'lan' + j
+ '_proto=' + fom
['lan' + j
+ '_proto'].value
+ '\n' +
1435 'dhcp' + j
+ '_start=' + fom
['dhcp' + j
+ '_start'].value
+ '\n' +
1436 'dhcp' + j
+ '_num=' + fom
['dhcp' + j
+ '_num'].value
+ '\n' +
1437 'dhcp' + j
+ '_lease=' + fom
['dhcp' + j
+ '_lease'].value
+ '\n' +
1438 'dhcpd' + j
+ '_startip=' + fom
['dhcpd' + j
+ '_startip'].value
+ '\n' +
1439 'dhcpd' + j
+ '_endip=' + fom
['dhcpd' + j
+ '_endip'].value
);
1443 var e
= E('footer-msg');
1444 var t
= fixIP(fom
['lan_ipaddr'].value
);
1445 if ((fom
['lan_ifname'].value
!= 'br0') || (fom
['lan_ipaddr'].value
== '0.0.0.0') || (!t
)) {
1446 e
.innerHTML
= 'Bridge br0 must be always defined and have a valid IP address set.';
1447 e
.style
.visibility
= 'visible';
1451 e
.style
.visibility
= 'hidden';
1457 // if ((nvram.lan_ipaddr != fom.lan_ipaddr.value) || (nvram.lan1_ipaddr != fom.lan1_ipaddr.value) ||
1458 // (nvram.lan2_ipaddr != fom.lan2_ipaddr.value) || (nvram.lan3_ipaddr != fom.lan3_ipaddr.value)){
1461 fom
.ppp_mlppp
.value
= fom
.f_ppp_mlppp
.checked
? 1 : 0;
1463 if (nvram
.lan_ipaddr
!= fom
.lan_ipaddr
.value
) {
1464 fom
._moveip
.value
= 1;
1468 form
.submit(fom
, 1);
1474 for (var uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1475 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1476 if (wl_sunit(uidx
)<0) {
1477 refreshNetModes(uidx
);
1478 refreshChannels(uidx
);
1485 <body onload='init()'
>
1486 <form id='_fom' method='post' action='tomato.cgi'
>
1487 <table id='container' cellspacing=
0>
1488 <tr><td colspan=
2 id='header'
>
1489 <div class='title'
>Tomato
</div>
1490 <div class='version'
>Version <%
version(); %></div>
1492 <tr id='body'
><td id='navi'
><script type='text/javascript'
>navi()</script></td>
1494 <div id='ident'
><%
ident(); %></div>
1498 <input type='hidden' name='_nextpage' value='basic-network.asp'
>
1499 <input type='hidden' name='_nextwait' value='
10'
>
1500 <input type='hidden' name='_service' value='*'
>
1501 <input type='hidden' name='_moveip' value='
0'
>
1503 <input type='hidden' name='wan_mtu'
>
1504 <input type='hidden' name='wan_islan'
>
1505 <input type='hidden' name='pptp_dhcp'
>
1506 <input type='hidden' name='wan_dns'
>
1507 <input type='hidden' name='ppp_mlppp'
>
1508 /* DNSCRYPT-BEGIN */
1509 <input type='hidden' name='dnscrypt_proxy'
>
1512 <script type='text/javascript'
>
1514 for (var i
= 0 ; i
<= MAX_BRIDGE_ID
; i
++) {
1515 var j
= (i
== 0) ? '' : i
.toString();
1516 W('<input type=\'hidden\' id=\'lan' + j
+ '_ifname\' name=\'lan' + j
+ '_ifname\'>');
1517 W('<input type=\'hidden\' id=\'lan' + j
+ '_ipaddr\' name=\'lan' + j
+ '_ipaddr\'>');
1518 W('<input type=\'hidden\' id=\'lan' + j
+ '_netmask\' name=\'lan' + j
+ '_netmask\'>');
1519 W('<input type=\'hidden\' id=\'lan' + j
+ '_proto\' name=\'lan' + j
+ '_proto\'>');
1520 W('<input type=\'hidden\' id=\'lan' + j
+ '_stp\' name=\'lan' + j
+ '_stp\'>');
1521 W('<input type=\'hidden\' id=\'dhcp' + j
+ '_start\' name=\'dhcp' + j
+ '_start\'>');
1522 W('<input type=\'hidden\' id=\'dhcp' + j
+ '_num\' name=\'dhcp' + j
+ '_num\'>');
1523 W('<input type=\'hidden\' id=\'dhcp' + j
+ '_lease\' name=\'dhcp' + j
+ '_lease\'>');
1524 W('<input type=\'hidden\' id=\'dhcpd' + j
+ '_startip\' name=\'dhcpd' + j
+ '_startip\'>');
1525 W('<input type=\'hidden\' id=\'dhcpd' + j
+ '_endip\' name=\'dhcpd' + j
+ '_endip\'>');
1529 <div class='section-title'
>WAN / Internet
</div>
1530 <div class='section'
>
1531 <script type='text/javascript'
>
1532 createFieldTable('', [
1533 { title
: 'Type', name
: 'wan_proto', type
: 'select', options
: [['dhcp','DHCP'],['pppoe','PPPoE'],['static','Static'],['pptp','PPTP'],['l2tp','L2TP'],
1536 ['ppp3g','3G Modem'],
1539 ['disabled','Disabled']],
1540 value
: nvram
.wan_proto
},
1541 { title
: 'Modem device', name
: 'modem_dev', type
: 'select', options
: [['ttyUSB0', '/dev/ttyUSB0'],['ttyUSB1', '/dev/ttyUSB1'],['ttyUSB2', '/dev/ttyUSB2'],['ttyUSB3', '/dev/ttyUSB3'],['ttyACM0', '/dev/ttyACM0']], value
: nvram
.modem_dev
},
1542 { title
: 'PIN Code', name
: 'modem_pin', type
: 'text', maxlen
: 6, size
: 8, value
: nvram
.modem_pin
},
1543 { title
: 'Modem init string', name
: 'modem_init', type
: 'text', maxlen
: 25, size
: 32, value
: nvram
.modem_init
},
1544 { title
: 'APN', name
: 'modem_apn', type
: 'text', maxlen
: 25, size
: 32, value
: nvram
.modem_apn
},
1545 { title
: 'Username', name
: 'ppp_username', type
: 'text', maxlen
: 60, size
: 64, value
: nvram
.ppp_username
},
1546 { title
: 'Password', name
: 'ppp_passwd', type
: 'password', maxlen
: 60, size
: 64, peekaboo
: 1, value
: nvram
.ppp_passwd
},
1547 { title
: 'Service Name', name
: 'ppp_service', type
: 'text', maxlen
: 50, size
: 64, value
: nvram
.ppp_service
},
1548 { title
: 'L2TP Server', name
: 'l2tp_server_ip', type
: 'text', maxlen
: 128, size
: 64, value
: nvram
.l2tp_server_ip
},
1549 { title
: 'Use DHCP', name
: 'f_pptp_dhcp', type
: 'checkbox', value
: (nvram
.pptp_dhcp
== 1) },
1550 { title
: 'IP Address', name
: 'wan_ipaddr', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.wan_ipaddr
},
1551 { title
: 'Subnet Mask', name
: 'wan_netmask', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.wan_netmask
},
1552 { title
: 'Gateway', name
: 'wan_gateway', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.wan_gateway
},
1553 { title
: 'PPTP Gateway', name
: 'pptp_server_ip', type
: 'text', maxlen
: 128, size
: 64, value
: nvram
.pptp_server_ip
},
1554 { title
: 'Options', name
: 'ppp_custom', type
: 'text', maxlen
: 256, size
: 64, value
: nvram
.ppp_custom
},
1555 { title
: 'Connect Mode', name
: 'ppp_demand', type
: 'select', options
: [['1', 'Connect On Demand'],['0', 'Keep Alive']],
1556 value
: nvram
.ppp_demand
},
1557 { title
: 'Max Idle Time', indent
: 2, name
: 'ppp_idletime', type
: 'text', maxlen
: 5, size
: 7, suffix
: ' <i>(minutes)</i>',
1558 value
: nvram
.ppp_idletime
},
1559 { title
: 'Check Interval', indent
: 2, name
: 'ppp_redialperiod', type
: 'text', maxlen
: 5, size
: 7, suffix
: ' <i>(seconds)</i>',
1560 value
: nvram
.ppp_redialperiod
},
1561 { title
: 'MTU', multi
: [
1562 { name
: 'mtu_enable', type
: 'select', options
: [['0', 'Default'],['1','Manual']], value
: nvram
.mtu_enable
},
1563 { name
: 'f_wan_mtu', type
: 'text', maxlen
: 4, size
: 6, value
: nvram
.wan_mtu
} ] },
1564 { title
: 'Single Line MLPPP', name
: 'f_ppp_mlppp', type
: 'checkbox', value
: (nvram
.ppp_mlppp
== 1) },
1566 { 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
},
1568 { title
: 'Bridge WAN port to primary LAN (br0)', name
: 'f_wan_islan', type
: 'checkbox', value
: (nvram
.wan_islan
== 1) }
1574 <div class='section-title'
>LAN
</div>
1575 <div class='section'
>
1576 <table class='tomato-grid' cellspacing=
1 id='lan-grid'
></table>
1578 <script type='text/javascript'
>lg
.setup();</script>
1580 <script type='text/javascript'
>
1581 dns
= nvram
.wan_dns
.split(/\s+/);
1583 //ipp = nvram.lan_ipaddr.split('.').splice(0, 3).join('.');
1585 createFieldTable('', [
1586 { title
: 'Default Gateway', name
: 'lan_gateway', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.lan_gateway
},
1587 { 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' },
1588 { title
: '', name
: 'f_dns_2', type
: 'text', maxlen
: 21, size
: 25, value
: dns
[1] || '0.0.0.0' },
1589 { title
: '', name
: 'f_dns_3', type
: 'text', maxlen
: 21, size
: 25, value
: dns
[2] || '0.0.0.0' },
1590 /* DNSCRYPT-BEGIN */
1591 { title
: 'Use dnscrypt-proxy', name
: 'f_dnscrypt_proxy', type
: 'checkbox', value
: (nvram
.dnscrypt_proxy
== 1) },
1593 { title
: 'WINS <i>(for DHCP)</i>', name
: 'wan_wins', type
: 'text', maxlen
: 15, size
: 17, value
: nvram
.wan_wins
}
1598 <script type='text/javascript'
>
1600 for (var uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
1601 //if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1602 if (wl_sunit(uidx
)<0) {
1603 var u
= wl_unit(uidx
);
1605 W('<input type=\'hidden\' id=\'_wl'+u
+'_mode\' name=\'wl'+u
+'_mode\'>');
1606 W('<input type=\'hidden\' id=\'_wl'+u
+'_nband\' name=\'wl'+u
+'_nband\'>');
1607 W('<input type=\'hidden\' id=\'_wl'+u
+'_wds_enable\' name=\'wl'+u
+'_wds_enable\'>');
1608 W('<input type=\'hidden\' id=\'_wl'+u
+'_wds\' name=\'wl'+u
+'_wds\'>');
1609 W('<input type=\'hidden\' id=\'_wl'+u
+'_radio\' name=\'wl'+u
+'_radio\'>');
1610 W('<input type=\'hidden\' id=\'_wl'+u
+'_closed\' name=\'wl'+u
+'_closed\'>');
1611 W('<input type=\'hidden\' id=\'_wl'+u
+'_key\' name=\'wl'+u
+'_key\'>');
1612 W('<input type=\'hidden\' id=\'_wl'+u
+'_gmode\' name=\'wl'+u
+'_gmode\'>');
1613 W('<input type=\'hidden\' id=\'_wl'+u
+'_akm\' name=\'wl'+u
+'_akm\'>');
1614 W('<input type=\'hidden\' id=\'_wl'+u
+'_auth\' name=\'wl'+u
+'_auth\'>');
1615 W('<input type=\'hidden\' id=\'_wl'+u
+'_auth_mode\' name=\'wl'+u
+'_auth_mode\'>');
1616 W('<input type=\'hidden\' id=\'_wl'+u
+'_wep\' name=\'wl'+u
+'_wep\'>');
1617 W('<input type=\'hidden\' id=\'_wl'+u
+'_lazywds\' name=\'wl'+u
+'_lazywds\'>');
1618 W('<input type=\'hidden\' id=\'_wl'+u
+'_nmode\' name=\'wl'+u
+'_nmode\'>');
1619 W('<input type=\'hidden\' id=\'_wl'+u
+'_nmcsidx\' name=\'wl'+u
+'_nmcsidx\'>');
1620 W('<input type=\'hidden\' id=\'_wl'+u
+'_nreqd\' name=\'wl'+u
+'_nreqd\'>');
1621 W('<input type=\'hidden\' id=\'_wl'+u
+'_nctrlsb\' name=\'wl'+u
+'_nctrlsb\'>');
1622 W('<input type=\'hidden\' id=\'_wl'+u
+'_nbw\' name=\'wl'+u
+'_nbw\'>');
1624 W('<div class=\'section-title\'>Wireless');
1625 // if (wl_ifaces.length > 1)
1626 W(' (' + wl_display_ifname(uidx
) + ')');
1629 W('<div class=\'section\'>');
1632 { title
: 'Enable Wireless', name
: 'f_wl'+u
+'_radio', type
: 'checkbox',
1633 value
: (eval('nvram.wl'+u
+'_radio') == '1') && (eval('nvram.wl'+u
+'_net_mode') != 'disabled') },
1634 { title
: 'MAC Address', text
: '<a href="advanced-mac.asp">' + eval('nvram.wl'+u
+'_hwaddr') + '</a>' },
1635 { title
: 'Wireless Mode', name
: 'f_wl'+u
+'_mode', type
: 'select',
1636 options
: [['ap', 'Access Point'],['apwds', 'Access Point + WDS'],['sta', 'Wireless Client'],['wet', 'Wireless Ethernet Bridge'],['wds', 'WDS']],
1637 value
: ((eval('nvram.wl'+u
+'_mode') == 'ap') && (eval('nvram.wl'+u
+'_wds_enable') == '1')) ? 'apwds' : eval('nvram.wl'+u
+'_mode') },
1638 { title
: 'Radio Band', name
: 'f_wl'+u
+'_nband', type
: 'select', options
: bands
[uidx
],
1639 value
: eval('nvram.wl'+u
+'_nband') || '0' == '0' ? bands
[uidx
][0][0] : eval('nvram.wl'+u
+'_nband') },
1640 { title
: 'Wireless Network Mode', name
: 'wl'+u
+'_net_mode', type
: 'select',
1641 value
: (eval('nvram.wl'+u
+'_net_mode') == 'disabled') ? 'mixed' : eval('nvram.wl'+u
+'_net_mode'),
1642 options
: [], prefix
: '<span id="__wl'+u
+'_net_mode">', suffix
: '</span>' },
1643 { title
: 'SSID', name
: 'wl'+u
+'_ssid', type
: 'text', maxlen
: 32, size
: 34, value
: eval('nvram.wl'+u
+'_ssid') },
1644 { title
: 'Broadcast', indent
: 2, name
: 'f_wl'+u
+'_bcast', type
: 'checkbox', value
: (eval('nvram.wl'+u
+'_closed') == '0') },
1645 { 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
+'">',
1646 value
: eval('nvram.wl'+u
+'_channel') },
1647 { title
: 'Channel Width', name
: 'wl'+u
+'_nbw_cap', type
: 'select', options
: [['0','20 MHz'],['1','40 MHz']],
1648 value
: eval('nvram.wl'+u
+'_nbw_cap') },
1649 { title
: 'Control Sideband', name
: 'f_wl'+u
+'_nctrlsb', type
: 'select', options
: [['lower','Lower'],['upper','Upper']],
1650 value
: eval('nvram.wl'+u
+'_nctrlsb') == 'none' ? 'lower' : eval('nvram.wl'+u
+'_nctrlsb') },
1652 { title
: 'Security', name
: 'wl'+u
+'_security_mode', type
: 'select',
1653 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']],
1654 value
: eval('nvram.wl'+u
+'_security_mode') },
1655 { title
: 'Encryption', indent
: 2, name
: 'wl'+u
+'_crypto', type
: 'select',
1656 options
: [['tkip','TKIP'],['aes','AES'],['tkip+aes','TKIP / AES']], value
: eval('nvram.wl'+u
+'_crypto') },
1657 { title
: 'Shared Key', indent
: 2, name
: 'wl'+u
+'_wpa_psk', type
: 'password', maxlen
: 64, size
: 66, peekaboo
: 1,
1658 suffix
: ' <input type="button" id="_f_wl'+u
+'_psk_random1" value="Random" onclick="random_psk(\'_wl'+u
+'_wpa_psk\')">',
1659 value
: eval('nvram.wl'+u
+'_wpa_psk') },
1660 { title
: 'Shared Key', indent
: 2, name
: 'wl'+u
+'_radius_key', type
: 'password', maxlen
: 80, size
: 32, peekaboo
: 1,
1661 suffix
: ' <input type="button" id="_f_wl'+u
+'_psk_random2" value="Random" onclick="random_psk(\'_wl'+u
+'_radius_key\')">',
1662 value
: eval('nvram.wl'+u
+'_radius_key') },
1663 { title
: 'Group Key Renewal', indent
: 2, name
: 'wl'+u
+'_wpa_gtk_rekey', type
: 'text', maxlen
: 4, size
: 6, suffix
: ' <i>(seconds)</i>',
1664 value
: eval('nvram.wl'+u
+'_wpa_gtk_rekey') },
1665 { title
: 'Radius Server', indent
: 2, multi
: [
1666 { name
: 'wl'+u
+'_radius_ipaddr', type
: 'text', maxlen
: 15, size
: 17, value
: eval('nvram.wl'+u
+'_radius_ipaddr') },
1667 { name
: 'wl'+u
+'_radius_port', type
: 'text', maxlen
: 5, size
: 7, prefix
: ' : ', value
: eval('nvram.wl'+u
+'_radius_port') } ] },
1668 { title
: 'Encryption', indent
: 2, name
: 'wl'+u
+'_wep_bit', type
: 'select', options
: [['128','128-bits'],['64','64-bits']],
1669 value
: eval('nvram.wl'+u
+'_wep_bit') },
1670 { title
: 'Passphrase', indent
: 2, name
: 'wl'+u
+'_passphrase', type
: 'text', maxlen
: 16, size
: 20,
1671 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
+')">',
1672 value
: eval('nvram.wl'+u
+'_passphrase') }
1675 for (i
= 1; i
<= 4; ++i
) {
1677 { title
: ('Key ' + i
), indent
: 2, name
: ('wl'+u
+'_key' + i
), type
: 'text', maxlen
: 26, size
: 34,
1678 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>' : '>'),
1679 value
: nvram
['wl'+u
+'_key' + i
] });
1683 { title
: 'WDS', name
: 'f_wl'+u
+'_lazywds', type
: 'select',
1684 options
: [['0','Link With...'],['1','Automatic']], value
: nvram
['wl'+u
+'_lazywds'] } );
1685 wds
= eval('nvram.wl'+u
+'_wds').split(/\s+/);
1686 for (i
= 0; i
< 10; i
+= 2) {
1687 f
.push({ title
: (i
? '' : 'MAC Address'), indent
: 2, multi
: [
1688 { name
: 'f_wl'+u
+'_wds_' + i
, type
: 'text', maxlen
: 17, size
: 20, value
: wds
[i
] || '00:00:00:00:00:00' },
1689 { name
: 'f_wl'+u
+'_wds_' + (i
+ 1), type
: 'text', maxlen
: 17, size
: 20, value
: wds
[i
+ 1] || '00:00:00:00:00:00' } ] } );
1692 createFieldTable('', f
);
1702 <tr><td id='footer' colspan=
2>
1703 <span id='footer-msg'
></span>
1704 <input type='button' value='Save' id='save-button' onclick='save()'
>
1705 <input type='button' value='Cancel' id='cancel-button' onclick='reloadPage();'
>
1709 <script type='text/javascript'
>earlyInit()</script>
1710 <div style='height:
100px'
></div>