libsodium: Needed for Dnscrypto-proxy Release 1.3.0
[tomato.git] / release / src / router / www / wireless.js
blob2b1ba2d90f8b042eb31b2c1dae0e0de9a3e6b039
1 function selectedBand(uidx) {
2         if (bands[uidx].length > 1) {
3                 var u = wl_fface(uidx);
4                 var e = E('_f_wl'+u+'_nband');
5                 return (e.value + '' == '' ? eval('nvram["wl'+u+'_nband"]') : e.value);
6         } else if (bands[uidx].length > 0) {
7                 return bands[uidx][0][0] || '0';
8         } else {
9                 return '0';
10         }
13 function refreshNetModes(uidx) {
14         var e, i, buf, val;
16         if (uidx >= wl_ifaces.length) return;
17         var u = wl_unit(uidx);
19         var m = [['mixed','Auto']];
20         if (selectedBand(uidx) == '1') {
21                 m.push(['a-only','A Only']);
22                 if (nphy) {
23                         m.push(['n-only','N Only']);
24                 }
25         }
26         else {
27                 m.push(['b-only','B Only']);
28                 m.push(['g-only','G Only']);
29                 if (nphy) {
30                         m.push(['bg-mixed','B/G Mixed']);
31                         m.push(['n-only','N Only']);
32                 }
33         }
35         e = E('_wl'+u+'_net_mode');
36         buf = '';
37         val = (!nm_loaded[uidx] || (e.value + '' == '')) ? eval('nvram["wl'+u+'_net_mode"]') : e.value;
38         if (val == 'disabled') val = 'mixed';
39         for (i = 0; i < m.length; ++i)
40                 buf += '<option value="' + m[i][0] + '"' + ((m[i][0] == val) ? ' selected' : '') + '>' + m[i][1] + '</option>';
42         e = E('__wl'+u+'_net_mode');
43         buf = '<select name="wl'+u+'_net_mode" onchange="verifyFields(this, 1)" id = "_wl'+u+'_net_mode">' + buf + '</select>';
44         elem.setInnerHTML(e, buf);
46         nm_loaded[uidx] = 1;
49 function refreshChannels(uidx) {
50         if (refresher[uidx] != null) return;
51         if (u >= wl_ifaces.length) return;
52         var u = wl_unit(uidx);
54         refresher[uidx] = new XmlHttp();
55         refresher[uidx].onCompleted = function(text, xml) {
56                 try {
57                         var e, i, buf, val;
59                         var wl_channels = [];
60                         eval(text);
62                         ghz[uidx] = [];
63                         max_channel[uidx] = 0;
64                         for (i = 0; i < wl_channels.length; ++i) {
65                                 ghz[uidx].push([wl_channels[i][0] + '',
66                                         (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']);
67                                 max_channel[uidx] = wl_channels[i][0] * 1;
68                         }
70                         e = E('_wl'+u+'_channel');
71                         buf = '';
72                         val = (!ch_loaded[uidx] || (e.value + '' == '')) ? eval('nvram["wl'+u+'_channel"]') : e.value;
73                         for (i = 0; i < ghz[uidx].length; ++i)
74                                 buf += '<option value="' + ghz[uidx][i][0] + '"' + ((ghz[uidx][i][0] == val) ? ' selected' : '') + '>' + ghz[uidx][i][1] + '</option>';
76                         e = E('__wl'+u+'_channel');
77                         buf = '<select name="wl'+u+'_channel" onchange="verifyFields(this, 1)" id = "_wl'+u+'_channel">' + buf + '</select>';
78                         elem.setInnerHTML(e, buf);
79                         ch_loaded[uidx] = 1;
81                         refresher[uidx] = null;
82                         verifyFields(null, 1);
83                 }
84                 catch (x) {
85                 }
86                 refresher[uidx] = null;
87         }
89         var bw, sb, e;
91         e = E('_f_wl'+u+'_nctrlsb');
92         if (e != null)
93         {
94                 sb = (e.value + '' == '' ? eval('nvram["wl'+u+'_nctrlsb"]') : e.value);
95 /* REMOVE-BEGIN */
96 // AB
97 //              sb = ((e.value + '' == '') ? (nvram['wl'+u+'_nctrlsb']) : e.value);
98 /* REMOVE-END */
99                 e = E('_wl'+u+'_nbw_cap');
100                 bw = (e.value + '' == '' ? eval('nvram["wl'+u+'_nbw_cap"]') : e.value) == '0' ? '20' : '40';
101 /* REMOVE-BEGIN */
102 // AB
103 //              bw = ((e.value + '' == '') ? (nvram['wl'+u+'_nbw_cap']) : e.value) == '0' ? '20' : '40';
104 /* REMOVE-END */
105                 refresher[uidx].onError = function(ex) { alert(ex); refresher[uidx] = null; reloadPage(); }
106                 refresher[uidx].post('update.cgi', 'exec=wlchannels&arg0=' + u + '&arg1=' + (nphy ? '1' : '0') +
107                         '&arg2=' + bw + '&arg3=' + selectedBand(uidx) + '&arg4=' + sb);
108         }
111 function scan() {
112         if (xob) return;
114         var unit = wscan.unit;
115         var uidx = wl_uidx(unit);
117         xob = new XmlHttp();
118         xob.onCompleted = function(text, xml) {
119                 try {
120                         var i;
122                         wlscandata = [];
123                         eval(text);
125                         for (i = 0; i < wlscandata.length; ++i) {
126                                 var data = wlscandata[i];
127                                 var ch = data[2];
128                                 var mac = data[0];
130                                 if (!wscan.inuse[ch]) {
131                                         wscan.inuse[ch] = {
132                                                 count: 0,
133                                                 rssi: -999,
134                                                 ssid: ''
135                                         };
136                                 }
138                                 if (!wscan.seen[mac]) {
139                                         wscan.seen[mac] = 1;
140                                         ++wscan.inuse[ch].count;
141                                 }
143                                 if (data[4] > wscan.inuse[ch].rssi) {
144                                         wscan.inuse[ch].rssi = data[4];
145                                         wscan.inuse[ch].ssid = data[1];
146                                 }
147                         }
148                         var e = E('_wl'+unit+'_channel');
149                         for (i = 1; i < ghz[uidx].length; ++i) {
150                                 var s = ghz[uidx][i][1];
151                                 var u = wscan.inuse[ghz[uidx][i][0]];
152                                 if (u) s += ' (' + u.count + ' AP' + (u.count == 1 ? '' : 's') + ' / strongest: "' + escapeHTML(ellipsis(u.ssid, 15)) + '" ' + u.rssi + ' dBm)';
153                                 e.options[i].innerHTML = s;
154                         }
155                         e.style.width = '400px';
157                         xob = null;
159                         if (wscan.tries < 4) {
160                                 ++wscan.tries;
161                                 setTimeout(scan, 1000);
162                                 return;
163                         }
164                 }
165                 catch (x) {
166                 }
167                 spin(0, unit);
168         }
169         xob.onError = function(x) {
170                 alert('error: ' + x);
171                 spin(0, unit);
172                 xob = null;
173         }
175         spin(1, unit);
176         xob.post('update.cgi', 'exec=wlscan&arg0='+unit);
179 function scanButton(u) {
180         if (xob) return;
182         wscan = {
183                 unit: u,
184                 seen: [],
185                 inuse: [],
186                 tries: 0
187         };
189         scan();
192 function joinAddr(a) {
193         var r, i, s;
195         r = [];
196         for (i = 0; i < a.length; ++i) {
197                 s = a[i];
198                 if ((s != '00:00:00:00:00:00') && (s != '0.0.0.0')) r.push(s);
199         }
200         return r.join(' ');
203 function random_x(max) {
204         var c = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
205         var s = '';
206         while (max-- > 0) s += c.substr(Math.floor(c.length * Math.random()), 1);
207         return s;
210 function random_psk(id) {
211         var e = E(id);
212         e.value = random_x(63);
213         verifyFields(null, 1);
216 function random_wep(u) {
217         E('_wl'+u+'_passphrase').value = random_x(16);
218         generate_wep(u);
221 function v_wep(e, quiet) {
222         var s = e.value;
224         if (((s.length == 5) || (s.length == 13)) && (s.length == (e.maxLength >> 1))) {
225                 // no checking
226         }
227         else {
228                 s = s.toUpperCase().replace(/[^0-9A-F]/g, '');
229                 if (s.length != e.maxLength) {
230                         ferror.set(e, 'Invalid WEP key. Expecting ' + e.maxLength + ' hex or ' + (e.maxLength >> 1) + ' ASCII characters.', quiet);
231                         return 0;
232                 }
233         }
235         e.value = s;
236         ferror.clear(e);
237         return 1;
240 // compatible w/ Linksys' and Netgear's (key 1) method for 128-bits
241 function generate_wep(u) {
242         function _wepgen(pass, i)
243         {
244                 while (pass.length < 64) pass += pass;
245                 return hex_md5(pass.substr(0, 64)).substr(i, (E('_wl'+u+'_wep_bit').value == 128) ? 26 : 10);
246         }
248         var e = E('_wl'+u+'_passphrase');
249         var pass = e.value;
250         if (!v_length(e, false, 3)) return;
251         E('_wl'+u+'_key1').value = _wepgen(pass, 0);
252         pass += '#$%';
253         E('_wl'+u+'_key2').value = _wepgen(pass, 2);
254         pass += '!@#';
255         E('_wl'+u+'_key3').value = _wepgen(pass, 4);
256         pass += '%&^';
257         E('_wl'+u+'_key4').value = _wepgen(pass, 6);
258         verifyFields(null, 1);