cosmetics, status-overview
[tomato/k99.git] / release / src / router / www / basic-network.asp
blob11c601a6e20452eafb2a4e50d7005f92fde80bf7
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,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"); %>
50 /* VLAN-BEGIN */
51 var lg = new TomatoGrid();
52 lg.setup = function() {
53 this.init('lan-grid', '', 4, [
54 { type: 'select', options: [[0, '0'],[1, '1'],[2, '2'],[3, '3']], prefix: '<div class="centered">', suffix: '</div>' },
55 { type: 'checkbox', prefix: '<div class="centered">', suffix: '</div>' },
56 { type: 'text', maxlen: 15, size: 17 },
57 { type: 'text', maxlen: 15, size: 17 },
58 { type: 'checkbox', prefix: '<div class="centered">', suffix: '</div>' },
59 { multi: [ { type: 'text', maxlen: 15, size: 17}, { type: 'text', maxlen: 15, size: 17 } ] },
60 { type: 'text', maxlen: 6, size: 8 }] );
61 this.headerSet(['Bridge', 'STP', 'IP Address', 'Netmask', 'DHCP', 'IP&nbsp;Range&nbsp;<i>(first/last)</i>', 'Lease&nbsp;Time&nbsp;<i>(mins)</i>']);
63 var numBridges = 0;
64 for (var i = 0 ; i <= MAX_BRIDGE_ID ; i++) {
65 var j = (i == 0) ? '' : i.toString();
66 if (nvram['lan' + j + '_ifname'].length > 0) {
67 if ((!fixIP(nvram['dhcpd' + j + '_startip'])) || (!fixIP(nvram['dhcpd' + j + '_endip']))) {
68 if ((fixIP(nvram['lan' + j + '_ipaddr'])) && (fixIP(nvram['lan' + j + '_netmask'])) && (nvram['dhcp' + j + '_start'] != '')) {
69 var n = getNetworkAddress(nvram['lan' + j + '_ipaddr'], nvram['lan' + j + '_netmask']);
70 nvram['dhcpd' + j + '_startip'] = getAddress(('0.0.0.' + nvram['dhcp' + j + '_start'] * 1), n);
71 nvram['dhcpd' + j + '_endip'] = getAddress(('0.0.0.' + ((nvram['dhcp' + j + '_start'] * 1) + (nvram['dhcp' + j + '_num'] *1) - 1)), n);
74 lg.insertData(-1, [
75 i.toString(),
76 nvram['lan' + j + '_stp'],
77 nvram['lan' + j + '_ipaddr'],
78 nvram['lan' + j + '_netmask'],
79 (nvram['lan' + j + '_proto'] == 'dhcp') ? '1' : '0',
80 nvram['dhcpd' + j + '_startip'],
81 nvram['dhcpd' + j + '_endip'],
82 (nvram['lan' + j + '_proto'] == 'dhcp') ? (((nvram['dhcp' + j + '_lease'])*1 == 0) ? '1440' : (nvram['dhcp' + j + '_lease']).toString()) : ''
83 ] ) ;
84 numBridges++;
87 lg.canDelete = false;
88 lg.sort(0);
89 elem.removeClass(lg.header.cells[lg.sortColumn], 'sortasc', 'sortdes');
90 lg.showNewEditor();
91 lg.resetNewEditor();
94 lg.dataToView = function(data) {
95 return ['br' + data[0],
96 (data[1].toString() == '1') ? '<small><i>Enabled</i></small>' : '<small><i>Disabled</i></small>',
97 data[2],
98 data[3],
99 (data[4].toString() == '1') ? '<small><i>Enabled</i></small>' : '<small><i>Disabled</i></small>',
100 (data[5].toString() + ((numberOfBitsOnNetMask(data[3])>=24) ? (' - ' + data[6].split('.').splice(3, 1).toString()) : ('<br>' + data[6].toString()) )),
101 (((data[7] != null) && (data[7] != '')) ? data[7] : '') ];
104 lg.dataToFieldValues = function (data) {
105 return [data[0],
106 (data[1] != 0) ? 'checked' : '',
107 data[2].toString(),
108 data[3].toString(),
109 (data[4].toString() == '1') ? 'checked' : '',
110 data[5].toString(),
111 data[6].toString(),
112 data[7].toString() ];
115 lg.fieldValuesToData = function(row) {
116 var f = fields.getAll(row);
117 return [f[0].value,
118 f[1].checked ? 1 : 0,
119 f[2].value,
120 f[3].value,
121 f[4].checked ? 1 : 0,
122 f[5].value,
123 f[6].value,
124 f[7].value ];
127 lg.resetNewEditor = function() {
128 var f = fields.getAll(this.newEditor);
129 f[0].selectedIndex=0;
130 var t = MAX_BRIDGE_ID;
131 while((this.countBridge(f[0].selectedIndex) > 0) && (t > 0)) {
132 f[0].selectedIndex = (f[0].selectedIndex%(MAX_BRIDGE_ID))+1;
133 t--;
135 for(var j=0; j<= MAX_BRIDGE_ID ; j++) {
136 f[0].options[j].disabled = (this.countBridge(j) > 0);
138 f[1].checked = 0;
139 f[2].value = '';
140 f[3].value = '';
141 f[5].value = '';
142 f[6].value = '';
143 f[7].value = '';
144 f[4].checked = 0;
145 f[4].disabled = 1;
146 f[5].disabled = 1;
147 f[6].disabled = 1;
148 f[7].disabled = 1;
149 ferror.clearAll(fields.getAll(this.newEditor));
152 lg.onCancel = function() {
153 this.removeEditor();
154 this.showSource();
155 this.disableNewEditor(false);
157 this.resetNewEditor();
160 lg.onAdd = function() {
161 var data;
163 this.moving = null;
164 this.rpHide();
166 if (!this.verifyFields(this.newEditor, false)) return;
168 data = this.fieldValuesToData(this.newEditor);
169 this.insertData(-1, data);
171 this.disableNewEditor(false);
172 this.resetNewEditor();
174 this.resort();
177 lg.onOK = function() {
178 var i, data, view;
180 if (!this.verifyFields(this.editor, false)) return;
182 data = this.fieldValuesToData(this.editor);
183 view = this.dataToView(data);
185 this.source.setRowData(data);
186 for (i = 0; i < this.source.cells.length; ++i) {
187 this.source.cells[i].innerHTML = view[i];
190 this.removeEditor();
191 this.showSource();
192 this.disableNewEditor(false);
194 this.resort();
195 this.resetNewEditor();
198 lg.onDelete = function() {
199 this.removeEditor();
200 elem.remove(this.source);
201 this.source = null;
202 this.disableNewEditor(false);
204 this.resetNewEditor();
207 lg.countElem = function(f, v) {
208 var data = this.getAllData();
209 var total = 0;
210 for (var i = 0; i < data.length; ++i) {
211 total += (data[i][f] == v) ? 1 : 0;
213 return total;
216 lg.countBridge = function (v) {
217 return this.countElem(0,v);
220 lg.countOverlappingNetworks = function (ip) {
221 var data = this.getAllData();
222 var total = 0;
223 for (var i = 0; i < data.length; ++i) {
224 var net = getNetworkAddress(data[i][2], data[i][3]);
225 var brd = getBroadcastAddress(net, data[i][3]);
226 total += ((aton(ip) <= aton(brd)) && (aton(ip) >= aton(net))) ? 1 : 0;
228 return total;
231 lg.verifyFields = function(row, quiet) {
232 var ok=1;
233 var f;
235 f = fields.getAll(row);
237 for(var j=0; j<= MAX_BRIDGE_ID ; j++) {
238 f[0].options[j].disabled = (this.countBridge(j) > 0);
241 if(this.countBridge(f[0].selectedIndex) > 0) {
242 ferror.set(f[0], 'Cannot add another entry for bridge br' + f[0].selectedIndex, quiet);
243 ok = 0;
244 } else {
245 ferror.clear(f[0]);
247 // valid IP address?
248 if(!v_ip(f[2], quiet || !ok))
249 ok = 0;
250 // if we have a properly defined IP address - 0.0.0.0 is NOT a valid IP address for our intents/purposes!
251 if ((f[2].value != '') && (f[2].value != '0.0.0.0')) {
252 // allow DHCP to be enabled
253 f[4].disabled = 0;
254 // validate netmask
255 if(!v_netmask(f[3], quiet || !ok)) {
256 return 0;
257 } else {
258 // must be class B or smaller network
259 if (numberOfBitsOnNetMask(f[3].value) < 16) {
260 ferror.set(f[3], 'Netmask must have at least 16 bits set (255.255.0.0)', quiet);
261 return 0;
262 } else {
263 ferror.clear(f[3]);
266 if(f[2].value == getNetworkAddress(f[2].value, f[3].value)) {
267 var s = 'Invalid IP address or subnet mask (the address of the network cannot be used)';
268 ferror.set(f[2], s, quiet);
269 ferror.set(f[3], s, quiet);
270 return 0;
271 } else
272 if(f[2].value == getBroadcastAddress(getNetworkAddress(f[2].value, f[3].value), f[3].value)) {
273 var s = 'Invalid IP address or subnet mask (the broadcast address cannot be used)';
274 ferror.set(f[2], s, quiet);
275 ferror.set(f[3], s, quiet);
276 return 0;
277 } else
278 if (this.countOverlappingNetworks(f[2].value) > 0) {
279 var s = 'Invalid IP address or subnet mask (conflicts/overlaps with another LAN bridge)';
280 ferror.set(f[2], s, quiet);
281 ferror.set(f[3], s, quiet);
282 return 0;
283 } else {
284 ferror.clear(f[2]);
285 ferror.clear(f[3]);
287 } else {
288 f[4].checked = 0;
289 f[4].disabled = 1;
291 // dhcp enabled?
292 if( (f[4].checked) && (v_ip(f[2], 1)) && (v_netmask(f[3],1)) ) {
293 f[5].disabled = 0;
294 f[6].disabled = 0;
295 f[7].disabled = 0;
296 // first/last IP still unset?
297 if (f[5].value == '') {
298 var l;
299 var m = aton(f[2].value) & aton(f[3].value);
300 var o = (m) ^ (~ aton(f[3].value))
301 var n = o - m;
302 do {
303 if (--n < 0) {
304 f[5].value = '';
305 return;
307 m++;
308 } while (((l = fixIP(ntoa(m), 1)) == null) || (l == f[2].value) );
309 f[5].value = l;
311 if (f[6].value == '') {
312 var l;
313 var m = aton(f[2].value) & aton(f[3].value);
314 var o = (m) ^ (~ aton(f[3].value));
315 var n = o - m;
316 do {
317 if (--n < 0) {
318 f[6].value = '';
319 return;
321 o--;
322 } while (((l = fixIP(ntoa(o), 1)) == null) || (l == f[2].value) );
323 f[6].value = l;
325 // first IP valid?
326 if ((getNetworkAddress(f[5].value, f[3].value) != getNetworkAddress(f[2].value, f[3].value)) ||
327 (f[5].value == getBroadcastAddress(getNetworkAddress(f[2].value, f[3].value), f[3].value)) ||
328 (f[5].value == getNetworkAddress(f[2].value, f[3].value)) ||
329 (f[2].value == f[5].value)) {
330 ferror.set(f[5], 'Invalid first IP address or subnet mask', quiet || !ok);
331 return 0;
332 } else {
333 ferror.clear(f[5]);
335 // last IP valid?
336 if ((getNetworkAddress(f[6].value, f[3].value) != getNetworkAddress(f[2].value, f[3].value)) ||
337 (f[6].value == getBroadcastAddress(getNetworkAddress(f[2].value, f[3].value), f[3].value)) ||
338 (f[6].value == getNetworkAddress(f[2].value, f[3].value)) ||
339 (f[2].value == f[6].value)) {
340 ferror.set(f[6], 'Invalid last IP address or subnet mask', quiet || !ok);
341 return 0;
342 } else {
343 ferror.clear(f[6]);
345 // validate range, swap first/last IP if needed
346 if (aton(f[6].value) < aton(f[5].value)) {
347 var t = f[5].value;
348 f[5].value = f[6].value;
349 f[6].value = t;
351 // lease time
352 if (parseInt(f[7].value*1) == 0)
353 f[7].value = 1440; // from nvram/defaults.c
354 if(!v_mins(f[7], quiet || !ok, 1, 10080))
355 ok = 0;
356 } else {
357 f[5].disabled = 1;
358 f[6].disabled = 1;
359 f[7].disabled = 1;
360 ferror.clear(f[5]);
361 ferror.clear(f[6]);
362 ferror.clear(f[7]);
364 return ok;
366 /* VLAN-END */
368 W('<style type=\'text/css\'>');
369 for (var u = 0; u < wl_ifaces.length; ++u) {
370 W('#spin'+wl_unit(u)+', ');
372 W('#spin {');
373 W(' visibility: hidden;');
374 W(' vertical-align: middle;');
375 W('}');
376 W('</style>');
378 var xob = null;
379 var refresher = [];
380 var nphy = features('11n');
382 /* NOVLAN-BEGIN */
383 if ((!fixIP(nvram.dhcpd_startip)) || (!fixIP(nvram.dhcpd_endip))) {
384 var x = nvram.lan_ipaddr.split('.').splice(0, 3).join('.') + '.';
385 nvram.dhcpd_startip = x + nvram.dhcp_start;
386 nvram.dhcpd_endip = x + ((nvram.dhcp_start * 1) + (nvram.dhcp_num * 1) - 1);
388 /* NOVLAN-END */
390 var ghz = [];
391 var bands = [];
392 var nm_loaded = [], ch_loaded = [], max_channel = [];
394 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
395 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
396 if (wl_sunit(uidx)<0) {
397 var b;
398 b = [];
399 for (var i = 0; i < wl_bands[uidx].length; ++i) {
400 b.push([wl_bands[uidx][i] + '', (wl_bands[uidx][i] == '1') ? '5 GHz' : '2.4 GHz']);
402 bands.push(b);
404 b = [];
405 ghz.push(b);
407 nm_loaded.push(0);
408 ch_loaded.push(0);
409 max_channel.push(0);
410 refresher.push(null);
414 function selectedBand(uidx)
416 if (bands[uidx].length > 1) {
417 var e = E('_f_wl'+u+'_nband');
418 return (e.value + '' == '' ? eval('nvram.wl'+u+'_nband') : e.value);
419 } else if (bands[uidx].length > 0) {
420 return bands[uidx][0][0] || '0';
421 } else {
422 return '0';
426 function refreshNetModes(uidx)
428 var e, i, buf, val;
430 if (uidx >= wl_ifaces.length) return;
431 var u = wl_unit(uidx);
433 var m = [['mixed','Auto']];
434 if (selectedBand(uidx) == '1') {
435 m.push(['a-only','A Only']);
436 if (nphy) {
437 m.push(['n-only','N Only']);
440 else {
441 m.push(['b-only','B Only']);
442 m.push(['g-only','G Only']);
443 if (nphy) {
444 m.push(['bg-mixed','B/G Mixed']);
445 m.push(['n-only','N Only']);
449 e = E('_wl'+u+'_net_mode');
450 buf = '';
451 val = (!nm_loaded[uidx] || (e.value + '' == '')) ? eval('nvram.wl'+u+'_net_mode') : e.value;
452 if (val == 'disabled') val = 'mixed';
453 for (i = 0; i < m.length; ++i)
454 buf += '<option value="' + m[i][0] + '"' + ((m[i][0] == val) ? ' selected' : '') + '>' + m[i][1] + '</option>';
456 e = E('__wl'+u+'_net_mode');
457 buf = '<select name="wl'+u+'_net_mode" onchange="verifyFields(this, 1)" id = "_wl'+u+'_net_mode">' + buf + '</select>';
458 elem.setInnerHTML(e, buf);
459 nm_loaded[uidx] = 1;
462 function refreshChannels(uidx)
464 if (refresher[uidx] != null) return;
465 if (u >= wl_ifaces.length) return;
466 var u = wl_unit(uidx);
468 refresher[uidx] = new XmlHttp();
469 refresher[uidx].onCompleted = function(text, xml) {
470 try {
471 var e, i, buf, val;
473 var wl_channels = [];
474 eval(text);
476 ghz[uidx] = [];
477 max_channel[uidx] = 0;
478 for (i = 0; i < wl_channels.length; ++i) {
479 ghz[uidx].push([wl_channels[i][0] + '',
480 (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']);
481 max_channel[uidx] = wl_channels[i][0] * 1;
484 e = E('_wl'+u+'_channel');
485 buf = '';
486 val = (!ch_loaded[uidx] || (e.value + '' == '')) ? eval('nvram.wl'+u+'_channel') : e.value;
487 for (i = 0; i < ghz[uidx].length; ++i)
488 buf += '<option value="' + ghz[uidx][i][0] + '"' + ((ghz[uidx][i][0] == val) ? ' selected' : '') + '>' + ghz[uidx][i][1] + '</option>';
490 e = E('__wl'+u+'_channel');
491 buf = '<select name="wl'+u+'_channel" onchange="verifyFields(this, 1)" id = "_wl'+u+'_channel">' + buf + '</select>';
492 elem.setInnerHTML(e, buf);
493 ch_loaded[uidx] = 1;
495 refresher[uidx] = null;
496 verifyFields(null, 1);
498 catch (x) {
500 refresher[uidx] = null;
503 var bw, sb, e;
505 e = E('_f_wl'+u+'_nctrlsb');
506 sb = (e.value + '' == '' ? eval('nvram.wl'+u+'_nctrlsb') : e.value);
507 e = E('_wl'+u+'_nbw_cap');
508 bw = (e.value + '' == '' ? eval('nvram.wl'+u+'_nbw_cap') : e.value) == '0' ? '20' : '40';
510 refresher[uidx].onError = function(ex) { alert(ex); refresher[uidx] = null; reloadPage(); }
511 refresher[uidx].post('update.cgi', 'exec=wlchannels&arg0=' + u + '&arg1=' + (nphy ? '1' : '0') +
512 '&arg2=' + bw + '&arg3=' + selectedBand(uidx) + '&arg4=' + sb);
515 function spin(x, unit)
517 for (var u = 0; u < wl_ifaces.length; ++u) {
518 E('_f_wl'+wl_unit(u)+'_scan').disabled = x;
520 var e = E('_f_wl'+unit+'_scan');
521 if (x) e.value = 'Scan ' + (wscan.tries + 1);
522 else e.value = 'Scan';
523 E('spin'+unit).style.visibility = x ? 'visible' : 'hidden';
526 function scan()
528 if (xob) return;
530 var unit = wscan.unit;
531 var uidx = wl_uidx(unit);
533 xob = new XmlHttp();
534 xob.onCompleted = function(text, xml) {
535 try {
536 var i;
538 wlscandata = [];
539 eval(text);
541 for (i = 0; i < wlscandata.length; ++i) {
542 var data = wlscandata[i];
543 var ch = data[2];
544 var mac = data[0];
546 if (!wscan.inuse[ch]) {
547 wscan.inuse[ch] = {
548 count: 0,
549 rssi: -999,
550 ssid: ''
554 if (!wscan.seen[mac]) {
555 wscan.seen[mac] = 1;
556 ++wscan.inuse[ch].count;
559 if (data[4] > wscan.inuse[ch].rssi) {
560 wscan.inuse[ch].rssi = data[4];
561 wscan.inuse[ch].ssid = data[1];
564 var e = E('_wl'+unit+'_channel');
565 for (i = 1; i < ghz[uidx].length; ++i) {
566 var s = ghz[uidx][i][1];
567 var u = wscan.inuse[ghz[uidx][i][0]];
568 if (u) s += ' (' + u.count + ' AP' + (u.count == 1 ? '' : 's') + ' / strongest: "' + escapeHTML(ellipsis(u.ssid, 15)) + '" ' + u.rssi + ' dBm)';
569 e.options[i].innerHTML = s;
571 e.style.width = '400px';
573 xob = null;
575 if (wscan.tries < 4) {
576 ++wscan.tries;
577 setTimeout(scan, 1000);
578 return;
581 catch (x) {
583 spin(0, unit);
585 xob.onError = function(x) {
586 alert('error: ' + x);
587 spin(0, unit);
588 xob = null;
591 spin(1, unit);
592 xob.post('update.cgi', 'exec=wlscan&arg0='+unit);
595 function scanButton(u)
597 if (xob) return;
599 wscan = {
600 unit: u,
601 seen: [],
602 inuse: [],
603 tries: 0
606 scan();
609 function joinAddr(a) {
610 var r, i, s;
612 r = [];
613 for (i = 0; i < a.length; ++i) {
614 s = a[i];
615 if ((s != '00:00:00:00:00:00') && (s != '0.0.0.0')) r.push(s);
617 return r.join(' ');
620 function random_x(max)
622 var c = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
623 var s = '';
624 while (max-- > 0) s += c.substr(Math.floor(c.length * Math.random()), 1);
625 return s;
628 function random_psk(id)
630 var e = E(id);
631 e.value = random_x(63);
632 verifyFields(null, 1);
635 function random_wep(u)
637 E('_wl'+u+'_passphrase').value = random_x(16);
638 generate_wep(u);
641 function v_wep(e, quiet)
643 var s = e.value;
645 if (((s.length == 5) || (s.length == 13)) && (s.length == (e.maxLength >> 1))) {
646 // no checking
648 else {
649 s = s.toUpperCase().replace(/[^0-9A-F]/g, '');
650 if (s.length != e.maxLength) {
651 ferror.set(e, 'Invalid WEP key. Expecting ' + e.maxLength + ' hex or ' + (e.maxLength >> 1) + ' ASCII characters.', quiet);
652 return 0;
656 e.value = s;
657 ferror.clear(e);
658 return 1;
661 // compatible w/ Linksys' and Netgear's (key 1) method for 128-bits
662 function generate_wep(u)
664 function _wepgen(pass, i)
666 while (pass.length < 64) pass += pass;
667 return hex_md5(pass.substr(0, 64)).substr(i, (E('_wl'+u+'_wep_bit').value == 128) ? 26 : 10);
670 var e = E('_wl'+u+'_passphrase');
671 var pass = e.value;
672 if (!v_length(e, false, 3)) return;
673 E('_wl'+u+'_key1').value = _wepgen(pass, 0);
674 pass += '#$%';
675 E('_wl'+u+'_key2').value = _wepgen(pass, 2);
676 pass += '!@#';
677 E('_wl'+u+'_key3').value = _wepgen(pass, 4);
678 pass += '%&^';
679 E('_wl'+u+'_key4').value = _wepgen(pass, 6);
680 verifyFields(null, 1);
683 function verifyFields(focused, quiet)
685 var i;
686 var ok = 1;
687 var a, b, c, d, e;
688 var u, uidx;
689 var wmode, sm2;
691 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
692 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
693 if (wl_sunit(uidx)<0) {
694 u = wl_unit(uidx);
695 if (focused == E('_f_wl'+u+'_nband')) {
696 refreshNetModes(uidx);
697 refreshChannels(uidx);
699 else if (focused == E('_f_wl'+u+'_nctrlsb') || focused == E('_wl'+u+'_nbw_cap')) {
700 refreshChannels(uidx);
705 // --- visibility ---
707 var vis = {
708 _wan_proto: 1,
709 _ppp_username: 1,
710 _ppp_passwd: 1,
711 _ppp_service: 1,
712 _ppp_custom: 1,
713 _l2tp_server_ip: 1,
714 _wan_ipaddr: 1,
715 _wan_netmask: 1,
716 _wan_gateway: 1,
717 _pptp_server_ip: 1,
718 _f_pptp_dhcp: 1,
719 _ppp_demand: 1,
720 _ppp_idletime: 1,
721 _ppp_redialperiod: 1,
722 _mtu_enable: 1,
723 _f_wan_mtu: 1,
724 _f_wan_islan: 0,
725 _f_ppp_mlppp: 1,
726 _modem_ipaddr: 1,
728 /* NOVLAN-BEGIN */
729 _dhcp_lease: 1,
730 _f_dhcpd_enable: 1,
731 _dhcpd_startip: 1,
732 _dhcpd_endip: 1,
733 _lan_ipaddr: 1,
734 _lan_netmask: 1,
735 /* NOVLAN-END */
736 _f_dns_1: 1,
737 _f_dns_2: 1,
738 _f_dns_3: 1,
739 _lan_gateway: 1,
740 _wan_wins: 1
743 var wl_vis = [];
744 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
745 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
746 if (wl_sunit(uidx)<0) {
747 a = {
748 _f_wl_radio: 1,
749 _f_wl_mode: 1,
750 _f_wl_nband: (bands[uidx].length > 1) ? 1 : 0,
751 _wl_net_mode: 1,
752 _wl_ssid: 1,
753 _f_wl_bcast: 1,
754 _wl_channel: 1,
755 _wl_nbw_cap: nphy ? 1 : 0,
756 _f_wl_nctrlsb: nphy ? 1 : 0,
757 _f_wl_scan: 1,
759 _wl_security_mode: 1,
760 _wl_crypto: 1,
761 _wl_wpa_psk: 1,
762 _f_wl_psk_random1: 1,
763 _f_wl_psk_random2: 1,
764 _wl_wpa_gtk_rekey: 1,
765 _wl_radius_key: 1,
766 _wl_radius_ipaddr: 1,
767 _wl_radius_port: 1,
768 _wl_wep_bit: 1,
769 _wl_passphrase: 1,
770 _f_wl_wep_gen: 1,
771 _f_wl_wep_random: 1,
772 _wl_key1: 1,
773 _wl_key2: 1,
774 _wl_key3: 1,
775 _wl_key4: 1,
777 _f_wl_lazywds: 1,
778 _f_wl_wds_0: 1
780 wl_vis.push(a);
784 var wan = E('_wan_proto').value;
786 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
787 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
788 if (wl_sunit(uidx)<0) {
789 wmode = E('_f_wl'+wl_unit(uidx)+'_mode').value;
791 if (wmode == 'wet') {
792 wan = 'disabled';
793 vis._wan_proto = 0;
794 /* NOVLAN-BEGIN */
795 vis._f_dhcpd_enable = 0;
796 vis._dhcp_lease = 0;
797 /* NOVLAN-END */
800 if ((wan == 'disabled') || (wmode == 'sta') || (wmode == 'wet')) {
801 vis._f_wan_islan = 1;
806 switch (wan) {
807 case 'disabled':
808 vis._ppp_username = 0;
809 vis._ppp_service = 0;
810 vis._ppp_custom = 0;
811 vis._l2tp_server_ip = 0;
812 vis._wan_ipaddr = 0;
813 vis._wan_netmask = 0;
814 vis._wan_gateway = 0;
815 vis._pptp_server_ip = 0;
816 vis._f_pptp_dhcp = 0;
817 vis._ppp_demand = 0;
818 vis._mtu_enable = 0;
819 vis._f_wan_mtu = 0;
820 vis._f_ppp_mlppp = 0;
821 vis._modem_ipaddr = 0;
822 break;
823 case 'dhcp':
824 vis._l2tp_server_ip = 0;
825 vis._ppp_demand = 0;
826 vis._ppp_service = 0;
827 vis._ppp_username = 0;
828 vis._ppp_custom = 0;
829 vis._pptp_server_ip = 0;
830 vis._f_pptp_dhcp = 0;
831 vis._wan_gateway = 0;
832 vis._wan_ipaddr = 0;
833 vis._wan_netmask = 0;
834 vis._f_ppp_mlppp = 0;
835 vis._modem_ipaddr = 1;
837 vis._lan_gateway = 0;
838 break;
839 case 'pppoe':
840 vis._l2tp_server_ip = 0;
841 vis._pptp_server_ip = 0;
842 vis._f_pptp_dhcp = 0;
843 vis._wan_gateway = 0;
844 vis._wan_ipaddr = 0;
845 vis._wan_netmask = 0;
846 vis._modem_ipaddr = 1;
848 vis._lan_gateway = 0;
849 break;
850 case 'static':
851 vis._l2tp_server_ip = 0;
852 vis._ppp_demand = 0;
853 vis._ppp_service = 0;
854 vis._ppp_username = 0;
855 vis._ppp_custom = 0;
856 vis._pptp_server_ip = 0;
857 vis._f_pptp_dhcp = 0;
858 vis._f_ppp_mlppp = 0;
859 vis._modem_ipaddr = 1;
861 vis._lan_gateway = 0;
862 break;
863 case 'pptp':
864 vis._l2tp_server_ip = 0;
865 vis._ppp_service = 0;
866 vis._wan_gateway = (!E('_f_pptp_dhcp').checked);
867 vis._wan_ipaddr = (!E('_f_pptp_dhcp').checked);
868 vis._modem_ipaddr = 0;
870 vis._lan_gateway = 0;
871 break;
872 case 'l2tp':
873 vis._pptp_server_ip = 0;
874 vis._ppp_service = 0;
875 vis._wan_gateway = (!E('_f_pptp_dhcp').checked);
876 vis._wan_ipaddr = (!E('_f_pptp_dhcp').checked);
877 vis._modem_ipaddr = 0;
879 vis._lan_gateway = 0;
880 break;
883 vis._ppp_idletime = (E('_ppp_demand').value == 1) && vis._ppp_demand
884 vis._ppp_redialperiod = !vis._ppp_idletime && vis._ppp_demand;
886 if (vis._mtu_enable) {
887 if (E('_mtu_enable').value == 0) {
888 vis._f_wan_mtu = 2;
889 a = E('_f_wan_mtu');
890 switch (E('_wan_proto').value) {
891 case 'pppoe':
892 a.value = 1492;
893 break;
894 case 'pptp':
895 case 'l2tp':
896 a.value = 1460;
897 break;
898 default:
899 a.value = 1500;
900 break;
905 /* NOVLAN-BEGIN */
906 if (!E('_f_dhcpd_enable').checked) vis._dhcp_lease = 0;
907 /* NOVLAN-END */
909 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
910 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
911 if (wl_sunit(uidx)<0) {
912 u = wl_unit(uidx);
913 wmode = E('_f_wl'+u+'_mode').value;
915 if (!E('_f_wl'+u+'_radio').checked) {
916 for (a in wl_vis[uidx]) {
917 wl_vis[uidx][a] = 2;
919 wl_vis[uidx]._f_wl_radio = 1;
920 wl_vis[uidx]._wl_nbw_cap = nphy ? 2 : 0;
921 wl_vis[uidx]._f_wl_nband = (bands[uidx].length > 1) ? 2 : 0;
924 switch (wmode) {
925 case 'apwds':
926 case 'wds':
927 break;
928 case 'wet':
929 case 'sta':
930 wl_vis[uidx]._f_wl_bcast = 0;
931 wl_vis[uidx]._wl_channel = 0;
932 wl_vis[uidx]._wl_nbw_cap = 0;
933 vis._modem_ipaddr = 0;
934 default:
935 wl_vis[uidx]._f_wl_lazywds = 0;
936 wl_vis[uidx]._f_wl_wds_0 = 0;
937 break;
940 sm2 = E('_wl'+u+'_security_mode').value;
941 switch (sm2) {
942 case 'disabled':
943 wl_vis[uidx]._wl_crypto = 0;
944 wl_vis[uidx]._wl_wep_bit = 0;
945 wl_vis[uidx]._wl_wpa_psk = 0;
946 wl_vis[uidx]._wl_radius_key = 0;
947 wl_vis[uidx]._wl_radius_ipaddr = 0;
948 wl_vis[uidx]._wl_wpa_gtk_rekey = 0;
949 break;
950 case 'wep':
951 wl_vis[uidx]._wl_crypto = 0;
952 wl_vis[uidx]._wl_wpa_psk = 0;
953 wl_vis[uidx]._wl_radius_key = 0;
954 wl_vis[uidx]._wl_radius_ipaddr = 0;
955 wl_vis[uidx]._wl_wpa_gtk_rekey = 0;
956 break;
957 case 'radius':
958 wl_vis[uidx]._wl_crypto = 0;
959 wl_vis[uidx]._wl_wpa_psk = 0;
960 break;
961 default: // wpa*
962 wl_vis[uidx]._wl_wep_bit = 0;
963 if (sm2.indexOf('personal') != -1) {
964 wl_vis[uidx]._wl_radius_key = 0;
965 wl_vis[uidx]._wl_radius_ipaddr = 0;
967 else {
968 wl_vis[uidx]._wl_wpa_psk = 0;
970 break;
973 if ((E('_f_wl'+u+'_lazywds').value == 1) && (wl_vis[uidx]._f_wl_wds_0 == 1)) {
974 wl_vis[uidx]._f_wl_wds_0 = 2;
977 if (wl_vis[uidx]._wl_nbw_cap != 0) {
978 switch (E('_wl'+u+'_net_mode').value) {
979 case 'b-only':
980 case 'g-only':
981 case 'a-only':
982 case 'bg-mixed':
983 wl_vis[uidx]._wl_nbw_cap = 2;
984 if (E('_wl'+u+'_nbw_cap').value != '0') {
985 E('_wl'+u+'_nbw_cap').value = 0;
986 refreshChannels(uidx);
988 break;
990 // avoid Enterprise-TKIP with 40MHz
991 if ((sm2 == 'wpa_enterprise') && (E('_wl'+u+'_crypto').value == 'tkip')) {
992 wl_vis[uidx]._wl_nbw_cap = 2;
993 if (E('_wl'+u+'_nbw_cap').value != '0') {
994 E('_wl'+u+'_nbw_cap').value = 0;
995 refreshChannels(uidx);
1000 wl_vis[uidx]._f_wl_nctrlsb = (E('_wl'+u+'_nbw_cap').value == 0) ? 0 : wl_vis[uidx]._wl_nbw_cap;
1002 /* REMOVE-BEGIN
1003 This is ugly...
1004 Special case - 2.4GHz band, currently running in B/G-only mode,
1005 with N/Auto and 40MHz selected in the GUI.
1006 Channel list is not filtered in this case by the wl driver,
1007 and includes all channels available with 20MHz channel width.
1008 REMOVE-END */
1009 b = selectedBand(uidx);
1010 if (wl_vis[uidx]._wl_channel == 1 && wl_vis[uidx]._f_wl_nctrlsb != 0 &&
1011 ((b == '2') || (wl_vis[uidx]._f_wl_nband == 0 && b == '0'))) {
1012 switch (eval('nvram.wl'+u+'_net_mode')) {
1013 case 'b-only':
1014 case 'g-only':
1015 case 'bg-mixed':
1016 i = E('_wl'+u+'_channel').value * 1;
1017 if (i > 0 && i < 5) {
1018 E('_f_wl'+u+'_nctrlsb').value = 'lower';
1019 wl_vis[uidx]._f_wl_nctrlsb = 2;
1021 else if (i > max_channel[uidx] - 4) {
1022 E('_f_wl'+u+'_nctrlsb').value = 'upper';
1023 wl_vis[uidx]._f_wl_nctrlsb = 2;
1025 break;
1029 wl_vis[uidx]._f_wl_scan = wl_vis[uidx]._wl_channel;
1030 wl_vis[uidx]._f_wl_psk_random1 = wl_vis[uidx]._wl_wpa_psk;
1031 wl_vis[uidx]._f_wl_psk_random2 = wl_vis[uidx]._wl_radius_key;
1032 wl_vis[uidx]._wl_radius_port = wl_vis[uidx]._wl_radius_ipaddr;
1033 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;
1035 for (i = 1; i < 10; ++i) {
1036 wl_vis[uidx]['_f_wl_wds_' + i] = wl_vis[uidx]._f_wl_wds_0;
1039 } // for each wl_iface
1041 vis._ppp_passwd = vis._ppp_username;
1042 /* NOVLAN-BEGIN */
1043 vis._dhcpd_startip = vis._dhcpd_endip = vis._wan_wins = vis._dhcp_lease;
1044 /* NOVLAN-END */
1046 for (a in vis) {
1047 b = E(a);
1048 c = vis[a];
1049 /* REMOVE-BEGIN
1050 // if (b != null)
1051 REMOVE-END */
1052 b.disabled = (c != 1);
1053 PR(b).style.display = c ? '' : 'none';
1056 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1057 if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1058 for (a in wl_vis[uidx]) {
1059 i = 3;
1060 if (a.substr(0, 6) == '_f_wl_') i = 5;
1061 b = E(a.substr(0, i) + wl_unit(uidx) + a.substr(i, a.length));
1062 c = wl_vis[uidx][a];
1063 b.disabled = (c != 1);
1064 PR(b).style.display = c ? '' : 'none';
1069 // --- verify ---
1071 ferror.clear('_wan_proto');
1073 var wlclnt = 0;
1074 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1075 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1076 if (wl_sunit(uidx)<0) {
1077 u = wl_unit(uidx);
1078 wmode = E('_f_wl'+u+'_mode').value;
1079 sm2 = E('_wl'+u+'_security_mode').value;
1081 /* REMOVE-BEGIN
1082 if ((wl_vis[uidx]._f_wl_mode == 1) && (wmode != 'ap') && (sm2.substr(0, 4) == 'wpa2')) {
1083 ferror.set('_wl'+u+'_security_mode', 'WPA2 is supported only in AP mode.', quiet || !ok);
1084 ok = 0;
1086 else ferror.clear('_wl'+u+'_security_mode');
1087 REMOVE-END */
1089 // --- N standard does not support WPA+TKIP ---
1090 a = E('_wl'+u+'_crypto');
1091 switch (E('_wl'+u+'_net_mode').value) {
1092 case 'mixed':
1093 case 'n-only':
1094 if (nphy && (a.value == 'tkip') && (sm2.indexOf('wpa') != -1)) {
1095 ferror.set(a, 'TKIP encryption is not supported with WPA / WPA2 in N mode.', quiet || !ok);
1096 ok = 0;
1098 else ferror.clear(a);
1099 break;
1102 a = E('_wl'+u+'_net_mode');
1103 ferror.clear(a);
1104 b = E('_f_wl'+u+'_mode');
1105 ferror.clear(b);
1106 if ((wmode == 'sta') || (wmode == 'wet')) {
1107 ++wlclnt;
1108 if (wlclnt > 1) {
1109 ferror.set(b, 'Only one wireless interface can be configured in client mode.', quiet || !ok);
1110 ok = 0;
1112 else if (a.value == 'n-only') {
1113 ferror.set(a, 'N-only is not supported in wireless client modes, use Auto.', quiet || !ok);
1114 ok = 0;
1118 a = E('_wl'+u+'_wpa_psk');
1119 ferror.clear(a);
1120 if (wl_vis[uidx]._wl_wpa_psk == 1) {
1121 if ((a.value.length < 8) || ((a.value.length == 64) && (a.value.search(/[^0-9A-Fa-f]/) != -1))) {
1122 ferror.set('_wl'+u+'_wpa_psk', 'Invalid pre-shared key. Please enter at least 8 characters or 64 hexadecimal digits.', quiet || !ok);
1123 ok = 0;
1127 // wl channel
1128 if (((wmode == 'wds') || (wmode == 'apwds')) && (wl_vis[uidx]._wl_channel == 1) && (E('_wl'+u+'_channel').value == '0')) {
1129 ferror.set('_wl'+u+'_channel', 'Fixed wireless channel required in WDS mode.', quiet || !ok);
1130 ok = 0;
1132 else ferror.clear('_wl'+u+'_channel');
1134 if (E('_f_wl'+u+'_mode').value == 'sta') {
1135 if ((wan == 'disabled') && (E('_f_wl'+u+'_radio').checked)) {
1136 ferror.set('_wan_proto', 'Wireless Client mode requires a valid WAN setting (usually DHCP).', quiet || !ok);
1137 ok = 0;
1143 // domain name or IP address
1144 a = ['_l2tp_server_ip', '_pptp_server_ip'];
1145 for (i = a.length - 1; i >= 0; --i)
1146 if ((vis[a[i]]) && ((!v_length(a[i], 1, 1)) || ((!v_ip(a[i], 1)) && (!v_domain(a[i], 1))))) {
1147 if (!quiet && ok) ferror.show(a[i]);
1148 ok = 0;
1151 // IP address
1152 /* NOVLAN-BEGIN */
1153 a = ['_wan_gateway','_wan_ipaddr','_lan_ipaddr', '_dhcpd_startip', '_dhcpd_endip'];
1154 /* NOVLAN-END */
1155 /* VLAN-BEGIN */
1156 a = ['_wan_gateway','_wan_ipaddr'];
1157 /* VLAN-END */
1158 for (i = a.length - 1; i >= 0; --i)
1159 if ((vis[a[i]]) && (!v_ip(a[i], quiet || !ok))) ok = 0;
1161 // IP address, blank -> 0.0.0.0
1162 a = ['_f_dns_1', '_f_dns_2', '_f_dns_3','_wan_wins','_lan_gateway', '_modem_ipaddr'];
1163 for (i = a.length - 1; i >= 0; --i)
1164 if ((vis[a[i]]) && (!v_dns(a[i], quiet || !ok))) ok = 0;
1166 // netmask
1167 /* NOVLAN-BEGIN */
1168 a = ['_wan_netmask','_lan_netmask'];
1169 /* NOVLAN-END */
1170 /* VLAN-BEGIN */
1171 a = ['_wan_netmask'];
1172 /* VLAN-END */
1173 for (i = a.length - 1; i >= 0; --i)
1174 if ((vis[a[i]]) && (!v_netmask(a[i], quiet || !ok))) ok = 0;
1176 // range
1177 /* NOVLAN-BEGIN */
1178 a = [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500],
1179 ['_dhcp_lease', 1, 10080]];
1180 /* NOVLAN-END */
1181 /* VLAN-BEGIN */
1182 a = [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500]];
1183 /* VLAN-END */
1184 for (i = a.length - 1; i >= 0; --i) {
1185 v = a[i];
1186 if ((vis[v[0]]) && (!v_range(v[0], quiet || !ok, v[1], v[2]))) ok = 0;
1189 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1190 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1191 if (wl_sunit(uidx)<0) {
1192 u = wl_unit(uidx);
1194 // IP address
1195 a = ['_radius_ipaddr'];
1196 for (i = a.length - 1; i >= 0; --i) {
1197 if ((wl_vis[uidx]['_wl'+a[i]]) && (!v_ip('_wl'+u+a[i], quiet || !ok))) ok = 0;
1200 // range
1201 a = [['_wpa_gtk_rekey', 60, 7200], ['_radius_port', 1, 65535]];
1202 for (i = a.length - 1; i >= 0; --i) {
1203 v = a[i];
1204 if ((wl_vis[uidx]['_wl'+v[0]]) && (!v_range('_wl'+u+v[0], quiet || !ok, v[1], v[2]))) ok = 0;
1207 // length
1208 a = [['_ssid', 1], ['_radius_key', 1]];
1209 for (i = a.length - 1; i >= 0; --i) {
1210 v = a[i];
1211 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;
1214 if (wl_vis[uidx]._wl_key1) {
1215 a = (E('_wl'+u+'_wep_bit').value == 128) ? 26 : 10;
1216 for (i = 1; i <= 4; ++i) {
1217 b = E('_wl'+u+'_key' + i);
1218 b.maxLength = a;
1219 if ((b.value.length > 0) || (E('_f_wl'+u+'_wepidx_' + i).checked)) {
1220 if (!v_wep(b, quiet || !ok)) ok = 0;
1222 else ferror.clear(b);
1226 ferror.clear('_f_wl'+u+'_wds_0');
1227 if (wl_vis[uidx]._f_wl_wds_0 == 1) {
1228 b = 0;
1229 for (i = 0; i < 10; ++i) {
1230 a = E('_f_wl'+u+'_wds_' + i);
1231 if (!v_macz(a, quiet || !ok)) ok = 0;
1232 else if (!isMAC0(a.value)) b = 1;
1234 if (!b) {
1235 ferror.set('_f_wl'+u+'_wds_0', 'WDS MAC address required.', quiet || !ok);
1236 ok = 0;
1242 /* NOVLAN-BEGIN */
1243 a = E('_dhcpd_startip');
1244 b = E('_dhcpd_endip');
1245 ferror.clear(a);
1246 ferror.clear(b);
1248 if ((vis._dhcp_lease) && (!a._error_msg) && (!b._error_msg)) {
1249 c = aton(E('_lan_netmask').value);
1250 d = aton(E('_lan_ipaddr').value) & c;
1251 e = 'Invalid IP address or subnet mask';
1252 if ((aton(a.value) & c) != d) {
1253 ferror.set(a, e, quiet || !ok);
1254 ok = 0;
1256 if ((aton(b.value) & c) != d) {
1257 ferror.set(b, e, quiet || !ok);
1258 ok = 0;
1262 if ((vis._dhcp_lease) && (!a._error_msg) && (!b._error_msg)) {
1263 if (aton(a.value) > aton(b.value)) {
1264 c = a.value;
1265 a.value = b.value;
1266 b.value = c;
1269 elem.setInnerHTML('dhcp_count', '(' + ((aton(b.value) - aton(a.value)) + 1) + ')');
1272 /* REMOVE-BEGIN */
1273 /* TODO: same validation for builds with VLAN-GUI enabled */
1274 /* REMOVE-END */
1275 ferror.clear('_modem_ipaddr');
1276 a = E('_modem_ipaddr');
1277 b = E('_lan_ipaddr');
1278 c = E('_lan_netmask');
1279 if ( vis['_modem_ipaddr'] && !(a._error_msg || b._error_msg || c._error_msg) && a.value != "0.0.0.0" ) {
1280 c = aton(c.value);
1281 if ( (aton(a.value) & c) == (aton(b.value) & c) ) {
1282 ferror.set('_modem_ipaddr', 'Modem IP address may not be within your local address space.', quiet);
1283 ok = 0;
1286 /* NOVLAN-END */
1288 return ok;
1291 function earlyInit()
1293 verifyFields(null, 1);
1296 function save()
1298 /* VLAN-BEGIN */
1299 if (lg.isEditing()) return;
1300 lg.resetNewEditor();
1301 /* VLAN-END */
1303 var a, b, c;
1304 var i;
1305 var u, uidx, wmode, sm2, wradio;
1307 if (!verifyFields(null, false)) return;
1309 var fom = E('_fom');
1311 fom.wan_mtu.value = fom.f_wan_mtu.value;
1312 fom.wan_mtu.disabled = fom.f_wan_mtu.disabled;
1314 /* NOVLAN-BEGIN */
1315 fom.lan_proto.value = fom.f_dhcpd_enable.checked ? 'dhcp' : 'static';
1316 /* NOVLAN-END */
1318 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1319 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1320 if (wl_sunit(uidx)<0) {
1321 u = wl_unit(uidx);
1322 wmode = E('_f_wl'+u+'_mode').value;
1323 sm2 = E('_wl'+u+'_security_mode').value;
1324 wradio = E('_f_wl'+u+'_radio').checked;
1326 E('_wl'+u+'_nband').value = selectedBand(uidx);
1328 if (wmode == 'apwds') E('_wl'+u+'_mode').value = 'ap';
1329 else E('_wl'+u+'_mode').value = wmode;
1331 if (wmode == 'wet') {
1332 fom.wan_proto.value = 'disabled';
1333 fom.wan_proto.disabled = 0;
1334 /* NOVLAN-BEGIN */
1335 fom.lan_proto.value = 'static';
1336 /* NOVLAN-END */
1337 /* VLAN-BEGIN */
1338 /* REMOVE-BEGIN */
1339 // TODO - what's required ? integrate with tomatogrid?
1340 /* REMOVE-END */
1341 /* VLAN-END */
1344 a = [];
1345 for (i = 0; i < 10; ++i) a.push(E('_f_wl'+u+'_wds_' + i).value);
1346 E('_wl'+u+'_wds').value = joinAddr(a);
1348 if (wmode.indexOf('wds') != -1) {
1349 E('_wl'+u+'_wds_enable').value = 1;
1350 E('_wl'+u+'_lazywds').value = E('_f_wl'+u+'_lazywds').value;
1351 if (E('_wl'+u+'_lazywds').value == 1) E('_wl'+u+'_wds').value = '';
1353 else {
1354 E('_wl'+u+'_wds_enable').value = 0;
1355 E('_wl'+u+'_wds').value = '';
1356 E('_wl'+u+'_lazywds').value = 0;
1359 E('_wl'+u+'_radio').value = wradio ? 1 : 0;
1360 E('_wl'+u+'_auth').value = eval('nvram.wl'+u+'_auth');
1362 e = E('_wl'+u+'_akm');
1363 switch (sm2) {
1364 case 'disabled':
1365 case 'radius':
1366 case 'wep':
1367 e.value = '';
1368 break;
1369 default:
1370 c = [];
1372 if (sm2.indexOf('personal') != -1) {
1373 if (sm2.indexOf('wpa2_') == -1) c.push('psk');
1374 if (sm2.indexOf('wpa_') == -1) c.push('psk2');
1376 else {
1377 if (sm2.indexOf('wpa2_') == -1) c.push('wpa');
1378 if (sm2.indexOf('wpa_') == -1) c.push('wpa2');
1380 c = c.join(' ');
1381 e.value = c;
1382 break;
1384 E('_wl'+u+'_auth_mode').value = (sm2 == 'radius') ? 'radius' : 'none';
1385 E('_wl'+u+'_wep').value = ((sm2 == 'radius') || (sm2 == 'wep')) ? 'enabled': 'disabled';
1387 if (sm2.indexOf('wpa') != -1) E('_wl'+u+'_auth').value = 0;
1389 E('_wl'+u+'_nreqd').value = 0;
1390 E('_wl'+u+'_gmode').value = 1;
1391 E('_wl'+u+'_nmode').value = 0;
1392 E('_wl'+u+'_nmcsidx').value = -2; // Legacy Rate
1393 E('_wl'+u+'_nbw').value = 0;
1394 switch (E('_wl'+u+'_net_mode').value) {
1395 case 'b-only':
1396 E('_wl'+u+'_gmode').value = 0;
1397 break;
1398 case 'g-only':
1399 E('_wl'+u+'_gmode').value = 4;
1400 break;
1401 case 'bg-mixed':
1402 break;
1403 case 'a-only':
1404 E('_wl'+u+'_nmcsidx').value = -1; // Auto
1405 break;
1406 case 'n-only':
1407 if (selectedBand(uidx) == '1') { // 5 GHz
1408 E('_wl'+u+'_nmode').value = -1;
1409 E('_wl'+u+'_nmcsidx').value = -1;
1410 } else {
1411 E('_wl'+u+'_nmode').value = 1;
1412 E('_wl'+u+'_nmcsidx').value = 32;
1414 E('_wl'+u+'_nreqd').value = 1;
1415 break;
1416 default: // Auto
1417 E('_wl'+u+'_nmode').value = -1;
1418 E('_wl'+u+'_nmcsidx').value = -1;
1419 break;
1422 E('_wl'+u+'_nctrlsb').value = eval('nvram.wl'+u+'_nctrlsb');
1423 if (E('_wl'+u+'_nmode').value != 0) {
1424 E('_wl'+u+'_nctrlsb').value = E('_f_wl'+u+'_nctrlsb').value;
1425 E('_wl'+u+'_nbw').value = (E('_wl'+u+'_nbw_cap').value == 0) ? 20 : 40;
1428 E('_wl'+u+'_closed').value = E('_f_wl'+u+'_bcast').checked ? 0 : 1;
1430 a = fields.radio.selected(eval('fom.f_wl'+u+'_wepidx'));
1431 if (a) E('_wl'+u+'_key').value = a.value;
1435 fom.wan_islan.value = fom.f_wan_islan.checked ? 1 : 0;
1436 fom.pptp_dhcp.value = fom.f_pptp_dhcp.checked ? 1 : 0;
1438 fom.wan_dns.value = joinAddr([fom.f_dns_1.value, fom.f_dns_2.value, fom.f_dns_3.value]);
1440 /* VLAN-BEGIN */
1441 // initialize/wipe out relevant fields
1442 for (var i = 0 ; i <= MAX_BRIDGE_ID ; i++) {
1443 var j = (i == 0) ? '' : i.toString();
1444 fom['lan' + j + '_ifname'].value = '';
1445 fom['lan' + j + '_ipaddr'].value = '';
1446 fom['lan' + j + '_netmask'].value = '';
1447 fom['lan' + j + '_proto'].value = '';
1448 fom['lan' + j + '_stp'].value = '';
1449 fom['dhcp' + j + '_start'].value = '';
1450 fom['dhcp' + j + '_num'].value = '';
1451 fom['dhcp' + j + '_lease'].value = '';
1452 fom['dhcpd' + j + '_startip'].value = '';
1453 fom['dhcpd' + j + '_endip'].value = '';
1456 var d = lg.getAllData();
1457 for (var i = 0; i < d.length; ++i) {
1459 if (lg.countOverlappingNetworks(d[i][2]) > 1) {
1460 var s = 'Cannot proceed: two or more LAN bridges have conflicting IP addresses or overlapping subnets';
1461 alert(s);
1462 var e = E('footer-msg');
1463 e.innerHTML = s;
1464 e.style.visibility = 'visible';
1465 setTimeout(
1466 function() {
1467 e.innerHTML = '';
1468 e.style.visibility = 'hidden';
1469 }, 5000);
1470 return;
1473 var j = (parseInt(d[i][0]) == 0) ? '' : d[i][0].toString();
1474 fom['lan' + j + '_ifname'].value = 'br' + d[i][0];
1475 fom['lan' + j + '_stp'].value = d[i][1];
1476 fom['lan' + j + '_ipaddr'].value = d[i][2];
1477 fom['lan' + j + '_netmask'].value = d[i][3];
1478 fom['lan' + j + '_proto'].value = (d[i][4] != '0') ? 'dhcp' : 'static';
1479 fom['dhcp' + j + '_start'].value = (d[i][4] != '0') ? (d[i][5]).split('.').splice(3, 1) : '';
1480 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)
1481 fom['dhcp' + j + '_lease'].value = (d[i][4] != '0') ? d[i][7] : '';
1482 fom['dhcpd' + j + '_startip'].value = (d[i][4] != '0') ? d[i][5] : '';
1483 fom['dhcpd' + j + '_endip'].value = (d[i][4] != '0') ? d[i][6] : '';
1485 /* REMOVE-BEGIN */
1486 alert('lan' + j + '_ifname=' + fom['lan' + j + '_ifname'].value + '\n' +
1487 'lan' + j + '_stp=' + fom['lan' + j + '_stp'].value + '\n' +
1488 'lan' + j + '_ipaddr=' + fom['lan' + j + '_ipaddr'].value + '\n' +
1489 'lan' + j + '_netmask=' + fom['lan' + j + '_netmask'].value + '\n' +
1490 'lan' + j + '_proto=' + fom['lan' + j + '_proto'].value + '\n' +
1491 'dhcp' + j + '_start=' + fom['dhcp' + j + '_start'].value + '\n' +
1492 'dhcp' + j + '_num=' + fom['dhcp' + j + '_num'].value + '\n' +
1493 'dhcp' + j + '_lease=' + fom['dhcp' + j + '_lease'].value + '\n' +
1494 'dhcpd' + j + '_startip=' + fom['dhcpd' + j + '_startip'].value + '\n' +
1495 'dhcpd' + j + '_endip=' + fom['dhcpd' + j + '_endip'].value);
1496 /* REMOVE-END */
1499 var e = E('footer-msg');
1500 var t = fixIP(fom['lan_ipaddr'].value);
1501 if ((fom['lan_ifname'].value != 'br0') || (fom['lan_ipaddr'].value == '0.0.0.0') || (!t)) {
1502 e.innerHTML = 'Bridge br0 must be always defined and have a valid IP address set.';
1503 e.style.visibility = 'visible';
1504 setTimeout(
1505 function() {
1506 e.innerHTML = '';
1507 e.style.visibility = 'hidden';
1508 }, 5000);
1509 return;
1511 /* VLAN-END */
1513 /* REMOVE-BEGIN
1514 // if ((nvram.lan_ipaddr != fom.lan_ipaddr.value) || (nvram.lan1_ipaddr != fom.lan1_ipaddr.value) ||
1515 // (nvram.lan2_ipaddr != fom.lan2_ipaddr.value) || (nvram.lan3_ipaddr != fom.lan3_ipaddr.value)){
1516 REMOVE-END */
1518 fom.ppp_mlppp.value = fom.f_ppp_mlppp.checked ? 1 : 0;
1520 if (nvram.lan_ipaddr != fom.lan_ipaddr.value) {
1521 fom._moveip.value = 1;
1522 form.submit(fom);
1524 else {
1525 form.submit(fom, 1);
1529 function init()
1531 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1532 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1533 if (wl_sunit(uidx)<0) {
1534 refreshNetModes(uidx);
1535 refreshChannels(uidx);
1539 </script>
1541 </head>
1542 <body onload='init()'>
1543 <form id='_fom' method='post' action='tomato.cgi'>
1544 <table id='container' cellspacing=0>
1545 <tr><td colspan=2 id='header'>
1546 <div class='title'>Tomato</div>
1547 <div class='version'>Version <% version(); %></div>
1548 </td></tr>
1549 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
1550 <td id='content'>
1551 <div id='ident'><% ident(); %></div>
1553 <!-- / / / -->
1555 <input type='hidden' name='_nextpage' value='basic-network.asp'>
1556 <input type='hidden' name='_nextwait' value='10'>
1557 <input type='hidden' name='_service' value='*'>
1558 <input type='hidden' name='_moveip' value='0'>
1560 <input type='hidden' name='wan_mtu'>
1561 <input type='hidden' name='wan_islan'>
1562 <input type='hidden' name='pptp_dhcp'>
1563 <!-- NOVLAN-BEGIN -->
1564 <input type='hidden' name='lan_proto'>
1565 <!-- NOVLAN-END -->
1566 <input type='hidden' name='wan_dns'>
1567 <input type='hidden' name='ppp_mlppp'>
1569 <!-- VLAN-BEGIN -->
1570 <script type='text/javascript'>
1572 for (var i = 0 ; i <= MAX_BRIDGE_ID ; i++) {
1573 var j = (i == 0) ? '' : i.toString();
1574 W('<input type=\'hidden\' id=\'lan' + j + '_ifname\' name=\'lan' + j + '_ifname\'>');
1575 W('<input type=\'hidden\' id=\'lan' + j + '_ipaddr\' name=\'lan' + j + '_ipaddr\'>');
1576 W('<input type=\'hidden\' id=\'lan' + j + '_netmask\' name=\'lan' + j + '_netmask\'>');
1577 W('<input type=\'hidden\' id=\'lan' + j + '_proto\' name=\'lan' + j + '_proto\'>');
1578 W('<input type=\'hidden\' id=\'lan' + j + '_stp\' name=\'lan' + j + '_stp\'>');
1579 W('<input type=\'hidden\' id=\'dhcp' + j + '_start\' name=\'dhcp' + j + '_start\'>');
1580 W('<input type=\'hidden\' id=\'dhcp' + j + '_num\' name=\'dhcp' + j + '_num\'>');
1581 W('<input type=\'hidden\' id=\'dhcp' + j + '_lease\' name=\'dhcp' + j + '_lease\'>');
1582 W('<input type=\'hidden\' id=\'dhcpd' + j + '_startip\' name=\'dhcpd' + j + '_startip\'>');
1583 W('<input type=\'hidden\' id=\'dhcpd' + j + '_endip\' name=\'dhcpd' + j + '_endip\'>');
1585 </script>
1586 <!-- VLAN-END -->
1588 <div class='section-title'>WAN / Internet</div>
1589 <div class='section'>
1590 <script type='text/javascript'>
1591 createFieldTable('', [
1592 { title: 'Type', name: 'wan_proto', type: 'select', options: [['dhcp','DHCP'],['pppoe','PPPoE'],['static','Static'],['pptp','PPTP'],['l2tp','L2TP'],['disabled','Disabled']],
1593 value: nvram.wan_proto },
1594 { title: 'Username', name: 'ppp_username', type: 'text', maxlen: 60, size: 64, value: nvram.ppp_username },
1595 { title: 'Password', name: 'ppp_passwd', type: 'password', maxlen: 60, size: 64, peekaboo: 1, value: nvram.ppp_passwd },
1596 { title: 'Service Name', name: 'ppp_service', type: 'text', maxlen: 50, size: 64, value: nvram.ppp_service },
1597 { title: 'L2TP Server', name: 'l2tp_server_ip', type: 'text', maxlen: 128, size: 64, value: nvram.l2tp_server_ip },
1598 { title: 'Use DHCP', name: 'f_pptp_dhcp', type: 'checkbox', value: (nvram.pptp_dhcp == 1) },
1599 { title: 'IP Address', name: 'wan_ipaddr', type: 'text', maxlen: 15, size: 17, value: nvram.wan_ipaddr },
1600 { title: 'Subnet Mask', name: 'wan_netmask', type: 'text', maxlen: 15, size: 17, value: nvram.wan_netmask },
1601 { title: 'Gateway', name: 'wan_gateway', type: 'text', maxlen: 15, size: 17, value: nvram.wan_gateway },
1602 { title: 'PPTP Gateway', name: 'pptp_server_ip', type: 'text', maxlen: 128, size: 64, value: nvram.pptp_server_ip },
1603 { title: 'Options', name: 'ppp_custom', type: 'text', maxlen: 256, size: 64, value: nvram.ppp_custom },
1604 { title: 'Connect Mode', name: 'ppp_demand', type: 'select', options: [['1', 'Connect On Demand'],['0', 'Keep Alive']],
1605 value: nvram.ppp_demand },
1606 { title: 'Max Idle Time', indent: 2, name: 'ppp_idletime', type: 'text', maxlen: 5, size: 7, suffix: ' <i>(minutes)</i>',
1607 value: nvram.ppp_idletime },
1608 { title: 'Check Interval', indent: 2, name: 'ppp_redialperiod', type: 'text', maxlen: 5, size: 7, suffix: ' <i>(seconds)</i>',
1609 value: nvram.ppp_redialperiod },
1610 { title: 'MTU', multi: [
1611 { name: 'mtu_enable', type: 'select', options: [['0', 'Default'],['1','Manual']], value: nvram.mtu_enable },
1612 { name: 'f_wan_mtu', type: 'text', maxlen: 4, size: 6, value: nvram.wan_mtu } ] },
1613 { title: 'Single Line MLPPP', name: 'f_ppp_mlppp', type: 'checkbox', value: (nvram.ppp_mlppp == 1) },
1614 { 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 },
1616 /* NOVLAN-BEGIN */
1617 { title: 'Use WAN port for LAN', name: 'f_wan_islan', type: 'checkbox', value: (nvram.wan_islan == 1) }
1618 /* NOVLAN-END */
1619 /* VLAN-BEGIN */
1620 { title: 'Bridge WAN port to primary LAN (br0)', name: 'f_wan_islan', type: 'checkbox', value: (nvram.wan_islan == 1) }
1621 /* VLAN-END */
1623 </script>
1624 </div>
1626 <div class='section-title'>LAN</div>
1627 <div class='section'>
1628 <!-- VLAN-BEGIN -->
1629 <table class='tomato-grid' cellspacing=1 id='lan-grid'></table>
1631 <script type='text/javascript'>lg.setup();</script>
1632 <!-- VLAN-END -->
1634 <script type='text/javascript'>
1635 dns = nvram.wan_dns.split(/\s+/);
1636 /* REMOVE-BEGIN
1637 //ipp = nvram.lan_ipaddr.split('.').splice(0, 3).join('.');
1638 REMOVE-END */
1639 createFieldTable('', [
1640 /* NOVLAN-BEGIN */
1641 { title: 'Router IP Address', name: 'lan_ipaddr', type: 'text', maxlen: 15, size: 17, value: nvram.lan_ipaddr },
1642 { title: 'Subnet Mask', name: 'lan_netmask', type: 'text', maxlen: 15, size: 17, value: nvram.lan_netmask },
1643 /* NOVLAN-END */
1644 { title: 'Default Gateway', name: 'lan_gateway', type: 'text', maxlen: 15, size: 17, value: nvram.lan_gateway },
1645 { 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' },
1646 { title: '', name: 'f_dns_2', type: 'text', maxlen: 21, size: 25, value: dns[1] || '0.0.0.0' },
1647 { title: '', name: 'f_dns_3', type: 'text', maxlen: 21, size: 25, value: dns[2] || '0.0.0.0' },
1648 /* NOVLAN-BEGIN */
1649 { title: 'DHCP Server', name: 'f_dhcpd_enable', type: 'checkbox', value: (nvram.lan_proto == 'dhcp') },
1650 { title: 'IP Address Range', indent: 2, multi: [
1651 { name: 'dhcpd_startip', type: 'text', maxlen: 15, size: 17, value: nvram.dhcpd_startip, suffix: ' - ' },
1652 { name: 'dhcpd_endip', type: 'text', maxlen: 15, size: 17, value: nvram.dhcpd_endip, suffix: ' <i id="dhcp_count"></i>' }
1653 ] },
1655 { title: 'Lease Time', indent: 2, name: 'dhcp_lease', type: 'text', maxlen: 6, size: 8, suffix: ' <i>(minutes)</i>',
1656 value: (nvram.dhcp_lease > 0) ? nvram.dhcp_lease : 1440 },
1657 { title: 'WINS', indent: 2, name: 'wan_wins', type: 'text', maxlen: 15, size: 17, value: nvram.wan_wins }
1658 /* NOVLAN-END */
1659 /* VLAN-BEGIN */
1660 { title: 'WINS <i>(for DHCP)</i>', name: 'wan_wins', type: 'text', maxlen: 15, size: 17, value: nvram.wan_wins }
1661 /* VLAN-END */
1663 </script>
1664 </div>
1666 <script type='text/javascript'>
1668 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1669 //if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1670 if (wl_sunit(uidx)<0) {
1671 var u = wl_unit(uidx);
1673 W('<input type=\'hidden\' id=\'_wl'+u+'_mode\' name=\'wl'+u+'_mode\'>');
1674 W('<input type=\'hidden\' id=\'_wl'+u+'_nband\' name=\'wl'+u+'_nband\'>');
1675 W('<input type=\'hidden\' id=\'_wl'+u+'_wds_enable\' name=\'wl'+u+'_wds_enable\'>');
1676 W('<input type=\'hidden\' id=\'_wl'+u+'_wds\' name=\'wl'+u+'_wds\'>');
1677 W('<input type=\'hidden\' id=\'_wl'+u+'_radio\' name=\'wl'+u+'_radio\'>');
1678 W('<input type=\'hidden\' id=\'_wl'+u+'_closed\' name=\'wl'+u+'_closed\'>');
1679 W('<input type=\'hidden\' id=\'_wl'+u+'_key\' name=\'wl'+u+'_key\'>');
1680 W('<input type=\'hidden\' id=\'_wl'+u+'_gmode\' name=\'wl'+u+'_gmode\'>');
1681 W('<input type=\'hidden\' id=\'_wl'+u+'_akm\' name=\'wl'+u+'_akm\'>');
1682 W('<input type=\'hidden\' id=\'_wl'+u+'_auth\' name=\'wl'+u+'_auth\'>');
1683 W('<input type=\'hidden\' id=\'_wl'+u+'_auth_mode\' name=\'wl'+u+'_auth_mode\'>');
1684 W('<input type=\'hidden\' id=\'_wl'+u+'_wep\' name=\'wl'+u+'_wep\'>');
1685 W('<input type=\'hidden\' id=\'_wl'+u+'_lazywds\' name=\'wl'+u+'_lazywds\'>');
1686 W('<input type=\'hidden\' id=\'_wl'+u+'_nmode\' name=\'wl'+u+'_nmode\'>');
1687 W('<input type=\'hidden\' id=\'_wl'+u+'_nmcsidx\' name=\'wl'+u+'_nmcsidx\'>');
1688 W('<input type=\'hidden\' id=\'_wl'+u+'_nreqd\' name=\'wl'+u+'_nreqd\'>');
1689 W('<input type=\'hidden\' id=\'_wl'+u+'_nctrlsb\' name=\'wl'+u+'_nctrlsb\'>');
1690 W('<input type=\'hidden\' id=\'_wl'+u+'_nbw\' name=\'wl'+u+'_nbw\'>');
1692 W('<div class=\'section-title\'>Wireless');
1693 // if (wl_ifaces.length > 1)
1694 W(' (' + wl_display_ifname(uidx) + ')');
1695 W('</div>');
1697 W('<div class=\'section\'>');
1699 f = [
1700 { title: 'Enable Wireless', name: 'f_wl'+u+'_radio', type: 'checkbox',
1701 value: (eval('nvram.wl'+u+'_radio') == '1') && (eval('nvram.wl'+u+'_net_mode') != 'disabled') },
1702 { title: 'MAC Address', text: '<a href="advanced-mac.asp">' + eval('nvram.wl'+u+'_hwaddr') + '</a>' },
1703 { title: 'Wireless Mode', name: 'f_wl'+u+'_mode', type: 'select',
1704 options: [['ap', 'Access Point'],['apwds', 'Access Point + WDS'],['sta', 'Wireless Client'],['wet', 'Wireless Ethernet Bridge'],['wds', 'WDS']],
1705 value: ((eval('nvram.wl'+u+'_mode') == 'ap') && (eval('nvram.wl'+u+'_wds_enable') == '1')) ? 'apwds' : eval('nvram.wl'+u+'_mode') },
1706 { title: 'Radio Band', name: 'f_wl'+u+'_nband', type: 'select', options: bands[uidx],
1707 value: eval('nvram.wl'+u+'_nband') || '0' == '0' ? bands[uidx][0][0] : eval('nvram.wl'+u+'_nband') },
1708 { title: 'Wireless Network Mode', name: 'wl'+u+'_net_mode', type: 'select',
1709 value: (eval('nvram.wl'+u+'_net_mode') == 'disabled') ? 'mixed' : eval('nvram.wl'+u+'_net_mode'),
1710 options: [], prefix: '<span id="__wl'+u+'_net_mode">', suffix: '</span>' },
1711 { title: 'SSID', name: 'wl'+u+'_ssid', type: 'text', maxlen: 32, size: 34, value: eval('nvram.wl'+u+'_ssid') },
1712 { title: 'Broadcast', indent: 2, name: 'f_wl'+u+'_bcast', type: 'checkbox', value: (eval('nvram.wl'+u+'_closed') == '0') },
1713 { 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+'">',
1714 value: eval('nvram.wl'+u+'_channel') },
1715 { title: 'Channel Width', name: 'wl'+u+'_nbw_cap', type: 'select', options: [['0','20 MHz'],['1','40 MHz']],
1716 value: eval('nvram.wl'+u+'_nbw_cap') },
1717 { title: 'Control Sideband', name: 'f_wl'+u+'_nctrlsb', type: 'select', options: [['lower','Lower'],['upper','Upper']],
1718 value: eval('nvram.wl'+u+'_nctrlsb') == 'none' ? 'lower' : eval('nvram.wl'+u+'_nctrlsb') },
1719 null,
1720 { title: 'Security', name: 'wl'+u+'_security_mode', type: 'select',
1721 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']],
1722 value: eval('nvram.wl'+u+'_security_mode') },
1723 { title: 'Encryption', indent: 2, name: 'wl'+u+'_crypto', type: 'select',
1724 options: [['tkip','TKIP'],['aes','AES'],['tkip+aes','TKIP / AES']], value: eval('nvram.wl'+u+'_crypto') },
1725 { title: 'Shared Key', indent: 2, name: 'wl'+u+'_wpa_psk', type: 'password', maxlen: 64, size: 66, peekaboo: 1,
1726 suffix: ' <input type="button" id="_f_wl'+u+'_psk_random1" value="Random" onclick="random_psk(\'_wl'+u+'_wpa_psk\')">',
1727 value: eval('nvram.wl'+u+'_wpa_psk') },
1728 { title: 'Shared Key', indent: 2, name: 'wl'+u+'_radius_key', type: 'password', maxlen: 80, size: 32, peekaboo: 1,
1729 suffix: ' <input type="button" id="_f_wl'+u+'_psk_random2" value="Random" onclick="random_psk(\'_wl'+u+'_radius_key\')">',
1730 value: eval('nvram.wl'+u+'_radius_key') },
1731 { title: 'Group Key Renewal', indent: 2, name: 'wl'+u+'_wpa_gtk_rekey', type: 'text', maxlen: 4, size: 6, suffix: ' <i>(seconds)</i>',
1732 value: eval('nvram.wl'+u+'_wpa_gtk_rekey') },
1733 { title: 'Radius Server', indent: 2, multi: [
1734 { name: 'wl'+u+'_radius_ipaddr', type: 'text', maxlen: 15, size: 17, value: eval('nvram.wl'+u+'_radius_ipaddr') },
1735 { name: 'wl'+u+'_radius_port', type: 'text', maxlen: 5, size: 7, prefix: ' : ', value: eval('nvram.wl'+u+'_radius_port') } ] },
1736 { title: 'Encryption', indent: 2, name: 'wl'+u+'_wep_bit', type: 'select', options: [['128','128-bits'],['64','64-bits']],
1737 value: eval('nvram.wl'+u+'_wep_bit') },
1738 { title: 'Passphrase', indent: 2, name: 'wl'+u+'_passphrase', type: 'text', maxlen: 16, size: 20,
1739 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+')">',
1740 value: eval('nvram.wl'+u+'_passphrase') }
1743 for (i = 1; i <= 4; ++i) {
1744 f.push(
1745 { title: ('Key ' + i), indent: 2, name: ('wl'+u+'_key' + i), type: 'text', maxlen: 26, size: 34,
1746 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>' : '>'),
1747 value: nvram['wl'+u+'_key' + i] });
1750 f.push(null,
1751 { title: 'WDS', name: 'f_wl'+u+'_lazywds', type: 'select',
1752 options: [['0','Link With...'],['1','Automatic']], value: nvram['wl'+u+'_lazywds'] } );
1753 wds = eval('nvram.wl'+u+'_wds').split(/\s+/);
1754 for (i = 0; i < 10; i += 2) {
1755 f.push({ title: (i ? '' : 'MAC Address'), indent: 2, multi: [
1756 { name: 'f_wl'+u+'_wds_' + i, type: 'text', maxlen: 17, size: 20, value: wds[i] || '00:00:00:00:00:00' },
1757 { name: 'f_wl'+u+'_wds_' + (i + 1), type: 'text', maxlen: 17, size: 20, value: wds[i + 1] || '00:00:00:00:00:00' } ] } );
1760 createFieldTable('', f);
1761 W('</div>');
1764 // for each wlif
1765 </script>
1767 <!-- / / / -->
1769 </td></tr>
1770 <tr><td id='footer' colspan=2>
1771 <span id='footer-msg'></span>
1772 <input type='button' value='Save' id='save-button' onclick='save()'>
1773 <input type='button' value='Cancel' id='cancel-button' onclick='reloadPage();'>
1774 </td></tr>
1775 </table>
1776 </form>
1777 <script type='text/javascript'>earlyInit()</script>
1778 <div style='height:100px'></div>
1779 </body>
1780 </html>