SSID: Respect ASCII character Label.
[tomato.git] / release / src / router / www / basic-network.asp
blob1b5e9d4e3b7a6fa7169f97df30d9077cfde46843
1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN'>
2 <!--
3 Tomato GUI
4 Copyright (C) 2006-2010 Jonathan Zarate
5 http://www.polarcloud.com/tomato/
7 For use with Tomato Firmware only.
8 No part of this file may be used without permission.
9 -->
10 <html>
11 <head>
12 <meta http-equiv='content-type' content='text/html;charset=utf-8'>
13 <meta name='robots' content='noindex,nofollow'>
14 <title>[<% ident(); %>] Basic: Network</title>
15 <link rel='stylesheet' type='text/css' href='tomato.css'>
16 <% css(); %>
17 <script type='text/javascript' src='tomato.js'></script>
19 <!-- / / / -->
21 <style type='text/css'>
22 #lan-grid .co1,
23 #lan-grid .co2,
24 #lan-grid .co3,
25 #lan-grid .co4,
26 #lan-grid .co5,
27 #lan-grid .co6,
28 #lan-grid .co7 {
29 text-align: center;
32 #lan-grid .centered {
33 text-align: center;
36 #spin {
37 visibility: hidden;
38 vertical-align: middle;
40 </style>
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,lan_state,mtu_enable,ppp_demand,ppp_idletime,pppoe_lei,pppoe_lef,ppp_passwd,ppp_redialperiod,ppp_service,ppp_username,ppp_custom,pptp_server_ip,pptp_dhcp,wl_security_mode,wan_dns,dnscrypt_proxy,dnscrypt_port,dnscrypt_cmd,wan_gateway,wan_ipaddr,wan_mtu,wan_netmask,wan_proto,wan_wins,wl_wds_enable,wl_channel,wl_closed,wl_crypto,wl_key,wl_key1,wl_key2,wl_key3,wl_key4,wl_lazywds,wl_mode,wl_net_mode,wl_passphrase,wl_radio,wl_radius_ipaddr,wl_radius_port,wl_ssid,wl_wds,wl_wep_bit,wl_wpa_gtk_rekey,wl_wpa_psk,wl_radius_key,wl_auth,wl_hwaddr,wan_islan,t_features,wl_nbw_cap,wl_nctrlsb,wl_nband,wl_phytype,lan_ifname,lan_stp,lan1_ifname,lan1_ipaddr,lan1_netmask,lan1_proto,lan1_stp,dhcp1_start,dhcp1_num,dhcp1_lease,dhcpd1_startip,dhcpd1_endip,lan2_ifname,lan2_ipaddr,lan2_netmask,lan2_proto,lan2_stp,dhcp2_start,dhcp2_num,dhcp2_lease,dhcpd2_startip,dhcpd2_endip,lan3_ifname,lan3_ipaddr,lan3_netmask,lan3_proto,lan3_stp,dhcp3_start,dhcp3_num,dhcp3_lease,dhcpd3_startip,dhcpd3_endip,ppp_mlppp,modem_ipaddr,modem_pin,modem_dev,modem_init,modem_apn,cstats_enable"); %>
50 /* VLAN-BEGIN */
51 var lg = new TomatoGrid();
52 lg.setup = function() {
53 this.init('lan-grid', '', 4, [
54 { type: 'select', options: [[0, '0'],[1, '1'],[2, '2'],[3, '3']], prefix: '<div class="centered">', suffix: '</div>' },
55 { type: 'checkbox', prefix: '<div class="centered">', suffix: '</div>' },
56 { type: 'text', maxlen: 15, size: 17 },
57 { type: 'text', maxlen: 15, size: 17 },
58 { type: 'checkbox', prefix: '<div class="centered">', suffix: '</div>' },
59 { multi: [ { type: 'text', maxlen: 15, size: 17}, { type: 'text', maxlen: 15, size: 17 } ] },
60 { type: 'text', maxlen: 6, size: 8 }] );
61 this.headerSet(['Bridge', 'STP', 'IP Address', 'Netmask', 'DHCP', 'IP&nbsp;Range&nbsp;<i>(first/last)</i>', 'Lease&nbsp;Time&nbsp;<i>(mins)</i>']);
63 var numBridges = 0;
64 for (var i = 0 ; i <= MAX_BRIDGE_ID ; i++) {
65 var j = (i == 0) ? '' : i.toString();
66 if (nvram['lan' + j + '_ifname'].length > 0) {
67 if ((!fixIP(nvram['dhcpd' + j + '_startip'])) || (!fixIP(nvram['dhcpd' + j + '_endip']))) {
68 if ((fixIP(nvram['lan' + j + '_ipaddr'])) && (fixIP(nvram['lan' + j + '_netmask'])) && (nvram['dhcp' + j + '_start'] != '')) {
69 var n = getNetworkAddress(nvram['lan' + j + '_ipaddr'], nvram['lan' + j + '_netmask']);
70 nvram['dhcpd' + j + '_startip'] = getAddress(('0.0.0.' + nvram['dhcp' + j + '_start'] * 1), n);
71 nvram['dhcpd' + j + '_endip'] = getAddress(('0.0.0.' + ((nvram['dhcp' + j + '_start'] * 1) + (nvram['dhcp' + j + '_num'] *1) - 1)), n);
74 lg.insertData(-1, [
75 i.toString(),
76 nvram['lan' + j + '_stp'],
77 nvram['lan' + j + '_ipaddr'],
78 nvram['lan' + j + '_netmask'],
79 (nvram['lan' + j + '_proto'] == 'dhcp') ? '1' : '0',
80 nvram['dhcpd' + j + '_startip'],
81 nvram['dhcpd' + j + '_endip'],
82 (nvram['lan' + j + '_proto'] == 'dhcp') ? (((nvram['dhcp' + j + '_lease'])*1 == 0) ? '1440' : (nvram['dhcp' + j + '_lease']).toString()) : ''
83 ] ) ;
84 numBridges++;
87 lg.canDelete = false;
88 lg.sort(0);
89 elem.removeClass(lg.header.cells[lg.sortColumn], 'sortasc', 'sortdes');
90 lg.showNewEditor();
91 lg.resetNewEditor();
94 lg.dataToView = function(data) {
95 return ['br' + data[0],
96 (data[1].toString() == '1') ? '<small><i>Enabled</i></small>' : '<small><i>Disabled</i></small>',
97 data[2],
98 data[3],
99 (data[4].toString() == '1') ? '<small><i>Enabled</i></small>' : '<small><i>Disabled</i></small>',
100 (data[5].toString() + ((numberOfBitsOnNetMask(data[3])>=24) ? (' - ' + data[6].split('.').splice(3, 1).toString()) : ('<br>' + data[6].toString()) )),
101 (((data[7] != null) && (data[7] != '')) ? data[7] : '') ];
104 lg.dataToFieldValues = function (data) {
105 return [data[0],
106 (data[1] != 0) ? 'checked' : '',
107 data[2].toString(),
108 data[3].toString(),
109 (data[4].toString() == '1') ? 'checked' : '',
110 data[5].toString(),
111 data[6].toString(),
112 data[7].toString() ];
115 lg.fieldValuesToData = function(row) {
116 var f = fields.getAll(row);
117 return [f[0].value,
118 f[1].checked ? 1 : 0,
119 f[2].value,
120 f[3].value,
121 f[4].checked ? 1 : 0,
122 f[5].value,
123 f[6].value,
124 f[7].value ];
127 lg.resetNewEditor = function() {
128 var f = fields.getAll(this.newEditor);
129 f[0].selectedIndex=0;
130 var t = MAX_BRIDGE_ID;
131 while((this.countBridge(f[0].selectedIndex) > 0) && (t > 0)) {
132 f[0].selectedIndex = (f[0].selectedIndex%(MAX_BRIDGE_ID))+1;
133 t--;
135 for(var j=0; j<= MAX_BRIDGE_ID ; j++) {
136 f[0].options[j].disabled = (this.countBridge(j) > 0);
138 f[1].checked = 0;
139 f[2].value = '';
140 f[3].value = '';
141 f[5].value = '';
142 f[6].value = '';
143 f[7].value = '';
144 f[4].checked = 0;
145 f[4].disabled = 1;
146 f[5].disabled = 1;
147 f[6].disabled = 1;
148 f[7].disabled = 1;
149 ferror.clearAll(fields.getAll(this.newEditor));
152 lg.onCancel = function() {
153 this.removeEditor();
154 this.showSource();
155 this.disableNewEditor(false);
157 this.resetNewEditor();
160 lg.onAdd = function() {
161 var data;
163 this.moving = null;
164 this.rpHide();
166 if (!this.verifyFields(this.newEditor, false)) return;
168 data = this.fieldValuesToData(this.newEditor);
169 this.insertData(-1, data);
171 this.disableNewEditor(false);
172 this.resetNewEditor();
174 this.resort();
177 lg.onOK = function() {
178 var i, data, view;
180 if (!this.verifyFields(this.editor, false)) return;
182 data = this.fieldValuesToData(this.editor);
183 view = this.dataToView(data);
185 this.source.setRowData(data);
186 for (i = 0; i < this.source.cells.length; ++i) {
187 this.source.cells[i].innerHTML = view[i];
190 this.removeEditor();
191 this.showSource();
192 this.disableNewEditor(false);
194 this.resort();
195 this.resetNewEditor();
198 lg.onDelete = function() {
199 this.removeEditor();
200 elem.remove(this.source);
201 this.source = null;
202 this.disableNewEditor(false);
204 this.resetNewEditor();
207 lg.countElem = function(f, v) {
208 var data = this.getAllData();
209 var total = 0;
210 for (var i = 0; i < data.length; ++i) {
211 total += (data[i][f] == v) ? 1 : 0;
213 return total;
216 lg.countBridge = function (v) {
217 return this.countElem(0,v);
220 lg.countOverlappingNetworks = function (ip) {
221 var data = this.getAllData();
222 var total = 0;
223 for (var i = 0; i < data.length; ++i) {
224 var net = getNetworkAddress(data[i][2], data[i][3]);
225 var brd = getBroadcastAddress(net, data[i][3]);
226 total += ((aton(ip) <= aton(brd)) && (aton(ip) >= aton(net))) ? 1 : 0;
228 return total;
231 lg.verifyFields = function(row, quiet) {
232 var ok=1;
233 var f;
235 f = fields.getAll(row);
237 for(var j=0; j<= MAX_BRIDGE_ID ; j++) {
238 f[0].options[j].disabled = (this.countBridge(j) > 0);
241 if(this.countBridge(f[0].selectedIndex) > 0) {
242 ferror.set(f[0], 'Cannot add another entry for bridge br' + f[0].selectedIndex, quiet);
243 ok = 0;
244 } else {
245 ferror.clear(f[0]);
247 // valid IP address?
248 if(!v_ip(f[2], quiet || !ok))
249 ok = 0;
250 // if we have a properly defined IP address - 0.0.0.0 is NOT a valid IP address for our intents/purposes!
251 if ((f[2].value != '') && (f[2].value != '0.0.0.0')) {
252 // allow DHCP to be enabled
253 f[4].disabled = 0;
254 // validate netmask
255 if(!v_netmask(f[3], quiet || !ok)) {
256 return 0;
257 } else {
258 // should be 22 bits or smaller network
259 if ((numberOfBitsOnNetMask(f[3].value) < 22) && (nvram.cstats_enable == '1' )) {
260 if (!confirm("Netmask should have at least 22 bits (255.255.252.0). You may continue anyway but remember - you were warned!")) return;
261 } else {
262 ferror.clear(f[3]);
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);
269 return 0;
270 } else
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);
275 return 0;
276 } else
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);
281 return 0;
282 } else {
283 ferror.clear(f[2]);
284 ferror.clear(f[3]);
286 } else {
287 f[4].checked = 0;
288 f[4].disabled = 1;
290 // dhcp enabled?
291 if( (f[4].checked) && (v_ip(f[2], 1)) && (v_netmask(f[3],1)) ) {
292 f[5].disabled = 0;
293 f[6].disabled = 0;
294 f[7].disabled = 0;
295 // first/last IP still unset?
296 if (f[5].value == '') {
297 var l;
298 var m = aton(f[2].value) & aton(f[3].value);
299 var o = (m) ^ (~ aton(f[3].value))
300 var n = o - m;
301 do {
302 if (--n < 0) {
303 f[5].value = '';
304 return;
306 m++;
307 } while (((l = fixIP(ntoa(m), 1)) == null) || (l == f[2].value) );
308 f[5].value = l;
310 if (f[6].value == '') {
311 var l;
312 var m = aton(f[2].value) & aton(f[3].value);
313 var o = (m) ^ (~ aton(f[3].value));
314 var n = o - m;
315 do {
316 if (--n < 0) {
317 f[6].value = '';
318 return;
320 o--;
321 } while (((l = fixIP(ntoa(o), 1)) == null) || (l == f[2].value) );
322 f[6].value = l;
324 // first IP valid?
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);
330 return 0;
331 } else {
332 ferror.clear(f[5]);
334 // last IP valid?
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);
340 return 0;
341 } else {
342 ferror.clear(f[6]);
344 // validate range, swap first/last IP if needed
345 if (aton(f[6].value) < aton(f[5].value)) {
346 var t = f[5].value;
347 f[5].value = f[6].value;
348 f[6].value = t;
350 // lease time
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))
354 ok = 0;
355 } else {
356 f[5].disabled = 1;
357 f[6].disabled = 1;
358 f[7].disabled = 1;
359 ferror.clear(f[5]);
360 ferror.clear(f[6]);
361 ferror.clear(f[7]);
363 return ok;
365 /* VLAN-END */
367 W('<style type=\'text/css\'>');
368 for (var u = 0; u < wl_ifaces.length; ++u) {
369 W('#spin'+wl_unit(u)+', ');
371 W('#spin {');
372 W(' visibility: hidden;');
373 W(' vertical-align: middle;');
374 W('}');
375 W('</style>');
377 var xob = null;
378 var refresher = [];
379 var nphy = features('11n');
381 /* NOVLAN-BEGIN */
382 if ((!fixIP(nvram.dhcpd_startip)) || (!fixIP(nvram.dhcpd_endip))) {
383 var x = nvram.lan_ipaddr.split('.').splice(0, 3).join('.') + '.';
384 nvram.dhcpd_startip = x + nvram.dhcp_start;
385 nvram.dhcpd_endip = x + ((nvram.dhcp_start * 1) + (nvram.dhcp_num * 1) - 1);
387 /* NOVLAN-END */
389 var ghz = [];
390 var bands = [];
391 var nm_loaded = [], ch_loaded = [], max_channel = [];
393 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
394 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
395 if (wl_sunit(uidx)<0) {
396 var b;
397 b = [];
398 for (var i = 0; i < wl_bands[uidx].length; ++i) {
399 b.push([wl_bands[uidx][i] + '', (wl_bands[uidx][i] == '1') ? '5 GHz' : '2.4 GHz']);
401 bands.push(b);
403 b = [];
404 ghz.push(b);
406 nm_loaded.push(0);
407 ch_loaded.push(0);
408 max_channel.push(0);
409 refresher.push(null);
413 function selectedBand(uidx)
415 if (bands[uidx].length > 1) {
416 var e = E('_f_wl'+u+'_nband');
417 return (e.value + '' == '' ? eval('nvram.wl'+u+'_nband') : e.value);
418 } else if (bands[uidx].length > 0) {
419 return bands[uidx][0][0] || '0';
420 } else {
421 return '0';
425 function refreshNetModes(uidx)
427 var e, i, buf, val;
429 if (uidx >= wl_ifaces.length) return;
430 var u = wl_unit(uidx);
432 var m = [['mixed','Auto']];
433 if (selectedBand(uidx) == '1') {
434 m.push(['a-only','A Only']);
435 if (nphy) {
436 m.push(['n-only','N Only']);
439 else {
440 m.push(['b-only','B Only']);
441 m.push(['g-only','G Only']);
442 if (nphy) {
443 m.push(['bg-mixed','B/G Mixed']);
444 m.push(['n-only','N Only']);
448 e = E('_wl'+u+'_net_mode');
449 buf = '';
450 val = (!nm_loaded[uidx] || (e.value + '' == '')) ? eval('nvram.wl'+u+'_net_mode') : e.value;
451 if (val == 'disabled') val = 'mixed';
452 for (i = 0; i < m.length; ++i)
453 buf += '<option value="' + m[i][0] + '"' + ((m[i][0] == val) ? ' selected' : '') + '>' + m[i][1] + '</option>';
455 e = E('__wl'+u+'_net_mode');
456 buf = '<select name="wl'+u+'_net_mode" onchange="verifyFields(this, 1)" id = "_wl'+u+'_net_mode">' + buf + '</select>';
457 elem.setInnerHTML(e, buf);
458 nm_loaded[uidx] = 1;
461 function refreshChannels(uidx)
463 if (refresher[uidx] != null) return;
464 if (u >= wl_ifaces.length) return;
465 var u = wl_unit(uidx);
467 refresher[uidx] = new XmlHttp();
468 refresher[uidx].onCompleted = function(text, xml) {
469 try {
470 var e, i, buf, val;
472 var wl_channels = [];
473 eval(text);
475 ghz[uidx] = [];
476 max_channel[uidx] = 0;
477 for (i = 0; i < wl_channels.length; ++i) {
478 ghz[uidx].push([wl_channels[i][0] + '',
479 (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']);
480 max_channel[uidx] = wl_channels[i][0] * 1;
483 e = E('_wl'+u+'_channel');
484 buf = '';
485 val = (!ch_loaded[uidx] || (e.value + '' == '')) ? eval('nvram.wl'+u+'_channel') : e.value;
486 for (i = 0; i < ghz[uidx].length; ++i)
487 buf += '<option value="' + ghz[uidx][i][0] + '"' + ((ghz[uidx][i][0] == val) ? ' selected' : '') + '>' + ghz[uidx][i][1] + '</option>';
489 e = E('__wl'+u+'_channel');
490 buf = '<select name="wl'+u+'_channel" onchange="verifyFields(this, 1)" id = "_wl'+u+'_channel">' + buf + '</select>';
491 elem.setInnerHTML(e, buf);
492 ch_loaded[uidx] = 1;
494 refresher[uidx] = null;
495 verifyFields(null, 1);
497 catch (x) {
499 refresher[uidx] = null;
502 var bw, sb, e;
504 e = E('_f_wl'+u+'_nctrlsb');
505 sb = (e.value + '' == '' ? eval('nvram.wl'+u+'_nctrlsb') : e.value);
506 e = E('_wl'+u+'_nbw_cap');
507 bw = (e.value + '' == '' ? eval('nvram.wl'+u+'_nbw_cap') : e.value) == '0' ? '20' : '40';
509 refresher[uidx].onError = function(ex) { alert(ex); refresher[uidx] = null; reloadPage(); }
510 refresher[uidx].post('update.cgi', 'exec=wlchannels&arg0=' + u + '&arg1=' + (nphy ? '1' : '0') +
511 '&arg2=' + bw + '&arg3=' + selectedBand(uidx) + '&arg4=' + sb);
514 function spin(x, unit)
516 for (var u = 0; u < wl_ifaces.length; ++u) {
517 E('_f_wl'+wl_unit(u)+'_scan').disabled = x;
519 var e = E('_f_wl'+unit+'_scan');
520 if (x) e.value = 'Scan ' + (wscan.tries + 1);
521 else e.value = 'Scan';
522 E('spin'+unit).style.visibility = x ? 'visible' : 'hidden';
525 function scan()
527 if (xob) return;
529 var unit = wscan.unit;
530 var uidx = wl_uidx(unit);
532 xob = new XmlHttp();
533 xob.onCompleted = function(text, xml) {
534 try {
535 var i;
537 wlscandata = [];
538 eval(text);
540 for (i = 0; i < wlscandata.length; ++i) {
541 var data = wlscandata[i];
542 var ch = data[2];
543 var mac = data[0];
545 if (!wscan.inuse[ch]) {
546 wscan.inuse[ch] = {
547 count: 0,
548 rssi: -999,
549 ssid: ''
553 if (!wscan.seen[mac]) {
554 wscan.seen[mac] = 1;
555 ++wscan.inuse[ch].count;
558 if (data[4] > wscan.inuse[ch].rssi) {
559 wscan.inuse[ch].rssi = data[4];
560 wscan.inuse[ch].ssid = data[1];
563 var e = E('_wl'+unit+'_channel');
564 for (i = 1; i < ghz[uidx].length; ++i) {
565 var s = ghz[uidx][i][1];
566 var u = wscan.inuse[ghz[uidx][i][0]];
567 if (u) s += ' (' + u.count + ' AP' + (u.count == 1 ? '' : 's') + ' / strongest: "' + escapeHTML(ellipsis(u.ssid, 15)) + '" ' + u.rssi + ' dBm)';
568 e.options[i].innerHTML = s;
570 e.style.width = '400px';
572 xob = null;
574 if (wscan.tries < 4) {
575 ++wscan.tries;
576 setTimeout(scan, 1000);
577 return;
580 catch (x) {
582 spin(0, unit);
584 xob.onError = function(x) {
585 alert('error: ' + x);
586 spin(0, unit);
587 xob = null;
590 spin(1, unit);
591 xob.post('update.cgi', 'exec=wlscan&arg0='+unit);
594 function scanButton(u)
596 if (xob) return;
598 wscan = {
599 unit: u,
600 seen: [],
601 inuse: [],
602 tries: 0
605 scan();
608 function joinAddr(a) {
609 var r, i, s;
611 r = [];
612 for (i = 0; i < a.length; ++i) {
613 s = a[i];
614 if ((s != '00:00:00:00:00:00') && (s != '0.0.0.0')) r.push(s);
616 return r.join(' ');
619 function random_x(max)
621 var c = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
622 var s = '';
623 while (max-- > 0) s += c.substr(Math.floor(c.length * Math.random()), 1);
624 return s;
627 function random_psk(id)
629 var e = E(id);
630 e.value = random_x(63);
631 verifyFields(null, 1);
634 function random_wep(u)
636 E('_wl'+u+'_passphrase').value = random_x(16);
637 generate_wep(u);
640 function v_wep(e, quiet)
642 var s = e.value;
644 if (((s.length == 5) || (s.length == 13)) && (s.length == (e.maxLength >> 1))) {
645 // no checking
647 else {
648 s = s.toUpperCase().replace(/[^0-9A-F]/g, '');
649 if (s.length != e.maxLength) {
650 ferror.set(e, 'Invalid WEP key. Expecting ' + e.maxLength + ' hex or ' + (e.maxLength >> 1) + ' ASCII characters.', quiet);
651 return 0;
655 e.value = s;
656 ferror.clear(e);
657 return 1;
660 // compatible w/ Linksys' and Netgear's (key 1) method for 128-bits
661 function generate_wep(u)
663 function _wepgen(pass, i)
665 while (pass.length < 64) pass += pass;
666 return hex_md5(pass.substr(0, 64)).substr(i, (E('_wl'+u+'_wep_bit').value == 128) ? 26 : 10);
669 var e = E('_wl'+u+'_passphrase');
670 var pass = e.value;
671 if (!v_length(e, false, 3)) return;
672 E('_wl'+u+'_key1').value = _wepgen(pass, 0);
673 pass += '#$%';
674 E('_wl'+u+'_key2').value = _wepgen(pass, 2);
675 pass += '!@#';
676 E('_wl'+u+'_key3').value = _wepgen(pass, 4);
677 pass += '%&^';
678 E('_wl'+u+'_key4').value = _wepgen(pass, 6);
679 verifyFields(null, 1);
682 function verifyFields(focused, quiet)
684 var i;
685 var ok = 1;
686 var a, b, c, d, e;
687 var u, uidx;
688 var wmode, sm2;
690 var n = E('_f_lan_state').checked;
691 E('_f_lan_desc').disabled = !n;
692 E('_f_lan_invert').disabled = !n;
694 /* DNSCRYPT-BEGIN */
695 var p = E('_f_dnscrypt_proxy').checked;
696 E('_dnscrypt_port').disabled = !p;
697 E('_dnscrypt_cmd').disabled = !p;
698 /* DNSCRYPT-END */
700 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
701 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
702 if (wl_sunit(uidx)<0) {
703 u = wl_unit(uidx);
704 if (focused == E('_f_wl'+u+'_nband')) {
705 refreshNetModes(uidx);
706 refreshChannels(uidx);
708 else if (focused == E('_f_wl'+u+'_nctrlsb') || focused == E('_wl'+u+'_nbw_cap')) {
709 refreshChannels(uidx);
714 // --- visibility ---
716 var vis = {
717 _wan_proto: 1,
718 _ppp_username: 1,
719 _ppp_passwd: 1,
720 _ppp_service: 1,
721 _ppp_custom: 1,
722 _l2tp_server_ip: 1,
723 _wan_ipaddr: 1,
724 _wan_netmask: 1,
725 _wan_gateway: 1,
726 _pptp_server_ip: 1,
727 _f_pptp_dhcp: 1,
728 _ppp_demand: 1,
729 _ppp_idletime: 1,
730 _ppp_redialperiod: 1,
731 _pppoe_lei: 1,
732 _pppoe_lef: 1,
733 _mtu_enable: 1,
734 _f_wan_mtu: 1,
735 _f_wan_islan: 0,
736 _f_ppp_mlppp: 1,
737 _modem_ipaddr: 1,
739 /* NOVLAN-BEGIN */
740 _dhcp_lease: 1,
741 _f_dhcpd_enable: 1,
742 _dhcpd_startip: 1,
743 _dhcpd_endip: 1,
744 _lan_ipaddr: 1,
745 _lan_netmask: 1,
746 /* NOVLAN-END */
747 _f_dns_1: 1,
748 _f_dns_2: 1,
749 _f_dns_3: 1,
750 _lan_gateway: 1,
751 _wan_wins: 1,
752 _modem_pin: 1,
753 _modem_dev: 1,
754 _modem_init: 1,
755 _modem_apn: 1
758 var wl_vis = [];
759 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
760 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
761 if (wl_sunit(uidx)<0) {
762 a = {
763 _f_wl_radio: 1,
764 _f_wl_mode: 1,
765 _f_wl_nband: (bands[uidx].length > 1) ? 1 : 0,
766 _wl_net_mode: 1,
767 _wl_ssid: 1,
768 _f_wl_bcast: 1,
769 _wl_channel: 1,
770 _wl_nbw_cap: nphy ? 1 : 0,
771 _f_wl_nctrlsb: nphy ? 1 : 0,
772 _f_wl_scan: 1,
774 _wl_security_mode: 1,
775 _wl_crypto: 1,
776 _wl_wpa_psk: 1,
777 _f_wl_psk_random1: 1,
778 _f_wl_psk_random2: 1,
779 _wl_wpa_gtk_rekey: 1,
780 _wl_radius_key: 1,
781 _wl_radius_ipaddr: 1,
782 _wl_radius_port: 1,
783 _wl_wep_bit: 1,
784 _wl_passphrase: 1,
785 _f_wl_wep_gen: 1,
786 _f_wl_wep_random: 1,
787 _wl_key1: 1,
788 _wl_key2: 1,
789 _wl_key3: 1,
790 _wl_key4: 1,
792 _f_wl_lazywds: 1,
793 _f_wl_wds_0: 1
795 wl_vis.push(a);
799 var wan = E('_wan_proto').value;
801 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
802 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
803 if (wl_sunit(uidx)<0) {
804 wmode = E('_f_wl'+wl_unit(uidx)+'_mode').value;
806 if (wmode == 'wet') {
807 wan = 'disabled';
808 vis._wan_proto = 0;
809 /* NOVLAN-BEGIN */
810 vis._f_dhcpd_enable = 0;
811 vis._dhcp_lease = 0;
812 /* NOVLAN-END */
815 if ((wan == 'disabled') || (wmode == 'sta') || (wmode == 'wet')) {
816 vis._f_wan_islan = 1;
821 switch (wan) {
822 case 'disabled':
823 vis._ppp_username = 0;
824 vis._ppp_service = 0;
825 vis._ppp_custom = 0;
826 vis._l2tp_server_ip = 0;
827 vis._wan_ipaddr = 0;
828 vis._wan_netmask = 0;
829 vis._wan_gateway = 0;
830 vis._pptp_server_ip = 0;
831 vis._f_pptp_dhcp = 0;
832 vis._ppp_demand = 0;
833 vis._mtu_enable = 0;
834 vis._f_wan_mtu = 0;
835 vis._f_ppp_mlppp = 0;
836 vis._modem_ipaddr = 0;
837 vis._modem_pin = 0;
838 vis._modem_dev = 0;
839 vis._modem_init = 0;
840 vis._modem_apn = 0;
841 vis._pppoe_lei = 0;
842 vis._pppoe_lef = 0;
843 break;
844 case 'dhcp':
845 vis._l2tp_server_ip = 0;
846 vis._pppoe_lei = 0;
847 vis._pppoe_lef = 0;
848 vis._ppp_demand = 0;
849 vis._ppp_service = 0;
850 vis._ppp_username = 0;
851 vis._ppp_custom = 0;
852 vis._pptp_server_ip = 0;
853 vis._f_pptp_dhcp = 0;
854 vis._wan_gateway = 0;
855 vis._wan_ipaddr = 0;
856 vis._wan_netmask = 0;
857 vis._f_ppp_mlppp = 0;
858 vis._modem_ipaddr = 1;
860 vis._lan_gateway = 0;
861 vis._modem_pin = 0;
862 vis._modem_dev = 0;
863 vis._modem_init = 0;
864 vis._modem_apn = 0;
865 break;
866 case 'pppoe':
867 vis._l2tp_server_ip = 0;
868 vis._pptp_server_ip = 0;
869 vis._f_pptp_dhcp = 0;
870 vis._wan_gateway = 0;
871 vis._wan_ipaddr = 0;
872 vis._wan_netmask = 0;
873 vis._modem_ipaddr = 1;
875 vis._lan_gateway = 0;
876 vis._modem_pin = 0;
877 vis._modem_dev = 0;
878 vis._modem_init = 0;
879 vis._modem_apn = 0;
880 break;
881 case 'ppp3g':
882 vis._pppoe_lei = 0;
883 vis._pppoe_lef = 0;
884 vis._ppp_service = 0;
885 vis._l2tp_server_ip = 0;
886 vis._pptp_server_ip = 0;
887 vis._f_pptp_dhcp = 0;
888 vis._wan_gateway = 0;
889 vis._wan_ipaddr = 0;
890 vis._wan_netmask = 0;
891 vis._lan_gateway = 0;
892 vis._modem_ipaddr = 0;
893 vis._f_ppp_mlppp = 0;
894 break;
895 case 'static':
896 vis._pppoe_lei = 0;
897 vis._pppoe_lef = 0;
898 vis._l2tp_server_ip = 0;
899 vis._ppp_demand = 0;
900 vis._ppp_service = 0;
901 vis._ppp_username = 0;
902 vis._ppp_custom = 0;
903 vis._pptp_server_ip = 0;
904 vis._f_pptp_dhcp = 0;
905 vis._f_ppp_mlppp = 0;
906 vis._modem_ipaddr = 1;
908 vis._lan_gateway = 0;
909 vis._modem_pin = 0;
910 vis._modem_dev = 0;
911 vis._modem_init = 0;
912 vis._modem_apn = 0;
913 break;
914 case 'pptp':
915 vis._pppoe_lei = 0;
916 vis._pppoe_lef = 0;
917 vis._l2tp_server_ip = 0;
918 vis._ppp_service = 0;
919 vis._wan_gateway = (!E('_f_pptp_dhcp').checked);
920 vis._wan_ipaddr = (!E('_f_pptp_dhcp').checked);
921 vis._modem_ipaddr = 0;
923 vis._lan_gateway = 0;
924 vis._modem_pin = 0;
925 vis._modem_dev = 0;
926 vis._modem_init = 0;
927 vis._modem_apn = 0;
928 break;
929 case 'l2tp':
930 vis._pppoe_lei = 0;
931 vis._pppoe_lef = 0;
932 vis._pptp_server_ip = 0;
933 vis._ppp_service = 0;
934 vis._wan_gateway = (!E('_f_pptp_dhcp').checked);
935 vis._wan_ipaddr = (!E('_f_pptp_dhcp').checked);
936 vis._modem_ipaddr = 0;
938 vis._lan_gateway = 0;
939 vis._modem_pin = 0;
940 vis._modem_dev = 0;
941 vis._modem_init = 0;
942 vis._modem_apn = 0;
943 break;
946 vis._ppp_idletime = (E('_ppp_demand').value == 1) && vis._ppp_demand
947 vis._ppp_redialperiod = !vis._ppp_idletime && vis._ppp_demand;
949 if (vis._mtu_enable) {
950 if (E('_mtu_enable').value == 0) {
951 vis._f_wan_mtu = 2;
952 a = E('_f_wan_mtu');
953 switch (E('_wan_proto').value) {
954 case 'pppoe':
955 a.value = 1492;
956 break;
957 case 'pptp':
958 case 'l2tp':
959 a.value = 1460;
960 break;
961 default:
962 a.value = 1500;
963 break;
968 /* NOVLAN-BEGIN */
969 if (!E('_f_dhcpd_enable').checked) vis._dhcp_lease = 0;
970 /* NOVLAN-END */
972 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
973 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
974 if (wl_sunit(uidx)<0) {
975 u = wl_unit(uidx);
976 wmode = E('_f_wl'+u+'_mode').value;
978 if (!E('_f_wl'+u+'_radio').checked) {
979 for (a in wl_vis[uidx]) {
980 wl_vis[uidx][a] = 2;
982 wl_vis[uidx]._f_wl_radio = 1;
983 wl_vis[uidx]._wl_nbw_cap = nphy ? 2 : 0;
984 wl_vis[uidx]._f_wl_nband = (bands[uidx].length > 1) ? 2 : 0;
987 switch (wmode) {
988 case 'apwds':
989 case 'wds':
990 break;
991 case 'wet':
992 case 'sta':
993 wl_vis[uidx]._f_wl_bcast = 0;
994 wl_vis[uidx]._wl_channel = 0;
995 wl_vis[uidx]._wl_nbw_cap = 0;
996 vis._modem_ipaddr = 0;
997 default:
998 wl_vis[uidx]._f_wl_lazywds = 0;
999 wl_vis[uidx]._f_wl_wds_0 = 0;
1000 break;
1003 sm2 = E('_wl'+u+'_security_mode').value;
1004 switch (sm2) {
1005 case 'disabled':
1006 wl_vis[uidx]._wl_crypto = 0;
1007 wl_vis[uidx]._wl_wep_bit = 0;
1008 wl_vis[uidx]._wl_wpa_psk = 0;
1009 wl_vis[uidx]._wl_radius_key = 0;
1010 wl_vis[uidx]._wl_radius_ipaddr = 0;
1011 wl_vis[uidx]._wl_wpa_gtk_rekey = 0;
1012 break;
1013 case 'wep':
1014 wl_vis[uidx]._wl_crypto = 0;
1015 wl_vis[uidx]._wl_wpa_psk = 0;
1016 wl_vis[uidx]._wl_radius_key = 0;
1017 wl_vis[uidx]._wl_radius_ipaddr = 0;
1018 wl_vis[uidx]._wl_wpa_gtk_rekey = 0;
1019 break;
1020 case 'radius':
1021 wl_vis[uidx]._wl_crypto = 0;
1022 wl_vis[uidx]._wl_wpa_psk = 0;
1023 break;
1024 default: // wpa*
1025 wl_vis[uidx]._wl_wep_bit = 0;
1026 if (sm2.indexOf('personal') != -1) {
1027 wl_vis[uidx]._wl_radius_key = 0;
1028 wl_vis[uidx]._wl_radius_ipaddr = 0;
1030 else {
1031 wl_vis[uidx]._wl_wpa_psk = 0;
1033 break;
1036 if ((E('_f_wl'+u+'_lazywds').value == 1) && (wl_vis[uidx]._f_wl_wds_0 == 1)) {
1037 wl_vis[uidx]._f_wl_wds_0 = 2;
1040 if (wl_vis[uidx]._wl_nbw_cap != 0) {
1041 switch (E('_wl'+u+'_net_mode').value) {
1042 case 'b-only':
1043 case 'g-only':
1044 case 'a-only':
1045 case 'bg-mixed':
1046 wl_vis[uidx]._wl_nbw_cap = 2;
1047 if (E('_wl'+u+'_nbw_cap').value != '0') {
1048 E('_wl'+u+'_nbw_cap').value = 0;
1049 refreshChannels(uidx);
1051 break;
1053 // avoid Enterprise-TKIP with 40MHz
1054 if ((sm2 == 'wpa_enterprise') && (E('_wl'+u+'_crypto').value == 'tkip')) {
1055 wl_vis[uidx]._wl_nbw_cap = 2;
1056 if (E('_wl'+u+'_nbw_cap').value != '0') {
1057 E('_wl'+u+'_nbw_cap').value = 0;
1058 refreshChannels(uidx);
1063 wl_vis[uidx]._f_wl_nctrlsb = (E('_wl'+u+'_nbw_cap').value == 0) ? 0 : wl_vis[uidx]._wl_nbw_cap;
1065 /* REMOVE-BEGIN
1066 This is ugly...
1067 Special case - 2.4GHz band, currently running in B/G-only mode,
1068 with N/Auto and 40MHz selected in the GUI.
1069 Channel list is not filtered in this case by the wl driver,
1070 and includes all channels available with 20MHz channel width.
1071 REMOVE-END */
1072 b = selectedBand(uidx);
1073 if (wl_vis[uidx]._wl_channel == 1 && wl_vis[uidx]._f_wl_nctrlsb != 0 &&
1074 ((b == '2') || (wl_vis[uidx]._f_wl_nband == 0 && b == '0'))) {
1075 switch (eval('nvram.wl'+u+'_net_mode')) {
1076 case 'b-only':
1077 case 'g-only':
1078 case 'bg-mixed':
1079 i = E('_wl'+u+'_channel').value * 1;
1080 if (i > 0 && i < 5) {
1081 E('_f_wl'+u+'_nctrlsb').value = 'lower';
1082 wl_vis[uidx]._f_wl_nctrlsb = 2;
1084 else if (i > max_channel[uidx] - 4) {
1085 E('_f_wl'+u+'_nctrlsb').value = 'upper';
1086 wl_vis[uidx]._f_wl_nctrlsb = 2;
1088 break;
1092 wl_vis[uidx]._f_wl_scan = wl_vis[uidx]._wl_channel;
1093 wl_vis[uidx]._f_wl_psk_random1 = wl_vis[uidx]._wl_wpa_psk;
1094 wl_vis[uidx]._f_wl_psk_random2 = wl_vis[uidx]._wl_radius_key;
1095 wl_vis[uidx]._wl_radius_port = wl_vis[uidx]._wl_radius_ipaddr;
1096 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;
1098 for (i = 1; i < 10; ++i) {
1099 wl_vis[uidx]['_f_wl_wds_' + i] = wl_vis[uidx]._f_wl_wds_0;
1102 } // for each wl_iface
1104 vis._ppp_passwd = vis._ppp_username;
1105 /* NOVLAN-BEGIN */
1106 vis._dhcpd_startip = vis._dhcpd_endip = vis._wan_wins = vis._dhcp_lease;
1107 /* NOVLAN-END */
1109 for (a in vis) {
1110 b = E(a);
1111 c = vis[a];
1112 /* REMOVE-BEGIN
1113 // if (b != null)
1114 REMOVE-END */
1115 b.disabled = (c != 1);
1116 PR(b).style.display = c ? '' : 'none';
1119 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1120 if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1121 for (a in wl_vis[uidx]) {
1122 i = 3;
1123 if (a.substr(0, 6) == '_f_wl_') i = 5;
1124 b = E(a.substr(0, i) + wl_unit(uidx) + a.substr(i, a.length));
1125 c = wl_vis[uidx][a];
1126 b.disabled = (c != 1);
1127 PR(b).style.display = c ? '' : 'none';
1132 // --- verify ---
1134 ferror.clear('_wan_proto');
1136 var wlclnt = 0;
1137 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1138 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1139 if (wl_sunit(uidx)<0) {
1140 u = wl_unit(uidx);
1141 wmode = E('_f_wl'+u+'_mode').value;
1142 sm2 = E('_wl'+u+'_security_mode').value;
1144 /* REMOVE-BEGIN
1145 if ((wl_vis[uidx]._f_wl_mode == 1) && (wmode != 'ap') && (sm2.substr(0, 4) == 'wpa2')) {
1146 ferror.set('_wl'+u+'_security_mode', 'WPA2 is supported only in AP mode.', quiet || !ok);
1147 ok = 0;
1149 else ferror.clear('_wl'+u+'_security_mode');
1150 REMOVE-END */
1152 // --- N standard does not support WPA+TKIP ---
1153 a = E('_wl'+u+'_crypto');
1154 switch (E('_wl'+u+'_net_mode').value) {
1155 case 'mixed':
1156 case 'n-only':
1157 if (nphy && (a.value == 'tkip') && (sm2.indexOf('wpa') != -1)) {
1158 ferror.set(a, 'TKIP encryption is not supported with WPA / WPA2 in N mode.', quiet || !ok);
1159 ok = 0;
1161 else ferror.clear(a);
1162 break;
1165 a = E('_wl'+u+'_net_mode');
1166 ferror.clear(a);
1167 b = E('_f_wl'+u+'_mode');
1168 ferror.clear(b);
1169 if ((wmode == 'sta') || (wmode == 'wet')) {
1170 ++wlclnt;
1171 if (wlclnt > 1) {
1172 ferror.set(b, 'Only one wireless interface can be configured in client mode.', quiet || !ok);
1173 ok = 0;
1175 else if (a.value == 'n-only') {
1176 ferror.set(a, 'N-only is not supported in wireless client modes, use Auto.', quiet || !ok);
1177 ok = 0;
1181 a = E('_wl'+u+'_wpa_psk');
1182 ferror.clear(a);
1183 if (wl_vis[uidx]._wl_wpa_psk == 1) {
1184 if ((a.value.length < 8) || ((a.value.length == 64) && (a.value.search(/[^0-9A-Fa-f]/) != -1))) {
1185 ferror.set('_wl'+u+'_wpa_psk', 'Invalid pre-shared key. Please enter at least 8 characters or 64 hexadecimal digits.', quiet || !ok);
1186 ok = 0;
1190 // wl channel
1191 if (((wmode == 'wds') || (wmode == 'apwds')) && (wl_vis[uidx]._wl_channel == 1) && (E('_wl'+u+'_channel').value == '0')) {
1192 ferror.set('_wl'+u+'_channel', 'Fixed wireless channel required in WDS mode.', quiet || !ok);
1193 ok = 0;
1195 else ferror.clear('_wl'+u+'_channel');
1197 if (E('_f_wl'+u+'_mode').value == 'sta') {
1198 if (((wan == 'disabled') || (wan == 'ppp3g')) && (E('_f_wl'+u+'_radio').checked)) {
1199 ferror.set('_wan_proto', 'Wireless Client mode requires a valid WAN setting (usually DHCP).', quiet || !ok);
1200 ok = 0;
1206 // domain name or IP address
1207 a = ['_l2tp_server_ip', '_pptp_server_ip'];
1208 for (i = a.length - 1; i >= 0; --i)
1209 if ((vis[a[i]]) && ((!v_length(a[i], 1, 1)) || ((!v_ip(a[i], 1)) && (!v_domain(a[i], 1))))) {
1210 if (!quiet && ok) ferror.show(a[i]);
1211 ok = 0;
1214 // IP address
1215 /* NOVLAN-BEGIN */
1216 a = ['_wan_gateway','_wan_ipaddr','_lan_ipaddr', '_dhcpd_startip', '_dhcpd_endip'];
1217 /* NOVLAN-END */
1218 /* VLAN-BEGIN */
1219 a = ['_wan_gateway','_wan_ipaddr'];
1220 /* VLAN-END */
1221 for (i = a.length - 1; i >= 0; --i)
1222 if ((vis[a[i]]) && (!v_ip(a[i], quiet || !ok))) ok = 0;
1224 // IP address, blank -> 0.0.0.0
1225 a = ['_f_dns_1', '_f_dns_2', '_f_dns_3','_wan_wins','_lan_gateway', '_modem_ipaddr'];
1226 for (i = a.length - 1; i >= 0; --i)
1227 if ((vis[a[i]]) && (!v_dns(a[i], quiet || !ok))) ok = 0;
1229 // netmask
1230 /* NOVLAN-BEGIN */
1231 a = ['_wan_netmask','_lan_netmask'];
1232 /* NOVLAN-END */
1233 /* VLAN-BEGIN */
1234 a = ['_wan_netmask'];
1235 /* VLAN-END */
1236 for (i = a.length - 1; i >= 0; --i)
1237 if ((vis[a[i]]) && (!v_netmask(a[i], quiet || !ok))) ok = 0;
1239 // range
1240 /* NOVLAN-BEGIN */
1241 a = [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500],
1242 ['_dhcp_lease', 1, 10080],['_pppoe_lei', 0, 30],['_pppoe_lef', 0, 10]];
1243 /* NOVLAN-END */
1244 /* VLAN-BEGIN */
1245 a = [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500],
1246 ['_pppoe_lei', 0, 60],['_pppoe_lef', 0, 10]];
1247 /* VLAN-END */
1248 for (i = a.length - 1; i >= 0; --i) {
1249 v = a[i];
1250 if ((vis[v[0]]) && (!v_range(v[0], quiet || !ok, v[1], v[2]))) ok = 0;
1253 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1254 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1255 if (wl_sunit(uidx)<0) {
1256 u = wl_unit(uidx);
1258 // IP address
1259 a = ['_radius_ipaddr'];
1260 for (i = a.length - 1; i >= 0; --i) {
1261 if ((wl_vis[uidx]['_wl'+a[i]]) && (!v_ip('_wl'+u+a[i], quiet || !ok))) ok = 0;
1264 // range
1265 a = [['_wpa_gtk_rekey', 60, 7200], ['_radius_port', 1, 65535]];
1266 for (i = a.length - 1; i >= 0; --i) {
1267 v = a[i];
1268 if ((wl_vis[uidx]['_wl'+v[0]]) && (!v_range('_wl'+u+v[0], quiet || !ok, v[1], v[2]))) ok = 0;
1271 // length
1272 a = [['_ssid', 1], ['_radius_key', 1]];
1273 for (i = a.length - 1; i >= 0; --i) {
1274 v = a[i];
1275 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;
1278 if (wl_vis[uidx]._wl_key1) {
1279 a = (E('_wl'+u+'_wep_bit').value == 128) ? 26 : 10;
1280 for (i = 1; i <= 4; ++i) {
1281 b = E('_wl'+u+'_key' + i);
1282 b.maxLength = a;
1283 if ((b.value.length > 0) || (E('_f_wl'+u+'_wepidx_' + i).checked)) {
1284 if (!v_wep(b, quiet || !ok)) ok = 0;
1286 else ferror.clear(b);
1290 ferror.clear('_f_wl'+u+'_wds_0');
1291 if (wl_vis[uidx]._f_wl_wds_0 == 1) {
1292 b = 0;
1293 for (i = 0; i < 10; ++i) {
1294 a = E('_f_wl'+u+'_wds_' + i);
1295 if (!v_macz(a, quiet || !ok)) ok = 0;
1296 else if (!isMAC0(a.value)) b = 1;
1298 if (!b) {
1299 ferror.set('_f_wl'+u+'_wds_0', 'WDS MAC address required.', quiet || !ok);
1300 ok = 0;
1306 /* NOVLAN-BEGIN */
1307 a = E('_dhcpd_startip');
1308 b = E('_dhcpd_endip');
1309 ferror.clear(a);
1310 ferror.clear(b);
1312 if ((vis._dhcp_lease) && (!a._error_msg) && (!b._error_msg)) {
1313 c = aton(E('_lan_netmask').value);
1314 d = aton(E('_lan_ipaddr').value) & c;
1315 e = 'Invalid IP address or subnet mask';
1316 if ((aton(a.value) & c) != d) {
1317 ferror.set(a, e, quiet || !ok);
1318 ok = 0;
1320 if ((aton(b.value) & c) != d) {
1321 ferror.set(b, e, quiet || !ok);
1322 ok = 0;
1326 if ((vis._dhcp_lease) && (!a._error_msg) && (!b._error_msg)) {
1327 if (aton(a.value) > aton(b.value)) {
1328 c = a.value;
1329 a.value = b.value;
1330 b.value = c;
1333 elem.setInnerHTML('dhcp_count', '(' + ((aton(b.value) - aton(a.value)) + 1) + ')');
1336 /* REMOVE-BEGIN */
1337 /* TODO: same validation for builds with VLAN-GUI enabled */
1338 /* REMOVE-END */
1339 ferror.clear('_modem_ipaddr');
1340 a = E('_modem_ipaddr');
1341 b = E('_lan_ipaddr');
1342 c = E('_lan_netmask');
1343 if ( vis['_modem_ipaddr'] && !(a._error_msg || b._error_msg || c._error_msg) && a.value != "0.0.0.0" ) {
1344 c = aton(c.value);
1345 if ( (aton(a.value) & c) == (aton(b.value) & c) ) {
1346 ferror.set('_modem_ipaddr', 'Modem IP address may not be within your local address space.', quiet);
1347 ok = 0;
1350 /* NOVLAN-END */
1352 return ok;
1355 function earlyInit()
1357 verifyFields(null, 1);
1360 function save()
1362 /* VLAN-BEGIN */
1363 if (lg.isEditing()) return;
1364 lg.resetNewEditor();
1365 /* VLAN-END */
1367 var a, b, c;
1368 var i;
1369 var u, uidx, wmode, sm2, wradio;
1371 if (!verifyFields(null, false)) return;
1373 var fom = E('_fom');
1375 fom.wan_mtu.value = fom.f_wan_mtu.value;
1376 fom.wan_mtu.disabled = fom.f_wan_mtu.disabled;
1378 /* NOVLAN-BEGIN */
1379 fom.lan_proto.value = fom.f_dhcpd_enable.checked ? 'dhcp' : 'static';
1380 /* NOVLAN-END */
1382 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1383 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1384 if (wl_sunit(uidx)<0) {
1385 u = wl_unit(uidx);
1386 wmode = E('_f_wl'+u+'_mode').value;
1387 sm2 = E('_wl'+u+'_security_mode').value;
1388 wradio = E('_f_wl'+u+'_radio').checked;
1390 E('_wl'+u+'_nband').value = selectedBand(uidx);
1392 if (wmode == 'apwds') E('_wl'+u+'_mode').value = 'ap';
1393 else E('_wl'+u+'_mode').value = wmode;
1395 if (wmode == 'wet') {
1396 fom.wan_proto.value = 'disabled';
1397 fom.wan_proto.disabled = 0;
1398 /* NOVLAN-BEGIN */
1399 fom.lan_proto.value = 'static';
1400 /* NOVLAN-END */
1401 /* VLAN-BEGIN */
1402 /* REMOVE-BEGIN */
1403 // TODO - what's required ? integrate with tomatogrid?
1404 /* REMOVE-END */
1405 /* VLAN-END */
1408 a = [];
1409 for (i = 0; i < 10; ++i) a.push(E('_f_wl'+u+'_wds_' + i).value);
1410 E('_wl'+u+'_wds').value = joinAddr(a);
1412 if (wmode.indexOf('wds') != -1) {
1413 E('_wl'+u+'_wds_enable').value = 1;
1414 E('_wl'+u+'_lazywds').value = E('_f_wl'+u+'_lazywds').value;
1415 if (E('_wl'+u+'_lazywds').value == 1) E('_wl'+u+'_wds').value = '';
1417 else {
1418 E('_wl'+u+'_wds_enable').value = 0;
1419 E('_wl'+u+'_wds').value = '';
1420 E('_wl'+u+'_lazywds').value = 0;
1423 E('_wl'+u+'_radio').value = wradio ? 1 : 0;
1424 E('_wl'+u+'_auth').value = eval('nvram.wl'+u+'_auth');
1426 e = E('_wl'+u+'_akm');
1427 switch (sm2) {
1428 case 'disabled':
1429 case 'radius':
1430 case 'wep':
1431 e.value = '';
1432 break;
1433 default:
1434 c = [];
1436 if (sm2.indexOf('personal') != -1) {
1437 if (sm2.indexOf('wpa2_') == -1) c.push('psk');
1438 if (sm2.indexOf('wpa_') == -1) c.push('psk2');
1440 else {
1441 if (sm2.indexOf('wpa2_') == -1) c.push('wpa');
1442 if (sm2.indexOf('wpa_') == -1) c.push('wpa2');
1444 c = c.join(' ');
1445 e.value = c;
1446 break;
1448 E('_wl'+u+'_auth_mode').value = (sm2 == 'radius') ? 'radius' : 'none';
1449 E('_wl'+u+'_wep').value = ((sm2 == 'radius') || (sm2 == 'wep')) ? 'enabled': 'disabled';
1451 if (sm2.indexOf('wpa') != -1) E('_wl'+u+'_auth').value = 0;
1453 E('_wl'+u+'_nreqd').value = 0;
1454 E('_wl'+u+'_gmode').value = 1;
1455 E('_wl'+u+'_nmode').value = 0;
1456 E('_wl'+u+'_nmcsidx').value = -2; // Legacy Rate
1457 E('_wl'+u+'_nbw').value = 0;
1458 switch (E('_wl'+u+'_net_mode').value) {
1459 case 'b-only':
1460 E('_wl'+u+'_gmode').value = 0;
1461 break;
1462 case 'g-only':
1463 E('_wl'+u+'_gmode').value = 4;
1464 break;
1465 case 'bg-mixed':
1466 break;
1467 case 'a-only':
1468 E('_wl'+u+'_nmcsidx').value = -1; // Auto
1469 break;
1470 case 'n-only':
1471 if (selectedBand(uidx) == '1') { // 5 GHz
1472 E('_wl'+u+'_nmode').value = -1;
1473 E('_wl'+u+'_nmcsidx').value = -1;
1474 } else {
1475 E('_wl'+u+'_nmode').value = 1;
1476 E('_wl'+u+'_nmcsidx').value = 32;
1478 E('_wl'+u+'_nreqd').value = 1;
1479 break;
1480 default: // Auto
1481 E('_wl'+u+'_nmode').value = -1;
1482 E('_wl'+u+'_nmcsidx').value = -1;
1483 break;
1486 E('_wl'+u+'_nctrlsb').value = eval('nvram.wl'+u+'_nctrlsb');
1487 if (E('_wl'+u+'_nmode').value != 0) {
1488 E('_wl'+u+'_nctrlsb').value = E('_f_wl'+u+'_nctrlsb').value;
1489 E('_wl'+u+'_nbw').value = (E('_wl'+u+'_nbw_cap').value == 0) ? 20 : 40;
1492 E('_wl'+u+'_closed').value = E('_f_wl'+u+'_bcast').checked ? 0 : 1;
1494 a = fields.radio.selected(eval('fom.f_wl'+u+'_wepidx'));
1495 if (a) E('_wl'+u+'_key').value = a.value;
1499 fom.wan_islan.value = fom.f_wan_islan.checked ? 1 : 0;
1500 fom.pptp_dhcp.value = fom.f_pptp_dhcp.checked ? 1 : 0;
1502 fom.wan_dns.value = joinAddr([fom.f_dns_1.value, fom.f_dns_2.value, fom.f_dns_3.value]);
1504 /* DNSCRYPT-BEGIN */
1505 fom.dnscrypt_proxy.value = fom.f_dnscrypt_proxy.checked ? 1 : 0;
1506 /* DNSCRYPT-END */
1508 fom.lan_state.value = 0;
1509 if (fom.f_lan_state.checked) fom.lan_state.value |= 1;
1510 if (fom.f_lan_desc.checked) fom.lan_state.value |= 2;
1511 if (fom.f_lan_invert.checked) fom.lan_state.value |= 4;
1513 /* VLAN-BEGIN */
1514 // initialize/wipe out relevant fields
1515 for (var i = 0 ; i <= MAX_BRIDGE_ID ; i++) {
1516 var j = (i == 0) ? '' : i.toString();
1517 fom['lan' + j + '_ifname'].value = '';
1518 fom['lan' + j + '_ipaddr'].value = '';
1519 fom['lan' + j + '_netmask'].value = '';
1520 fom['lan' + j + '_proto'].value = '';
1521 fom['lan' + j + '_stp'].value = '';
1522 fom['dhcp' + j + '_start'].value = '';
1523 fom['dhcp' + j + '_num'].value = '';
1524 fom['dhcp' + j + '_lease'].value = '';
1525 fom['dhcpd' + j + '_startip'].value = '';
1526 fom['dhcpd' + j + '_endip'].value = '';
1529 var d = lg.getAllData();
1530 for (var i = 0; i < d.length; ++i) {
1532 if (lg.countOverlappingNetworks(d[i][2]) > 1) {
1533 var s = 'Cannot proceed: two or more LAN bridges have conflicting IP addresses or overlapping subnets';
1534 alert(s);
1535 var e = E('footer-msg');
1536 e.innerHTML = s;
1537 e.style.visibility = 'visible';
1538 setTimeout(
1539 function() {
1540 e.innerHTML = '';
1541 e.style.visibility = 'hidden';
1542 }, 5000);
1543 return;
1546 var j = (parseInt(d[i][0]) == 0) ? '' : d[i][0].toString();
1547 fom['lan' + j + '_ifname'].value = 'br' + d[i][0];
1548 fom['lan' + j + '_stp'].value = d[i][1];
1549 fom['lan' + j + '_ipaddr'].value = d[i][2];
1550 fom['lan' + j + '_netmask'].value = d[i][3];
1551 fom['lan' + j + '_proto'].value = (d[i][4] != '0') ? 'dhcp' : 'static';
1552 fom['dhcp' + j + '_start'].value = (d[i][4] != '0') ? (d[i][5]).split('.').splice(3, 1) : '';
1553 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)
1554 fom['dhcp' + j + '_lease'].value = (d[i][4] != '0') ? d[i][7] : '';
1555 fom['dhcpd' + j + '_startip'].value = (d[i][4] != '0') ? d[i][5] : '';
1556 fom['dhcpd' + j + '_endip'].value = (d[i][4] != '0') ? d[i][6] : '';
1558 /* REMOVE-BEGIN */
1559 alert('lan' + j + '_ifname=' + fom['lan' + j + '_ifname'].value + '\n' +
1560 'lan' + j + '_stp=' + fom['lan' + j + '_stp'].value + '\n' +
1561 'lan' + j + '_ipaddr=' + fom['lan' + j + '_ipaddr'].value + '\n' +
1562 'lan' + j + '_netmask=' + fom['lan' + j + '_netmask'].value + '\n' +
1563 'lan' + j + '_proto=' + fom['lan' + j + '_proto'].value + '\n' +
1564 'dhcp' + j + '_start=' + fom['dhcp' + j + '_start'].value + '\n' +
1565 'dhcp' + j + '_num=' + fom['dhcp' + j + '_num'].value + '\n' +
1566 'dhcp' + j + '_lease=' + fom['dhcp' + j + '_lease'].value + '\n' +
1567 'dhcpd' + j + '_startip=' + fom['dhcpd' + j + '_startip'].value + '\n' +
1568 'dhcpd' + j + '_endip=' + fom['dhcpd' + j + '_endip'].value);
1569 /* REMOVE-END */
1572 var e = E('footer-msg');
1573 var t = fixIP(fom['lan_ipaddr'].value);
1574 if ((fom['lan_ifname'].value != 'br0') || (fom['lan_ipaddr'].value == '0.0.0.0') || (!t)) {
1575 e.innerHTML = 'Bridge br0 must be always defined and have a valid IP address set.';
1576 e.style.visibility = 'visible';
1577 setTimeout(
1578 function() {
1579 e.innerHTML = '';
1580 e.style.visibility = 'hidden';
1581 }, 5000);
1582 return;
1584 /* VLAN-END */
1586 /* REMOVE-BEGIN
1587 // if ((nvram.lan_ipaddr != fom.lan_ipaddr.value) || (nvram.lan1_ipaddr != fom.lan1_ipaddr.value) ||
1588 // (nvram.lan2_ipaddr != fom.lan2_ipaddr.value) || (nvram.lan3_ipaddr != fom.lan3_ipaddr.value)){
1589 REMOVE-END */
1591 fom.ppp_mlppp.value = fom.f_ppp_mlppp.checked ? 1 : 0;
1593 if (nvram.lan_ipaddr != fom.lan_ipaddr.value) {
1594 fom._moveip.value = 1;
1595 form.submit(fom);
1597 else {
1598 form.submit(fom, 1);
1602 function init()
1604 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1605 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1606 if (wl_sunit(uidx)<0) {
1607 refreshNetModes(uidx);
1608 refreshChannels(uidx);
1612 </script>
1614 </head>
1615 <body onload='init()'>
1616 <form id='_fom' method='post' action='tomato.cgi'>
1617 <table id='container' cellspacing=0>
1618 <tr><td colspan=2 id='header'>
1619 <div class='title'>Tomato</div>
1620 <div class='version'>Version <% version(); %></div>
1621 </td></tr>
1622 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
1623 <td id='content'>
1624 <div id='ident'><% ident(); %></div>
1626 <!-- / / / -->
1628 <input type='hidden' name='_nextpage' value='basic-network.asp'>
1629 <input type='hidden' name='_nextwait' value='10'>
1630 <input type='hidden' name='_service' value='*'>
1631 <input type='hidden' name='_moveip' value='0'>
1633 <input type='hidden' name='wan_mtu'>
1634 <input type='hidden' name='wan_islan'>
1635 <input type='hidden' name='pptp_dhcp'>
1636 <!-- NOVLAN-BEGIN -->
1637 <input type='hidden' name='lan_proto'>
1638 <!-- NOVLAN-END -->
1639 <input type='hidden' name='wan_dns'>
1640 <input type='hidden' name='ppp_mlppp'>
1641 /* DNSCRYPT-BEGIN */
1642 <input type='hidden' name='dnscrypt_proxy'>
1643 /* DNSCRYPT-END */
1644 <input type='hidden' name='lan_state'>
1646 <!-- VLAN-BEGIN -->
1647 <script type='text/javascript'>
1649 for (var i = 0 ; i <= MAX_BRIDGE_ID ; i++) {
1650 var j = (i == 0) ? '' : i.toString();
1651 W('<input type=\'hidden\' id=\'lan' + j + '_ifname\' name=\'lan' + j + '_ifname\'>');
1652 W('<input type=\'hidden\' id=\'lan' + j + '_ipaddr\' name=\'lan' + j + '_ipaddr\'>');
1653 W('<input type=\'hidden\' id=\'lan' + j + '_netmask\' name=\'lan' + j + '_netmask\'>');
1654 W('<input type=\'hidden\' id=\'lan' + j + '_proto\' name=\'lan' + j + '_proto\'>');
1655 W('<input type=\'hidden\' id=\'lan' + j + '_stp\' name=\'lan' + j + '_stp\'>');
1656 W('<input type=\'hidden\' id=\'dhcp' + j + '_start\' name=\'dhcp' + j + '_start\'>');
1657 W('<input type=\'hidden\' id=\'dhcp' + j + '_num\' name=\'dhcp' + j + '_num\'>');
1658 W('<input type=\'hidden\' id=\'dhcp' + j + '_lease\' name=\'dhcp' + j + '_lease\'>');
1659 W('<input type=\'hidden\' id=\'dhcpd' + j + '_startip\' name=\'dhcpd' + j + '_startip\'>');
1660 W('<input type=\'hidden\' id=\'dhcpd' + j + '_endip\' name=\'dhcpd' + j + '_endip\'>');
1662 </script>
1663 <!-- VLAN-END -->
1665 <div class='section-title'>WAN / Internet</div>
1666 <div class='section'>
1667 <script type='text/javascript'>
1668 createFieldTable('', [
1669 { title: 'Type', name: 'wan_proto', type: 'select', options: [['dhcp','DHCP'],['pppoe','PPPoE'],['static','Static'],['pptp','PPTP'],['l2tp','L2TP'],
1670 /* LINUX26-BEGIN */
1671 /* USB-BEGIN */
1672 ['ppp3g','3G Modem'],
1673 /* USB-END */
1674 /* LINUX26-END */
1675 ['disabled','Disabled']],
1676 value: nvram.wan_proto },
1677 { 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 },
1678 { title: 'PIN Code', name: 'modem_pin', type: 'text', maxlen: 6, size: 8, value: nvram.modem_pin },
1679 { title: 'Modem init string', name: 'modem_init', type: 'text', maxlen: 25, size: 32, value: nvram.modem_init },
1680 { title: 'APN', name: 'modem_apn', type: 'text', maxlen: 25, size: 32, value: nvram.modem_apn },
1681 { title: 'Username', name: 'ppp_username', type: 'text', maxlen: 60, size: 64, value: nvram.ppp_username },
1682 { title: 'Password', name: 'ppp_passwd', type: 'password', maxlen: 60, size: 64, peekaboo: 1, value: nvram.ppp_passwd },
1683 { title: 'Service Name', name: 'ppp_service', type: 'text', maxlen: 50, size: 64, value: nvram.ppp_service },
1684 { title: 'L2TP Server', name: 'l2tp_server_ip', type: 'text', maxlen: 128, size: 64, value: nvram.l2tp_server_ip },
1685 { title: 'Use DHCP', name: 'f_pptp_dhcp', type: 'checkbox', value: (nvram.pptp_dhcp == 1) },
1686 { title: 'IP Address', name: 'wan_ipaddr', type: 'text', maxlen: 15, size: 17, value: nvram.wan_ipaddr },
1687 { title: 'Subnet Mask', name: 'wan_netmask', type: 'text', maxlen: 15, size: 17, value: nvram.wan_netmask },
1688 { title: 'Gateway', name: 'wan_gateway', type: 'text', maxlen: 15, size: 17, value: nvram.wan_gateway },
1689 { title: 'PPTP Gateway', name: 'pptp_server_ip', type: 'text', maxlen: 128, size: 64, value: nvram.pptp_server_ip },
1690 { title: 'Options', name: 'ppp_custom', type: 'text', maxlen: 256, size: 64, value: nvram.ppp_custom },
1691 { title: 'Connect Mode', name: 'ppp_demand', type: 'select', options: [['1', 'Connect On Demand'],['0', 'Keep Alive']],
1692 value: nvram.ppp_demand },
1693 { title: 'Max Idle Time', indent: 2, name: 'ppp_idletime', type: 'text', maxlen: 5, size: 7, suffix: ' <i>(minutes)</i>',
1694 value: nvram.ppp_idletime },
1695 { title: 'Redial Period', indent: 2, name: 'ppp_redialperiod', type: 'text', maxlen: 5, size: 7, suffix: ' <i>(seconds)</i>',
1696 value: nvram.ppp_redialperiod },
1697 { title: 'LCP Echo Interval', indent: 2, name: 'pppoe_lei', type: 'text', maxlen: 5, size: 7, suffix: ' <i>(seconds)</i>',
1698 value: nvram.pppoe_lei },
1699 { title: 'LCP Echo Failure Threshold', indent: 2, name: 'pppoe_lef', type: 'text', maxlen: 5, size: 7, suffix: ' <i>(retries)</i>',value: nvram.pppoe_lef },
1700 { title: 'Override MTU', multi: [
1701 { name: 'mtu_enable', type: 'select', options: [['0', 'Default'],['1','Manual']], value: nvram.mtu_enable },
1702 { name: 'f_wan_mtu', type: 'text', maxlen: 4, size: 6, value: nvram.wan_mtu } ] },
1703 { title: 'Single Line MLPPP', name: 'f_ppp_mlppp', type: 'checkbox', value: (nvram.ppp_mlppp == 1) },
1705 { 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 },
1707 /* NOVLAN-BEGIN */
1708 { title: 'Use WAN port for LAN', name: 'f_wan_islan', type: 'checkbox', value: (nvram.wan_islan == 1) }
1709 /* NOVLAN-END */
1710 /* VLAN-BEGIN */
1711 { title: 'Bridge WAN port to primary LAN (br0)', name: 'f_wan_islan', type: 'checkbox', value: (nvram.wan_islan == 1) }
1712 /* VLAN-END */
1715 </script>
1716 </div>
1718 <div class='section-title'>LAN</div>
1719 <div class='section'>
1720 <!-- VLAN-BEGIN -->
1721 <table class='tomato-grid' cellspacing=1 id='lan-grid'></table>
1723 <script type='text/javascript'>lg.setup();</script>
1724 <!-- VLAN-END -->
1726 <script type='text/javascript'>
1727 dns = nvram.wan_dns.split(/\s+/);
1728 /* REMOVE-BEGIN
1729 //ipp = nvram.lan_ipaddr.split('.').splice(0, 3).join('.');
1730 REMOVE-END */
1731 createFieldTable('', [
1732 /* NOVLAN-BEGIN */
1733 { title: 'Router IP Address', name: 'lan_ipaddr', type: 'text', maxlen: 15, size: 17, value: nvram.lan_ipaddr },
1734 { title: 'Subnet Mask', name: 'lan_netmask', type: 'text', maxlen: 15, size: 17, value: nvram.lan_netmask },
1735 /* NOVLAN-END */
1736 { title: 'Default Gateway', name: 'lan_gateway', type: 'text', maxlen: 15, size: 17, value: nvram.lan_gateway },
1737 { title: 'Static DNS', suffix: '&nbsp; <i>(IP:port)</i>', name: 'f_dns_1', type: 'text', maxlen: 21, size: 25, value: dns[0] || '0.0.0.0' },
1738 { title: '', name: 'f_dns_2', type: 'text', maxlen: 21, size: 25, value: dns[1] || '0.0.0.0' },
1739 { title: '', name: 'f_dns_3', type: 'text', maxlen: 21, size: 25, value: dns[2] || '0.0.0.0' },
1740 /* DNSCRYPT-BEGIN */
1741 { title: 'Use dnscrypt-proxy', name: 'f_dnscrypt_proxy', type: 'checkbox', value: (nvram.dnscrypt_proxy == 1) },
1742 { title: 'Local Port', indent: 2, name: 'dnscrypt_port', type: 'text', maxlen: 5, size: 7, value: nvram.dnscrypt_port },
1743 { title: 'Boot Parameters', indent: 2, name: 'dnscrypt_cmd', type: 'text', maxlen: 256, size: 64, value: nvram.dnscrypt_cmd, suffix: ' <i>(optional)</i>' },
1744 /* DNSCRYPT-END */
1745 { title: 'WINS <i>(for DHCP)</i>', name: 'wan_wins', type: 'text', maxlen: 15, size: 17, value: nvram.wan_wins }
1746 /* VLAN-END */
1748 </script>
1749 </div>
1751 <div class='section-title'>Ethernet Monitor Status - Settings</div>
1752 <div class='section'>
1753 <script type='text/javascript'>
1754 createFieldTable('', [
1755 { title: 'Enable Ports Status', name: 'f_lan_state', type: 'checkbox', value: (nvram.lan_state & 1) },
1756 { title: 'Speed Info', indent: 2, name: 'f_lan_desc', type: 'checkbox', value: (nvram.lan_state & 2) },
1757 { title: 'Swap Ports Order', indent: 2, name: 'f_lan_invert', type: 'checkbox', value: (nvram.lan_state & 4) }
1759 </script>
1760 </div>
1762 <script type='text/javascript'>
1764 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1765 //if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1766 if (wl_sunit(uidx)<0) {
1767 var u = wl_unit(uidx);
1769 W('<input type=\'hidden\' id=\'_wl'+u+'_mode\' name=\'wl'+u+'_mode\'>');
1770 W('<input type=\'hidden\' id=\'_wl'+u+'_nband\' name=\'wl'+u+'_nband\'>');
1771 W('<input type=\'hidden\' id=\'_wl'+u+'_wds_enable\' name=\'wl'+u+'_wds_enable\'>');
1772 W('<input type=\'hidden\' id=\'_wl'+u+'_wds\' name=\'wl'+u+'_wds\'>');
1773 W('<input type=\'hidden\' id=\'_wl'+u+'_radio\' name=\'wl'+u+'_radio\'>');
1774 W('<input type=\'hidden\' id=\'_wl'+u+'_closed\' name=\'wl'+u+'_closed\'>');
1775 W('<input type=\'hidden\' id=\'_wl'+u+'_key\' name=\'wl'+u+'_key\'>');
1776 W('<input type=\'hidden\' id=\'_wl'+u+'_gmode\' name=\'wl'+u+'_gmode\'>');
1777 W('<input type=\'hidden\' id=\'_wl'+u+'_akm\' name=\'wl'+u+'_akm\'>');
1778 W('<input type=\'hidden\' id=\'_wl'+u+'_auth\' name=\'wl'+u+'_auth\'>');
1779 W('<input type=\'hidden\' id=\'_wl'+u+'_auth_mode\' name=\'wl'+u+'_auth_mode\'>');
1780 W('<input type=\'hidden\' id=\'_wl'+u+'_wep\' name=\'wl'+u+'_wep\'>');
1781 W('<input type=\'hidden\' id=\'_wl'+u+'_lazywds\' name=\'wl'+u+'_lazywds\'>');
1782 W('<input type=\'hidden\' id=\'_wl'+u+'_nmode\' name=\'wl'+u+'_nmode\'>');
1783 W('<input type=\'hidden\' id=\'_wl'+u+'_nmcsidx\' name=\'wl'+u+'_nmcsidx\'>');
1784 W('<input type=\'hidden\' id=\'_wl'+u+'_nreqd\' name=\'wl'+u+'_nreqd\'>');
1785 W('<input type=\'hidden\' id=\'_wl'+u+'_nctrlsb\' name=\'wl'+u+'_nctrlsb\'>');
1786 W('<input type=\'hidden\' id=\'_wl'+u+'_nbw\' name=\'wl'+u+'_nbw\'>');
1788 W('<div class=\'section-title\'>Wireless');
1789 // if (wl_ifaces.length > 1)
1790 W(' (' + wl_display_ifname(uidx) + ')');
1791 W('</div>');
1793 W('<div class=\'section\'>');
1795 f = [
1796 { title: 'Enable Wireless', name: 'f_wl'+u+'_radio', type: 'checkbox',
1797 value: (eval('nvram.wl'+u+'_radio') == '1') && (eval('nvram.wl'+u+'_net_mode') != 'disabled') },
1798 { title: 'MAC Address', text: '<a href="advanced-mac.asp">' + eval('nvram.wl'+u+'_hwaddr') + '</a>' },
1799 { title: 'Wireless Mode', name: 'f_wl'+u+'_mode', type: 'select',
1800 options: [['ap', 'Access Point'],['apwds', 'Access Point + WDS'],['sta', 'Wireless Client'],['wet', 'Wireless Ethernet Bridge'],['wds', 'WDS']],
1801 value: ((eval('nvram.wl'+u+'_mode') == 'ap') && (eval('nvram.wl'+u+'_wds_enable') == '1')) ? 'apwds' : eval('nvram.wl'+u+'_mode') },
1802 { title: 'Radio Band', name: 'f_wl'+u+'_nband', type: 'select', options: bands[uidx],
1803 value: eval('nvram.wl'+u+'_nband') || '0' == '0' ? bands[uidx][0][0] : eval('nvram.wl'+u+'_nband') },
1804 { title: 'Wireless Network Mode', name: 'wl'+u+'_net_mode', type: 'select',
1805 value: (eval('nvram.wl'+u+'_net_mode') == 'disabled') ? 'mixed' : eval('nvram.wl'+u+'_net_mode'),
1806 options: [], prefix: '<span id="__wl'+u+'_net_mode">', suffix: '</span>' },
1807 { title: 'SSID', name: 'wl'+u+'_ssid', type: 'text', maxlen: 32, size: 34, suffix: ' <i>(for full compatibility use only ASCII characters, avoid symbols!)</i>', value: eval('nvram.wl'+u+'_ssid') },
1808 { title: 'Broadcast', indent: 2, name: 'f_wl'+u+'_bcast', type: 'checkbox', value: (eval('nvram.wl'+u+'_closed') == '0') },
1809 { 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+'">',
1810 value: eval('nvram.wl'+u+'_channel') },
1811 { title: 'Channel Width', name: 'wl'+u+'_nbw_cap', type: 'select', options: [['0','20 MHz'],['1','40 MHz']],
1812 value: eval('nvram.wl'+u+'_nbw_cap') },
1813 { title: 'Control Sideband', name: 'f_wl'+u+'_nctrlsb', type: 'select', options: [['lower','Lower'],['upper','Upper']],
1814 value: eval('nvram.wl'+u+'_nctrlsb') == 'none' ? 'lower' : eval('nvram.wl'+u+'_nctrlsb') },
1815 null,
1816 { title: 'Security', name: 'wl'+u+'_security_mode', type: 'select',
1817 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']],
1818 value: eval('nvram.wl'+u+'_security_mode') },
1819 { title: 'Encryption', indent: 2, name: 'wl'+u+'_crypto', type: 'select',
1820 options: [['tkip','TKIP'],['aes','AES'],['tkip+aes','TKIP / AES']], value: eval('nvram.wl'+u+'_crypto') },
1821 { title: 'Shared Key', indent: 2, name: 'wl'+u+'_wpa_psk', type: 'password', maxlen: 64, size: 66, peekaboo: 1,
1822 suffix: ' <input type="button" id="_f_wl'+u+'_psk_random1" value="Random" onclick="random_psk(\'_wl'+u+'_wpa_psk\')">',
1823 value: eval('nvram.wl'+u+'_wpa_psk') },
1824 { title: 'Shared Key', indent: 2, name: 'wl'+u+'_radius_key', type: 'password', maxlen: 80, size: 32, peekaboo: 1,
1825 suffix: ' <input type="button" id="_f_wl'+u+'_psk_random2" value="Random" onclick="random_psk(\'_wl'+u+'_radius_key\')">',
1826 value: eval('nvram.wl'+u+'_radius_key') },
1827 { title: 'Group Key Renewal', indent: 2, name: 'wl'+u+'_wpa_gtk_rekey', type: 'text', maxlen: 4, size: 6, suffix: ' <i>(seconds)</i>',
1828 value: eval('nvram.wl'+u+'_wpa_gtk_rekey') },
1829 { title: 'Radius Server', indent: 2, multi: [
1830 { name: 'wl'+u+'_radius_ipaddr', type: 'text', maxlen: 15, size: 17, value: eval('nvram.wl'+u+'_radius_ipaddr') },
1831 { name: 'wl'+u+'_radius_port', type: 'text', maxlen: 5, size: 7, prefix: ' : ', value: eval('nvram.wl'+u+'_radius_port') } ] },
1832 { title: 'Encryption', indent: 2, name: 'wl'+u+'_wep_bit', type: 'select', options: [['128','128-bits'],['64','64-bits']],
1833 value: eval('nvram.wl'+u+'_wep_bit') },
1834 { title: 'Passphrase', indent: 2, name: 'wl'+u+'_passphrase', type: 'text', maxlen: 16, size: 20,
1835 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+')">',
1836 value: eval('nvram.wl'+u+'_passphrase') }
1839 for (i = 1; i <= 4; ++i) {
1840 f.push(
1841 { title: ('Key ' + i), indent: 2, name: ('wl'+u+'_key' + i), type: 'text', maxlen: 26, size: 34,
1842 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>' : '>'),
1843 value: nvram['wl'+u+'_key' + i] });
1846 f.push(null,
1847 { title: 'WDS', name: 'f_wl'+u+'_lazywds', type: 'select',
1848 options: [['0','Link With...'],['1','Automatic']], value: nvram['wl'+u+'_lazywds'] } );
1849 wds = eval('nvram.wl'+u+'_wds').split(/\s+/);
1850 for (i = 0; i < 10; i += 2) {
1851 f.push({ title: (i ? '' : 'MAC Address'), indent: 2, multi: [
1852 { name: 'f_wl'+u+'_wds_' + i, type: 'text', maxlen: 17, size: 20, value: wds[i] || '00:00:00:00:00:00' },
1853 { name: 'f_wl'+u+'_wds_' + (i + 1), type: 'text', maxlen: 17, size: 20, value: wds[i + 1] || '00:00:00:00:00:00' } ] } );
1856 createFieldTable('', f);
1857 W('</div>');
1860 // for each wlif
1861 </script>
1863 <!-- / / / -->
1865 </td></tr>
1866 <tr><td id='footer' colspan=2>
1867 <span id='footer-msg'></span>
1868 <input type='button' value='Save' id='save-button' onclick='save()'>
1869 <input type='button' value='Cancel' id='cancel-button' onclick='reloadPage();'>
1870 </td></tr>
1871 </table>
1872 </form>
1873 <script type='text/javascript'>earlyInit()</script>
1874 <div style='height:100px'></div>
1875 </body>
1876 </html>