Merge branch 'VLAN-MultiSSID' into Toastman-VLAN-MultiSSID
[tomato.git] / release / src / router / www / basic-network.asp
blob62425f4ec5d5cf79fac45e07f09470dc0ee2290d
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 Tomato VLAN GUI
8 Copyright (C) 2011 Augusto Bott
9 http://code.google.com/p/tomato-sdhc-vlan/
11 For use with Tomato Firmware only.
12 No part of this file may be used without permission.
13 -->
14 <html>
15 <head>
16 <meta http-equiv='content-type' content='text/html;charset=utf-8'>
17 <meta name='robots' content='noindex,nofollow'>
18 <title>[<% ident(); %>] Basic: Networks</title>
19 <link rel='stylesheet' type='text/css' href='tomato.css'>
20 <% css(); %>
21 <script type='text/javascript' src='tomato.js'></script>
23 <!-- / / / -->
25 <style type='text/css'>
26 #lan-grid .co1,
27 #lan-grid .co2,
28 #lan-grid .co3,
29 #lan-grid .co4,
30 #lan-grid .co5,
31 #lan-grid .co6,
32 #lan-grid .co7 {
33 text-align: center;
36 #lan-grid .centered {
37 text-align: center;
39 </style>
41 <script type='text/javascript' src='debug.js'></script>
43 <script type='text/javascript' src='md5.js'></script>
44 <script type='text/javascript' src='wireless.jsx?_http_id=<% nv(http_id); %>'></script>
45 <script type='text/javascript' src='interfaces.js'></script>
46 <script type='text/javascript'>
47 // <% 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,ppp_defgw,wl_security_mode,wan_dns,wan_gateway,wan_ipaddr,wan_mtu,wan_netmask,wan_proto,wan_wins,wl_wds_enable,wl_channel,wl_closed,wl_crypto,wl_key,wl_key1,wl_key2,wl_key3,wl_key4,wl_lazywds,wl_mode,wl_net_mode,wl_passphrase,wl_radio,wl_radius_ipaddr,wl_radius_port,wl_ssid,wl_wds,wl_wep_bit,wl_wpa_gtk_rekey,wl_wpa_psk,wl_radius_key,wl_auth,wl_hwaddr,wan_islan,t_features,wl_nbw_cap,wl_nctrlsb,wl_nband,wl_phytype,lan_ifname,lan_stp,lan1_ifname,lan1_ipaddr,lan1_netmask,lan1_proto,lan1_stp,dhcp1_start,dhcp1_num,dhcp1_lease,dhcpd1_startip,dhcpd1_endip,lan2_ifname,lan2_ipaddr,lan2_netmask,lan2_proto,lan2_stp,dhcp2_start,dhcp2_num,dhcp2_lease,dhcpd2_startip,dhcpd2_endip,lan3_ifname,lan3_ipaddr,lan3_netmask,lan3_proto,lan3_stp,dhcp3_start,dhcp3_num,dhcp3_lease,dhcpd3_startip,dhcpd3_endip"); %>
49 var lg = new TomatoGrid();
50 lg.setup = function() {
51 this.init('lan-grid', '', 4, [
52 { type: 'select', options: [[0, '0'],[1, '1'],[2, '2'],[3, '3']], prefix: '<div class="centered">', suffix: '</div>' },
53 { type: 'checkbox', prefix: '<div class="centered">', suffix: '</div>' },
54 { type: 'text', maxlen: 15, size: 17 },
55 { type: 'text', maxlen: 15, size: 17 },
56 { type: 'checkbox', prefix: '<div class="centered">', suffix: '</div>' },
57 { multi: [ { type: 'text', maxlen: 15, size: 17}, { type: 'text', maxlen: 15, size: 17 } ] },
58 { type: 'text', maxlen: 6, size: 8 }] );
59 this.headerSet(['Bridge', 'STP', 'IP Address', 'Netmask', 'DHCP', 'IP&nbsp;Range&nbsp;<i>(first/last)</i>', 'Lease&nbsp;Time&nbsp;<i>(mins)</i>']);
61 var numBridges = 0;
62 for (var i = 0 ; i <= MAX_BRIDGE_ID ; i++) {
63 var j = (i == 0) ? '' : i.toString();
64 if (nvram['lan' + j + '_ifname'].length > 0) {
65 if ((!fixIP(nvram['dhcpd' + j + '_startip'])) || (!fixIP(nvram['dhcpd' + j + '_endip']))) {
66 var x = nvram['lan' + j + '_ipaddr'].split('.').splice(0, 3).join('.') + '.';
67 nvram['dhcpd' + j + '_startip'] = x + nvram['dhcp' + j + '_start'];
68 nvram['dhcpd' + j + '_endip'] = x + ((nvram['dhcp' + j + '_start'] * 1) + (nvram['dhcp' + j + '_num'] * 1) - 1);
70 lg.insertData(-1, [
71 i.toString(),
72 nvram['lan' + j + '_stp'],
73 nvram['lan' + j + '_ipaddr'],
74 nvram['lan' + j + '_netmask'],
75 (nvram['lan' + j + '_proto'] == 'dhcp') ? '1' : '0',
76 (nvram['dhcp' + j + '_start'] != '') ? fixIP(getNetworkAddress(nvram['lan' + j + '_ipaddr'], nvram['lan' + j + '_netmask']).split('.').splice(0, 3).join('.') + '.' + nvram['dhcp' + j + '_start']) : '',
77 (nvram['dhcp' + j + '_start'] != '') ? parseInt(nvram['dhcp' + j + '_start']) + parseInt(nvram['dhcp' + j + '_num']) - 1 : '',
78 (nvram['dhcp' + j + '_start'] != '') ? nvram['dhcp' + j + '_lease'] : ''
79 ] ) ;
80 numBridges++;
83 lg.canDelete = false;
84 lg.sort(0);
85 elem.removeClass(lg.header.cells[lg.sortColumn], 'sortasc', 'sortdes');
86 lg.showNewEditor();
87 lg.resetNewEditor();
90 lg.dataToView = function(data) {
91 return ['br' + data[0],
92 (data[1].toString() == '1') ? '<small><i>Enabled</i></small>' : '<small><i>Disabled</i></small>',
93 data[2],
94 data[3],
95 (data[4].toString() == '1') ? '<small><i>Enabled</i></small>' : '<small><i>Disabled</i></small>',
96 (((data[5] != null) && (data[5] != '')) ? (data[5] + ' - ') : '') + (((data[6] != null) && (data[6] != '')) ? data[6] : ''),
97 (((data[7] != null) && (data[7] != '')) ? data[7] : '') ];
100 lg.dataToFieldValues = function (data) {
101 return [data[0],
102 (data[1] != 0) ? 'checked' : '',
103 data[2].toString(),
104 data[3].toString(),
105 (data[4].toString() == '1') ? 'checked' : '',
106 data[5].toString(),
107 (data[6] != '') ? fixIP(getNetworkAddress(data[2], data[3]).split('.').splice(0, 3).join('.') + '.' + parseInt(data[6])) : '',
108 data[7].toString() ];
111 lg.fieldValuesToData = function(row) {
112 var f = fields.getAll(row);
113 var g = f[6].value.split('.');
114 return [f[0].value,
115 f[1].checked ? 1 : 0,
116 f[2].value,
117 f[3].value,
118 f[4].checked ? 1 : 0,
119 f[5].value,
120 (g[3] != null) ? g[3] : '',
121 f[7].value ];
124 lg.resetNewEditor = function() {
125 var f = fields.getAll(this.newEditor);
126 f[0].selectedIndex=0;
127 var t = MAX_BRIDGE_ID;
128 while((this.countBridge(f[0].selectedIndex) > 0) && (t > 0)) {
129 f[0].selectedIndex = (f[0].selectedIndex%(MAX_BRIDGE_ID))+1;
130 t--;
132 for(var j=0; j<= MAX_BRIDGE_ID ; j++) {
133 f[0].options[j].disabled = (this.countBridge(j) > 0);
135 f[1].checked = 0;
136 f[2].value = '';
137 f[3].value = '';
138 f[5].value = '';
139 f[6].value = '';
140 f[7].value = '';
141 f[4].checked = 0;
142 f[4].disabled = 1;
143 f[5].disabled = 1;
144 f[6].disabled = 1;
145 f[7].disabled = 1;
146 ferror.clearAll(fields.getAll(this.newEditor));
149 lg.onCancel = function() {
150 this.removeEditor();
151 this.showSource();
152 this.disableNewEditor(false);
154 this.resetNewEditor();
157 lg.onAdd = function() {
158 var data;
160 this.moving = null;
161 this.rpHide();
163 if (!this.verifyFields(this.newEditor, false)) return;
165 data = this.fieldValuesToData(this.newEditor);
166 this.insertData(-1, data);
168 this.disableNewEditor(false);
169 this.resetNewEditor();
171 this.resort();
174 lg.onOK = function() {
175 var i, data, view;
177 if (!this.verifyFields(this.editor, false)) return;
179 data = this.fieldValuesToData(this.editor);
180 view = this.dataToView(data);
182 this.source.setRowData(data);
183 for (i = 0; i < this.source.cells.length; ++i) {
184 this.source.cells[i].innerHTML = view[i];
187 this.removeEditor();
188 this.showSource();
189 this.disableNewEditor(false);
191 this.resort();
192 this.resetNewEditor();
195 lg.onDelete = function() {
196 this.removeEditor();
197 elem.remove(this.source);
198 this.source = null;
199 this.disableNewEditor(false);
201 this.resetNewEditor();
204 lg.countElem = function(f, v) {
205 var data = this.getAllData();
206 var total = 0;
207 for (var i = 0; i < data.length; ++i) {
208 total += (data[i][f] == v) ? 1 : 0;
210 return total;
213 lg.countBridge = function (v) {
214 return this.countElem(0,v);
217 lg.countOverlappingNetworks = function (ip) {
218 var data = this.getAllData();
219 var total = 0;
220 for (var i = 0; i < data.length; ++i) {
221 var net = getNetworkAddress(data[i][2], data[i][3]);
222 var brd = getBroadcastAddress(net, data[i][3]);
223 total += ((aton(ip) <= aton(brd)) && (aton(ip) >= aton(net))) ? 1 : 0;
225 return total;
228 lg.verifyFields = function(row, quiet) {
229 var ok=1;
230 var f;
232 f = fields.getAll(row);
234 for(var j=0; j<= MAX_BRIDGE_ID ; j++) {
235 f[0].options[j].disabled = (this.countBridge(j) > 0);
238 if(this.countBridge(f[0].selectedIndex) > 0) {
239 ferror.set(f[0], 'Cannot add another entry for bridge br' + f[0].selectedIndex, quiet);
240 ok = 0;
241 } else {
242 ferror.clear(f[0]);
244 // valid IP address?
245 if(!v_ip(f[2], quiet || !ok))
246 ok = 0;
247 // if we have a properly defined IP address - 0.0.0.0 is NOT a valid IP address for our intents/purposes!
248 if ((f[2].value != '') && (f[2].value != '0.0.0.0')) {
249 // allow DHCP to be enabled
250 f[4].disabled = 0;
251 // validate netmask
252 if(!v_netmask(f[3], quiet || !ok)) {
253 return 0;
254 } else {
255 // must be class C or smaller network
256 if (numberOfBitsOnNetMask(f[3].value) < 24) {
257 ferror.set(f[3], 'Netmask must have at least 24 bits set (255.255.255.0)', quiet);
258 return 0;
259 } else {
260 ferror.clear(f[3]);
263 if(f[2].value == getNetworkAddress(f[2].value, f[3].value)) {
264 var s = 'Invalid IP address or subnet mask (the address of the network cannot be used)';
265 ferror.set(f[2], s, quiet);
266 ferror.set(f[3], s, quiet);
267 return 0;
268 } else
269 if(f[2].value == getBroadcastAddress(getNetworkAddress(f[2].value, f[3].value), f[3].value)) {
270 var s = 'Invalid IP address or subnet mask (the broadcast address cannot be used)';
271 ferror.set(f[2], s, quiet);
272 ferror.set(f[3], s, quiet);
273 return 0;
274 } else
275 if (this.countOverlappingNetworks(f[2].value) > 0) {
276 var s = 'Invalid IP address or subnet mask (conflicts/overlaps with another LAN bridge)';
277 ferror.set(f[2], s, quiet);
278 ferror.set(f[3], s, quiet);
279 return 0;
280 } else {
281 ferror.clear(f[2]);
282 ferror.clear(f[3]);
284 } else {
285 f[4].checked = 0;
286 f[4].disabled = 1;
288 // dhcp enabled?
289 if( (f[4].checked) && (v_ip(f[2], 1)) && (v_netmask(f[3],1)) ) {
290 f[5].disabled = 0;
291 f[6].disabled = 0;
292 f[7].disabled = 0;
293 // first/last IP still unset?
294 if (f[5].value == '') {
295 var l;
296 var m = aton(f[2].value) & aton(f[3].value);
297 var o = (m) ^ (~ aton(f[3].value))
298 var n = o - m;
299 do {
300 if (--n < 0) {
301 f[5].value = '';
302 return;
304 m++;
305 } while (((l = fixIP(ntoa(m), 1)) == null) || (l == f[2].value) );
306 f[5].value = l;
308 if (f[6].value == '') {
309 var l;
310 var m = aton(f[2].value) & aton(f[3].value);
311 var o = (m) ^ (~ aton(f[3].value));
312 var n = o - m;
313 do {
314 if (--n < 0) {
315 f[6].value = '';
316 return;
318 o--;
319 } while (((l = fixIP(ntoa(o), 1)) == null) || (l == f[2].value) );
320 f[6].value = l;
322 // first IP valid?
323 if ((getNetworkAddress(f[5].value, f[3].value) != getNetworkAddress(f[2].value, f[3].value)) ||
324 (f[5].value == getBroadcastAddress(getNetworkAddress(f[2].value, f[3].value), f[3].value)) ||
325 (f[5].value == getNetworkAddress(f[2].value, f[3].value)) ||
326 (f[2].value == f[5].value)) {
327 ferror.set(f[5], 'Invalid first IP address or subnet mask', quiet || !ok);
328 return 0;
329 } else {
330 ferror.clear(f[5]);
332 // last IP valid?
333 if ((getNetworkAddress(f[6].value, f[3].value) != getNetworkAddress(f[2].value, f[3].value)) ||
334 (f[6].value == getBroadcastAddress(getNetworkAddress(f[2].value, f[3].value), f[3].value)) ||
335 (f[6].value == getNetworkAddress(f[2].value, f[3].value)) ||
336 (f[2].value == f[6].value)) {
337 ferror.set(f[6], 'Invalid last IP address or subnet mask', quiet || !ok);
338 return 0;
339 } else {
340 ferror.clear(f[6]);
342 // validate range, swap first/last IP if needed
343 if (aton(f[6].value) < aton(f[5].value)) {
344 var t = f[5].value;
345 f[5].value = f[6].value;
346 f[6].value = t;
348 // lease time
349 if (parseInt(f[7].value*1) == 0)
350 f[7].value = 1440; // from nvram/defaults.c
351 if(!v_mins(f[7], quiet || !ok, 1, 10080))
352 ok = 0;
353 } else {
354 f[5].disabled = 1;
355 f[6].disabled = 1;
356 f[7].disabled = 1;
357 ferror.clear(f[5]);
358 ferror.clear(f[6]);
359 ferror.clear(f[7]);
361 return ok;
364 W('<style type=\'text/css\'>');
365 for (var u = 0; u < wl_ifaces.length; ++u) {
366 W('#spin'+wl_unit(u)+', ');
368 W('#spin {');
369 W(' visibility: hidden;');
370 W(' vertical-align: middle;');
371 W('}');
372 W('</style>');
374 var xob = null;
375 var refresher = [];
376 var nphy = features('11n');
378 var ghz = [];
379 var bands = [];
380 var nm_loaded = [], ch_loaded = [], max_channel = [];
382 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
383 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
384 if (wl_sunit(uidx)<0) {
385 var b;
386 b = [];
387 for (var i = 0; i < wl_bands[uidx].length; ++i) {
388 b.push([wl_bands[uidx][i] + '', (wl_bands[uidx][i] == '1') ? '5 GHz' : '2.4 GHz']);
390 bands.push(b);
392 b = [];
393 ghz.push(b);
395 nm_loaded.push(0);
396 ch_loaded.push(0);
397 max_channel.push(0);
398 refresher.push(null);
402 function selectedBand(uidx)
404 if (bands[uidx].length > 1) {
405 var e = E('_f_wl'+u+'_nband');
406 return (e.value + '' == '' ? eval('nvram.wl'+u+'_nband') : e.value);
407 } else if (bands[uidx].length > 0) {
408 return bands[uidx][0][0] || '0';
409 } else {
410 return '0';
414 function refreshNetModes(uidx)
416 var e, i, buf, val;
418 if (uidx >= wl_ifaces.length) return;
419 var u = wl_unit(uidx);
421 var m = [['mixed','Auto']];
422 if (selectedBand(uidx) == '1') {
423 m.push(['a-only','A Only']);
424 if (nphy) {
425 m.push(['n-only','N Only']);
428 else {
429 m.push(['b-only','B Only']);
430 m.push(['g-only','G Only']);
431 if (nphy) {
432 m.push(['bg-mixed','B/G Mixed']);
433 m.push(['n-only','N Only']);
437 e = E('_wl'+u+'_net_mode');
438 buf = '';
439 val = (!nm_loaded[uidx] || (e.value + '' == '')) ? eval('nvram.wl'+u+'_net_mode') : e.value;
440 if (val == 'disabled') val = 'mixed';
441 for (i = 0; i < m.length; ++i)
442 buf += '<option value="' + m[i][0] + '"' + ((m[i][0] == val) ? ' selected' : '') + '>' + m[i][1] + '</option>';
444 e = E('__wl'+u+'_net_mode');
445 buf = '<select name="wl'+u+'_net_mode" onchange="verifyFields(this, 1)" id = "_wl'+u+'_net_mode">' + buf + '</select>';
446 elem.setInnerHTML(e, buf);
447 nm_loaded[uidx] = 1;
450 function refreshChannels(uidx)
452 if (refresher[uidx] != null) return;
453 if (u >= wl_ifaces.length) return;
454 var u = wl_unit(uidx);
456 refresher[uidx] = new XmlHttp();
457 refresher[uidx].onCompleted = function(text, xml) {
458 try {
459 var e, i, buf, val;
461 var wl_channels = [];
462 eval(text);
464 ghz[uidx] = [];
465 max_channel[uidx] = 0;
466 for (i = 0; i < wl_channels.length; ++i) {
467 ghz[uidx].push([wl_channels[i][0] + '',
468 (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']);
469 max_channel[uidx] = wl_channels[i][0] * 1;
472 e = E('_wl'+u+'_channel');
473 buf = '';
474 val = (!ch_loaded[uidx] || (e.value + '' == '')) ? eval('nvram.wl'+u+'_channel') : e.value;
475 for (i = 0; i < ghz[uidx].length; ++i)
476 buf += '<option value="' + ghz[uidx][i][0] + '"' + ((ghz[uidx][i][0] == val) ? ' selected' : '') + '>' + ghz[uidx][i][1] + '</option>';
478 e = E('__wl'+u+'_channel');
479 buf = '<select name="wl'+u+'_channel" onchange="verifyFields(this, 1)" id = "_wl'+u+'_channel">' + buf + '</select>';
480 elem.setInnerHTML(e, buf);
481 ch_loaded[uidx] = 1;
483 refresher[uidx] = null;
484 verifyFields(null, 1);
486 catch (x) {
488 refresher[uidx] = null;
491 var bw, sb, e;
493 e = E('_f_wl'+u+'_nctrlsb');
494 sb = (e.value + '' == '' ? eval('nvram.wl'+u+'_nctrlsb') : e.value);
495 e = E('_wl'+u+'_nbw_cap');
496 bw = (e.value + '' == '' ? eval('nvram.wl'+u+'_nbw_cap') : e.value) == '0' ? '20' : '40';
498 refresher[uidx].onError = function(ex) { alert(ex); refresher[uidx] = null; reloadPage(); }
499 refresher[uidx].post('update.cgi', 'exec=wlchannels&arg0=' + u + '&arg1=' + (nphy ? '1' : '0') +
500 '&arg2=' + bw + '&arg3=' + selectedBand(uidx) + '&arg4=' + sb);
503 function spin(x, unit)
505 for (var u = 0; u < wl_ifaces.length; ++u) {
506 E('_f_wl'+wl_unit(u)+'_scan').disabled = x;
508 var e = E('_f_wl'+unit+'_scan');
509 if (x) e.value = 'Scan ' + (wscan.tries + 1);
510 else e.value = 'Scan';
511 E('spin'+unit).style.visibility = x ? 'visible' : 'hidden';
514 function scan()
516 if (xob) return;
518 var unit = wscan.unit;
519 var uidx = wl_uidx(unit);
521 xob = new XmlHttp();
522 xob.onCompleted = function(text, xml) {
523 try {
524 var i;
526 wlscandata = [];
527 eval(text);
529 for (i = 0; i < wlscandata.length; ++i) {
530 var data = wlscandata[i];
531 var ch = data[2];
532 var mac = data[0];
534 if (!wscan.inuse[ch]) {
535 wscan.inuse[ch] = {
536 count: 0,
537 rssi: -999,
538 ssid: ''
542 if (!wscan.seen[mac]) {
543 wscan.seen[mac] = 1;
544 ++wscan.inuse[ch].count;
547 if (data[4] > wscan.inuse[ch].rssi) {
548 wscan.inuse[ch].rssi = data[4];
549 wscan.inuse[ch].ssid = data[1];
552 var e = E('_wl'+unit+'_channel');
553 for (i = 1; i < ghz[uidx].length; ++i) {
554 var s = ghz[uidx][i][1];
555 var u = wscan.inuse[ghz[uidx][i][0]];
556 if (u) s += ' (' + u.count + ' AP' + (u.count == 1 ? '' : 's') + ' / strongest: "' + escapeHTML(ellipsis(u.ssid, 15)) + '" ' + u.rssi + ' dBm)';
557 e.options[i].innerHTML = s;
559 e.style.width = '400px';
561 xob = null;
563 if (wscan.tries < 4) {
564 ++wscan.tries;
565 setTimeout(scan, 1000);
566 return;
569 catch (x) {
571 spin(0, unit);
573 xob.onError = function(x) {
574 alert('error: ' + x);
575 spin(0, unit);
576 xob = null;
579 spin(1, unit);
580 xob.post('update.cgi', 'exec=wlscan&arg0='+unit);
583 function scanButton(u)
585 if (xob) return;
587 wscan = {
588 unit: u,
589 seen: [],
590 inuse: [],
591 tries: 0
594 scan();
597 function joinAddr(a) {
598 var r, i, s;
600 r = [];
601 for (i = 0; i < a.length; ++i) {
602 s = a[i];
603 if ((s != '00:00:00:00:00:00') && (s != '0.0.0.0')) r.push(s);
605 return r.join(' ');
608 function random_x(max)
610 var c = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
611 var s = '';
612 while (max-- > 0) s += c.substr(Math.floor(c.length * Math.random()), 1);
613 return s;
616 function random_psk(id)
618 var e = E(id);
619 e.value = random_x(63);
620 verifyFields(null, 1);
623 function random_wep(u)
625 E('_wl'+u+'_passphrase').value = random_x(16);
626 generate_wep(u);
629 function v_wep(e, quiet)
631 var s = e.value;
633 if (((s.length == 5) || (s.length == 13)) && (s.length == (e.maxLength >> 1))) {
634 // no checking
636 else {
637 s = s.toUpperCase().replace(/[^0-9A-F]/g, '');
638 if (s.length != e.maxLength) {
639 ferror.set(e, 'Invalid WEP key. Expecting ' + e.maxLength + ' hex or ' + (e.maxLength >> 1) + ' ASCII characters.', quiet);
640 return 0;
644 e.value = s;
645 ferror.clear(e);
646 return 1;
649 // compatible w/ Linksys' and Netgear's (key 1) method for 128-bits
650 function generate_wep(u)
652 function _wepgen(pass, i)
654 while (pass.length < 64) pass += pass;
655 return hex_md5(pass.substr(0, 64)).substr(i, (E('_wl'+u+'_wep_bit').value == 128) ? 26 : 10);
658 var e = E('_wl'+u+'_passphrase');
659 var pass = e.value;
660 if (!v_length(e, false, 3)) return;
661 E('_wl'+u+'_key1').value = _wepgen(pass, 0);
662 pass += '#$%';
663 E('_wl'+u+'_key2').value = _wepgen(pass, 2);
664 pass += '!@#';
665 E('_wl'+u+'_key3').value = _wepgen(pass, 4);
666 pass += '%&^';
667 E('_wl'+u+'_key4').value = _wepgen(pass, 6);
668 verifyFields(null, 1);
671 function verifyFields(focused, quiet)
673 var i;
674 var ok = 1;
675 var a, b, c, d, e;
676 var u, uidx;
677 var wmode, sm2;
679 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
680 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
681 if (wl_sunit(uidx)<0) {
682 u = wl_unit(uidx);
683 if (focused == E('_f_wl'+u+'_nband')) {
684 refreshNetModes(uidx);
685 refreshChannels(uidx);
687 else if (focused == E('_f_wl'+u+'_nctrlsb') || focused == E('_wl'+u+'_nbw_cap')) {
688 refreshChannels(uidx);
693 // --- visibility ---
695 var vis = {
696 _wan_proto: 1,
697 _ppp_username: 1,
698 _ppp_passwd: 1,
699 _ppp_service: 1,
700 _ppp_custom: 1,
701 _l2tp_server_ip: 1,
702 _wan_ipaddr: 1,
703 _wan_netmask: 1,
704 _wan_gateway: 1,
705 _pptp_server_ip: 1,
706 _f_pptp_dhcp: 1,
707 _ppp_demand: 1,
708 _ppp_idletime: 1,
709 _ppp_redialperiod: 1,
710 _mtu_enable: 1,
711 _f_wan_mtu: 1,
712 _f_wan_islan: 0,
714 /* REMOVE-BEGIN
715 // _dhcp_lease: 1,
716 // _f_dhcpd_enable: 1,
717 // _dhcpd_startip: 1,
718 // _dhcpd_endip: 1,
719 // _lan_ipaddr: 1,
720 // _lan_netmask: 1,
721 REMOVE-END */
722 _f_dns_1: 1,
723 _f_dns_2: 1,
724 _f_dns_3: 1,
725 _lan_gateway: 1,
726 _wan_wins: 1
729 var wl_vis = [];
730 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
731 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
732 if (wl_sunit(uidx)<0) {
733 a = {
734 _f_wl_radio: 1,
735 _f_wl_mode: 1,
736 _f_wl_nband: (bands[uidx].length > 1) ? 1 : 0,
737 _wl_net_mode: 1,
738 _wl_ssid: 1,
739 _f_wl_bcast: 1,
740 _wl_channel: 1,
741 _wl_nbw_cap: nphy ? 1 : 0,
742 _f_wl_nctrlsb: nphy ? 1 : 0,
743 _f_wl_scan: 1,
745 _wl_security_mode: 1,
746 _wl_crypto: 1,
747 _wl_wpa_psk: 1,
748 _f_wl_psk_random1: 1,
749 _f_wl_psk_random2: 1,
750 _wl_wpa_gtk_rekey: 1,
751 _wl_radius_key: 1,
752 _wl_radius_ipaddr: 1,
753 _wl_radius_port: 1,
754 _wl_wep_bit: 1,
755 _wl_passphrase: 1,
756 _f_wl_wep_gen: 1,
757 _f_wl_wep_random: 1,
758 _wl_key1: 1,
759 _wl_key2: 1,
760 _wl_key3: 1,
761 _wl_key4: 1,
763 _f_wl_lazywds: 1,
764 _f_wl_wds_0: 1
766 wl_vis.push(a);
770 var wan = E('_wan_proto').value;
772 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
773 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
774 if (wl_sunit(uidx)<0) {
775 wmode = E('_f_wl'+wl_unit(uidx)+'_mode').value;
777 if (wmode == 'wet') {
778 wan = 'disabled';
779 vis._wan_proto = 0;
780 /* REMOVE-BEGIN
781 // vis._f_dhcpd_enable = 0;
782 // vis._dhcp_lease = 0;
783 REMOVE-END */
786 if ((wan == 'disabled') || (wmode == 'sta') || (wmode == 'wet')) {
787 vis._f_wan_islan = 1;
792 switch (wan) {
793 case 'disabled':
794 vis._ppp_username = 0;
795 vis._ppp_service = 0;
796 vis._ppp_custom = 0;
797 vis._l2tp_server_ip = 0;
798 vis._wan_ipaddr = 0;
799 vis._wan_netmask = 0;
800 vis._wan_gateway = 0;
801 vis._pptp_server_ip = 0;
802 vis._f_pptp_dhcp = 0;
803 vis._ppp_demand = 0;
804 vis._mtu_enable = 0;
805 vis._f_wan_mtu = 0;
806 break;
807 case 'dhcp':
808 vis._l2tp_server_ip = 0;
809 vis._ppp_demand = 0;
810 vis._ppp_service = 0;
811 vis._ppp_username = 0;
812 vis._ppp_custom = 0;
813 vis._pptp_server_ip = 0;
814 vis._f_pptp_dhcp = 0;
815 vis._wan_gateway = 0;
816 vis._wan_ipaddr = 0;
817 vis._wan_netmask = 0;
819 vis._lan_gateway = 0;
820 break;
821 case 'pppoe':
822 vis._l2tp_server_ip = 0;
823 vis._pptp_server_ip = 0;
824 vis._f_pptp_dhcp = 0;
825 vis._wan_gateway = 0;
826 vis._wan_ipaddr = 0;
827 vis._wan_netmask = 0;
829 vis._lan_gateway = 0;
830 break;
831 case 'static':
832 vis._l2tp_server_ip = 0;
833 vis._ppp_demand = 0;
834 vis._ppp_service = 0;
835 vis._ppp_username = 0;
836 vis._ppp_custom = 0;
837 vis._pptp_server_ip = 0;
838 vis._f_pptp_dhcp = 0;
840 vis._lan_gateway = 0;
841 break;
842 case 'pptp':
843 vis._l2tp_server_ip = 0;
844 vis._ppp_service = 0;
845 vis._wan_gateway = (!E('_f_pptp_dhcp').checked);
846 vis._wan_ipaddr = (!E('_f_pptp_dhcp').checked);
848 vis._lan_gateway = 0;
849 break;
850 case 'l2tp':
851 vis._pptp_server_ip = 0;
852 vis._ppp_service = 0;
853 vis._wan_gateway = (!E('_f_pptp_dhcp').checked);
854 vis._wan_ipaddr = (!E('_f_pptp_dhcp').checked);
856 vis._lan_gateway = 0;
857 break;
860 vis._ppp_idletime = (E('_ppp_demand').value == 1) && vis._ppp_demand
861 vis._ppp_redialperiod = !vis._ppp_idletime && vis._ppp_demand;
863 if (vis._mtu_enable) {
864 if (E('_mtu_enable').value == 0) {
865 vis._f_wan_mtu = 2;
866 a = E('_f_wan_mtu');
867 switch (E('_wan_proto').value) {
868 case 'pppoe':
869 a.value = 1492;
870 break;
871 case 'pptp':
872 case 'l2tp':
873 a.value = 1460;
874 break;
875 default:
876 a.value = 1500;
877 break;
882 /* REMOVE-BEGIN
883 // if (!E('_f_dhcpd_enable').checked) vis._dhcp_lease = 0;
884 REMOVE-END */
885 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
886 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
887 if (wl_sunit(uidx)<0) {
888 u = wl_unit(uidx);
889 wmode = E('_f_wl'+u+'_mode').value;
891 if (!E('_f_wl'+u+'_radio').checked) {
892 for (a in wl_vis[uidx]) {
893 wl_vis[uidx][a] = 2;
895 wl_vis[uidx]._f_wl_radio = 1;
896 wl_vis[uidx]._wl_nbw_cap = nphy ? 2 : 0;
897 wl_vis[uidx]._f_wl_nband = (bands[uidx].length > 1) ? 2 : 0;
900 switch (wmode) {
901 case 'apwds':
902 case 'wds':
903 break;
904 case 'wet':
905 case 'sta':
906 wl_vis[uidx]._f_wl_bcast = 0;
907 wl_vis[uidx]._wl_channel = 0;
908 wl_vis[uidx]._wl_nbw_cap = 0;
909 default:
910 wl_vis[uidx]._f_wl_lazywds = 0;
911 wl_vis[uidx]._f_wl_wds_0 = 0;
912 break;
915 sm2 = E('_wl'+u+'_security_mode').value;
916 switch (sm2) {
917 case 'disabled':
918 wl_vis[uidx]._wl_crypto = 0;
919 wl_vis[uidx]._wl_wep_bit = 0;
920 wl_vis[uidx]._wl_wpa_psk = 0;
921 wl_vis[uidx]._wl_radius_key = 0;
922 wl_vis[uidx]._wl_radius_ipaddr = 0;
923 wl_vis[uidx]._wl_wpa_gtk_rekey = 0;
924 break;
925 case 'wep':
926 wl_vis[uidx]._wl_crypto = 0;
927 wl_vis[uidx]._wl_wpa_psk = 0;
928 wl_vis[uidx]._wl_radius_key = 0;
929 wl_vis[uidx]._wl_radius_ipaddr = 0;
930 wl_vis[uidx]._wl_wpa_gtk_rekey = 0;
931 break;
932 case 'radius':
933 wl_vis[uidx]._wl_crypto = 0;
934 wl_vis[uidx]._wl_wpa_psk = 0;
935 break;
936 default: // wpa*
937 wl_vis[uidx]._wl_wep_bit = 0;
938 if (sm2.indexOf('personal') != -1) {
939 wl_vis[uidx]._wl_radius_key = 0;
940 wl_vis[uidx]._wl_radius_ipaddr = 0;
942 else {
943 wl_vis[uidx]._wl_wpa_psk = 0;
945 break;
948 if ((E('_f_wl'+u+'_lazywds').value == 1) && (wl_vis[uidx]._f_wl_wds_0 == 1)) {
949 wl_vis[uidx]._f_wl_wds_0 = 2;
952 if (wl_vis[uidx]._wl_nbw_cap != 0) {
953 switch (E('_wl'+u+'_net_mode').value) {
954 case 'b-only':
955 case 'g-only':
956 case 'a-only':
957 case 'bg-mixed':
958 wl_vis[uidx]._wl_nbw_cap = 2;
959 if (E('_wl'+u+'_nbw_cap').value != '0') {
960 E('_wl'+u+'_nbw_cap').value = 0;
961 refreshChannels(uidx);
963 break;
965 // avoid Enterprise-TKIP with 40MHz
966 if ((sm2 == 'wpa_enterprise') && (E('_wl'+u+'_crypto').value == 'tkip')) {
967 wl_vis[uidx]._wl_nbw_cap = 2;
968 if (E('_wl'+u+'_nbw_cap').value != '0') {
969 E('_wl'+u+'_nbw_cap').value = 0;
970 refreshChannels(uidx);
975 wl_vis[uidx]._f_wl_nctrlsb = (E('_wl'+u+'_nbw_cap').value == 0) ? 0 : wl_vis[uidx]._wl_nbw_cap;
977 /* REMOVE-BEGIN
978 This is ugly...
979 Special case - 2.4GHz band, currently running in B/G-only mode,
980 with N/Auto and 40MHz selected in the GUI.
981 Channel list is not filtered in this case by the wl driver,
982 and includes all channels available with 20MHz channel width.
983 REMOVE-END */
984 b = selectedBand(uidx);
985 if (wl_vis[uidx]._wl_channel == 1 && wl_vis[uidx]._f_wl_nctrlsb != 0 &&
986 ((b == '2') || (wl_vis[uidx]._f_wl_nband == 0 && b == '0'))) {
987 switch (eval('nvram.wl'+u+'_net_mode')) {
988 case 'b-only':
989 case 'g-only':
990 case 'bg-mixed':
991 i = E('_wl'+u+'_channel').value * 1;
992 if (i > 0 && i < 5) {
993 E('_f_wl'+u+'_nctrlsb').value = 'lower';
994 wl_vis[uidx]._f_wl_nctrlsb = 2;
996 else if (i > max_channel[uidx] - 4) {
997 E('_f_wl'+u+'_nctrlsb').value = 'upper';
998 wl_vis[uidx]._f_wl_nctrlsb = 2;
1000 break;
1004 wl_vis[uidx]._f_wl_scan = wl_vis[uidx]._wl_channel;
1005 wl_vis[uidx]._f_wl_psk_random1 = wl_vis[uidx]._wl_wpa_psk;
1006 wl_vis[uidx]._f_wl_psk_random2 = wl_vis[uidx]._wl_radius_key;
1007 wl_vis[uidx]._wl_radius_port = wl_vis[uidx]._wl_radius_ipaddr;
1008 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;
1010 for (i = 1; i < 10; ++i) {
1011 wl_vis[uidx]['_f_wl_wds_' + i] = wl_vis[uidx]._f_wl_wds_0;
1014 } // for each wl_iface
1016 vis._ppp_passwd = vis._ppp_username;
1017 /* REMOVE-BEGIN
1018 // vis._dhcpd_startip = vis._dhcpd_endip = vis._wan_wins = vis._dhcp_lease;
1019 REMOVE-END */
1021 for (a in vis) {
1022 b = E(a);
1023 c = vis[a];
1024 /* REMOVE-BEGIN
1025 // if (b != null)
1026 REMOVE-END */
1027 b.disabled = (c != 1);
1028 PR(b).style.display = c ? '' : 'none';
1031 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1032 if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1033 for (a in wl_vis[uidx]) {
1034 i = 3;
1035 if (a.substr(0, 6) == '_f_wl_') i = 5;
1036 b = E(a.substr(0, i) + wl_unit(uidx) + a.substr(i, a.length));
1037 c = wl_vis[uidx][a];
1038 b.disabled = (c != 1);
1039 PR(b).style.display = c ? '' : 'none';
1044 // --- verify ---
1046 ferror.clear('_wan_proto');
1048 var wlclnt = 0;
1049 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1050 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1051 if (wl_sunit(uidx)<0) {
1052 u = wl_unit(uidx);
1053 wmode = E('_f_wl'+u+'_mode').value;
1054 sm2 = E('_wl'+u+'_security_mode').value;
1056 /* REMOVE-BEGIN
1057 if ((wl_vis[uidx]._f_wl_mode == 1) && (wmode != 'ap') && (sm2.substr(0, 4) == 'wpa2')) {
1058 ferror.set('_wl'+u+'_security_mode', 'WPA2 is supported only in AP mode.', quiet || !ok);
1059 ok = 0;
1061 else ferror.clear('_wl'+u+'_security_mode');
1062 REMOVE-END */
1064 // --- N standard does not support WPA+TKIP ---
1065 a = E('_wl'+u+'_crypto');
1066 switch (E('_wl'+u+'_net_mode').value) {
1067 case 'mixed':
1068 case 'n-only':
1069 if (nphy && (a.value == 'tkip') && (sm2.indexOf('wpa') != -1)) {
1070 ferror.set(a, 'TKIP encryption is not supported with WPA / WPA2 in N mode.', quiet || !ok);
1071 ok = 0;
1073 else ferror.clear(a);
1074 break;
1077 a = E('_wl'+u+'_net_mode');
1078 ferror.clear(a);
1079 b = E('_f_wl'+u+'_mode');
1080 ferror.clear(b);
1081 if ((wmode == 'sta') || (wmode == 'wet')) {
1082 ++wlclnt;
1083 if (wlclnt > 1) {
1084 ferror.set(b, 'Only one wireless interface can be configured in client mode.', quiet || !ok);
1085 ok = 0;
1087 else if (a.value == 'n-only') {
1088 ferror.set(a, 'N-only is not supported in wireless client modes, use Auto.', quiet || !ok);
1089 ok = 0;
1093 a = E('_wl'+u+'_wpa_psk');
1094 ferror.clear(a);
1095 if (wl_vis[uidx]._wl_wpa_psk == 1) {
1096 if ((a.value.length < 8) || ((a.value.length == 64) && (a.value.search(/[^0-9A-Fa-f]/) != -1))) {
1097 ferror.set('_wl'+u+'_wpa_psk', 'Invalid pre-shared key. Please enter at least 8 characters or 64 hexadecimal digits.', quiet || !ok);
1098 ok = 0;
1102 // wl channel
1103 if (((wmode == 'wds') || (wmode == 'apwds')) && (wl_vis[uidx]._wl_channel == 1) && (E('_wl'+u+'_channel').value == '0')) {
1104 ferror.set('_wl'+u+'_channel', 'Fixed wireless channel required in WDS mode.', quiet || !ok);
1105 ok = 0;
1107 else ferror.clear('_wl'+u+'_channel');
1109 if (E('_f_wl'+u+'_mode').value == 'sta') {
1110 if ((wan == 'disabled') && (E('_f_wl'+u+'_radio').checked)) {
1111 ferror.set('_wan_proto', 'Wireless Client mode requires a valid WAN setting (usually DHCP).', quiet || !ok);
1112 ok = 0;
1118 // domain name or IP address
1119 a = ['_l2tp_server_ip', '_pptp_server_ip'];
1120 for (i = a.length - 1; i >= 0; --i)
1121 if ((vis[a[i]]) && ((!v_length(a[i], 1, 1)) || ((!v_ip(a[i], 1)) && (!v_domain(a[i], 1))))) {
1122 if (!quiet && ok) ferror.show(a[i]);
1123 ok = 0;
1126 // IP address
1127 /* REMOVE-BEGIN
1128 // a = ['_wan_gateway','_wan_ipaddr','_lan_ipaddr', '_dhcpd_startip', '_dhcpd_endip'];
1129 REMOVE-END */
1130 a = ['_wan_gateway','_wan_ipaddr'];
1131 for (i = a.length - 1; i >= 0; --i)
1132 if ((vis[a[i]]) && (!v_ip(a[i], quiet || !ok))) ok = 0;
1134 // IP address, blank -> 0.0.0.0
1135 a = ['_f_dns_1', '_f_dns_2', '_f_dns_3','_wan_wins','_lan_gateway'];
1136 for (i = a.length - 1; i >= 0; --i)
1137 if ((vis[a[i]]) && (!v_dns(a[i], quiet || !ok))) ok = 0;
1139 // netmask
1140 /* REMOVE-BEGIN
1141 // a = ['_wan_netmask','_lan_netmask'];
1142 REMOVE-END */
1143 a = ['_wan_netmask'];
1144 for (i = a.length - 1; i >= 0; --i)
1145 if ((vis[a[i]]) && (!v_netmask(a[i], quiet || !ok))) ok = 0;
1147 // range
1148 /* REMOVE-BEGIN
1149 // a = [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500],
1150 // ['_dhcp_lease', 1, 10080]];
1151 REMOVE-END */
1152 a = [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500]];
1153 for (i = a.length - 1; i >= 0; --i) {
1154 v = a[i];
1155 if ((vis[v[0]]) && (!v_range(v[0], quiet || !ok, v[1], v[2]))) ok = 0;
1158 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1159 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1160 if (wl_sunit(uidx)<0) {
1161 u = wl_unit(uidx);
1163 // IP address
1164 a = ['_radius_ipaddr'];
1165 for (i = a.length - 1; i >= 0; --i) {
1166 if ((wl_vis[uidx]['_wl'+a[i]]) && (!v_ip('_wl'+u+a[i], quiet || !ok))) ok = 0;
1169 // range
1170 a = [['_wpa_gtk_rekey', 60, 7200], ['_radius_port', 1, 65535]];
1171 for (i = a.length - 1; i >= 0; --i) {
1172 v = a[i];
1173 if ((wl_vis[uidx]['_wl'+v[0]]) && (!v_range('_wl'+u+v[0], quiet || !ok, v[1], v[2]))) ok = 0;
1176 // length
1177 a = [['_ssid', 1], ['_radius_key', 1]];
1178 for (i = a.length - 1; i >= 0; --i) {
1179 v = a[i];
1180 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;
1183 if (wl_vis[uidx]._wl_key1) {
1184 a = (E('_wl'+u+'_wep_bit').value == 128) ? 26 : 10;
1185 for (i = 1; i <= 4; ++i) {
1186 b = E('_wl'+u+'_key' + i);
1187 b.maxLength = a;
1188 if ((b.value.length > 0) || (E('_f_wl'+u+'_wepidx_' + i).checked)) {
1189 if (!v_wep(b, quiet || !ok)) ok = 0;
1191 else ferror.clear(b);
1195 ferror.clear('_f_wl'+u+'_wds_0');
1196 if (wl_vis[uidx]._f_wl_wds_0 == 1) {
1197 b = 0;
1198 for (i = 0; i < 10; ++i) {
1199 a = E('_f_wl'+u+'_wds_' + i);
1200 if (!v_macz(a, quiet || !ok)) ok = 0;
1201 else if (!isMAC0(a.value)) b = 1;
1203 if (!b) {
1204 ferror.set('_f_wl'+u+'_wds_0', 'WDS MAC address required.', quiet || !ok);
1205 ok = 0;
1210 /* REMOVE-BEGIN
1211 a = E('_dhcpd_startip');
1212 b = E('_dhcpd_endip');
1213 ferror.clear(a);
1214 ferror.clear(b);
1216 if ((vis._dhcp_lease) && (!a._error_msg) && (!b._error_msg)) {
1217 c = aton(E('_lan_netmask').value);
1218 d = aton(E('_lan_ipaddr').value) & c;
1219 e = 'Invalid IP address or subnet mask';
1220 if ((aton(a.value) & c) != d) {
1221 ferror.set(a, e, quiet || !ok);
1222 ok = 0;
1224 if ((aton(b.value) & c) != d) {
1225 ferror.set(b, e, quiet || !ok);
1226 ok = 0;
1230 if ((vis._dhcp_lease) && (!a._error_msg) && (!b._error_msg)) {
1231 if (aton(a.value) > aton(b.value)) {
1232 c = a.value;
1233 a.value = b.value;
1234 b.value = c;
1237 elem.setInnerHTML('dhcp_count', '(' + ((aton(b.value) - aton(a.value)) + 1) + ')');
1239 REMOVE-END */
1241 return ok;
1244 function earlyInit()
1246 verifyFields(null, 1);
1249 function save()
1251 if (lg.isEditing()) return;
1252 lg.resetNewEditor();
1254 var a, b, c;
1255 var i;
1256 var u, uidx, wmode, sm2, wradio;
1258 if (!verifyFields(null, false)) return;
1260 var fom = E('_fom');
1262 fom.wan_mtu.value = fom.f_wan_mtu.value;
1263 fom.wan_mtu.disabled = fom.f_wan_mtu.disabled;
1265 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1266 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1267 if (wl_sunit(uidx)<0) {
1268 u = wl_unit(uidx);
1269 wmode = E('_f_wl'+u+'_mode').value;
1270 sm2 = E('_wl'+u+'_security_mode').value;
1271 wradio = E('_f_wl'+u+'_radio').checked;
1273 E('_wl'+u+'_nband').value = selectedBand(uidx);
1275 if (wmode == 'apwds') E('_wl'+u+'_mode').value = 'ap';
1276 else E('_wl'+u+'_mode').value = wmode;
1278 if (wmode == 'wet') {
1279 fom.wan_proto.value = 'disabled';
1280 fom.wan_proto.disabled = 0;
1281 /* REMOVE-BEGIN
1282 // fom.lan_proto.value = 'static';
1283 REMOVE-END */
1286 a = [];
1287 for (i = 0; i < 10; ++i) a.push(E('_f_wl'+u+'_wds_' + i).value);
1288 E('_wl'+u+'_wds').value = joinAddr(a);
1290 if (wmode.indexOf('wds') != -1) {
1291 E('_wl'+u+'_wds_enable').value = 1;
1292 E('_wl'+u+'_lazywds').value = E('_f_wl'+u+'_lazywds').value;
1293 if (E('_wl'+u+'_lazywds').value == 1) E('_wl'+u+'_wds').value = '';
1295 else {
1296 E('_wl'+u+'_wds_enable').value = 0;
1297 E('_wl'+u+'_wds').value = '';
1298 E('_wl'+u+'_lazywds').value = 0;
1301 E('_wl'+u+'_radio').value = wradio ? 1 : 0;
1302 E('_wl'+u+'_auth').value = eval('nvram.wl'+u+'_auth');
1304 e = E('_wl'+u+'_akm');
1305 switch (sm2) {
1306 case 'disabled':
1307 case 'radius':
1308 case 'wep':
1309 e.value = '';
1310 break;
1311 default:
1312 c = [];
1314 if (sm2.indexOf('personal') != -1) {
1315 if (sm2.indexOf('wpa2_') == -1) c.push('psk');
1316 if (sm2.indexOf('wpa_') == -1) c.push('psk2');
1318 else {
1319 if (sm2.indexOf('wpa2_') == -1) c.push('wpa');
1320 if (sm2.indexOf('wpa_') == -1) c.push('wpa2');
1322 c = c.join(' ');
1323 e.value = c;
1324 break;
1326 E('_wl'+u+'_auth_mode').value = (sm2 == 'radius') ? 'radius' : 'none';
1327 E('_wl'+u+'_wep').value = ((sm2 == 'radius') || (sm2 == 'wep')) ? 'enabled': 'disabled';
1329 if (sm2.indexOf('wpa') != -1) E('_wl'+u+'_auth').value = 0;
1331 E('_wl'+u+'_nreqd').value = 0;
1332 E('_wl'+u+'_gmode').value = 1;
1333 E('_wl'+u+'_nmode').value = 0;
1334 E('_wl'+u+'_nmcsidx').value = -2; // Legacy Rate
1335 E('_wl'+u+'_nbw').value = 0;
1336 switch (E('_wl'+u+'_net_mode').value) {
1337 case 'b-only':
1338 E('_wl'+u+'_gmode').value = 0;
1339 break;
1340 case 'g-only':
1341 E('_wl'+u+'_gmode').value = 4;
1342 break;
1343 case 'bg-mixed':
1344 break;
1345 case 'a-only':
1346 E('_wl'+u+'_nmcsidx').value = -1; // Auto
1347 break;
1348 case 'n-only':
1349 if (selectedBand(uidx) == '1') { // 5 GHz
1350 E('_wl'+u+'_nmode').value = -1;
1351 E('_wl'+u+'_nmcsidx').value = -1;
1352 } else {
1353 E('_wl'+u+'_nmode').value = 1;
1354 E('_wl'+u+'_nmcsidx').value = 32;
1356 E('_wl'+u+'_nreqd').value = 1;
1357 break;
1358 default: // Auto
1359 E('_wl'+u+'_nmode').value = -1;
1360 E('_wl'+u+'_nmcsidx').value = -1;
1361 break;
1364 E('_wl'+u+'_nctrlsb').value = eval('nvram.wl'+u+'_nctrlsb');
1365 if (E('_wl'+u+'_nmode').value != 0) {
1366 E('_wl'+u+'_nctrlsb').value = E('_f_wl'+u+'_nctrlsb').value;
1367 E('_wl'+u+'_nbw').value = (E('_wl'+u+'_nbw_cap').value == 0) ? 20 : 40;
1370 E('_wl'+u+'_closed').value = E('_f_wl'+u+'_bcast').checked ? 0 : 1;
1372 a = fields.radio.selected(eval('fom.f_wl'+u+'_wepidx'));
1373 if (a) E('_wl'+u+'_key').value = a.value;
1377 fom.wan_islan.value = fom.f_wan_islan.checked ? 1 : 0;
1378 fom.pptp_dhcp.value = fom.f_pptp_dhcp.checked ? 1 : 0;
1380 fom.wan_dns.value = joinAddr([fom.f_dns_1.value, fom.f_dns_2.value, fom.f_dns_3.value]);
1382 // initialize/wipe out relevant fields
1383 for (var i = 0 ; i <= MAX_BRIDGE_ID ; i++) {
1384 var j = (i == 0) ? '' : i.toString();
1385 fom['lan' + j + '_ifname'].value = '';
1386 fom['lan' + j + '_ipaddr'].value = '';
1387 fom['lan' + j + '_netmask'].value = '';
1388 fom['lan' + j + '_proto'].value = '';
1389 fom['lan' + j + '_stp'].value = '';
1390 fom['dhcp' + j + '_start'].value = '';
1391 fom['dhcp' + j + '_num'].value = '';
1392 fom['dhcp' + j + '_lease'].value = '';
1393 fom['dhcpd' + j + '_startip'].value = '';
1394 fom['dhcpd' + j + '_endip'].value = '';
1397 var d = lg.getAllData();
1398 for (var i = 0; i < d.length; ++i) {
1400 if (lg.countOverlappingNetworks(d[i][2]) > 1) {
1401 var s = 'Cannot proceed: two or more LAN bridges have conflicting IP addresses or overlapping subnets';
1402 alert(s);
1403 var e = E('footer-msg');
1404 e.innerHTML = s;
1405 e.style.visibility = 'visible';
1406 setTimeout(
1407 function() {
1408 e.innerHTML = '';
1409 e.style.visibility = 'hidden';
1410 }, 5000);
1411 return;
1414 var j = (parseInt(d[i][0]) == 0) ? '' : d[i][0].toString();
1415 fom['lan' + j + '_ifname'].value = 'br' + d[i][0];
1416 fom['lan' + j + '_stp'].value = d[i][1];
1417 fom['lan' + j + '_ipaddr'].value = d[i][2];
1418 fom['lan' + j + '_netmask'].value = d[i][3];
1419 fom['lan' + j + '_proto'].value = (d[i][4] != '0') ? 'dhcp' : 'static';
1420 fom['dhcp' + j + '_start'].value = (d[i][4] != '0') ? (d[i][5]).split('.').splice(3, 1) : '';
1421 fom['dhcp' + j + '_num'].value = (d[i][4] != '0') ? d[i][6] - fom['dhcp' + j + '_start'].value + 1 : '';
1422 fom['dhcp' + j + '_lease'].value = (d[i][4] != '0') ? d[i][7] : '';
1423 fom['dhcpd' + j + '_startip'].value = (d[i][4] != '0') ? d[i][5] : '';
1424 fom['dhcpd' + j + '_endip'].value = (d[i][4] != '0') ? fixIP(getNetworkAddress(d[i][2], d[i][3]).split('.').splice(0, 3).join('.') + '.' + parseInt(d[i][6])) : '';
1426 /* REMOVE-BEGIN
1427 alert('lan' + j + '_ifname=' + fom['lan' + j + '_ifname'].value +
1428 ', lan' + j + '_stp=' + fom['lan' + j + '_stp'].value +
1429 ', lan' + j + '_ipaddr=' + fom['lan' + j + '_ipaddr'].value +
1430 ', lan' + j + '_netmask=' + fom['lan' + j + '_netmask'].value +
1431 ', lan' + j + '_proto=' + fom['lan' + j + '_proto'].value +
1432 ', dhcp' + j + '_start=' + fom['dhcp' + j + '_start'].value +
1433 ', dhcp' + j + '_num=' + fom['dhcp' + j + '_num'].value +
1434 ', dhcp' + j + '_lease=' + fom['dhcp' + j + '_lease'].value +
1435 ', dhcpd' + j + '_startip=' + fom['dhcpd' + j + '_startip'].value +
1436 ', dhcpd' + j + '_endip=' + fom['dhcpd' + j + '_endip'].value);
1437 // fixIP(getNetworkAddress(data[2], data[3]).split('.').splice(0, 3).join('.') + '.' + parseInt(data[6]))
1438 REMOVE-END */
1441 var e = E('footer-msg');
1442 var t = fixIP(fom['lan_ipaddr'].value);
1443 if ((fom['lan_ifname'].value != 'br0') || (fom['lan_ipaddr'].value == '0.0.0.0') || (!t)) {
1444 e.innerHTML = 'Bridge br0 must be always defined and have a valid IP address set.';
1445 e.style.visibility = 'visible';
1446 setTimeout(
1447 function() {
1448 e.innerHTML = '';
1449 e.style.visibility = 'hidden';
1450 }, 5000);
1451 return;
1454 /* REMOVE-BEGIN
1455 // if ((nvram.lan_ipaddr != fom.lan_ipaddr.value) || (nvram.lan1_ipaddr != fom.lan1_ipaddr.value) ||
1456 // (nvram.lan2_ipaddr != fom.lan2_ipaddr.value) || (nvram.lan3_ipaddr != fom.lan3_ipaddr.value)){
1457 REMOVE-END */
1458 if (nvram.lan_ipaddr != fom.lan_ipaddr.value) {
1459 fom._moveip.value = 1;
1460 form.submit(fom);
1462 else {
1463 form.submit(fom, 1);
1467 function init()
1469 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1470 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1471 if (wl_sunit(uidx)<0) {
1472 refreshNetModes(uidx);
1473 refreshChannels(uidx);
1477 </script>
1479 </head>
1480 <body onload='init()'>
1481 <form id='_fom' method='post' action='tomato.cgi'>
1482 <table id='container' cellspacing=0>
1483 <tr><td colspan=2 id='header'>
1484 <div class='title'>Tomato</div>
1485 <div class='version'>Version <% version(); %></div>
1486 </td></tr>
1487 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
1488 <td id='content'>
1489 <div id='ident'><% ident(); %></div>
1491 <!-- / / / -->
1493 <input type='hidden' name='_nextpage' value='basic-networks.asp'>
1494 <input type='hidden' name='_nextwait' value='10'>
1495 <input type='hidden' name='_service' value='*'>
1496 <input type='hidden' name='_moveip' value='0'>
1498 <input type='hidden' name='wan_mtu'>
1499 <input type='hidden' name='wan_islan'>
1500 <input type='hidden' name='pptp_dhcp'>
1501 <input type='hidden' name='ppp_defgw'>
1502 <input type='hidden' name='wan_dns'>
1504 <script type='text/javascript'>
1506 for (var i = 0 ; i <= MAX_BRIDGE_ID ; i++) {
1507 var j = (i == 0) ? '' : i.toString();
1508 W('<input type=\'hidden\' id=\'lan' + j + '_ifname\' name=\'lan' + j + '_ifname\'>');
1509 W('<input type=\'hidden\' id=\'lan' + j + '_ipaddr\' name=\'lan' + j + '_ipaddr\'>');
1510 W('<input type=\'hidden\' id=\'lan' + j + '_netmask\' name=\'lan' + j + '_netmask\'>');
1511 W('<input type=\'hidden\' id=\'lan' + j + '_proto\' name=\'lan' + j + '_proto\'>');
1512 W('<input type=\'hidden\' id=\'lan' + j + '_stp\' name=\'lan' + j + '_stp\'>');
1513 W('<input type=\'hidden\' id=\'dhcp' + j + '_start\' name=\'dhcp' + j + '_start\'>');
1514 W('<input type=\'hidden\' id=\'dhcp' + j + '_num\' name=\'dhcp' + j + '_num\'>');
1515 W('<input type=\'hidden\' id=\'dhcp' + j + '_lease\' name=\'dhcp' + j + '_lease\'>');
1516 W('<input type=\'hidden\' id=\'dhcpd' + j + '_startip\' name=\'dhcpd' + j + '_startip\'>');
1517 W('<input type=\'hidden\' id=\'dhcpd' + j + '_endip\' name=\'dhcpd' + j + '_endip\'>');
1519 </script>
1521 <div class='section-title'>WAN / Internet</div>
1522 <div class='section'>
1523 <script type='text/javascript'>
1524 createFieldTable('', [
1525 { title: 'Type', name: 'wan_proto', type: 'select', options: [['dhcp','DHCP'],['pppoe','PPPoE'],['static','Static'],['pptp','PPTP'],['l2tp','L2TP'],['disabled','Disabled']],
1526 value: nvram.wan_proto },
1527 { title: 'Username', name: 'ppp_username', type: 'text', maxlen: 60, size: 64, value: nvram.ppp_username },
1528 { title: 'Password', name: 'ppp_passwd', type: 'password', maxlen: 60, size: 64, peekaboo: 1, value: nvram.ppp_passwd },
1529 { title: 'Service Name', name: 'ppp_service', type: 'text', maxlen: 50, size: 64, value: nvram.ppp_service },
1530 { title: 'L2TP Server', name: 'l2tp_server_ip', type: 'text', maxlen: 128, size: 64, value: nvram.l2tp_server_ip },
1531 { title: 'Use DHCP', name: 'f_pptp_dhcp', type: 'checkbox', value: (nvram.pptp_dhcp == 1) },
1532 { title: 'IP Address', name: 'wan_ipaddr', type: 'text', maxlen: 15, size: 17, value: nvram.wan_ipaddr },
1533 { title: 'Subnet Mask', name: 'wan_netmask', type: 'text', maxlen: 15, size: 17, value: nvram.wan_netmask },
1534 { title: 'Gateway', name: 'wan_gateway', type: 'text', maxlen: 15, size: 17, value: nvram.wan_gateway },
1535 { title: 'PPTP Gateway', name: 'pptp_server_ip', type: 'text', maxlen: 128, size: 64, value: nvram.pptp_server_ip },
1536 { title: 'Options', name: 'ppp_custom', type: 'text', maxlen: 256, size: 64, value: nvram.ppp_custom },
1537 { title: 'Connect Mode', name: 'ppp_demand', type: 'select', options: [['1', 'Connect On Demand'],['0', 'Keep Alive']],
1538 value: nvram.ppp_demand },
1539 { title: 'Max Idle Time', indent: 2, name: 'ppp_idletime', type: 'text', maxlen: 5, size: 7, suffix: ' <i>(minutes)</i>',
1540 value: nvram.ppp_idletime },
1541 { title: 'Check Interval', indent: 2, name: 'ppp_redialperiod', type: 'text', maxlen: 5, size: 7, suffix: ' <i>(seconds)</i>',
1542 value: nvram.ppp_redialperiod },
1543 { title: 'MTU', multi: [
1544 { name: 'mtu_enable', type: 'select', options: [['0', 'Default'],['1','Manual']], value: nvram.mtu_enable },
1545 { name: 'f_wan_mtu', type: 'text', maxlen: 4, size: 6, value: nvram.wan_mtu } ] },
1546 { title: 'Bridge WAN port to primary LAN (br0)', name: 'f_wan_islan', type: 'checkbox', value: (nvram.wan_islan == 1) }
1548 </script>
1549 </div>
1551 <div class='section-title'>LAN</div>
1552 <div class='section'>
1553 <table class='tomato-grid' cellspacing=1 id='lan-grid'></table>
1554 <script type='text/javascript'>lg.setup();</script>
1555 <script type='text/javascript'>
1556 dns = nvram.wan_dns.split(/\s+/);
1557 /* REMOVE-BEGIN
1558 //ipp = nvram.lan_ipaddr.split('.').splice(0, 3).join('.');
1559 REMOVE-END */
1560 createFieldTable('', [
1561 /* REMOVE-BEGIN
1562 // { title: 'Router IP Address', name: 'lan_ipaddr', type: 'text', maxlen: 15, size: 17, value: nvram.lan_ipaddr },
1563 // { title: 'Subnet Mask', name: 'lan_netmask', type: 'text', maxlen: 15, size: 17, value: nvram.lan_netmask },
1564 REMOVE-END */
1565 { title: 'Default Gateway', name: 'lan_gateway', type: 'text', maxlen: 15, size: 17, value: nvram.lan_gateway },
1566 { 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' },
1567 { title: '', name: 'f_dns_2', type: 'text', maxlen: 21, size: 25, value: dns[1] || '0.0.0.0' },
1568 { title: '', name: 'f_dns_3', type: 'text', maxlen: 21, size: 25, value: dns[2] || '0.0.0.0' },
1570 /* REMOVE-BEGIN
1571 // { title: 'DHCP Server', name: 'f_dhcpd_enable', type: 'checkbox', value: (nvram.lan_proto == 'dhcp') },
1572 // { title: 'IP Address Range', indent: 2, multi: [
1573 // { name: 'dhcpd_startip', type: 'text', maxlen: 15, size: 17, value: nvram.dhcpd_startip, suffix: ' - ' },
1574 // { name: 'dhcpd_endip', type: 'text', maxlen: 15, size: 17, value: nvram.dhcpd_endip, suffix: ' <i id="dhcp_count"></i>' }
1575 // ] },
1577 // { title: 'Lease Time', indent: 2, name: 'dhcp_lease', type: 'text', maxlen: 6, size: 8, suffix: ' <i>(minutes)</i>',
1578 // value: (nvram.dhcp_lease > 0) ? nvram.dhcp_lease : 1440 },
1579 // { title: 'WINS <i>(for DHCP)</i>', indent: 2, name: 'wan_wins', type: 'text', maxlen: 15, size: 17, value: nvram.wan_wins }
1580 REMOVE-END */
1581 { title: 'WINS <i>(for DHCP)</i>', name: 'wan_wins', type: 'text', maxlen: 15, size: 17, value: nvram.wan_wins }
1584 </script>
1585 </div>
1587 <script type='text/javascript'>
1589 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1590 //if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1591 if (wl_sunit(uidx)<0) {
1592 var u = wl_unit(uidx);
1594 W('<input type=\'hidden\' id=\'_wl'+u+'_mode\' name=\'wl'+u+'_mode\'>');
1595 W('<input type=\'hidden\' id=\'_wl'+u+'_nband\' name=\'wl'+u+'_nband\'>');
1596 W('<input type=\'hidden\' id=\'_wl'+u+'_wds_enable\' name=\'wl'+u+'_wds_enable\'>');
1597 W('<input type=\'hidden\' id=\'_wl'+u+'_wds\' name=\'wl'+u+'_wds\'>');
1598 W('<input type=\'hidden\' id=\'_wl'+u+'_radio\' name=\'wl'+u+'_radio\'>');
1599 W('<input type=\'hidden\' id=\'_wl'+u+'_closed\' name=\'wl'+u+'_closed\'>');
1600 W('<input type=\'hidden\' id=\'_wl'+u+'_key\' name=\'wl'+u+'_key\'>');
1601 W('<input type=\'hidden\' id=\'_wl'+u+'_gmode\' name=\'wl'+u+'_gmode\'>');
1602 W('<input type=\'hidden\' id=\'_wl'+u+'_akm\' name=\'wl'+u+'_akm\'>');
1603 W('<input type=\'hidden\' id=\'_wl'+u+'_auth\' name=\'wl'+u+'_auth\'>');
1604 W('<input type=\'hidden\' id=\'_wl'+u+'_auth_mode\' name=\'wl'+u+'_auth_mode\'>');
1605 W('<input type=\'hidden\' id=\'_wl'+u+'_wep\' name=\'wl'+u+'_wep\'>');
1606 W('<input type=\'hidden\' id=\'_wl'+u+'_lazywds\' name=\'wl'+u+'_lazywds\'>');
1607 W('<input type=\'hidden\' id=\'_wl'+u+'_nmode\' name=\'wl'+u+'_nmode\'>');
1608 W('<input type=\'hidden\' id=\'_wl'+u+'_nmcsidx\' name=\'wl'+u+'_nmcsidx\'>');
1609 W('<input type=\'hidden\' id=\'_wl'+u+'_nreqd\' name=\'wl'+u+'_nreqd\'>');
1610 W('<input type=\'hidden\' id=\'_wl'+u+'_nctrlsb\' name=\'wl'+u+'_nctrlsb\'>');
1611 W('<input type=\'hidden\' id=\'_wl'+u+'_nbw\' name=\'wl'+u+'_nbw\'>');
1613 W('<div class=\'section-title\'>Wireless');
1614 // if (wl_ifaces.length > 1)
1615 W(' (' + wl_display_ifname(uidx) + ')');
1616 W('</div>');
1618 W('<div class=\'section\'>');
1620 f = [
1621 { title: 'Enable Wireless', name: 'f_wl'+u+'_radio', type: 'checkbox',
1622 value: (eval('nvram.wl'+u+'_radio') == '1') && (eval('nvram.wl'+u+'_net_mode') != 'disabled') },
1623 { title: 'MAC Address', text: '<a href="advanced-mac.asp">' + eval('nvram.wl'+u+'_hwaddr') + '</a>' },
1624 { title: 'Wireless Mode', name: 'f_wl'+u+'_mode', type: 'select',
1625 options: [['ap', 'Access Point'],['apwds', 'Access Point + WDS'],['sta', 'Wireless Client'],['wet', 'Wireless Ethernet Bridge'],['wds', 'WDS']],
1626 value: ((eval('nvram.wl'+u+'_mode') == 'ap') && (eval('nvram.wl'+u+'_wds_enable') == '1')) ? 'apwds' : eval('nvram.wl'+u+'_mode') },
1627 { title: 'Radio Band', name: 'f_wl'+u+'_nband', type: 'select', options: bands[uidx],
1628 value: eval('nvram.wl'+u+'_nband') || '0' == '0' ? bands[uidx][0][0] : eval('nvram.wl'+u+'_nband') },
1629 { title: 'Wireless Network Mode', name: 'wl'+u+'_net_mode', type: 'select',
1630 value: (eval('nvram.wl'+u+'_net_mode') == 'disabled') ? 'mixed' : eval('nvram.wl'+u+'_net_mode'),
1631 options: [], prefix: '<span id="__wl'+u+'_net_mode">', suffix: '</span>' },
1632 { title: 'SSID', name: 'wl'+u+'_ssid', type: 'text', maxlen: 32, size: 34, value: eval('nvram.wl'+u+'_ssid') },
1633 { title: 'Broadcast', indent: 2, name: 'f_wl'+u+'_bcast', type: 'checkbox', value: (eval('nvram.wl'+u+'_closed') == '0') },
1634 { 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+'">',
1635 value: eval('nvram.wl'+u+'_channel') },
1636 { title: 'Channel Width', name: 'wl'+u+'_nbw_cap', type: 'select', options: [['0','20 MHz'],['1','40 MHz']],
1637 value: eval('nvram.wl'+u+'_nbw_cap') },
1638 { title: 'Control Sideband', name: 'f_wl'+u+'_nctrlsb', type: 'select', options: [['lower','Lower'],['upper','Upper']],
1639 value: eval('nvram.wl'+u+'_nctrlsb') == 'none' ? 'lower' : eval('nvram.wl'+u+'_nctrlsb') },
1640 null,
1641 { title: 'Security', name: 'wl'+u+'_security_mode', type: 'select',
1642 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']],
1643 value: eval('nvram.wl'+u+'_security_mode') },
1644 { title: 'Encryption', indent: 2, name: 'wl'+u+'_crypto', type: 'select',
1645 options: [['tkip','TKIP'],['aes','AES'],['tkip+aes','TKIP / AES']], value: eval('nvram.wl'+u+'_crypto') },
1646 { title: 'Shared Key', indent: 2, name: 'wl'+u+'_wpa_psk', type: 'password', maxlen: 64, size: 66, peekaboo: 1,
1647 suffix: ' <input type="button" id="_f_wl'+u+'_psk_random1" value="Random" onclick="random_psk(\'_wl'+u+'_wpa_psk\')">',
1648 value: eval('nvram.wl'+u+'_wpa_psk') },
1649 { title: 'Shared Key', indent: 2, name: 'wl'+u+'_radius_key', type: 'password', maxlen: 80, size: 32, peekaboo: 1,
1650 suffix: ' <input type="button" id="_f_wl'+u+'_psk_random2" value="Random" onclick="random_psk(\'_wl'+u+'_radius_key\')">',
1651 value: eval('nvram.wl'+u+'_radius_key') },
1652 { title: 'Group Key Renewal', indent: 2, name: 'wl'+u+'_wpa_gtk_rekey', type: 'text', maxlen: 4, size: 6, suffix: ' <i>(seconds)</i>',
1653 value: eval('nvram.wl'+u+'_wpa_gtk_rekey') },
1654 { title: 'Radius Server', indent: 2, multi: [
1655 { name: 'wl'+u+'_radius_ipaddr', type: 'text', maxlen: 15, size: 17, value: eval('nvram.wl'+u+'_radius_ipaddr') },
1656 { name: 'wl'+u+'_radius_port', type: 'text', maxlen: 5, size: 7, prefix: ' : ', value: eval('nvram.wl'+u+'_radius_port') } ] },
1657 { title: 'Encryption', indent: 2, name: 'wl'+u+'_wep_bit', type: 'select', options: [['128','128-bits'],['64','64-bits']],
1658 value: eval('nvram.wl'+u+'_wep_bit') },
1659 { title: 'Passphrase', indent: 2, name: 'wl'+u+'_passphrase', type: 'text', maxlen: 16, size: 20,
1660 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+')">',
1661 value: eval('nvram.wl'+u+'_passphrase') }
1664 for (i = 1; i <= 4; ++i) {
1665 f.push(
1666 { title: ('Key ' + i), indent: 2, name: ('wl'+u+'_key' + i), type: 'text', maxlen: 26, size: 34,
1667 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>' : '>'),
1668 value: nvram['wl'+u+'_key' + i] });
1671 f.push(null,
1672 { title: 'WDS', name: 'f_wl'+u+'_lazywds', type: 'select',
1673 options: [['0','Link With...'],['1','Automatic']], value: nvram['wl'+u+'_lazywds'] } );
1674 wds = eval('nvram.wl'+u+'_wds').split(/\s+/);
1675 for (i = 0; i < 10; i += 2) {
1676 f.push({ title: (i ? '' : 'MAC Address'), indent: 2, multi: [
1677 { name: 'f_wl'+u+'_wds_' + i, type: 'text', maxlen: 17, size: 20, value: wds[i] || '00:00:00:00:00:00' },
1678 { name: 'f_wl'+u+'_wds_' + (i + 1), type: 'text', maxlen: 17, size: 20, value: wds[i + 1] || '00:00:00:00:00:00' } ] } );
1681 createFieldTable('', f);
1682 W('</div>');
1685 // for each wlif
1686 </script>
1688 <!-- / / / -->
1690 </td></tr>
1691 <tr><td id='footer' colspan=2>
1692 <span id='footer-msg'></span>
1693 <input type='button' value='Save' id='save-button' onclick='save()'>
1694 <input type='button' value='Cancel' id='cancel-button' onclick='reloadPage();'>
1695 </td></tr>
1696 </table>
1697 </form>
1698 <script type='text/javascript'>earlyInit()</script>
1699 <div style='height:100px'></div>
1700 </body>
1701 </html>