Expose pppoe lcp echo parameters in gui
[tomato.git] / release / src / router / www / basic-network.asp
blob587dc00585648e92d4b8d115202b6de7a748bed4
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'>
49 // <% 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,pppoe_lei,pppoe_lef,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,modem_pin,modem_dev,modem_init,modem_apn,cstats_enable"); %>
51 /* VLAN-BEGIN */
52 var lg = new TomatoGrid();
53 lg.setup = function() {
54 this.init('lan-grid', '', 4, [
55 { type: 'select', options: [[0, '0'],[1, '1'],[2, '2'],[3, '3']], prefix: '<div class="centered">', suffix: '</div>' },
56 { type: 'checkbox', prefix: '<div class="centered">', suffix: '</div>' },
57 { type: 'text', maxlen: 15, size: 17 },
58 { type: 'text', maxlen: 15, size: 17 },
59 { type: 'checkbox', prefix: '<div class="centered">', suffix: '</div>' },
60 { multi: [ { type: 'text', maxlen: 15, size: 17}, { type: 'text', maxlen: 15, size: 17 } ] },
61 { type: 'text', maxlen: 6, size: 8 }] );
62 this.headerSet(['Bridge', 'STP', 'IP Address', 'Netmask', 'DHCP', 'IP&nbsp;Range&nbsp;<i>(first/last)</i>', 'Lease&nbsp;Time&nbsp;<i>(mins)</i>']);
64 var numBridges = 0;
65 for (var i = 0 ; i <= MAX_BRIDGE_ID ; i++) {
66 var j = (i == 0) ? '' : i.toString();
67 if (nvram['lan' + j + '_ifname'].length > 0) {
68 if ((!fixIP(nvram['dhcpd' + j + '_startip'])) || (!fixIP(nvram['dhcpd' + j + '_endip']))) {
69 if ((fixIP(nvram['lan' + j + '_ipaddr'])) && (fixIP(nvram['lan' + j + '_netmask'])) && (nvram['dhcp' + j + '_start'] != '')) {
70 var n = getNetworkAddress(nvram['lan' + j + '_ipaddr'], nvram['lan' + j + '_netmask']);
71 nvram['dhcpd' + j + '_startip'] = getAddress(('0.0.0.' + nvram['dhcp' + j + '_start'] * 1), n);
72 nvram['dhcpd' + j + '_endip'] = getAddress(('0.0.0.' + ((nvram['dhcp' + j + '_start'] * 1) + (nvram['dhcp' + j + '_num'] *1) - 1)), n);
75 lg.insertData(-1, [
76 i.toString(),
77 nvram['lan' + j + '_stp'],
78 nvram['lan' + j + '_ipaddr'],
79 nvram['lan' + j + '_netmask'],
80 (nvram['lan' + j + '_proto'] == 'dhcp') ? '1' : '0',
81 nvram['dhcpd' + j + '_startip'],
82 nvram['dhcpd' + j + '_endip'],
83 (nvram['lan' + j + '_proto'] == 'dhcp') ? (((nvram['dhcp' + j + '_lease'])*1 == 0) ? '1440' : (nvram['dhcp' + j + '_lease']).toString()) : ''
84 ] ) ;
85 numBridges++;
88 lg.canDelete = false;
89 lg.sort(0);
90 elem.removeClass(lg.header.cells[lg.sortColumn], 'sortasc', 'sortdes');
91 lg.showNewEditor();
92 lg.resetNewEditor();
95 lg.dataToView = function(data) {
96 return ['br' + data[0],
97 (data[1].toString() == '1') ? '<small><i>Enabled</i></small>' : '<small><i>Disabled</i></small>',
98 data[2],
99 data[3],
100 (data[4].toString() == '1') ? '<small><i>Enabled</i></small>' : '<small><i>Disabled</i></small>',
101 (data[5].toString() + ((numberOfBitsOnNetMask(data[3])>=24) ? (' - ' + data[6].split('.').splice(3, 1).toString()) : ('<br>' + data[6].toString()) )),
102 (((data[7] != null) && (data[7] != '')) ? data[7] : '') ];
105 lg.dataToFieldValues = function (data) {
106 return [data[0],
107 (data[1] != 0) ? 'checked' : '',
108 data[2].toString(),
109 data[3].toString(),
110 (data[4].toString() == '1') ? 'checked' : '',
111 data[5].toString(),
112 data[6].toString(),
113 data[7].toString() ];
116 lg.fieldValuesToData = function(row) {
117 var f = fields.getAll(row);
118 return [f[0].value,
119 f[1].checked ? 1 : 0,
120 f[2].value,
121 f[3].value,
122 f[4].checked ? 1 : 0,
123 f[5].value,
124 f[6].value,
125 f[7].value ];
128 lg.resetNewEditor = function() {
129 var f = fields.getAll(this.newEditor);
130 f[0].selectedIndex=0;
131 var t = MAX_BRIDGE_ID;
132 while((this.countBridge(f[0].selectedIndex) > 0) && (t > 0)) {
133 f[0].selectedIndex = (f[0].selectedIndex%(MAX_BRIDGE_ID))+1;
134 t--;
136 for(var j=0; j<= MAX_BRIDGE_ID ; j++) {
137 f[0].options[j].disabled = (this.countBridge(j) > 0);
139 f[1].checked = 0;
140 f[2].value = '';
141 f[3].value = '';
142 f[5].value = '';
143 f[6].value = '';
144 f[7].value = '';
145 f[4].checked = 0;
146 f[4].disabled = 1;
147 f[5].disabled = 1;
148 f[6].disabled = 1;
149 f[7].disabled = 1;
150 ferror.clearAll(fields.getAll(this.newEditor));
153 lg.onCancel = function() {
154 this.removeEditor();
155 this.showSource();
156 this.disableNewEditor(false);
158 this.resetNewEditor();
161 lg.onAdd = function() {
162 var data;
164 this.moving = null;
165 this.rpHide();
167 if (!this.verifyFields(this.newEditor, false)) return;
169 data = this.fieldValuesToData(this.newEditor);
170 this.insertData(-1, data);
172 this.disableNewEditor(false);
173 this.resetNewEditor();
175 this.resort();
178 lg.onOK = function() {
179 var i, data, view;
181 if (!this.verifyFields(this.editor, false)) return;
183 data = this.fieldValuesToData(this.editor);
184 view = this.dataToView(data);
186 this.source.setRowData(data);
187 for (i = 0; i < this.source.cells.length; ++i) {
188 this.source.cells[i].innerHTML = view[i];
191 this.removeEditor();
192 this.showSource();
193 this.disableNewEditor(false);
195 this.resort();
196 this.resetNewEditor();
199 lg.onDelete = function() {
200 this.removeEditor();
201 elem.remove(this.source);
202 this.source = null;
203 this.disableNewEditor(false);
205 this.resetNewEditor();
208 lg.countElem = function(f, v) {
209 var data = this.getAllData();
210 var total = 0;
211 for (var i = 0; i < data.length; ++i) {
212 total += (data[i][f] == v) ? 1 : 0;
214 return total;
217 lg.countBridge = function (v) {
218 return this.countElem(0,v);
221 lg.countOverlappingNetworks = function (ip) {
222 var data = this.getAllData();
223 var total = 0;
224 for (var i = 0; i < data.length; ++i) {
225 var net = getNetworkAddress(data[i][2], data[i][3]);
226 var brd = getBroadcastAddress(net, data[i][3]);
227 total += ((aton(ip) <= aton(brd)) && (aton(ip) >= aton(net))) ? 1 : 0;
229 return total;
232 lg.verifyFields = function(row, quiet) {
233 var ok=1;
234 var f;
236 f = fields.getAll(row);
238 for(var j=0; j<= MAX_BRIDGE_ID ; j++) {
239 f[0].options[j].disabled = (this.countBridge(j) > 0);
242 if(this.countBridge(f[0].selectedIndex) > 0) {
243 ferror.set(f[0], 'Cannot add another entry for bridge br' + f[0].selectedIndex, quiet);
244 ok = 0;
245 } else {
246 ferror.clear(f[0]);
248 // valid IP address?
249 if(!v_ip(f[2], quiet || !ok))
250 ok = 0;
251 // if we have a properly defined IP address - 0.0.0.0 is NOT a valid IP address for our intents/purposes!
252 if ((f[2].value != '') && (f[2].value != '0.0.0.0')) {
253 // allow DHCP to be enabled
254 f[4].disabled = 0;
255 // validate netmask
256 if(!v_netmask(f[3], quiet || !ok)) {
257 return 0;
258 } else {
259 // should be 22 bits or smaller network
260 if ((numberOfBitsOnNetMask(f[3].value) < 22) && (nvram.cstats_enable == '1' )) {
261 if (!confirm("Netmask should have at least 22 bits (255.255.252.0). You may continue anyway but remember - you were warned!")) return;
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 _pppoe_lei: 1,
723 _pppoe_lef: 1,
724 _mtu_enable: 1,
725 _f_wan_mtu: 1,
726 _f_wan_islan: 0,
727 _f_ppp_mlppp: 1,
728 _modem_ipaddr: 1,
730 /* NOVLAN-BEGIN */
731 _dhcp_lease: 1,
732 _f_dhcpd_enable: 1,
733 _dhcpd_startip: 1,
734 _dhcpd_endip: 1,
735 _lan_ipaddr: 1,
736 _lan_netmask: 1,
737 /* NOVLAN-END */
738 _f_dns_1: 1,
739 _f_dns_2: 1,
740 _f_dns_3: 1,
741 _lan_gateway: 1,
742 _wan_wins: 1,
743 _modem_pin: 1,
744 _modem_dev: 1,
745 _modem_init: 1,
746 _modem_apn: 1
749 var wl_vis = [];
750 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
751 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
752 if (wl_sunit(uidx)<0) {
753 a = {
754 _f_wl_radio: 1,
755 _f_wl_mode: 1,
756 _f_wl_nband: (bands[uidx].length > 1) ? 1 : 0,
757 _wl_net_mode: 1,
758 _wl_ssid: 1,
759 _f_wl_bcast: 1,
760 _wl_channel: 1,
761 _wl_nbw_cap: nphy ? 1 : 0,
762 _f_wl_nctrlsb: nphy ? 1 : 0,
763 _f_wl_scan: 1,
765 _wl_security_mode: 1,
766 _wl_crypto: 1,
767 _wl_wpa_psk: 1,
768 _f_wl_psk_random1: 1,
769 _f_wl_psk_random2: 1,
770 _wl_wpa_gtk_rekey: 1,
771 _wl_radius_key: 1,
772 _wl_radius_ipaddr: 1,
773 _wl_radius_port: 1,
774 _wl_wep_bit: 1,
775 _wl_passphrase: 1,
776 _f_wl_wep_gen: 1,
777 _f_wl_wep_random: 1,
778 _wl_key1: 1,
779 _wl_key2: 1,
780 _wl_key3: 1,
781 _wl_key4: 1,
783 _f_wl_lazywds: 1,
784 _f_wl_wds_0: 1
786 wl_vis.push(a);
790 var wan = E('_wan_proto').value;
792 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
793 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
794 if (wl_sunit(uidx)<0) {
795 wmode = E('_f_wl'+wl_unit(uidx)+'_mode').value;
797 if (wmode == 'wet') {
798 wan = 'disabled';
799 vis._wan_proto = 0;
800 /* NOVLAN-BEGIN */
801 vis._f_dhcpd_enable = 0;
802 vis._dhcp_lease = 0;
803 /* NOVLAN-END */
806 if ((wan == 'disabled') || (wmode == 'sta') || (wmode == 'wet')) {
807 vis._f_wan_islan = 1;
812 switch (wan) {
813 case 'disabled':
814 vis._ppp_username = 0;
815 vis._ppp_service = 0;
816 vis._ppp_custom = 0;
817 vis._l2tp_server_ip = 0;
818 vis._wan_ipaddr = 0;
819 vis._wan_netmask = 0;
820 vis._wan_gateway = 0;
821 vis._pptp_server_ip = 0;
822 vis._f_pptp_dhcp = 0;
823 vis._ppp_demand = 0;
824 vis._mtu_enable = 0;
825 vis._f_wan_mtu = 0;
826 vis._f_ppp_mlppp = 0;
827 vis._modem_ipaddr = 0;
828 vis._modem_pin = 0;
829 vis._modem_dev = 0;
830 vis._modem_init = 0;
831 vis._modem_apn = 0;
832 vis._pppoe_lei = 0;
833 vis._pppoe_lef = 0;
834 break;
835 case 'dhcp':
836 vis._l2tp_server_ip = 0;
837 vis._pppoe_lei = 0;
838 vis._pppoe_lef = 0;
839 vis._ppp_demand = 0;
840 vis._ppp_service = 0;
841 vis._ppp_username = 0;
842 vis._ppp_custom = 0;
843 vis._pptp_server_ip = 0;
844 vis._f_pptp_dhcp = 0;
845 vis._wan_gateway = 0;
846 vis._wan_ipaddr = 0;
847 vis._wan_netmask = 0;
848 vis._f_ppp_mlppp = 0;
849 vis._modem_ipaddr = 1;
851 vis._lan_gateway = 0;
852 vis._modem_pin = 0;
853 vis._modem_dev = 0;
854 vis._modem_init = 0;
855 vis._modem_apn = 0;
856 break;
857 case 'pppoe':
858 vis._l2tp_server_ip = 0;
859 vis._pptp_server_ip = 0;
860 vis._f_pptp_dhcp = 0;
861 vis._wan_gateway = 0;
862 vis._wan_ipaddr = 0;
863 vis._wan_netmask = 0;
864 vis._modem_ipaddr = 1;
866 vis._lan_gateway = 0;
867 vis._modem_pin = 0;
868 vis._modem_dev = 0;
869 vis._modem_init = 0;
870 vis._modem_apn = 0;
871 break;
872 case 'ppp3g':
873 vis._pppoe_lei = 0;
874 vis._pppoe_lef = 0;
875 vis._ppp_service = 0;
876 vis._l2tp_server_ip = 0;
877 vis._pptp_server_ip = 0;
878 vis._f_pptp_dhcp = 0;
879 vis._wan_gateway = 0;
880 vis._wan_ipaddr = 0;
881 vis._wan_netmask = 0;
882 vis._lan_gateway = 0;
883 vis._modem_ipaddr = 0;
884 vis._f_ppp_mlppp = 0;
885 break;
886 case 'static':
887 vis._pppoe_lei = 0;
888 vis._pppoe_lef = 0;
889 vis._l2tp_server_ip = 0;
890 vis._ppp_demand = 0;
891 vis._ppp_service = 0;
892 vis._ppp_username = 0;
893 vis._ppp_custom = 0;
894 vis._pptp_server_ip = 0;
895 vis._f_pptp_dhcp = 0;
896 vis._f_ppp_mlppp = 0;
897 vis._modem_ipaddr = 1;
899 vis._lan_gateway = 0;
900 vis._modem_pin = 0;
901 vis._modem_dev = 0;
902 vis._modem_init = 0;
903 vis._modem_apn = 0;
904 break;
905 case 'pptp':
906 vis._pppoe_lei = 0;
907 vis._pppoe_lef = 0;
908 vis._l2tp_server_ip = 0;
909 vis._ppp_service = 0;
910 vis._wan_gateway = (!E('_f_pptp_dhcp').checked);
911 vis._wan_ipaddr = (!E('_f_pptp_dhcp').checked);
912 vis._modem_ipaddr = 0;
914 vis._lan_gateway = 0;
915 vis._modem_pin = 0;
916 vis._modem_dev = 0;
917 vis._modem_init = 0;
918 vis._modem_apn = 0;
919 break;
920 case 'l2tp':
921 vis._pppoe_lei = 0;
922 vis._pppoe_lef = 0;
923 vis._pptp_server_ip = 0;
924 vis._ppp_service = 0;
925 vis._wan_gateway = (!E('_f_pptp_dhcp').checked);
926 vis._wan_ipaddr = (!E('_f_pptp_dhcp').checked);
927 vis._modem_ipaddr = 0;
929 vis._lan_gateway = 0;
930 vis._modem_pin = 0;
931 vis._modem_dev = 0;
932 vis._modem_init = 0;
933 vis._modem_apn = 0;
934 break;
937 vis._ppp_idletime = (E('_ppp_demand').value == 1) && vis._ppp_demand
938 vis._ppp_redialperiod = !vis._ppp_idletime && vis._ppp_demand;
940 if (vis._mtu_enable) {
941 if (E('_mtu_enable').value == 0) {
942 vis._f_wan_mtu = 2;
943 a = E('_f_wan_mtu');
944 switch (E('_wan_proto').value) {
945 case 'pppoe':
946 a.value = 1492;
947 break;
948 case 'pptp':
949 case 'l2tp':
950 a.value = 1460;
951 break;
952 default:
953 a.value = 1500;
954 break;
959 /* NOVLAN-BEGIN */
960 if (!E('_f_dhcpd_enable').checked) vis._dhcp_lease = 0;
961 /* NOVLAN-END */
963 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
964 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
965 if (wl_sunit(uidx)<0) {
966 u = wl_unit(uidx);
967 wmode = E('_f_wl'+u+'_mode').value;
969 if (!E('_f_wl'+u+'_radio').checked) {
970 for (a in wl_vis[uidx]) {
971 wl_vis[uidx][a] = 2;
973 wl_vis[uidx]._f_wl_radio = 1;
974 wl_vis[uidx]._wl_nbw_cap = nphy ? 2 : 0;
975 wl_vis[uidx]._f_wl_nband = (bands[uidx].length > 1) ? 2 : 0;
978 switch (wmode) {
979 case 'apwds':
980 case 'wds':
981 break;
982 case 'wet':
983 case 'sta':
984 wl_vis[uidx]._f_wl_bcast = 0;
985 wl_vis[uidx]._wl_channel = 0;
986 wl_vis[uidx]._wl_nbw_cap = 0;
987 vis._modem_ipaddr = 0;
988 default:
989 wl_vis[uidx]._f_wl_lazywds = 0;
990 wl_vis[uidx]._f_wl_wds_0 = 0;
991 break;
994 sm2 = E('_wl'+u+'_security_mode').value;
995 switch (sm2) {
996 case 'disabled':
997 wl_vis[uidx]._wl_crypto = 0;
998 wl_vis[uidx]._wl_wep_bit = 0;
999 wl_vis[uidx]._wl_wpa_psk = 0;
1000 wl_vis[uidx]._wl_radius_key = 0;
1001 wl_vis[uidx]._wl_radius_ipaddr = 0;
1002 wl_vis[uidx]._wl_wpa_gtk_rekey = 0;
1003 break;
1004 case 'wep':
1005 wl_vis[uidx]._wl_crypto = 0;
1006 wl_vis[uidx]._wl_wpa_psk = 0;
1007 wl_vis[uidx]._wl_radius_key = 0;
1008 wl_vis[uidx]._wl_radius_ipaddr = 0;
1009 wl_vis[uidx]._wl_wpa_gtk_rekey = 0;
1010 break;
1011 case 'radius':
1012 wl_vis[uidx]._wl_crypto = 0;
1013 wl_vis[uidx]._wl_wpa_psk = 0;
1014 break;
1015 default: // wpa*
1016 wl_vis[uidx]._wl_wep_bit = 0;
1017 if (sm2.indexOf('personal') != -1) {
1018 wl_vis[uidx]._wl_radius_key = 0;
1019 wl_vis[uidx]._wl_radius_ipaddr = 0;
1021 else {
1022 wl_vis[uidx]._wl_wpa_psk = 0;
1024 break;
1027 if ((E('_f_wl'+u+'_lazywds').value == 1) && (wl_vis[uidx]._f_wl_wds_0 == 1)) {
1028 wl_vis[uidx]._f_wl_wds_0 = 2;
1031 if (wl_vis[uidx]._wl_nbw_cap != 0) {
1032 switch (E('_wl'+u+'_net_mode').value) {
1033 case 'b-only':
1034 case 'g-only':
1035 case 'a-only':
1036 case 'bg-mixed':
1037 wl_vis[uidx]._wl_nbw_cap = 2;
1038 if (E('_wl'+u+'_nbw_cap').value != '0') {
1039 E('_wl'+u+'_nbw_cap').value = 0;
1040 refreshChannels(uidx);
1042 break;
1044 // avoid Enterprise-TKIP with 40MHz
1045 if ((sm2 == 'wpa_enterprise') && (E('_wl'+u+'_crypto').value == 'tkip')) {
1046 wl_vis[uidx]._wl_nbw_cap = 2;
1047 if (E('_wl'+u+'_nbw_cap').value != '0') {
1048 E('_wl'+u+'_nbw_cap').value = 0;
1049 refreshChannels(uidx);
1054 wl_vis[uidx]._f_wl_nctrlsb = (E('_wl'+u+'_nbw_cap').value == 0) ? 0 : wl_vis[uidx]._wl_nbw_cap;
1056 /* REMOVE-BEGIN
1057 This is ugly...
1058 Special case - 2.4GHz band, currently running in B/G-only mode,
1059 with N/Auto and 40MHz selected in the GUI.
1060 Channel list is not filtered in this case by the wl driver,
1061 and includes all channels available with 20MHz channel width.
1062 REMOVE-END */
1063 b = selectedBand(uidx);
1064 if (wl_vis[uidx]._wl_channel == 1 && wl_vis[uidx]._f_wl_nctrlsb != 0 &&
1065 ((b == '2') || (wl_vis[uidx]._f_wl_nband == 0 && b == '0'))) {
1066 switch (eval('nvram.wl'+u+'_net_mode')) {
1067 case 'b-only':
1068 case 'g-only':
1069 case 'bg-mixed':
1070 i = E('_wl'+u+'_channel').value * 1;
1071 if (i > 0 && i < 5) {
1072 E('_f_wl'+u+'_nctrlsb').value = 'lower';
1073 wl_vis[uidx]._f_wl_nctrlsb = 2;
1075 else if (i > max_channel[uidx] - 4) {
1076 E('_f_wl'+u+'_nctrlsb').value = 'upper';
1077 wl_vis[uidx]._f_wl_nctrlsb = 2;
1079 break;
1083 wl_vis[uidx]._f_wl_scan = wl_vis[uidx]._wl_channel;
1084 wl_vis[uidx]._f_wl_psk_random1 = wl_vis[uidx]._wl_wpa_psk;
1085 wl_vis[uidx]._f_wl_psk_random2 = wl_vis[uidx]._wl_radius_key;
1086 wl_vis[uidx]._wl_radius_port = wl_vis[uidx]._wl_radius_ipaddr;
1087 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;
1089 for (i = 1; i < 10; ++i) {
1090 wl_vis[uidx]['_f_wl_wds_' + i] = wl_vis[uidx]._f_wl_wds_0;
1093 } // for each wl_iface
1095 vis._ppp_passwd = vis._ppp_username;
1096 /* NOVLAN-BEGIN */
1097 vis._dhcpd_startip = vis._dhcpd_endip = vis._wan_wins = vis._dhcp_lease;
1098 /* NOVLAN-END */
1100 for (a in vis) {
1101 b = E(a);
1102 c = vis[a];
1103 /* REMOVE-BEGIN
1104 // if (b != null)
1105 REMOVE-END */
1106 b.disabled = (c != 1);
1107 PR(b).style.display = c ? '' : 'none';
1110 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1111 if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1112 for (a in wl_vis[uidx]) {
1113 i = 3;
1114 if (a.substr(0, 6) == '_f_wl_') i = 5;
1115 b = E(a.substr(0, i) + wl_unit(uidx) + a.substr(i, a.length));
1116 c = wl_vis[uidx][a];
1117 b.disabled = (c != 1);
1118 PR(b).style.display = c ? '' : 'none';
1123 // --- verify ---
1125 ferror.clear('_wan_proto');
1127 var wlclnt = 0;
1128 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1129 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1130 if (wl_sunit(uidx)<0) {
1131 u = wl_unit(uidx);
1132 wmode = E('_f_wl'+u+'_mode').value;
1133 sm2 = E('_wl'+u+'_security_mode').value;
1135 /* REMOVE-BEGIN
1136 if ((wl_vis[uidx]._f_wl_mode == 1) && (wmode != 'ap') && (sm2.substr(0, 4) == 'wpa2')) {
1137 ferror.set('_wl'+u+'_security_mode', 'WPA2 is supported only in AP mode.', quiet || !ok);
1138 ok = 0;
1140 else ferror.clear('_wl'+u+'_security_mode');
1141 REMOVE-END */
1143 // --- N standard does not support WPA+TKIP ---
1144 a = E('_wl'+u+'_crypto');
1145 switch (E('_wl'+u+'_net_mode').value) {
1146 case 'mixed':
1147 case 'n-only':
1148 if (nphy && (a.value == 'tkip') && (sm2.indexOf('wpa') != -1)) {
1149 ferror.set(a, 'TKIP encryption is not supported with WPA / WPA2 in N mode.', quiet || !ok);
1150 ok = 0;
1152 else ferror.clear(a);
1153 break;
1156 a = E('_wl'+u+'_net_mode');
1157 ferror.clear(a);
1158 b = E('_f_wl'+u+'_mode');
1159 ferror.clear(b);
1160 if ((wmode == 'sta') || (wmode == 'wet')) {
1161 ++wlclnt;
1162 if (wlclnt > 1) {
1163 ferror.set(b, 'Only one wireless interface can be configured in client mode.', quiet || !ok);
1164 ok = 0;
1166 else if (a.value == 'n-only') {
1167 ferror.set(a, 'N-only is not supported in wireless client modes, use Auto.', quiet || !ok);
1168 ok = 0;
1172 a = E('_wl'+u+'_wpa_psk');
1173 ferror.clear(a);
1174 if (wl_vis[uidx]._wl_wpa_psk == 1) {
1175 if ((a.value.length < 8) || ((a.value.length == 64) && (a.value.search(/[^0-9A-Fa-f]/) != -1))) {
1176 ferror.set('_wl'+u+'_wpa_psk', 'Invalid pre-shared key. Please enter at least 8 characters or 64 hexadecimal digits.', quiet || !ok);
1177 ok = 0;
1181 // wl channel
1182 if (((wmode == 'wds') || (wmode == 'apwds')) && (wl_vis[uidx]._wl_channel == 1) && (E('_wl'+u+'_channel').value == '0')) {
1183 ferror.set('_wl'+u+'_channel', 'Fixed wireless channel required in WDS mode.', quiet || !ok);
1184 ok = 0;
1186 else ferror.clear('_wl'+u+'_channel');
1188 if (E('_f_wl'+u+'_mode').value == 'sta') {
1189 if (((wan == 'disabled') || (wan == 'ppp3g')) && (E('_f_wl'+u+'_radio').checked)) {
1190 ferror.set('_wan_proto', 'Wireless Client mode requires a valid WAN setting (usually DHCP).', quiet || !ok);
1191 ok = 0;
1197 // domain name or IP address
1198 a = ['_l2tp_server_ip', '_pptp_server_ip'];
1199 for (i = a.length - 1; i >= 0; --i)
1200 if ((vis[a[i]]) && ((!v_length(a[i], 1, 1)) || ((!v_ip(a[i], 1)) && (!v_domain(a[i], 1))))) {
1201 if (!quiet && ok) ferror.show(a[i]);
1202 ok = 0;
1205 // IP address
1206 /* NOVLAN-BEGIN */
1207 a = ['_wan_gateway','_wan_ipaddr','_lan_ipaddr', '_dhcpd_startip', '_dhcpd_endip'];
1208 /* NOVLAN-END */
1209 /* VLAN-BEGIN */
1210 a = ['_wan_gateway','_wan_ipaddr'];
1211 /* VLAN-END */
1212 for (i = a.length - 1; i >= 0; --i)
1213 if ((vis[a[i]]) && (!v_ip(a[i], quiet || !ok))) ok = 0;
1215 // IP address, blank -> 0.0.0.0
1216 a = ['_f_dns_1', '_f_dns_2', '_f_dns_3','_wan_wins','_lan_gateway', '_modem_ipaddr'];
1217 for (i = a.length - 1; i >= 0; --i)
1218 if ((vis[a[i]]) && (!v_dns(a[i], quiet || !ok))) ok = 0;
1220 // netmask
1221 /* NOVLAN-BEGIN */
1222 a = ['_wan_netmask','_lan_netmask'];
1223 /* NOVLAN-END */
1224 /* VLAN-BEGIN */
1225 a = ['_wan_netmask'];
1226 /* VLAN-END */
1227 for (i = a.length - 1; i >= 0; --i)
1228 if ((vis[a[i]]) && (!v_netmask(a[i], quiet || !ok))) ok = 0;
1230 // range
1231 /* NOVLAN-BEGIN */
1232 a = [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500],
1233 ['_dhcp_lease', 1, 10080],['_pppoe_lei', 1, 60],['_pppoe_lef', 1, 10]];
1234 /* NOVLAN-END */
1235 /* VLAN-BEGIN */
1236 a = [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500],
1237 ['_pppoe_lei', 1, 60],['_pppoe_lef', 1, 10]];
1238 /* VLAN-END */
1239 for (i = a.length - 1; i >= 0; --i) {
1240 v = a[i];
1241 if ((vis[v[0]]) && (!v_range(v[0], quiet || !ok, v[1], v[2]))) ok = 0;
1244 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1245 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1246 if (wl_sunit(uidx)<0) {
1247 u = wl_unit(uidx);
1249 // IP address
1250 a = ['_radius_ipaddr'];
1251 for (i = a.length - 1; i >= 0; --i) {
1252 if ((wl_vis[uidx]['_wl'+a[i]]) && (!v_ip('_wl'+u+a[i], quiet || !ok))) ok = 0;
1255 // range
1256 a = [['_wpa_gtk_rekey', 60, 7200], ['_radius_port', 1, 65535]];
1257 for (i = a.length - 1; i >= 0; --i) {
1258 v = a[i];
1259 if ((wl_vis[uidx]['_wl'+v[0]]) && (!v_range('_wl'+u+v[0], quiet || !ok, v[1], v[2]))) ok = 0;
1262 // length
1263 a = [['_ssid', 1], ['_radius_key', 1]];
1264 for (i = a.length - 1; i >= 0; --i) {
1265 v = a[i];
1266 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;
1269 if (wl_vis[uidx]._wl_key1) {
1270 a = (E('_wl'+u+'_wep_bit').value == 128) ? 26 : 10;
1271 for (i = 1; i <= 4; ++i) {
1272 b = E('_wl'+u+'_key' + i);
1273 b.maxLength = a;
1274 if ((b.value.length > 0) || (E('_f_wl'+u+'_wepidx_' + i).checked)) {
1275 if (!v_wep(b, quiet || !ok)) ok = 0;
1277 else ferror.clear(b);
1281 ferror.clear('_f_wl'+u+'_wds_0');
1282 if (wl_vis[uidx]._f_wl_wds_0 == 1) {
1283 b = 0;
1284 for (i = 0; i < 10; ++i) {
1285 a = E('_f_wl'+u+'_wds_' + i);
1286 if (!v_macz(a, quiet || !ok)) ok = 0;
1287 else if (!isMAC0(a.value)) b = 1;
1289 if (!b) {
1290 ferror.set('_f_wl'+u+'_wds_0', 'WDS MAC address required.', quiet || !ok);
1291 ok = 0;
1297 /* NOVLAN-BEGIN */
1298 a = E('_dhcpd_startip');
1299 b = E('_dhcpd_endip');
1300 ferror.clear(a);
1301 ferror.clear(b);
1303 if ((vis._dhcp_lease) && (!a._error_msg) && (!b._error_msg)) {
1304 c = aton(E('_lan_netmask').value);
1305 d = aton(E('_lan_ipaddr').value) & c;
1306 e = 'Invalid IP address or subnet mask';
1307 if ((aton(a.value) & c) != d) {
1308 ferror.set(a, e, quiet || !ok);
1309 ok = 0;
1311 if ((aton(b.value) & c) != d) {
1312 ferror.set(b, e, quiet || !ok);
1313 ok = 0;
1317 if ((vis._dhcp_lease) && (!a._error_msg) && (!b._error_msg)) {
1318 if (aton(a.value) > aton(b.value)) {
1319 c = a.value;
1320 a.value = b.value;
1321 b.value = c;
1324 elem.setInnerHTML('dhcp_count', '(' + ((aton(b.value) - aton(a.value)) + 1) + ')');
1327 /* REMOVE-BEGIN */
1328 /* TODO: same validation for builds with VLAN-GUI enabled */
1329 /* REMOVE-END */
1330 ferror.clear('_modem_ipaddr');
1331 a = E('_modem_ipaddr');
1332 b = E('_lan_ipaddr');
1333 c = E('_lan_netmask');
1334 if ( vis['_modem_ipaddr'] && !(a._error_msg || b._error_msg || c._error_msg) && a.value != "0.0.0.0" ) {
1335 c = aton(c.value);
1336 if ( (aton(a.value) & c) == (aton(b.value) & c) ) {
1337 ferror.set('_modem_ipaddr', 'Modem IP address may not be within your local address space.', quiet);
1338 ok = 0;
1341 /* NOVLAN-END */
1343 return ok;
1346 function earlyInit()
1348 verifyFields(null, 1);
1351 function save()
1353 /* VLAN-BEGIN */
1354 if (lg.isEditing()) return;
1355 lg.resetNewEditor();
1356 /* VLAN-END */
1358 var a, b, c;
1359 var i;
1360 var u, uidx, wmode, sm2, wradio;
1362 if (!verifyFields(null, false)) return;
1364 var fom = E('_fom');
1366 fom.wan_mtu.value = fom.f_wan_mtu.value;
1367 fom.wan_mtu.disabled = fom.f_wan_mtu.disabled;
1369 /* NOVLAN-BEGIN */
1370 fom.lan_proto.value = fom.f_dhcpd_enable.checked ? 'dhcp' : 'static';
1371 /* NOVLAN-END */
1373 for (uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1374 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1375 if (wl_sunit(uidx)<0) {
1376 u = wl_unit(uidx);
1377 wmode = E('_f_wl'+u+'_mode').value;
1378 sm2 = E('_wl'+u+'_security_mode').value;
1379 wradio = E('_f_wl'+u+'_radio').checked;
1381 E('_wl'+u+'_nband').value = selectedBand(uidx);
1383 if (wmode == 'apwds') E('_wl'+u+'_mode').value = 'ap';
1384 else E('_wl'+u+'_mode').value = wmode;
1386 if (wmode == 'wet') {
1387 fom.wan_proto.value = 'disabled';
1388 fom.wan_proto.disabled = 0;
1389 /* NOVLAN-BEGIN */
1390 fom.lan_proto.value = 'static';
1391 /* NOVLAN-END */
1392 /* VLAN-BEGIN */
1393 /* REMOVE-BEGIN */
1394 // TODO - what's required ? integrate with tomatogrid?
1395 /* REMOVE-END */
1396 /* VLAN-END */
1399 a = [];
1400 for (i = 0; i < 10; ++i) a.push(E('_f_wl'+u+'_wds_' + i).value);
1401 E('_wl'+u+'_wds').value = joinAddr(a);
1403 if (wmode.indexOf('wds') != -1) {
1404 E('_wl'+u+'_wds_enable').value = 1;
1405 E('_wl'+u+'_lazywds').value = E('_f_wl'+u+'_lazywds').value;
1406 if (E('_wl'+u+'_lazywds').value == 1) E('_wl'+u+'_wds').value = '';
1408 else {
1409 E('_wl'+u+'_wds_enable').value = 0;
1410 E('_wl'+u+'_wds').value = '';
1411 E('_wl'+u+'_lazywds').value = 0;
1414 E('_wl'+u+'_radio').value = wradio ? 1 : 0;
1415 E('_wl'+u+'_auth').value = eval('nvram.wl'+u+'_auth');
1417 e = E('_wl'+u+'_akm');
1418 switch (sm2) {
1419 case 'disabled':
1420 case 'radius':
1421 case 'wep':
1422 e.value = '';
1423 break;
1424 default:
1425 c = [];
1427 if (sm2.indexOf('personal') != -1) {
1428 if (sm2.indexOf('wpa2_') == -1) c.push('psk');
1429 if (sm2.indexOf('wpa_') == -1) c.push('psk2');
1431 else {
1432 if (sm2.indexOf('wpa2_') == -1) c.push('wpa');
1433 if (sm2.indexOf('wpa_') == -1) c.push('wpa2');
1435 c = c.join(' ');
1436 e.value = c;
1437 break;
1439 E('_wl'+u+'_auth_mode').value = (sm2 == 'radius') ? 'radius' : 'none';
1440 E('_wl'+u+'_wep').value = ((sm2 == 'radius') || (sm2 == 'wep')) ? 'enabled': 'disabled';
1442 if (sm2.indexOf('wpa') != -1) E('_wl'+u+'_auth').value = 0;
1444 E('_wl'+u+'_nreqd').value = 0;
1445 E('_wl'+u+'_gmode').value = 1;
1446 E('_wl'+u+'_nmode').value = 0;
1447 E('_wl'+u+'_nmcsidx').value = -2; // Legacy Rate
1448 E('_wl'+u+'_nbw').value = 0;
1449 switch (E('_wl'+u+'_net_mode').value) {
1450 case 'b-only':
1451 E('_wl'+u+'_gmode').value = 0;
1452 break;
1453 case 'g-only':
1454 E('_wl'+u+'_gmode').value = 4;
1455 break;
1456 case 'bg-mixed':
1457 break;
1458 case 'a-only':
1459 E('_wl'+u+'_nmcsidx').value = -1; // Auto
1460 break;
1461 case 'n-only':
1462 if (selectedBand(uidx) == '1') { // 5 GHz
1463 E('_wl'+u+'_nmode').value = -1;
1464 E('_wl'+u+'_nmcsidx').value = -1;
1465 } else {
1466 E('_wl'+u+'_nmode').value = 1;
1467 E('_wl'+u+'_nmcsidx').value = 32;
1469 E('_wl'+u+'_nreqd').value = 1;
1470 break;
1471 default: // Auto
1472 E('_wl'+u+'_nmode').value = -1;
1473 E('_wl'+u+'_nmcsidx').value = -1;
1474 break;
1477 E('_wl'+u+'_nctrlsb').value = eval('nvram.wl'+u+'_nctrlsb');
1478 if (E('_wl'+u+'_nmode').value != 0) {
1479 E('_wl'+u+'_nctrlsb').value = E('_f_wl'+u+'_nctrlsb').value;
1480 E('_wl'+u+'_nbw').value = (E('_wl'+u+'_nbw_cap').value == 0) ? 20 : 40;
1483 E('_wl'+u+'_closed').value = E('_f_wl'+u+'_bcast').checked ? 0 : 1;
1485 a = fields.radio.selected(eval('fom.f_wl'+u+'_wepidx'));
1486 if (a) E('_wl'+u+'_key').value = a.value;
1490 fom.wan_islan.value = fom.f_wan_islan.checked ? 1 : 0;
1491 fom.pptp_dhcp.value = fom.f_pptp_dhcp.checked ? 1 : 0;
1493 fom.wan_dns.value = joinAddr([fom.f_dns_1.value, fom.f_dns_2.value, fom.f_dns_3.value]);
1495 /* VLAN-BEGIN */
1496 // initialize/wipe out relevant fields
1497 for (var i = 0 ; i <= MAX_BRIDGE_ID ; i++) {
1498 var j = (i == 0) ? '' : i.toString();
1499 fom['lan' + j + '_ifname'].value = '';
1500 fom['lan' + j + '_ipaddr'].value = '';
1501 fom['lan' + j + '_netmask'].value = '';
1502 fom['lan' + j + '_proto'].value = '';
1503 fom['lan' + j + '_stp'].value = '';
1504 fom['dhcp' + j + '_start'].value = '';
1505 fom['dhcp' + j + '_num'].value = '';
1506 fom['dhcp' + j + '_lease'].value = '';
1507 fom['dhcpd' + j + '_startip'].value = '';
1508 fom['dhcpd' + j + '_endip'].value = '';
1511 var d = lg.getAllData();
1512 for (var i = 0; i < d.length; ++i) {
1514 if (lg.countOverlappingNetworks(d[i][2]) > 1) {
1515 var s = 'Cannot proceed: two or more LAN bridges have conflicting IP addresses or overlapping subnets';
1516 alert(s);
1517 var e = E('footer-msg');
1518 e.innerHTML = s;
1519 e.style.visibility = 'visible';
1520 setTimeout(
1521 function() {
1522 e.innerHTML = '';
1523 e.style.visibility = 'hidden';
1524 }, 5000);
1525 return;
1528 var j = (parseInt(d[i][0]) == 0) ? '' : d[i][0].toString();
1529 fom['lan' + j + '_ifname'].value = 'br' + d[i][0];
1530 fom['lan' + j + '_stp'].value = d[i][1];
1531 fom['lan' + j + '_ipaddr'].value = d[i][2];
1532 fom['lan' + j + '_netmask'].value = d[i][3];
1533 fom['lan' + j + '_proto'].value = (d[i][4] != '0') ? 'dhcp' : 'static';
1534 fom['dhcp' + j + '_start'].value = (d[i][4] != '0') ? (d[i][5]).split('.').splice(3, 1) : '';
1535 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)
1536 fom['dhcp' + j + '_lease'].value = (d[i][4] != '0') ? d[i][7] : '';
1537 fom['dhcpd' + j + '_startip'].value = (d[i][4] != '0') ? d[i][5] : '';
1538 fom['dhcpd' + j + '_endip'].value = (d[i][4] != '0') ? d[i][6] : '';
1540 /* REMOVE-BEGIN */
1541 alert('lan' + j + '_ifname=' + fom['lan' + j + '_ifname'].value + '\n' +
1542 'lan' + j + '_stp=' + fom['lan' + j + '_stp'].value + '\n' +
1543 'lan' + j + '_ipaddr=' + fom['lan' + j + '_ipaddr'].value + '\n' +
1544 'lan' + j + '_netmask=' + fom['lan' + j + '_netmask'].value + '\n' +
1545 'lan' + j + '_proto=' + fom['lan' + j + '_proto'].value + '\n' +
1546 'dhcp' + j + '_start=' + fom['dhcp' + j + '_start'].value + '\n' +
1547 'dhcp' + j + '_num=' + fom['dhcp' + j + '_num'].value + '\n' +
1548 'dhcp' + j + '_lease=' + fom['dhcp' + j + '_lease'].value + '\n' +
1549 'dhcpd' + j + '_startip=' + fom['dhcpd' + j + '_startip'].value + '\n' +
1550 'dhcpd' + j + '_endip=' + fom['dhcpd' + j + '_endip'].value);
1551 /* REMOVE-END */
1554 var e = E('footer-msg');
1555 var t = fixIP(fom['lan_ipaddr'].value);
1556 if ((fom['lan_ifname'].value != 'br0') || (fom['lan_ipaddr'].value == '0.0.0.0') || (!t)) {
1557 e.innerHTML = 'Bridge br0 must be always defined and have a valid IP address set.';
1558 e.style.visibility = 'visible';
1559 setTimeout(
1560 function() {
1561 e.innerHTML = '';
1562 e.style.visibility = 'hidden';
1563 }, 5000);
1564 return;
1566 /* VLAN-END */
1568 /* REMOVE-BEGIN
1569 // if ((nvram.lan_ipaddr != fom.lan_ipaddr.value) || (nvram.lan1_ipaddr != fom.lan1_ipaddr.value) ||
1570 // (nvram.lan2_ipaddr != fom.lan2_ipaddr.value) || (nvram.lan3_ipaddr != fom.lan3_ipaddr.value)){
1571 REMOVE-END */
1573 fom.ppp_mlppp.value = fom.f_ppp_mlppp.checked ? 1 : 0;
1575 if (nvram.lan_ipaddr != fom.lan_ipaddr.value) {
1576 fom._moveip.value = 1;
1577 form.submit(fom);
1579 else {
1580 form.submit(fom, 1);
1584 function init()
1586 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1587 // if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1588 if (wl_sunit(uidx)<0) {
1589 refreshNetModes(uidx);
1590 refreshChannels(uidx);
1594 </script>
1596 </head>
1597 <body onload='init()'>
1598 <form id='_fom' method='post' action='tomato.cgi'>
1599 <table id='container' cellspacing=0>
1600 <tr><td colspan=2 id='header'>
1601 <div class='title'>Tomato</div>
1602 <div class='version'>Version <% version(); %></div>
1603 </td></tr>
1604 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
1605 <td id='content'>
1606 <div id='ident'><% ident(); %></div>
1608 <!-- / / / -->
1610 <input type='hidden' name='_nextpage' value='basic-network.asp'>
1611 <input type='hidden' name='_nextwait' value='10'>
1612 <input type='hidden' name='_service' value='*'>
1613 <input type='hidden' name='_moveip' value='0'>
1615 <input type='hidden' name='wan_mtu'>
1616 <input type='hidden' name='wan_islan'>
1617 <input type='hidden' name='pptp_dhcp'>
1618 <!-- NOVLAN-BEGIN -->
1619 <input type='hidden' name='lan_proto'>
1620 <!-- NOVLAN-END -->
1621 <input type='hidden' name='wan_dns'>
1622 <input type='hidden' name='ppp_mlppp'>
1624 <!-- VLAN-BEGIN -->
1625 <script type='text/javascript'>
1627 for (var i = 0 ; i <= MAX_BRIDGE_ID ; i++) {
1628 var j = (i == 0) ? '' : i.toString();
1629 W('<input type=\'hidden\' id=\'lan' + j + '_ifname\' name=\'lan' + j + '_ifname\'>');
1630 W('<input type=\'hidden\' id=\'lan' + j + '_ipaddr\' name=\'lan' + j + '_ipaddr\'>');
1631 W('<input type=\'hidden\' id=\'lan' + j + '_netmask\' name=\'lan' + j + '_netmask\'>');
1632 W('<input type=\'hidden\' id=\'lan' + j + '_proto\' name=\'lan' + j + '_proto\'>');
1633 W('<input type=\'hidden\' id=\'lan' + j + '_stp\' name=\'lan' + j + '_stp\'>');
1634 W('<input type=\'hidden\' id=\'dhcp' + j + '_start\' name=\'dhcp' + j + '_start\'>');
1635 W('<input type=\'hidden\' id=\'dhcp' + j + '_num\' name=\'dhcp' + j + '_num\'>');
1636 W('<input type=\'hidden\' id=\'dhcp' + j + '_lease\' name=\'dhcp' + j + '_lease\'>');
1637 W('<input type=\'hidden\' id=\'dhcpd' + j + '_startip\' name=\'dhcpd' + j + '_startip\'>');
1638 W('<input type=\'hidden\' id=\'dhcpd' + j + '_endip\' name=\'dhcpd' + j + '_endip\'>');
1640 </script>
1641 <!-- VLAN-END -->
1643 <div class='section-title'>WAN / Internet</div>
1644 <div class='section'>
1645 <script type='text/javascript'>
1646 createFieldTable('', [
1647 { title: 'Type', name: 'wan_proto', type: 'select', options: [['dhcp','DHCP'],['pppoe','PPPoE'],['static','Static'],['pptp','PPTP'],['l2tp','L2TP'],
1648 /* LINUX26-BEGIN */
1649 /* USB-BEGIN */
1650 ['ppp3g','3G Modem'],
1651 /* USB-END */
1652 /* LINUX26-END */
1653 ['disabled','Disabled']],
1654 value: nvram.wan_proto },
1655 { title: 'Modem device', name: 'modem_dev', type: 'select', options: [['ttyUSB0', '/dev/ttyUSB0'],['ttyUSB1', '/dev/ttyUSB1'],['ttyUSB2', '/dev/ttyUSB2'],['ttyUSB3', '/dev/ttyUSB3'],['ttyACM0', '/dev/ttyACM0']], value: nvram.modem_dev },
1656 { title: 'PIN Code', name: 'modem_pin', type: 'text', maxlen: 6, size: 8, value: nvram.modem_pin },
1657 { title: 'Modem init string', name: 'modem_init', type: 'text', maxlen: 25, size: 32, value: nvram.modem_init },
1658 { title: 'APN', name: 'modem_apn', type: 'text', maxlen: 25, size: 32, value: nvram.modem_apn },
1659 { title: 'Username', name: 'ppp_username', type: 'text', maxlen: 60, size: 64, value: nvram.ppp_username },
1660 { title: 'Password', name: 'ppp_passwd', type: 'password', maxlen: 60, size: 64, peekaboo: 1, value: nvram.ppp_passwd },
1661 { title: 'Service Name', name: 'ppp_service', type: 'text', maxlen: 50, size: 64, value: nvram.ppp_service },
1662 { title: 'L2TP Server', name: 'l2tp_server_ip', type: 'text', maxlen: 128, size: 64, value: nvram.l2tp_server_ip },
1663 { title: 'Use DHCP', name: 'f_pptp_dhcp', type: 'checkbox', value: (nvram.pptp_dhcp == 1) },
1664 { title: 'IP Address', name: 'wan_ipaddr', type: 'text', maxlen: 15, size: 17, value: nvram.wan_ipaddr },
1665 { title: 'Subnet Mask', name: 'wan_netmask', type: 'text', maxlen: 15, size: 17, value: nvram.wan_netmask },
1666 { title: 'Gateway', name: 'wan_gateway', type: 'text', maxlen: 15, size: 17, value: nvram.wan_gateway },
1667 { title: 'PPTP Gateway', name: 'pptp_server_ip', type: 'text', maxlen: 128, size: 64, value: nvram.pptp_server_ip },
1668 { title: 'Options', name: 'ppp_custom', type: 'text', maxlen: 256, size: 64, value: nvram.ppp_custom },
1669 { title: 'Connect Mode', name: 'ppp_demand', type: 'select', options: [['1', 'Connect On Demand'],['0', 'Keep Alive']],
1670 value: nvram.ppp_demand },
1671 { title: 'Max Idle Time', indent: 2, name: 'ppp_idletime', type: 'text', maxlen: 5, size: 7, suffix: ' <i>(minutes)</i>',
1672 value: nvram.ppp_idletime },
1673 { title: 'Redial Interval', indent: 2, name: 'ppp_redialperiod', type: 'text', maxlen: 5, size: 7, suffix: ' <i>(seconds)</i>',
1674 value: nvram.ppp_redialperiod },
1675 { title: 'LCP Echo Interval', indent: 2, name: 'pppoe_lei', type: 'text', maxlen: 5, size: 7, suffix: ' <i>(seconds)</i>',
1676 value: nvram.pppoe_lei },
1677 { title: 'LCP Echo Link fail limit', indent: 2, name: 'pppoe_lef', type: 'text', maxlen: 5, size: 7, value: nvram.pppoe_lef },
1678 { title: 'MTU', multi: [
1679 { name: 'mtu_enable', type: 'select', options: [['0', 'Default'],['1','Manual']], value: nvram.mtu_enable },
1680 { name: 'f_wan_mtu', type: 'text', maxlen: 4, size: 6, value: nvram.wan_mtu } ] },
1681 { title: 'Single Line MLPPP', name: 'f_ppp_mlppp', type: 'checkbox', value: (nvram.ppp_mlppp == 1) },
1683 { 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 },
1685 /* NOVLAN-BEGIN */
1686 { title: 'Use WAN port for LAN', name: 'f_wan_islan', type: 'checkbox', value: (nvram.wan_islan == 1) }
1687 /* NOVLAN-END */
1688 /* VLAN-BEGIN */
1689 { title: 'Bridge WAN port to primary LAN (br0)', name: 'f_wan_islan', type: 'checkbox', value: (nvram.wan_islan == 1) }
1690 /* VLAN-END */
1693 </script>
1694 </div>
1696 <div class='section-title'>LAN</div>
1697 <div class='section'>
1698 <!-- VLAN-BEGIN -->
1699 <table class='tomato-grid' cellspacing=1 id='lan-grid'></table>
1701 <script type='text/javascript'>lg.setup();</script>
1702 <!-- VLAN-END -->
1704 <script type='text/javascript'>
1705 dns = nvram.wan_dns.split(/\s+/);
1706 /* REMOVE-BEGIN
1707 //ipp = nvram.lan_ipaddr.split('.').splice(0, 3).join('.');
1708 REMOVE-END */
1709 createFieldTable('', [
1710 /* NOVLAN-BEGIN */
1711 { title: 'Router IP Address', name: 'lan_ipaddr', type: 'text', maxlen: 15, size: 17, value: nvram.lan_ipaddr },
1712 { title: 'Subnet Mask', name: 'lan_netmask', type: 'text', maxlen: 15, size: 17, value: nvram.lan_netmask },
1713 /* NOVLAN-END */
1714 { title: 'Default Gateway', name: 'lan_gateway', type: 'text', maxlen: 15, size: 17, value: nvram.lan_gateway },
1715 { 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' },
1716 { title: '', name: 'f_dns_2', type: 'text', maxlen: 21, size: 25, value: dns[1] || '0.0.0.0' },
1717 { title: '', name: 'f_dns_3', type: 'text', maxlen: 21, size: 25, value: dns[2] || '0.0.0.0' },
1718 /* NOVLAN-BEGIN */
1719 { title: 'DHCP Server', name: 'f_dhcpd_enable', type: 'checkbox', value: (nvram.lan_proto == 'dhcp') },
1720 { title: 'IP Address Range', indent: 2, multi: [
1721 { name: 'dhcpd_startip', type: 'text', maxlen: 15, size: 17, value: nvram.dhcpd_startip, suffix: ' - ' },
1722 { name: 'dhcpd_endip', type: 'text', maxlen: 15, size: 17, value: nvram.dhcpd_endip, suffix: ' <i id="dhcp_count"></i>' }
1723 ] },
1725 { title: 'Lease Time', indent: 2, name: 'dhcp_lease', type: 'text', maxlen: 6, size: 8, suffix: ' <i>(minutes)</i>',
1726 value: (nvram.dhcp_lease > 0) ? nvram.dhcp_lease : 1440 },
1727 { title: 'WINS', indent: 2, name: 'wan_wins', type: 'text', maxlen: 15, size: 17, value: nvram.wan_wins }
1728 /* NOVLAN-END */
1729 /* VLAN-BEGIN */
1730 { title: 'WINS <i>(for DHCP)</i>', name: 'wan_wins', type: 'text', maxlen: 15, size: 17, value: nvram.wan_wins }
1731 /* VLAN-END */
1733 </script>
1734 </div>
1736 <script type='text/javascript'>
1738 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
1739 //if(wl_ifaces[uidx][0].indexOf('.') < 0) {
1740 if (wl_sunit(uidx)<0) {
1741 var u = wl_unit(uidx);
1743 W('<input type=\'hidden\' id=\'_wl'+u+'_mode\' name=\'wl'+u+'_mode\'>');
1744 W('<input type=\'hidden\' id=\'_wl'+u+'_nband\' name=\'wl'+u+'_nband\'>');
1745 W('<input type=\'hidden\' id=\'_wl'+u+'_wds_enable\' name=\'wl'+u+'_wds_enable\'>');
1746 W('<input type=\'hidden\' id=\'_wl'+u+'_wds\' name=\'wl'+u+'_wds\'>');
1747 W('<input type=\'hidden\' id=\'_wl'+u+'_radio\' name=\'wl'+u+'_radio\'>');
1748 W('<input type=\'hidden\' id=\'_wl'+u+'_closed\' name=\'wl'+u+'_closed\'>');
1749 W('<input type=\'hidden\' id=\'_wl'+u+'_key\' name=\'wl'+u+'_key\'>');
1750 W('<input type=\'hidden\' id=\'_wl'+u+'_gmode\' name=\'wl'+u+'_gmode\'>');
1751 W('<input type=\'hidden\' id=\'_wl'+u+'_akm\' name=\'wl'+u+'_akm\'>');
1752 W('<input type=\'hidden\' id=\'_wl'+u+'_auth\' name=\'wl'+u+'_auth\'>');
1753 W('<input type=\'hidden\' id=\'_wl'+u+'_auth_mode\' name=\'wl'+u+'_auth_mode\'>');
1754 W('<input type=\'hidden\' id=\'_wl'+u+'_wep\' name=\'wl'+u+'_wep\'>');
1755 W('<input type=\'hidden\' id=\'_wl'+u+'_lazywds\' name=\'wl'+u+'_lazywds\'>');
1756 W('<input type=\'hidden\' id=\'_wl'+u+'_nmode\' name=\'wl'+u+'_nmode\'>');
1757 W('<input type=\'hidden\' id=\'_wl'+u+'_nmcsidx\' name=\'wl'+u+'_nmcsidx\'>');
1758 W('<input type=\'hidden\' id=\'_wl'+u+'_nreqd\' name=\'wl'+u+'_nreqd\'>');
1759 W('<input type=\'hidden\' id=\'_wl'+u+'_nctrlsb\' name=\'wl'+u+'_nctrlsb\'>');
1760 W('<input type=\'hidden\' id=\'_wl'+u+'_nbw\' name=\'wl'+u+'_nbw\'>');
1762 W('<div class=\'section-title\'>Wireless');
1763 // if (wl_ifaces.length > 1)
1764 W(' (' + wl_display_ifname(uidx) + ')');
1765 W('</div>');
1767 W('<div class=\'section\'>');
1769 f = [
1770 { title: 'Enable Wireless', name: 'f_wl'+u+'_radio', type: 'checkbox',
1771 value: (eval('nvram.wl'+u+'_radio') == '1') && (eval('nvram.wl'+u+'_net_mode') != 'disabled') },
1772 { title: 'MAC Address', text: '<a href="advanced-mac.asp">' + eval('nvram.wl'+u+'_hwaddr') + '</a>' },
1773 { title: 'Wireless Mode', name: 'f_wl'+u+'_mode', type: 'select',
1774 options: [['ap', 'Access Point'],['apwds', 'Access Point + WDS'],['sta', 'Wireless Client'],['wet', 'Wireless Ethernet Bridge'],['wds', 'WDS']],
1775 value: ((eval('nvram.wl'+u+'_mode') == 'ap') && (eval('nvram.wl'+u+'_wds_enable') == '1')) ? 'apwds' : eval('nvram.wl'+u+'_mode') },
1776 { title: 'Radio Band', name: 'f_wl'+u+'_nband', type: 'select', options: bands[uidx],
1777 value: eval('nvram.wl'+u+'_nband') || '0' == '0' ? bands[uidx][0][0] : eval('nvram.wl'+u+'_nband') },
1778 { title: 'Wireless Network Mode', name: 'wl'+u+'_net_mode', type: 'select',
1779 value: (eval('nvram.wl'+u+'_net_mode') == 'disabled') ? 'mixed' : eval('nvram.wl'+u+'_net_mode'),
1780 options: [], prefix: '<span id="__wl'+u+'_net_mode">', suffix: '</span>' },
1781 { title: 'SSID', name: 'wl'+u+'_ssid', type: 'text', maxlen: 32, size: 34, value: eval('nvram.wl'+u+'_ssid') },
1782 { title: 'Broadcast', indent: 2, name: 'f_wl'+u+'_bcast', type: 'checkbox', value: (eval('nvram.wl'+u+'_closed') == '0') },
1783 { 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+'">',
1784 value: eval('nvram.wl'+u+'_channel') },
1785 { title: 'Channel Width', name: 'wl'+u+'_nbw_cap', type: 'select', options: [['0','20 MHz'],['1','40 MHz']],
1786 value: eval('nvram.wl'+u+'_nbw_cap') },
1787 { title: 'Control Sideband', name: 'f_wl'+u+'_nctrlsb', type: 'select', options: [['lower','Lower'],['upper','Upper']],
1788 value: eval('nvram.wl'+u+'_nctrlsb') == 'none' ? 'lower' : eval('nvram.wl'+u+'_nctrlsb') },
1789 null,
1790 { title: 'Security', name: 'wl'+u+'_security_mode', type: 'select',
1791 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']],
1792 value: eval('nvram.wl'+u+'_security_mode') },
1793 { title: 'Encryption', indent: 2, name: 'wl'+u+'_crypto', type: 'select',
1794 options: [['tkip','TKIP'],['aes','AES'],['tkip+aes','TKIP / AES']], value: eval('nvram.wl'+u+'_crypto') },
1795 { title: 'Shared Key', indent: 2, name: 'wl'+u+'_wpa_psk', type: 'password', maxlen: 64, size: 66, peekaboo: 1,
1796 suffix: ' <input type="button" id="_f_wl'+u+'_psk_random1" value="Random" onclick="random_psk(\'_wl'+u+'_wpa_psk\')">',
1797 value: eval('nvram.wl'+u+'_wpa_psk') },
1798 { title: 'Shared Key', indent: 2, name: 'wl'+u+'_radius_key', type: 'password', maxlen: 80, size: 32, peekaboo: 1,
1799 suffix: ' <input type="button" id="_f_wl'+u+'_psk_random2" value="Random" onclick="random_psk(\'_wl'+u+'_radius_key\')">',
1800 value: eval('nvram.wl'+u+'_radius_key') },
1801 { title: 'Group Key Renewal', indent: 2, name: 'wl'+u+'_wpa_gtk_rekey', type: 'text', maxlen: 4, size: 6, suffix: ' <i>(seconds)</i>',
1802 value: eval('nvram.wl'+u+'_wpa_gtk_rekey') },
1803 { title: 'Radius Server', indent: 2, multi: [
1804 { name: 'wl'+u+'_radius_ipaddr', type: 'text', maxlen: 15, size: 17, value: eval('nvram.wl'+u+'_radius_ipaddr') },
1805 { name: 'wl'+u+'_radius_port', type: 'text', maxlen: 5, size: 7, prefix: ' : ', value: eval('nvram.wl'+u+'_radius_port') } ] },
1806 { title: 'Encryption', indent: 2, name: 'wl'+u+'_wep_bit', type: 'select', options: [['128','128-bits'],['64','64-bits']],
1807 value: eval('nvram.wl'+u+'_wep_bit') },
1808 { title: 'Passphrase', indent: 2, name: 'wl'+u+'_passphrase', type: 'text', maxlen: 16, size: 20,
1809 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+')">',
1810 value: eval('nvram.wl'+u+'_passphrase') }
1813 for (i = 1; i <= 4; ++i) {
1814 f.push(
1815 { title: ('Key ' + i), indent: 2, name: ('wl'+u+'_key' + i), type: 'text', maxlen: 26, size: 34,
1816 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>' : '>'),
1817 value: nvram['wl'+u+'_key' + i] });
1820 f.push(null,
1821 { title: 'WDS', name: 'f_wl'+u+'_lazywds', type: 'select',
1822 options: [['0','Link With...'],['1','Automatic']], value: nvram['wl'+u+'_lazywds'] } );
1823 wds = eval('nvram.wl'+u+'_wds').split(/\s+/);
1824 for (i = 0; i < 10; i += 2) {
1825 f.push({ title: (i ? '' : 'MAC Address'), indent: 2, multi: [
1826 { name: 'f_wl'+u+'_wds_' + i, type: 'text', maxlen: 17, size: 20, value: wds[i] || '00:00:00:00:00:00' },
1827 { name: 'f_wl'+u+'_wds_' + (i + 1), type: 'text', maxlen: 17, size: 20, value: wds[i + 1] || '00:00:00:00:00:00' } ] } );
1830 createFieldTable('', f);
1831 W('</div>');
1834 // for each wlif
1835 </script>
1837 <!-- / / / -->
1839 </td></tr>
1840 <tr><td id='footer' colspan=2>
1841 <span id='footer-msg'></span>
1842 <input type='button' value='Save' id='save-button' onclick='save()'>
1843 <input type='button' value='Cancel' id='cancel-button' onclick='reloadPage();'>
1844 </td></tr>
1845 </table>
1846 </form>
1847 <script type='text/javascript'>earlyInit()</script>
1848 <div style='height:100px'></div>
1849 </body>
1850 </html>