Tomato 1.28
[tomato.git] / release / src / router / www / basic-network.asp
blob21d3bbbfd924cdeb8aa800e52e68c3675d0d6a01
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 <link rel='stylesheet' type='text/css' href='color.css'>
17 <script type='text/javascript' src='tomato.js'></script>
19 <!-- / / / -->
21 <style type='text/css'>
22 #spin {
23 visibility: hidden;
24 vertical-align: middle;
26 </style>
28 <script type='text/javascript' src='debug.js'></script>
30 <script type='text/javascript' src='md5.js'></script>
31 <script type='text/javascript'>
32 // <% 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,pptp_server_ip,security_mode2,wan_dns,wan_gateway,wan_ipaddr,wan_mtu,wan_netmask,wan_proto,wan_wins,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,wds_save,wl_auth,wl0_hwaddr,wan_islan"); %>
34 xob = null;
35 ghz = [['1', '1 - 2.412 GHz'],['2', '2 - 2.417 GHz'],['3', '3 - 2.422 GHz'],['4', '4 - 2.427 GHz'],['5', '5 - 2.432 GHz'],['6', '6 - 2.437 GHz'],['7', '7 - 2.442 GHz'],['8', '8 - 2.447 GHz'],['9', '9 - 2.452 GHz'],['10', '10 - 2.457 GHz'],['11', '11 - 2.462 GHz'],['12', '12 - 2.467 GHz'],['13', '13 - 2.472 GHz'],['14', '14 - 2.484 GHz']]
37 if ((!fixIP(nvram.dhcpd_startip)) || (!fixIP(nvram.dhcpd_endip))) {
38 var x = nvram.lan_ipaddr.split('.').splice(0, 3).join('.') + '.';
39 nvram.dhcpd_startip = x + nvram.dhcp_start;
40 nvram.dhcpd_endip = x + ((nvram.dhcp_start * 1) + (nvram.dhcp_num * 1) - 1);
43 function spin(x)
45 var e = E('_f_scan');
46 e.disabled = x;
47 if (x) e.value = 'Scan ' + (wscan.tries + 1);
48 else e.value = 'Scan';
49 E('spin').style.visibility = x ? 'visible' : 'hidden';
52 function scan()
54 if (xob) return;
56 xob = new XmlHttp();
57 xob.onCompleted = function(text, xml) {
58 try {
59 var i;
61 wlscandata = [];
62 eval(text);
64 for (i = 0; i < wlscandata.length; ++i) {
65 var data = wlscandata[i];
66 var ch = data[2];
67 var mac = data[0];
69 if (!wscan.inuse[ch]) {
70 wscan.inuse[ch] = {
71 count: 0,
72 rssi: -999,
73 ssid: ''
77 if (!wscan.seen[mac]) {
78 wscan.seen[mac] = 1;
79 ++wscan.inuse[ch].count;
82 if (data[4] > wscan.inuse[ch].rssi) {
83 wscan.inuse[ch].rssi = data[4];
84 wscan.inuse[ch].ssid = data[1];
87 var e = E('_wl_channel');
88 for (i = 0; i < 14; ++i) {
89 var s = ghz[i][1];
90 var u = wscan.inuse[i + 1];
91 if (u) s += ' (' + u.count + ' AP' + (u.count == 1 ? '' : 's') + ' / strongest: "' + ellipsis(u.ssid, 15) + '" ' + u.rssi + ' dBm)';
92 e.options[i].innerHTML = s;
94 e.style.width = '400px';
96 xob = null;
98 if (wscan.tries < 4) {
99 ++wscan.tries;
100 setTimeout(scan, 1000);
101 return;
104 catch (x) {
106 spin(0);
108 xob.onError = function(x) {
109 alert('error: ' + x);
110 spin(0);
111 xob = null;
114 spin(1);
115 xob.post('update.cgi', 'exec=wlscan');
118 function scanButton()
120 if (xob) return;
122 wscan = {
123 seen: [],
124 inuse: [],
125 tries: 0
128 scan();
131 function joinAddr(a) {
132 var r, i, s;
134 r = [];
135 for (i = 0; i < a.length; ++i) {
136 s = a[i];
137 if ((s != '00:00:00:00:00:00') && (s != '0.0.0.0')) r.push(s);
139 return r.join(' ');
142 function random_x(max)
144 var c = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
145 var s = '';
146 while (max-- > 0) s += c.substr(Math.floor(c.length * Math.random()), 1);
147 return s;
150 function random_psk(id)
152 var e = E(id);
153 e.value = random_x(63);
154 verifyFields(null, 1);
157 function random_wep()
159 E('_wl_passphrase').value = random_x(16);
160 generate_wep();
163 function v_wep(e, quiet)
165 var s = e.value;
167 if (((s.length == 5) || (s.length == 13)) && (s.length == (e.maxLength >> 1))) {
168 // no checking
170 else {
171 s = s.toUpperCase().replace(/[^0-9A-F]/g, '');
172 if (s.length != e.maxLength) {
173 ferror.set(e, 'Invalid WEP key. Expecting ' + e.maxLength + ' hex or ' + (e.maxLength >> 1) + ' ASCII characters.', quiet);
174 return 0;
178 e.value = s;
179 ferror.clear(e);
180 return 1;
183 // compatible w/ Linksys' and Netgear's (key 1) method for 128-bits
184 function generate_wep()
186 function _wepgen(pass, i)
188 while (pass.length < 64) pass += pass;
189 return hex_md5(pass.substr(0, 64)).substr(i, (E('_wl_wep_bit').value == 128) ? 26 : 10);
192 var e = E('_wl_passphrase');
193 var pass = e.value;
194 if (!v_length(e, false, 3)) return;
195 E('_wl_key1').value = _wepgen(pass, 0);
196 pass += '#$%';
197 E('_wl_key2').value = _wepgen(pass, 2);
198 pass += '!@#';
199 E('_wl_key3').value = _wepgen(pass, 4);
200 pass += '%&^';
201 E('_wl_key4').value = _wepgen(pass, 6);
202 verifyFields(null, 1);
205 function verifyFields(focused, quiet)
207 var i;
208 var ok = 1;
209 var a, b, c, d, e;
212 // --- visibility ---
214 var vis = {
215 _wan_proto: 1,
216 _ppp_username: 1,
217 _ppp_passwd: 1,
218 _ppp_service: 1,
219 _l2tp_server_ip: 1,
220 _wan_ipaddr: 1,
221 _wan_netmask: 1,
222 _wan_gateway: 1,
223 _pptp_server_ip: 1,
224 _ppp_demand: 1,
225 _ppp_idletime: 1,
226 _ppp_redialperiod: 1,
227 _mtu_enable: 1,
228 _f_wan_mtu: 1,
229 _f_wan_islan: 0,
231 _dhcp_lease: 1,
232 _f_dhcpd_enable: 1,
233 _dhcpd_startip: 1,
234 _dhcpd_endip: 1,
235 _f_dns_1: 1,
236 _f_dns_2: 1,
237 _f_dns_3: 1,
238 _lan_gateway: 1,
239 _lan_ipaddr: 1,
240 _lan_netmask: 1,
241 _wan_wins: 1,
243 _f_wl_radio: 1,
244 _f_wmode: 1,
245 _wl_net_mode: 1,
246 _wl_ssid: 1,
247 _f_bcast: 1,
248 _wl_channel: 1,
249 _f_scan: 1,
251 _security_mode2: 1,
252 _wl_crypto: 1,
253 _wl_wpa_psk: 1,
254 _f_psk_random1: 1,
255 _f_psk_random2: 1,
256 _wl_wpa_gtk_rekey: 1,
257 _wl_radius_key: 1,
258 _wl_radius_ipaddr: 1,
259 _wl_radius_port: 1,
260 _wl_wep_bit: 1,
261 _wl_passphrase: 1,
262 _f_wep_gen: 1,
263 _f_wep_random: 1,
264 _wl_key1: 1,
265 _wl_key2: 1,
266 _wl_key3: 1,
267 _wl_key4: 1,
269 _f_wl_lazywds: 1,
270 _f_wds_0: 1
273 var wan = E('_wan_proto').value;
274 var wmode = E('_f_wmode').value;
276 if (wmode == 'wet') {
277 wan = 'disabled';
278 vis._wan_proto = 0;
279 vis._f_dhcpd_enable = 0;
280 vis._dhcp_lease = 0;
283 if ((wan == 'disabled') || (wmode == 'sta') || (wmode == 'wet')) {
284 vis._f_wan_islan = 1;
287 switch (wan) {
288 case 'disabled':
289 vis._ppp_username = 0;
290 vis._ppp_service = 0;
291 vis._l2tp_server_ip = 0;
292 vis._wan_ipaddr = 0;
293 vis._wan_netmask = 0;
294 vis._wan_gateway = 0;
295 vis._pptp_server_ip = 0;
296 vis._ppp_demand = 0;
297 vis._mtu_enable = 0;
298 vis._f_wan_mtu = 0;
299 break;
300 case 'dhcp':
301 vis._l2tp_server_ip = 0;
302 vis._ppp_demand = 0;
303 vis._ppp_service = 0;
304 vis._ppp_username = 0;
305 vis._pptp_server_ip = 0;
306 vis._wan_gateway = 0;
307 vis._wan_ipaddr = 0;
308 vis._wan_netmask = 0;
310 vis._lan_gateway = 0;
311 break;
312 case 'pppoe':
313 vis._l2tp_server_ip = 0;
314 vis._pptp_server_ip = 0;
315 vis._wan_gateway = 0;
316 vis._wan_ipaddr = 0;
317 vis._wan_netmask = 0;
319 vis._lan_gateway = 0;
320 break;
321 case 'static':
322 vis._l2tp_server_ip = 0;
323 vis._ppp_demand = 0;
324 vis._ppp_service = 0;
325 vis._ppp_username = 0;
326 vis._pptp_server_ip = 0;
328 vis._lan_gateway = 0;
329 break;
330 case 'pptp':
331 vis._l2tp_server_ip = 0;
332 vis._ppp_service = 0;
333 vis._wan_gateway = 0;
335 vis._lan_gateway = 0;
336 break;
337 case 'l2tp':
338 vis._ppp_service = 0;
339 vis._pptp_server_ip = 0;
340 vis._wan_gateway = 0;
341 vis._wan_ipaddr = 0;
342 vis._wan_netmask = 0;
344 vis._lan_gateway = 0;
345 break;
348 vis._ppp_idletime = (E('_ppp_demand').value == 1) && vis._ppp_demand
349 vis._ppp_redialperiod = !vis._ppp_idletime && vis._ppp_demand;
351 if (vis._mtu_enable) {
352 if (E('_mtu_enable').value == 0) {
353 vis._f_wan_mtu = 2;
354 a = E('_f_wan_mtu');
355 switch (E('_wan_proto').value) {
356 case 'pppoe':
357 a.value = 1492;
358 break;
359 case 'pptp':
360 case 'l2tp':
361 a.value = 1460;
362 break;
363 default:
364 a.value = 1500;
365 break;
370 if (!E('_f_dhcpd_enable').checked) vis._dhcp_lease = 0;
372 if (!E('_f_wl_radio').checked) {
373 vis._f_wl_lazywds = 2;
374 vis._f_wds_0 = 2;
375 vis._f_wmode = 2;
376 vis._security_mode2 = 2;
377 vis._wl_channel = 2;
378 vis._f_bcast = 2;
379 vis._wl_crypto = 2;
380 vis._wl_net_mode = 2;
381 vis._wl_wpa_psk = 2;
382 vis._wl_radius_key = 2;
383 vis._wl_wpa_gtk_rekey = 2;
384 vis._wl_radius_ipaddr = 2;
385 vis._wl_ssid = 2;
386 vis._wl_wep_bit = 2;
389 switch (wmode) {
390 case 'apwds':
391 case 'wds':
392 break;
393 case 'wet':
394 case 'sta':
395 vis._f_bcast = 0;
396 default:
397 vis._f_wl_lazywds = 0;
398 vis._f_wds_0 = 0;
399 break;
402 var sm2 = E('_security_mode2').value;
403 switch (sm2) {
404 case 'disabled':
405 vis._wl_crypto = 0;
406 vis._wl_wep_bit = 0;
407 vis._wl_wpa_psk = 0;
408 vis._wl_radius_key = 0;
409 vis._wl_radius_ipaddr = 0;
410 vis._wl_wpa_gtk_rekey = 0;
411 break;
412 case 'wep':
413 vis._wl_crypto = 0;
414 vis._wl_wpa_psk = 0;
415 vis._wl_radius_key = 0;
416 vis._wl_radius_ipaddr = 0;
417 vis._wl_wpa_gtk_rekey = 0;
418 break;
419 case 'radius':
420 vis._wl_crypto = 0;
421 vis._wl_wpa_psk = 0;
422 break;
423 default: // wpa*
424 vis._wl_wep_bit = 0;
425 if (sm2.indexOf('personal') != -1) {
426 vis._wl_radius_key = 0;
427 vis._wl_radius_ipaddr = 0;
429 else {
430 vis._wl_wpa_psk = 0;
432 break;
435 if ((E('_f_wl_lazywds').value == 1) && (vis._f_wds_0 == 1)) {
436 vis._f_wds_0 = 2;
441 vis._ppp_passwd = vis._ppp_username;
442 vis._dhcpd_startip = vis._dhcpd_endip = vis._wan_wins = vis._dhcp_lease;
443 vis._f_scan = vis._wl_channel;
444 vis._f_psk_random1 = vis._wl_wpa_psk;
445 vis._f_psk_random2 = vis._wl_radius_key;
446 vis._wl_radius_port = vis._wl_radius_ipaddr;
447 vis._wl_key1 = vis._wl_key2 = vis._wl_key3 = vis._wl_key4 = vis._f_wep_gen = vis._f_wep_random = vis._wl_passphrase = vis._wl_wep_bit;
449 for (i = 1; i < 10; ++i) {
450 vis['_f_wds_' + i] = vis._f_wds_0;
452 for (a in vis) {
453 b = E(a);
454 c = vis[a];
455 b.disabled = (c != 1);
456 PR(b).style.display = c ? '' : 'none';
460 // --- verify ---
462 if (wmode == 'sta') {
463 if ((wan == 'disabled') && (E('_f_wl_radio').checked)) {
464 ferror.set('_wan_proto', 'Wireless Client mode requires a valid WAN setting (usually DHCP).', quiet);
465 return 0;
468 ferror.clear('_wan_proto');
470 if ((vis._f_wmode == 1) && (wmode != 'ap') && (sm2.substr(0, 4) == 'wpa2')) {
471 ferror.set('_security_mode2', 'WPA2 is supported only in AP mode.', quiet);
472 return 0;
474 ferror.clear('_security_mode2');
476 a = E('_wl_wpa_psk');
477 ferror.clear(a);
478 if (vis._wl_wpa_psk == 1) {
479 if ((a.value.length < 8) || ((a.value.length == 64) && (a.value.search(/[^0-9A-Fa-f]/) != -1))) {
480 ferror.set('_wl_wpa_psk', 'Invalid pre-shared key. Please enter at least 8 characters or 64 hexadecimal digits.', quiet);
481 ok = 0;
485 // IP address
486 a = ['_l2tp_server_ip','_pptp_server_ip', '_wan_gateway','_wan_ipaddr','_lan_ipaddr', '_wl_radius_ipaddr', '_dhcpd_startip', '_dhcpd_endip'];
487 for (i = a.length - 1; i >= 0; --i)
488 if ((vis[a[i]]) && (!v_ip(a[i], quiet))) ok = 0;
490 // IP address, blank -> 0.0.0.0
491 a = ['_f_dns_1', '_f_dns_2', '_f_dns_3','_wan_wins','_lan_gateway'];
492 for (i = a.length - 1; i >= 0; --i)
493 if ((vis[a[i]]) && (!v_dns(a[i], quiet))) ok = 0;
495 // netmask
496 a = ['_wan_netmask','_lan_netmask'];
497 for (i = a.length - 1; i >= 0; --i)
498 if ((vis[a[i]]) && (!v_netmask(a[i], quiet))) ok = 0;
500 // range
501 a = [['_ppp_idletime', 3, 1440],['_ppp_redialperiod', 1, 86400],['_f_wan_mtu', 576, 1500],
502 ['_dhcp_lease', 1, 10080],['_wl_wpa_gtk_rekey', 60, 7200], ['_wl_radius_port', 1, 65535]];
503 for (i = a.length - 1; i >= 0; --i) {
504 v = a[i];
505 if ((vis[v[0]]) && (!v_range(v[0], quiet, v[1], v[2]))) ok = 0;
508 // length
509 a = [['_wl_ssid', 1], ['_wl_radius_key', 1]];
510 for (i = a.length - 1; i >= 0; --i) {
511 v = a[i];
512 if ((vis[v[0]]) && (!v_length(v[0], quiet, v[1], E(v[0]).maxlength))) ok = 0;
515 if (vis._wl_key1) {
516 a = (E('_wl_wep_bit').value == 128) ? 26 : 10;
517 for (i = 1; i <= 4; ++i) {
518 b = E('_wl_key' + i);
519 b.maxLength = a;
520 if ((b.value.length > 0) || (E('_f_wepidx_' + i).checked)) {
521 if (!v_wep(b, quiet)) ok = 0;
523 else ferror.clear(b);
527 ferror.clear('_f_wds_0');
528 if (vis._f_wds_0 == 1) {
529 b = 0;
530 for (i = 0; i < 10; ++i) {
531 a = E('_f_wds_' + i);
532 if (!v_macz(a, quiet)) ok = 0;
533 else if (!isMAC0(a.value)) b = 1;
535 if (!b) {
536 ferror.set('_f_wds_0', 'WDS MAC address required.', quiet);
537 ok = 0;
541 a = E('_dhcpd_startip');
542 b = E('_dhcpd_endip');
544 if ((!a._error_msg) && (!b._error_msg)) {
545 c = aton(E('_lan_netmask').value);
546 d = aton(E('_lan_ipaddr').value) & c;
547 e = 'Invalid IP address or subnet mask';
548 if ((aton(a.value) & c) != d) {
549 ferror.set(a, e, quiet);
550 ok = 0;
552 if ((aton(b.value) & c) != d) {
553 ferror.set(b, e, quiet);
554 ok = 0;
558 if ((!a._error_msg) && (!b._error_msg)) {
559 if (aton(a.value) > aton(b.value)) {
560 c = a.value;
561 a.value = b.value;
562 b.value = c;
565 elem.setInnerHTML('dhcp_count', '(' + ((aton(b.value) - aton(a.value)) + 1) + ')');
568 return ok;
571 function earlyInit()
573 verifyFields(null, 1);
576 function save()
578 var a, b, c;
579 var i;
581 if (!verifyFields(null, false)) return;
583 var fom = E('_fom');
584 var wmode = fom.f_wmode.value;
585 var sm2 = fom.security_mode2.value;
586 var wradio = fom.f_wl_radio.checked;
588 fom.lan_proto.value = fom.f_dhcpd_enable.checked ? 'dhcp' : 'static';
590 fom.wan_mtu.value = fom.f_wan_mtu.value;
591 fom.wan_mtu.disabled = fom.f_wan_mtu.disabled;
593 if (wmode == 'apwds') fom.wl_mode.value = 'ap';
594 else fom.wl_mode.value = wmode;
596 if (wmode == 'wet') {
597 fom.wan_proto.value = 'disabled';
598 fom.wan_proto.disabled = 0;
599 fom.lan_proto.value = 'static';
602 fom.wan_islan.value = fom.f_wan_islan.checked ? 1 : 0;
604 a = [];
605 for (i = 0; i < 10; ++i) a.push(E('_f_wds_' + i).value);
606 fom.wl_wds.value = joinAddr(a);
608 fom.wds_save.value = nvram.wds_save;
609 if (wmode.indexOf('wds') != -1) {
610 fom.wds_enable.value = 1;
611 fom.wl_lazywds.value = fom.f_wl_lazywds.value;
612 if (fom.wl_lazywds.value == 1) fom.wl_wds.value = '';
613 else fom.wds_save.value = fom.wl_wds.value;
615 else {
616 fom.wds_enable.value = 0;
617 fom.wl_wds.value = '';
618 fom.wl_lazywds.value = 0;
621 fom.wan_dns.value = joinAddr([fom.f_dns_1.value, fom.f_dns_2.value, fom.f_dns_3.value])
623 fom.wl_radio.value = fom.f_wl_radio.checked ? 1 : 0;
624 fom.wl_radio.disabled = fom.f_wl_radio.disabled;
626 fom.wl_auth.value = nvram.wl_auth;
628 switch (sm2) {
629 case 'disabled':
630 case 'radius':
631 case 'wep':
632 fom.security_mode.value = sm2;
633 fom.wl_akm.value = '';
634 break;
635 default:
636 c = [];
637 if (sm2.indexOf('personal') != -1) {
638 if (sm2.indexOf('wpa2_') == -1) c.push('psk');
639 if (sm2.indexOf('wpa_') == -1) c.push('psk2');
641 else {
642 if (sm2.indexOf('wpa2_') == -1) c.push('wpa');
643 if (sm2.indexOf('wpa_') == -1) c.push('wpa2');
645 c = c.join(' ');
646 fom.security_mode.value = c;
647 fom.wl_akm.value = c;
648 break;
650 fom.wl_auth_mode.value = (sm2 == 'radius') ? 'radius' : 'none';
651 fom.wl_wep.value = ((sm2 == 'radius') || (sm2 == 'wep')) ? 'enabled': 'disabled';
652 fom.wl_auth_mode.disabled = fom.wl_wep.disabled = fom.security_mode.disabled = fom.wl_akm.disabled = fom.security_mode2.disabled;
654 if (sm2.indexOf('wpa') != -1) fom.wl_auth.value = 0;
656 fom.wl_gmode.value = (fom.wl_net_mode.value == 'b-only') ? 0 : (fom.wl_net_mode.value == 'g-only') ? 2 : 1;
657 fom.wl_gmode.disabled = fom.wl_net_mode.disabled;
659 fom.wl_closed.value = fom.f_bcast.checked ? 0 : 1;
660 fom.wl_closed.disabled = fom.f_bcast.disabled;
662 a = fields.radio.selected(fom.f_wepidx);
663 if (a) fom.wl_key.value = a.value;
664 fom.wl_key.disabled = fom.wl_key1.disabled;
666 fom.wl_mode.disabled = fom.wl_wds.disabled = fom.wds_enable.disabled = !fom.f_wl_radio.checked;
668 if (nvram.lan_ipaddr != fom.lan_ipaddr.value) {
669 fom._moveip.value = 1;
670 form.submit(fom);
672 else {
673 form.submit(fom, 1);
676 </script>
678 </head>
679 <body>
680 <form id='_fom' method='post' action='tomato.cgi'>
681 <table id='container' cellspacing=0>
682 <tr><td colspan=2 id='header'>
683 <div class='title'>Tomato</div>
684 <div class='version'>Version <% version(); %></div>
685 </td></tr>
686 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
687 <td id='content'>
688 <div id='ident'><% ident(); %></div>
690 <!-- / / / -->
692 <input type='hidden' name='_nextpage' value='basic-network.asp'>
693 <input type='hidden' name='_nextwait' value='10'>
694 <input type='hidden' name='_service' value='*'>
695 <input type='hidden' name='_moveip' value='0'>
697 <input type='hidden' name='wan_mtu'>
698 <input type='hidden' name='wan_islan'>
699 <input type='hidden' name='wl_mode'>
700 <input type='hidden' name='wds_enable'>
701 <input type='hidden' name='wl_wds'>
702 <input type='hidden' name='wds_save'>
703 <input type='hidden' name='lan_proto'>
704 <input type='hidden' name='wan_dns'>
705 <input type='hidden' name='wl_radio'>
706 <input type='hidden' name='wl_closed'>
707 <input type='hidden' name='wl_key'>
708 <input type='hidden' name='wl_gmode'>
709 <input type='hidden' name='security_mode'>
710 <input type='hidden' name='wl_akm'>
711 <input type='hidden' name='wl_auth'>
712 <input type='hidden' name='wl_auth_mode'>
713 <input type='hidden' name='wl_wep'>
714 <input type='hidden' name='wl_lazywds'>
717 <div class='section-title'>WAN / Internet</div>
718 <div class='section'>
719 <script type='text/javascript'>
720 createFieldTable('', [
721 { title: 'Type', name: 'wan_proto', type: 'select', options: [['dhcp','DHCP'],['pppoe','PPPoE'],['static','Static'],['pptp','PPTP'],['l2tp','L2TP'],['disabled','Disabled']],
722 value: nvram.wan_proto },
723 { title: 'Username', name: 'ppp_username', type: 'text', maxlen: 60, size: 64, value: nvram.ppp_username },
724 { title: 'Password', name: 'ppp_passwd', type: 'password', maxlen: 60, size: 64, peekaboo: 1, value: nvram.ppp_passwd },
725 { title: 'Service Name', name: 'ppp_service', type: 'text', maxlen: 50, size: 54, value: nvram.ppp_service },
726 { title: 'L2TP Server', name: 'l2tp_server_ip', type: 'text', maxlen: 15, size: 17, value: nvram.l2tp_server_ip },
727 { title: 'IP Address', name: 'wan_ipaddr', type: 'text', maxlen: 15, size: 17, value: nvram.wan_ipaddr },
728 { title: 'Subnet Mask', name: 'wan_netmask', type: 'text', maxlen: 15, size: 17, value: nvram.wan_netmask },
729 { title: 'Gateway', name: 'wan_gateway', type: 'text', maxlen: 15, size: 17, value: nvram.wan_gateway },
730 { title: 'Gateway', name: 'pptp_server_ip', type: 'text', maxlen: 15, size: 17, value: nvram.pptp_server_ip },
731 { title: 'Connect Mode', name: 'ppp_demand', type: 'select', options: [['1', 'Connect On Demand'],['0', 'Keep Alive']],
732 value: nvram.ppp_demand },
733 { title: 'Max Idle Time', indent: 2, name: 'ppp_idletime', type: 'text', maxlen: 5, size: 7, suffix: ' <i>(minutes)</i>',
734 value: nvram.ppp_idletime },
735 { title: 'Check Interval', indent: 2, name: 'ppp_redialperiod', type: 'text', maxlen: 5, size: 7, suffix: ' <i>(seconds)</i>',
736 value: nvram.ppp_redialperiod },
737 { title: 'MTU', multi: [
738 { name: 'mtu_enable', type: 'select', options: [['0', 'Default'],['1','Manual']], value: nvram.mtu_enable },
739 { name: 'f_wan_mtu', type: 'text', maxlen: 4, size: 6, value: nvram.wan_mtu } ] },
740 { title: 'Use WAN port for LAN', name: 'f_wan_islan', type: 'checkbox', value: (nvram.wan_islan == 1) }
742 </script>
743 </div>
745 <div class='section-title'>LAN</div>
746 <div class='section'>
747 <script type='text/javascript'>
748 dns = nvram.wan_dns.split(/\s+/);
749 ipp = nvram.lan_ipaddr.split('.').splice(0, 3).join('.');
751 createFieldTable('', [
752 { title: 'Router IP Address', name: 'lan_ipaddr', type: 'text', maxlen: 15, size: 17, value: nvram.lan_ipaddr },
753 { title: 'Subnet Mask', name: 'lan_netmask', type: 'text', maxlen: 15, size: 17, value: nvram.lan_netmask },
754 { title: 'Default Gateway', name: 'lan_gateway', type: 'text', maxlen: 15, size: 17, value: nvram.lan_gateway },
755 { 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' },
756 { title: '', name: 'f_dns_2', type: 'text', maxlen: 21, size: 25, value: dns[1] || '0.0.0.0' },
757 { title: '', name: 'f_dns_3', type: 'text', maxlen: 21, size: 25, value: dns[2] || '0.0.0.0' },
758 { title: 'DHCP Server', name: 'f_dhcpd_enable', type: 'checkbox', value: (nvram.lan_proto == 'dhcp') },
759 { title: 'IP Address Range', indent: 2, multi: [
760 { name: 'dhcpd_startip', type: 'text', maxlen: 15, size: 17, value: nvram.dhcpd_startip, suffix: ' - ' },
761 { name: 'dhcpd_endip', type: 'text', maxlen: 15, size: 17, value: nvram.dhcpd_endip, suffix: ' <i id="dhcp_count"></i>' }
762 ] },
764 { title: 'Lease Time', indent: 2, name: 'dhcp_lease', type: 'text', maxlen: 6, size: 8, suffix: ' <i>(minutes)</i>',
765 value: (nvram.dhcp_lease > 0) ? nvram.dhcp_lease : 1440 },
766 { title: 'WINS', indent: 2, name: 'wan_wins', type: 'text', maxlen: 15, size: 17, value: nvram.wan_wins }
768 </script>
769 </div>
772 <div class='section-title'>Wireless</div>
773 <div class='section'>
774 <script type='text/javascript'>
775 f = [
776 { title: 'Enable Wireless', name: 'f_wl_radio', type: 'checkbox',
777 value: (nvram.wl_radio == '1') && (nvram.wl_net_mode != 'disabled') },
778 { title: 'MAC Address', text: '<a href="advanced-mac.asp">' + nvram.wl0_hwaddr + '</a>' },
779 { title: 'Wireless Mode', name: 'f_wmode', type: 'select',
780 options: [['ap', 'Access Point'],['apwds', 'Access Point + WDS'],['sta', 'Wireless Client'],['wet', 'Wireless Ethernet Bridge'],['wds', 'WDS']],
781 value: ((nvram.wl_mode == 'ap') && (nvram.wds_enable == '1')) ? 'apwds' : nvram.wl_mode },
782 { title: 'B/G Mode', name: 'wl_net_mode', type: 'select', value: (nvram.wl_net_mode == 'disabled') ? 'mixed' : nvram.wl_net_mode, options:[['mixed','Mixed'],['b-only','B Only'],['g-only','G Only']] },
783 { title: 'SSID', name: 'wl_ssid', type: 'text', maxlen: 32, size: 34, value: nvram.wl_ssid },
784 { title: 'Broadcast', indent: 2, name: 'f_bcast', type: 'checkbox', value: (nvram.wl_closed == '0') },
785 { title: 'Channel', name: 'wl_channel', type: 'select', options: ghz, suffix: ' <input type="button" id="_f_scan" value="Scan" onclick="scanButton()"> <img src="spin.gif" id="spin">',
786 value: nvram.wl_channel },
787 null,
788 { title: 'Security', name: 'security_mode2', type: 'select',
789 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']],
790 value: nvram.security_mode2 },
791 { title: 'Encryption', indent: 2, name: 'wl_crypto', type: 'select',
792 options: [['tkip','TKIP'],['aes','AES'],['tkip+aes','TKIP / AES']], value: nvram.wl_crypto },
793 { title: 'Shared Key', indent: 2, name: 'wl_wpa_psk', type: 'password', maxlen: 64, size: 66, peekaboo: 1,
794 suffix: ' <input type="button" id="_f_psk_random1" value="Random" onclick="random_psk(\'_wl_wpa_psk\')">',
795 value: nvram.wl_wpa_psk },
796 { title: 'Shared Key', indent: 2, name: 'wl_radius_key', type: 'password', maxlen: 80, size: 32, peekaboo: 1,
797 suffix: ' <input type="button" id="_f_psk_random2" value="Random" onclick="random_psk(\'_wl_radius_key\')">',
798 value: nvram.wl_radius_key },
799 { title: 'Group Key Renewal', indent: 2, name: 'wl_wpa_gtk_rekey', type: 'text', maxlen: 4, size: 6, suffix: ' <i>(seconds)</i>',
800 value: nvram.wl_wpa_gtk_rekey },
801 { title: 'Radius Server', indent: 2, multi: [
802 { name: 'wl_radius_ipaddr', type: 'text', maxlen: 15, size: 17, value: nvram.wl_radius_ipaddr },
803 { name: 'wl_radius_port', type: 'text', maxlen: 5, size: 7, prefix: ' : ', value: nvram.wl_radius_port } ] },
804 { title: 'Encryption', indent: 2, name: 'wl_wep_bit', type: 'select', options: [['128','128-bits'],['64','64-bits']],
805 value: nvram.wl_wep_bit },
806 { title: 'Passphrase', indent: 2, name: 'wl_passphrase', type: 'text', maxlen: 16, size: 20,
807 suffix: ' <input type="button" id="_f_wep_gen" value="Generate" onclick="generate_wep()"> <input type="button" id="_f_wep_random" value="Random" onclick="random_wep()">',
808 value: nvram.wl_passphrase }
811 for (i = 1; i <= 4; ++i) {
812 f.push(
813 { title: ('Key ' + i), indent: 2, name: ('wl_key' + i), type: 'text', maxlen: 26, size: 34,
814 suffix: '<input type="radio" onchange="verifyFields(this,1)" onclick="verifyFields(this,1)" name="f_wepidx" id="_f_wepidx_' + i + '" value="' + i + '"' + ((nvram.wl_key == i) ? ' checked>' : '>'),
815 value: nvram['wl_key' + i] });
818 f.push(null,
819 { title: 'WDS', name: 'f_wl_lazywds', type: 'select',
820 options: [['0','Link With...'],['1','Automatic']], value: nvram.wl_lazywds } );
821 wds = ((nvram.wl_wds == '') ? nvram.wds_save : nvram.wl_wds).split(/\s+/);
822 for (i = 0; i < 10; i += 2) {
823 f.push({ title: (i ? '' : 'MAC Address'), indent: 2, multi: [
824 { name: 'f_wds_' + i, type: 'text', maxlen: 17, size: 20, value: wds[i] || '00:00:00:00:00:00' },
825 { name: 'f_wds_' + (i + 1), type: 'text', maxlen: 17, size: 20, value: wds[i + 1] || '00:00:00:00:00:00' } ] } );
828 createFieldTable('', f);
829 </script>
830 </div>
832 <!-- / / / -->
834 </td></tr>
835 <tr><td id='footer' colspan=2>
836 <span id='footer-msg'></span>
837 <input type='button' value='Save' id='save-button' onclick='save()'>
838 <input type='button' value='Cancel' id='cancel-button' onclick='reloadPage();'>
839 </td></tr>
840 </table>
841 </form>
842 <script type='text/javascript'>earlyInit()</script>
843 <div style='height:100px'></div>
844 </body>
845 </html>