3G Modem: Add support for ZTE MF195
[tomato.git] / release / src / router / www / basic-network.asp
blob84db15e8b0050d785574adfc6aaef500b0251d6e
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,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&nbsp;Range&nbsp;<i>(first/last)</i>', 'Lease&nbsp;Time&nbsp;<i>(mins)</i>']);
62 var numBridges = 0;
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);
73 lg.insertData(-1, [
74 i.toString(),
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()) : ''
82 ] ) ;
83 numBridges++;
86 lg.canDelete = false;
87 lg.sort(0);
88 elem.removeClass(lg.header.cells[lg.sortColumn], 'sortasc', 'sortdes');
89 lg.showNewEditor();
90 lg.resetNewEditor();
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>',
96 data[2],
97 data[3],
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) {
104 return [data[0],
105 (data[1] != 0) ? 'checked' : '',
106 data[2].toString(),
107 data[3].toString(),
108 (data[4].toString() == '1') ? 'checked' : '',
109 data[5].toString(),
110 data[6].toString(),
111 data[7].toString() ];
114 lg.fieldValuesToData = function(row) {
115 var f = fields.getAll(row);
116 return [f[0].value,
117 f[1].checked ? 1 : 0,
118 f[2].value,
119 f[3].value,
120 f[4].checked ? 1 : 0,
121 f[5].value,
122 f[6].value,
123 f[7].value ];
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;
132 t--;
134 for(var j=0; j<= MAX_BRIDGE_ID ; j++) {
135 f[0].options[j].disabled = (this.countBridge(j) > 0);
137 f[1].checked = 0;
138 f[2].value = '';
139 f[3].value = '';
140 f[5].value = '';
141 f[6].value = '';
142 f[7].value = '';
143 f[4].checked = 0;
144 f[4].disabled = 1;
145 f[5].disabled = 1;
146 f[6].disabled = 1;
147 f[7].disabled = 1;
148 ferror.clearAll(fields.getAll(this.newEditor));
151 lg.onCancel = function() {
152 this.removeEditor();
153 this.showSource();
154 this.disableNewEditor(false);
156 this.resetNewEditor();
159 lg.onAdd = function() {
160 var data;
162 this.moving = null;
163 this.rpHide();
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();
173 this.resort();
176 lg.onOK = function() {
177 var i, data, view;
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];
189 this.removeEditor();
190 this.showSource();
191 this.disableNewEditor(false);
193 this.resort();
194 this.resetNewEditor();
197 lg.onDelete = function() {
198 this.removeEditor();
199 elem.remove(this.source);
200 this.source = null;
201 this.disableNewEditor(false);
203 this.resetNewEditor();
206 lg.countElem = function(f, v) {
207 var data = this.getAllData();
208 var total = 0;
209 for (var i = 0; i < data.length; ++i) {
210 total += (data[i][f] == v) ? 1 : 0;
212 return total;
215 lg.countBridge = function (v) {
216 return this.countElem(0,v);
219 lg.countOverlappingNetworks = function (ip) {
220 var data = this.getAllData();
221 var total = 0;
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;
227 return total;
230 lg.verifyFields = function(row, quiet) {
231 var ok=1;
232 var f;
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);
242 ok = 0;
243 } else {
244 ferror.clear(f[0]);
246 // valid IP address?
247 if(!v_ip(f[2], quiet || !ok))
248 ok = 0;
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
252 f[4].disabled = 0;
253 // validate netmask
254 if(!v_netmask(f[3], quiet || !ok)) {
255 return 0;
256 } else {
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);
260 return 0;
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;
366 W('<style type=\'text/css\'>');
367 for (var u = 0; u < wl_ifaces.length; ++u) {
368 W('#spin'+wl_unit(u)+', ');
370 W('#spin {');
371 W(' visibility: hidden;');
372 W(' vertical-align: middle;');
373 W('}');
374 W('</style>');
376 var xob = null;
377 var refresher = [];
378 var nphy = features('11n');
380 var ghz = [];
381 var bands = [];
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) {
387 var b;
388 b = [];
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']);
392 bands.push(b);
394 b = [];
395 ghz.push(b);
397 nm_loaded.push(0);
398 ch_loaded.push(0);
399 max_channel.push(0);
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';
411 } else {
412 return '0';
416 function refreshNetModes(uidx)
418 var e, i, buf, val;
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']);
426 if (nphy) {
427 m.push(['n-only','N Only']);
430 else {
431 m.push(['b-only','B Only']);
432 m.push(['g-only','G Only']);
433 if (nphy) {
434 m.push(['bg-mixed','B/G Mixed']);
435 m.push(['n-only','N Only']);
439 e = E('_wl'+u+'_net_mode');
440 buf = '';
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);
449 nm_loaded[uidx] = 1;
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) {
460 try {
461 var e, i, buf, val;
463 var wl_channels = [];
464 eval(text);
466 ghz[uidx] = [];
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');
475 buf = '';
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);
483 ch_loaded[uidx] = 1;
485 refresher[uidx] = null;
486 verifyFields(null, 1);
488 catch (x) {
490 refresher[uidx] = null;
493 var bw, sb, e;
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';
516 function scan()
518 if (xob) return;
520 var unit = wscan.unit;
521 var uidx = wl_uidx(unit);
523 xob = new XmlHttp();
524 xob.onCompleted = function(text, xml) {
525 try {
526 var i;
528 wlscandata = [];
529 eval(text);
531 for (i = 0; i < wlscandata.length; ++i) {
532 var data = wlscandata[i];
533 var ch = data[2];
534 var mac = data[0];
536 if (!wscan.inuse[ch]) {
537 wscan.inuse[ch] = {
538 count: 0,
539 rssi: -999,
540 ssid: ''
544 if (!wscan.seen[mac]) {
545 wscan.seen[mac] = 1;
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';
563 xob = null;
565 if (wscan.tries < 4) {
566 ++wscan.tries;
567 setTimeout(scan, 1000);
568 return;
571 catch (x) {
573 spin(0, unit);
575 xob.onError = function(x) {
576 alert('error: ' + x);
577 spin(0, unit);
578 xob = null;
581 spin(1, unit);
582 xob.post('update.cgi', 'exec=wlscan&arg0='+unit);
585 function scanButton(u)
587 if (xob) return;
589 wscan = {
590 unit: u,
591 seen: [],
592 inuse: [],
593 tries: 0
596 scan();
599 function joinAddr(a) {
600 var r, i, s;
602 r = [];
603 for (i = 0; i < a.length; ++i) {
604 s = a[i];
605 if ((s != '00:00:00:00:00:00') && (s != '0.0.0.0')) r.push(s);
607 return r.join(' ');
610 function random_x(max)
612 var c = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
613 var s = '';
614 while (max-- > 0) s += c.substr(Math.floor(c.length * Math.random()), 1);
615 return s;
618 function random_psk(id)
620 var e = E(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);
628 generate_wep(u);
631 function v_wep(e, quiet)
633 var s = e.value;
635 if (((s.length == 5) || (s.length == 13)) && (s.length == (e.maxLength >> 1))) {
636 // no checking
638 else {
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);
642 return 0;
646 e.value = s;
647 ferror.clear(e);
648 return 1;
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');
661 var pass = e.value;
662 if (!v_length(e, false, 3)) return;
663 E('_wl'+u+'_key1').value = _wepgen(pass, 0);
664 pass += '#$%';
665 E('_wl'+u+'_key2').value = _wepgen(pass, 2);
666 pass += '!@#';
667 E('_wl'+u+'_key3').value = _wepgen(pass, 4);
668 pass += '%&^';
669 E('_wl'+u+'_key4').value = _wepgen(pass, 6);
670 verifyFields(null, 1);
673 function verifyFields(focused, quiet)
675 var i;
676 var ok = 1;
677 var a, b, c, d, e;
678 var u, uidx;
679 var wmode, sm2;
681 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
682 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
683 if (wl_sunit(uidx)<0) {
684 u = wl_unit(uidx);
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 ---
697 var vis = {
698 _wan_proto: 1,
699 _ppp_username: 1,
700 _ppp_passwd: 1,
701 _ppp_service: 1,
702 _ppp_custom: 1,
703 _l2tp_server_ip: 1,
704 _wan_ipaddr: 1,
705 _wan_netmask: 1,
706 _wan_gateway: 1,
707 _pptp_server_ip: 1,
708 _f_pptp_dhcp: 1,
709 _ppp_demand: 1,
710 _ppp_idletime: 1,
711 _ppp_redialperiod: 1,
712 _mtu_enable: 1,
713 _f_wan_mtu: 1,
714 _f_wan_islan: 0,
715 _f_ppp_mlppp: 1,
716 _modem_ipaddr: 1,
718 _f_dns_1: 1,
719 _f_dns_2: 1,
720 _f_dns_3: 1,
721 /* DNSCRYPT-BEGIN */
722 _f_dnscrypt_proxy: 1,
723 /* DNSCRYPT-END */
724 _lan_gateway: 1,
725 _wan_wins: 1,
726 _modem_pin: 1,
727 _modem_dev: 1,
728 _modem_init: 1,
729 _modem_apn: 1
732 var wl_vis = [];
733 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
734 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
735 if (wl_sunit(uidx)<0) {
736 a = {
737 _f_wl_radio: 1,
738 _f_wl_mode: 1,
739 _f_wl_nband: (bands[uidx].length > 1) ? 1 : 0,
740 _wl_net_mode: 1,
741 _wl_ssid: 1,
742 _f_wl_bcast: 1,
743 _wl_channel: 1,
744 _wl_nbw_cap: nphy ? 1 : 0,
745 _f_wl_nctrlsb: nphy ? 1 : 0,
746 _f_wl_scan: 1,
748 _wl_security_mode: 1,
749 _wl_crypto: 1,
750 _wl_wpa_psk: 1,
751 _f_wl_psk_random1: 1,
752 _f_wl_psk_random2: 1,
753 _wl_wpa_gtk_rekey: 1,
754 _wl_radius_key: 1,
755 _wl_radius_ipaddr: 1,
756 _wl_radius_port: 1,
757 _wl_wep_bit: 1,
758 _wl_passphrase: 1,
759 _f_wl_wep_gen: 1,
760 _f_wl_wep_random: 1,
761 _wl_key1: 1,
762 _wl_key2: 1,
763 _wl_key3: 1,
764 _wl_key4: 1,
766 _f_wl_lazywds: 1,
767 _f_wl_wds_0: 1
769 wl_vis.push(a);
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') {
781 wan = 'disabled';
782 vis._wan_proto = 0;
785 if ((wan == 'disabled') || (wmode == 'sta') || (wmode == 'wet')) {
786 vis._f_wan_islan = 1;
791 switch (wan) {
792 case 'disabled':
793 vis._ppp_username = 0;
794 vis._ppp_service = 0;
795 vis._ppp_custom = 0;
796 vis._l2tp_server_ip = 0;
797 vis._wan_ipaddr = 0;
798 vis._wan_netmask = 0;
799 vis._wan_gateway = 0;
800 vis._pptp_server_ip = 0;
801 vis._f_pptp_dhcp = 0;
802 vis._ppp_demand = 0;
803 vis._mtu_enable = 0;
804 vis._f_wan_mtu = 0;
805 vis._f_ppp_mlppp = 0;
806 vis._modem_ipaddr = 0;
807 vis._modem_pin = 0;
808 vis._modem_dev = 0;
809 vis._modem_init = 0;
810 vis._modem_apn = 0;
811 break;
812 case 'dhcp':
813 vis._l2tp_server_ip = 0;
814 vis._ppp_demand = 0;
815 vis._ppp_service = 0;
816 vis._ppp_username = 0;
817 vis._ppp_custom = 0;
818 vis._pptp_server_ip = 0;
819 vis._f_pptp_dhcp = 0;
820 vis._wan_gateway = 0;
821 vis._wan_ipaddr = 0;
822 vis._wan_netmask = 0;
823 vis._f_ppp_mlppp = 0;
824 vis._modem_ipaddr = 1;
826 vis._lan_gateway = 0;
827 vis._modem_pin = 0;
828 vis._modem_dev = 0;
829 vis._modem_init = 0;
830 vis._modem_apn = 0;
831 break;
832 case 'pppoe':
833 vis._l2tp_server_ip = 0;
834 vis._pptp_server_ip = 0;
835 vis._f_pptp_dhcp = 0;
836 vis._wan_gateway = 0;
837 vis._wan_ipaddr = 0;
838 vis._wan_netmask = 0;
839 vis._modem_ipaddr = 1;
841 vis._lan_gateway = 0;
842 vis._modem_pin = 0;
843 vis._modem_dev = 0;
844 vis._modem_init = 0;
845 vis._modem_apn = 0;
846 break;
847 case 'ppp3g':
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;
853 vis._wan_ipaddr = 0;
854 vis._wan_netmask = 0;
855 vis._lan_gateway = 0;
856 vis._modem_ipaddr = 0;
857 vis._f_ppp_mlppp = 0;
858 break;
859 case 'static':
860 vis._l2tp_server_ip = 0;
861 vis._ppp_demand = 0;
862 vis._ppp_service = 0;
863 vis._ppp_username = 0;
864 vis._ppp_custom = 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;
871 vis._modem_pin = 0;
872 vis._modem_dev = 0;
873 vis._modem_init = 0;
874 vis._modem_apn = 0;
875 break;
876 case 'pptp':
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;
884 vis._modem_pin = 0;
885 vis._modem_dev = 0;
886 vis._modem_init = 0;
887 vis._modem_apn = 0;
888 break;
889 case 'l2tp':
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;
897 vis._modem_pin = 0;
898 vis._modem_dev = 0;
899 vis._modem_init = 0;
900 vis._modem_apn = 0;
901 break;
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) {
909 vis._f_wan_mtu = 2;
910 a = E('_f_wan_mtu');
911 switch (E('_wan_proto').value) {
912 case 'pppoe':
913 a.value = 1492;
914 break;
915 case 'pptp':
916 case 'l2tp':
917 a.value = 1460;
918 break;
919 default:
920 a.value = 1500;
921 break;
926 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
927 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
928 if (wl_sunit(uidx)<0) {
929 u = wl_unit(uidx);
930 wmode = E('_f_wl'+u+'_mode').value;
932 if (!E('_f_wl'+u+'_radio').checked) {
933 for (a in wl_vis[uidx]) {
934 wl_vis[uidx][a] = 2;
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;
941 switch (wmode) {
942 case 'apwds':
943 case 'wds':
944 break;
945 case 'wet':
946 case 'sta':
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;
951 default:
952 wl_vis[uidx]._f_wl_lazywds = 0;
953 wl_vis[uidx]._f_wl_wds_0 = 0;
954 break;
957 sm2 = E('_wl'+u+'_security_mode').value;
958 switch (sm2) {
959 case 'disabled':
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;
966 break;
967 case 'wep':
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;
973 break;
974 case 'radius':
975 wl_vis[uidx]._wl_crypto = 0;
976 wl_vis[uidx]._wl_wpa_psk = 0;
977 break;
978 default: // wpa*
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;
984 else {
985 wl_vis[uidx]._wl_wpa_psk = 0;
987 break;
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) {
996 case 'b-only':
997 case 'g-only':
998 case 'a-only':
999 case 'bg-mixed':
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);
1005 break;
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;
1019 /* REMOVE-BEGIN
1020 This is ugly...
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.
1025 REMOVE-END */
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')) {
1030 case 'b-only':
1031 case 'g-only':
1032 case 'bg-mixed':
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;
1042 break;
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;
1060 for (a in vis) {
1061 b = E(a);
1062 c = vis[a];
1063 /* REMOVE-BEGIN
1064 // if (b != null)
1065 REMOVE-END */
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]) {
1073 i = 3;
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';
1083 // --- verify ---
1085 ferror.clear('_wan_proto');
1087 var wlclnt = 0;
1088 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1089 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1090 if (wl_sunit(uidx)<0) {
1091 u = wl_unit(uidx);
1092 wmode = E('_f_wl'+u+'_mode').value;
1093 sm2 = E('_wl'+u+'_security_mode').value;
1095 /* REMOVE-BEGIN
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);
1098 ok = 0;
1100 else ferror.clear('_wl'+u+'_security_mode');
1101 REMOVE-END */
1103 // --- N standard does not support WPA+TKIP ---
1104 a = E('_wl'+u+'_crypto');
1105 switch (E('_wl'+u+'_net_mode').value) {
1106 case 'mixed':
1107 case 'n-only':
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);
1110 ok = 0;
1112 else ferror.clear(a);
1113 break;
1116 a = E('_wl'+u+'_net_mode');
1117 ferror.clear(a);
1118 b = E('_f_wl'+u+'_mode');
1119 ferror.clear(b);
1120 if ((wmode == 'sta') || (wmode == 'wet')) {
1121 ++wlclnt;
1122 if (wlclnt > 1) {
1123 ferror.set(b, 'Only one wireless interface can be configured in client mode.', quiet || !ok);
1124 ok = 0;
1126 else if (a.value == 'n-only') {
1127 ferror.set(a, 'N-only is not supported in wireless client modes, use Auto.', quiet || !ok);
1128 ok = 0;
1132 a = E('_wl'+u+'_wpa_psk');
1133 ferror.clear(a);
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);
1137 ok = 0;
1141 // wl channel
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);
1144 ok = 0;
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);
1151 ok = 0;
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]);
1162 ok = 0;
1165 // IP address
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;
1175 // netmask
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;
1180 // range
1181 a = [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500]];
1182 for (i = a.length - 1; i >= 0; --i) {
1183 v = a[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) {
1190 u = wl_unit(uidx);
1192 // IP address
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;
1198 // range
1199 a = [['_wpa_gtk_rekey', 60, 7200], ['_radius_port', 1, 65535]];
1200 for (i = a.length - 1; i >= 0; --i) {
1201 v = a[i];
1202 if ((wl_vis[uidx]['_wl'+v[0]]) && (!v_range('_wl'+u+v[0], quiet || !ok, v[1], v[2]))) ok = 0;
1205 // length
1206 a = [['_ssid', 1], ['_radius_key', 1]];
1207 for (i = a.length - 1; i >= 0; --i) {
1208 v = a[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);
1216 b.maxLength = a;
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) {
1226 b = 0;
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;
1232 if (!b) {
1233 ferror.set('_f_wl'+u+'_wds_0', 'WDS MAC address required.', quiet || !ok);
1234 ok = 0;
1240 return ok;
1243 function earlyInit()
1245 verifyFields(null, 1);
1248 function save()
1250 if (lg.isEditing()) return;
1251 lg.resetNewEditor();
1253 var a, b, c;
1254 var i;
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) {
1267 u = wl_unit(uidx);
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;
1280 /* REMOVE-BEGIN */
1281 // TODO - what's required ? integrate with tomatogrid?
1282 /* REMOVE-END */
1285 a = [];
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 = '';
1294 else {
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');
1304 switch (sm2) {
1305 case 'disabled':
1306 case 'radius':
1307 case 'wep':
1308 e.value = '';
1309 break;
1310 default:
1311 c = [];
1313 if (sm2.indexOf('personal') != -1) {
1314 if (sm2.indexOf('wpa2_') == -1) c.push('psk');
1315 if (sm2.indexOf('wpa_') == -1) c.push('psk2');
1317 else {
1318 if (sm2.indexOf('wpa2_') == -1) c.push('wpa');
1319 if (sm2.indexOf('wpa_') == -1) c.push('wpa2');
1321 c = c.join(' ');
1322 e.value = c;
1323 break;
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) {
1336 case 'b-only':
1337 E('_wl'+u+'_gmode').value = 0;
1338 break;
1339 case 'g-only':
1340 E('_wl'+u+'_gmode').value = 4;
1341 break;
1342 case 'bg-mixed':
1343 break;
1344 case 'a-only':
1345 E('_wl'+u+'_nmcsidx').value = -1; // Auto
1346 break;
1347 case 'n-only':
1348 if (selectedBand(uidx) == '1') { // 5 GHz
1349 E('_wl'+u+'_nmode').value = -1;
1350 E('_wl'+u+'_nmcsidx').value = -1;
1351 } else {
1352 E('_wl'+u+'_nmode').value = 1;
1353 E('_wl'+u+'_nmcsidx').value = 32;
1355 E('_wl'+u+'_nreqd').value = 1;
1356 break;
1357 default: // Auto
1358 E('_wl'+u+'_nmode').value = -1;
1359 E('_wl'+u+'_nmcsidx').value = -1;
1360 break;
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;
1383 /* DNSCRYPT-END */
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';
1405 alert(s);
1406 var e = E('footer-msg');
1407 e.innerHTML = s;
1408 e.style.visibility = 'visible';
1409 setTimeout(
1410 function() {
1411 e.innerHTML = '';
1412 e.style.visibility = 'hidden';
1413 }, 5000);
1414 return;
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] : '';
1429 /* REMOVE-BEGIN */
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);
1440 /* REMOVE-END */
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';
1448 setTimeout(
1449 function() {
1450 e.innerHTML = '';
1451 e.style.visibility = 'hidden';
1452 }, 5000);
1453 return;
1456 /* REMOVE-BEGIN
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)){
1459 REMOVE-END */
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;
1465 form.submit(fom);
1467 else {
1468 form.submit(fom, 1);
1472 function init()
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);
1482 </script>
1484 </head>
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>
1491 </td></tr>
1492 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
1493 <td id='content'>
1494 <div id='ident'><% ident(); %></div>
1496 <!-- / / / -->
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'>
1510 /* DNSCRYPT-END */
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\'>');
1527 </script>
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'],
1534 /* LINUX26-BEGIN */
1535 /* USB-BEGIN */
1536 ['ppp3g','3G Modem'],
1537 /* USB-END */
1538 /* LINUX26-END */
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) }
1571 </script>
1572 </div>
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+/);
1582 /* REMOVE-BEGIN
1583 //ipp = nvram.lan_ipaddr.split('.').splice(0, 3).join('.');
1584 REMOVE-END */
1585 createFieldTable('', [
1586 { title: 'Default Gateway', name: 'lan_gateway', type: 'text', maxlen: 15, size: 17, value: nvram.lan_gateway },
1587 { 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' },
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) },
1592 /* DNSCRYPT-END */
1593 { title: 'WINS <i>(for DHCP)</i>', name: 'wan_wins', type: 'text', maxlen: 15, size: 17, value: nvram.wan_wins }
1595 </script>
1596 </div>
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) + ')');
1627 W('</div>');
1629 W('<div class=\'section\'>');
1631 f = [
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') },
1651 null,
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) {
1676 f.push(
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] });
1682 f.push(null,
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);
1693 W('</div>');
1696 // for each wlif
1697 </script>
1699 <!-- / / / -->
1701 </td></tr>
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();'>
1706 </td></tr>
1707 </table>
1708 </form>
1709 <script type='text/javascript'>earlyInit()</script>
1710 <div style='height:100px'></div>
1711 </body>
1712 </html>