root/src/router/services/networking/madwifi.c

Revision 12436, 55.0 kB (checked in by BrainSlayer, 5 months ago)

cpe only mode

Line 
1 /*
2  * madwifi.c
3  *
4  * Copyright (C) 2005 - 2007 Sebastian Gottschall <gottschall@dd-wrt.com>
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * $Id:
21  */
22
23 #ifdef HAVE_MADWIFI
24 #include <sys/mman.h>
25 #include <stdio.h>
26 #include <unistd.h>
27 #include <signal.h>
28 #include <fcntl.h>
29
30 #include <sys/types.h>
31 #include <sys/file.h>
32 #include <sys/ioctl.h>
33 #include <sys/socket.h>
34
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <string.h>
38 #include <stdint.h>
39 #include <ctype.h>
40 #include <getopt.h>
41 #include <err.h>
42
43 #include <ctype.h>
44 #include <string.h>
45 #include <stdlib.h>
46 #include <stdio.h>
47 #include <bcmnvram.h>
48 #include <bcmutils.h>
49 #include <shutils.h>
50 #include <utils.h>
51 #include <unistd.h>
52
53 #include "wireless.h"
54 #include "net80211/ieee80211.h"
55 #include "net80211/ieee80211_crypto.h"
56 #include "net80211/ieee80211_ioctl.h"
57 #include <iwlib.h>
58 #include <services.h>
59
60 static int setsysctrl(const char *dev, const char *control, u_long value)
61 {
62         sysprintf("echo %li > /proc/sys/dev/%s/%s", value, dev, control);
63
64         return 0;
65 }
66
67 static void setdistance(char *device, int distance, int chanbw)
68 {
69
70         if (distance >= 0) {
71                 int slottime = (distance / 300) + ((distance % 300) ? 1 : 0);
72                 int acktimeout = slottime * 2 + 3;
73                 int ctstimeout = slottime * 2 + 3;
74
75                 // printf("Setting distance on interface %s to %i meters\n", device,
76                 // distance);
77                 setsysctrl(device, "slottime", slottime);
78                 setsysctrl(device, "acktimeout", acktimeout);
79                 setsysctrl(device, "ctstimeout", ctstimeout);
80         }
81 }
82
83 // returns the number of installed atheros devices/cards
84
85 static char iflist[1024];
86
87 char *getiflist(void)
88 {
89         return iflist;
90 }
91
92 static void deconfigure_single(int count)
93 {
94         char *next;
95         char dev[16];
96         char var[80];
97         char wifivifs[16];
98
99         sprintf(wifivifs, "ath%d_vifs", count);
100         sprintf(dev, "ath%d", count);
101         char vifs[128];
102
103         sprintf(vifs, "%s.1 %s.2 %s.3 %s.4 %s.5 %s.6 %s.7 %s.8 %s.9", dev, dev,
104                 dev, dev, dev, dev, dev, dev, dev);
105         int s;
106
107         for (s = 1; s <= 10; s++) {
108                 sprintf(dev, "ath%d.wds%d", count, s - 1);
109                 if (ifexists(dev)) {
110                         br_del_interface("br0", dev);
111                         sysprintf("ifconfig %s down", dev);
112                 }
113         }
114         sprintf(dev, "ath%d", count);
115         if (ifexists(dev)) {
116                 br_del_interface("br0", dev);
117                 sysprintf("ifconfig %s down", dev);
118         }
119         foreach(var, vifs, next) {
120                 if (ifexists(var)) {
121                         sysprintf("ifconfig %s down", dev);
122                 }
123         }
124         sprintf(dev, "ath%d", count);
125
126         if (ifexists(dev))
127                 sysprintf("wlanconfig %s destroy", dev);
128
129         foreach(var, vifs, next) {
130                 if (ifexists(var)) {
131                         sysprintf("wlanconfig %s destroy", var);
132                 }
133         }
134
135 }
136
137 void deconfigure_wifi(void)
138 {
139
140         memset(iflist, 0, 1024);
141         killall("wrt-radauth", SIGTERM);
142         killall("hostapd", SIGTERM);
143         killall("wpa_supplicant", SIGTERM);
144         sleep(1);
145         killall("wrt-radauth", SIGKILL);
146         killall("hostapd", SIGKILL);
147         killall("wpa_supplicant", SIGKILL);
148
149         int c = getdevicecount();
150         int i;
151
152         for (i = 0; i < c; i++)
153                 deconfigure_single(i);
154 }
155
156 static int need_commit = 0;
157
158 static int getMaxPower(char *ifname)
159 {
160         char buf[128];
161
162         sprintf(buf, "iwlist %s txpower|grep \"Maximum Power:\" > /tmp/.power",
163                 ifname);
164         system2(buf);
165         FILE *in = fopen("/tmp/.power", "rb");
166
167         if (in == NULL)
168                 return 1000;
169         char buf2[16];
170         int max;
171
172         fscanf(in, "%s %s %d", buf, buf2, &max);
173         fclose(in);
174         return max;
175 }
176
177 /*
178  * MADWIFI Encryption Setup
179  */
180 void setupSupplicant(char *prefix, char *ssidoverride)
181 {
182 #ifdef HAVE_REGISTER
183         if (!isregistered())
184                 return;
185 #endif
186         char akm[16];
187         char bridged[32];
188         char wmode[16];
189         char *background = "-B";
190         char *debug;
191         debug = nvram_nget("%s_wpa_debug", prefix);
192         if (debug != NULL) {
193                 if (!strcmp(debug, "1"))
194                         background = "-Bd";
195                 else if (!strcmp(debug, "2"))
196                         background = "-Bdd";
197                 else if (!strcmp(debug, "3"))
198                         background = "-Bddd";
199         }
200
201         sprintf(akm, "%s_akm", prefix);
202         sprintf(wmode, "%s_mode", prefix);
203         sprintf(bridged, "%s_bridged", prefix);
204         if (nvram_match(akm, "wep")) {
205                 char key[16];
206                 int cnt = 1;
207                 int i;
208                 char bul[8];
209                 char *authmode = nvram_nget("%s_authmode", prefix);
210                 for (i = 1; i < 5; i++) {
211                         char *athkey = nvram_nget("%s_key%d", prefix, i);
212
213                         if (athkey != NULL && strlen(athkey) > 0) {
214                                 sysprintf("iwconfig %s key [%d] %s", prefix, cnt++, athkey);    // setup wep
215                         }
216                 }
217                 sysprintf("iwconfig %s key [%s]", prefix,
218                           nvram_nget("%s_key", prefix));
219                 if (!strcmp(authmode, "shared"))
220                         sysprintf("iwpriv %s authmode 2", prefix);
221                 else
222                         sysprintf("iwpriv %s authmode 1", prefix);
223         } else if (nvram_match(akm, "psk") ||
224                    nvram_match(akm, "psk2") || nvram_match(akm, "psk psk2")) {
225                 char fstr[32];
226                 char psk[16];
227
228                 sprintf(fstr, "/tmp/%s_wpa_supplicant.conf", prefix);
229                 FILE *fp = fopen(fstr, "wb");
230
231                 fprintf(fp, "ap_scan=1\n");
232                 fprintf(fp, "fast_reauth=1\n");
233                 fprintf(fp, "eapol_version=1\n");
234                 // fprintf (fp, "ctrl_interface_group=0\n");
235                 // fprintf (fp, "ctrl_interface=/var/run/wpa_supplicant\n");
236
237                 fprintf(fp, "network={\n");
238                 if (!ssidoverride)
239                         ssidoverride = nvram_nget("%s_ssid", prefix);
240                 fprintf(fp, "\tssid=\"%s\"\n", ssidoverride);
241                 // fprintf (fp, "\tmode=0\n");
242                 fprintf(fp, "\tscan_ssid=1\n");
243                 fprintf(fp, "\tkey_mgmt=WPA-PSK\n");
244
245                 sprintf(psk, "%s_crypto", prefix);
246                 if (nvram_match(psk, "aes")) {
247                         fprintf(fp, "\tpairwise=CCMP\n");
248                         fprintf(fp, "\tgroup=CCMP\n");
249                 }
250                 if (nvram_match(psk, "tkip")) {
251                         fprintf(fp, "\tpairwise=TKIP\n");
252                         fprintf(fp, "\tgroup=TKIP\n");
253                 }
254                 if (nvram_match(psk, "tkip+aes")) {
255                         fprintf(fp, "\tpairwise=CCMP TKIP\n");
256                         fprintf(fp, "\tgroup=CCMP TKIP\n");
257                 }
258                 if (nvram_match(akm, "psk"))
259                         fprintf(fp, "\tproto=WPA\n");
260                 if (nvram_match(akm, "psk2"))
261                         fprintf(fp, "\tproto=RSN\n");
262                 if (nvram_match(akm, "psk psk2"))
263                         fprintf(fp, "\tproto=WPA RSN\n");
264
265                 fprintf(fp, "\tpsk=\"%s\"\n", nvram_nget("%s_wpa_psk", prefix));
266                 fprintf(fp, "}\n");
267                 char extra[32];
268                 sprintf(extra, "%s_supplicantext", prefix);
269                 if (nvram_invmatch(extra, ""))
270                         fwritenvram(extra, fp);
271
272                 fclose(fp);
273                 sprintf(psk, "-i%s", prefix);
274                 if ((nvram_match(wmode, "wdssta") || nvram_match(wmode, "wet"))
275                     && nvram_match(bridged, "1"))
276                         eval("wpa_supplicant", "-b", getBridge(prefix),
277                              background, "-Dmadwifi", psk, "-c", fstr);
278                 else
279                         eval("wpa_supplicant", background, "-Dmadwifi", psk,
280                              "-c", fstr);
281         } else if (nvram_match(akm, "8021X")) {
282                 char fstr[32];
283                 char psk[64];
284                 char ath[64];
285
286                 sprintf(fstr, "/tmp/%s_wpa_supplicant.conf", prefix);
287                 FILE *fp = fopen(fstr, "wb");
288
289                 fprintf(fp, "ap_scan=1\n");
290                 fprintf(fp, "fast_reauth=1\n");
291                 fprintf(fp, "eapol_version=1\n");
292                 // fprintf (fp, "ctrl_interface_group=0\n");
293                 // fprintf (fp, "ctrl_interface=/var/run/wpa_supplicant\n");
294                 fprintf(fp, "network={\n");
295                 if (!ssidoverride)
296                         ssidoverride = nvram_nget("%s_ssid", prefix);
297                 fprintf(fp, "\tssid=\"%s\"\n", ssidoverride);
298                 fprintf(fp, "\tscan_ssid=1\n");
299                 if (nvram_prefix_match("8021xtype", prefix, "tls")) {
300                         fprintf(fp, "\tkey_mgmt=IEEE8021X\n");
301                         fprintf(fp, "\teap=TLS\n");
302                         fprintf(fp, "\tidentity=\"%s\"\n",
303                                 nvram_prefix_get("tls8021xuser", prefix));
304                         sprintf(psk, "/tmp/%s", prefix);
305                         mkdir(psk);
306                         sprintf(psk, "/tmp/%s/ca.pem", prefix);
307                         sprintf(ath, "%s_tls8021xca", prefix);
308                         write_nvram(psk, ath);
309                         sprintf(psk, "/tmp/%s/user.pem", prefix);
310                         sprintf(ath, "%s_tls8021xpem", prefix);
311                         write_nvram(psk, ath);
312
313                         sprintf(psk, "/tmp/%s/user.prv", prefix);
314                         sprintf(ath, "%s_tls8021xprv", prefix);
315                         write_nvram(psk, ath);
316                         fprintf(fp, "\tca_cert=\"/tmp/%s/ca.pem\"\n", prefix);
317                         fprintf(fp, "\tclient_cert=\"/tmp/%s/user.pem\"\n",
318                                 prefix);
319                         fprintf(fp, "\tprivate_key=\"/tmp/%s/user.prv\"\n",
320                                 prefix);
321                         fprintf(fp, "\tprivate_key_passwd=\"%s\"\n",
322                                 nvram_prefix_get("tls8021xpasswd", prefix));
323                         fprintf(fp, "\teapol_flags=3\n");
324                         if (strlen(nvram_nget("%s_tls8021xphase2", prefix)) > 0) {
325                                 fprintf(fp, "\tphase2=\"%s\"\n",
326                                         nvram_nget("%s_tls8021xphase2",
327                                                    prefix));
328                         }
329                         if (strlen(nvram_nget("%s_tls8021xanon", prefix)) > 0) {
330                                 fprintf(fp, "\tanonymous_identity=\"%s\"\n",
331                                         nvram_nget("%s_tls8021xanon", prefix));
332                         }
333                 }
334                 if (nvram_prefix_match("8021xtype", prefix, "peap")) {
335                         fprintf(fp, "\tkey_mgmt=WPA-EAP\n");
336                         fprintf(fp, "\teap=PEAP\n");
337                         fprintf(fp, "\tpairwise=CCMP TKIP\n");
338                         fprintf(fp, "\tgroup=CCMP TKIP\n");
339                         fprintf(fp, "\tphase1=\"peapver=0\"\n");
340                         fprintf(fp, "\tidentity=\"%s\"\n",
341                                 nvram_prefix_get("peap8021xuser", prefix));
342                         fprintf(fp, "\tpassword=\"%s\"\n",
343                                 nvram_prefix_get("peap8021xpasswd", prefix));
344                         sprintf(psk, "/tmp/%s", prefix);
345                         mkdir(psk);
346                         sprintf(psk, "/tmp/%s/ca.pem", prefix);
347                         sprintf(ath, "%s_peap8021xca", prefix);
348                         if (!nvram_match(ath, "")) {
349                                 write_nvram(psk, ath);
350                                 fprintf(fp, "\tca_cert=\"/tmp/%s/ca.pem\"\n",
351                                         prefix);
352                         }
353                         if (strlen(nvram_nget("%s_peap8021xphase2", prefix)) >
354                             0) {
355                                 fprintf(fp, "\tphase2=\"%s\"\n",
356                                         nvram_nget("%s_peap8021xphase2",
357                                                    prefix));
358                         }
359                         if (strlen(nvram_nget("%s_peap8021xanon", prefix)) > 0) {
360                                 fprintf(fp, "\tanonymous_identity=\"%s\"\n",
361                                         nvram_nget("%s_peap8021xanon", prefix));
362                         }
363                 }
364                 if (nvram_prefix_match("8021xtype", prefix, "ttls")) {
365                         fprintf(fp, "\tkey_mgmt=WPA-EAP\n");
366                         fprintf(fp, "\teap=TTLS\n");
367                         fprintf(fp, "\tpairwise=CCMP TKIP\n");
368                         fprintf(fp, "\tgroup=CCMP TKIP\n");
369                         fprintf(fp, "\tidentity=\"%s\"\n",
370                                 nvram_prefix_get("ttls8021xuser", prefix));
371                         fprintf(fp, "\tpassword=\"%s\"\n",
372                                 nvram_prefix_get("ttls8021xpasswd", prefix));
373                         if (strlen(nvram_nget("%s_ttls8021xca", prefix)) > 0) {
374                                 sprintf(psk, "/tmp/%s", prefix);
375                                 mkdir(psk);
376                                 sprintf(psk, "/tmp/%s/ca.pem", prefix);
377                                 sprintf(ath, "%s_ttls8021xca", prefix);
378                                 write_nvram(psk, ath);
379                                 fprintf(fp, "\tca_cert=\"/tmp/%s/ca.pem\"\n",
380                                         prefix);
381                         }
382                         if (strlen(nvram_nget("%s_ttls8021xphase2", prefix)) >
383                             0) {
384                                 fprintf(fp, "\tphase2=\"%s\"\n",
385                                         nvram_nget("%s_ttls8021xphase2",
386                                                    prefix));
387                         }
388                         if (strlen(nvram_nget("%s_ttls8021xanon", prefix)) > 0) {
389                                 fprintf(fp, "\tanonymous_identity=\"%s\"\n",
390                                         nvram_nget("%s_ttls8021xanon", prefix));
391                         }
392                 }
393                 if (nvram_prefix_match("8021xtype", prefix, "leap")) {
394                         fprintf(fp, "\tkey_mgmt=WPA-EAP\n");
395                         fprintf(fp, "\teap=LEAP\n");
396                         fprintf(fp, "\tauth_alg=LEAP\n");
397                         fprintf(fp, "\tproto=WPA RSN\n");
398                         fprintf(fp, "\tpairwise=CCMP TKIP\n");
399                         fprintf(fp, "\tgroup=CCMP TKIP\n");
400                         fprintf(fp, "\tidentity=\"%s\"\n",
401                                 nvram_prefix_get("leap8021xuser", prefix));
402                         fprintf(fp, "\tpassword=\"%s\"\n",
403                                 nvram_prefix_get("leap8021xpasswd", prefix));
404                         // sprintf (psk, "/tmp/%s", prefix);
405                         // mkdir (psk);
406                         // sprintf (psk, "/tmp/%s/ca.pem", prefix);
407                         // sprintf (ath, "%s_peap8021xca", prefix);
408                         // write_nvram (psk, ath);
409                         // fprintf (fp, "\tca_cert=\"/tmp/%s/ca.pem\"\n", prefix);
410                         if (strlen(nvram_nget("%s_leap8021xphase2", prefix)) >
411                             0) {
412                                 fprintf(fp, "\tphase2=\"%s\"\n",
413                                         nvram_nget("%s_leap8021xphase2",
414                                                    prefix));
415                         }
416                         if (strlen(nvram_nget("%s_leap8021xanon", prefix)) > 0) {
417                                 fprintf(fp, "\tanonymous_identity=\"%s\"\n",
418                                         nvram_nget("%s_leap8021xanon", prefix));
419                         }
420                 }
421                 fprintf(fp, "}\n");
422                 char extra[32];
423                 sprintf(extra, "%s_supplicantext", prefix);
424                 if (nvram_invmatch(extra, ""))
425                         fwritenvram(extra, fp);
426                 fclose(fp);
427                 sprintf(psk, "-i%s", prefix);
428                 sysprintf("iwpriv %s hostroaming 2", prefix);
429                 if (nvram_match(bridged, "1")
430                     && (nvram_match(wmode, "wdssta")
431                         || nvram_match(wmode, "wet")))
432                         eval("wpa_supplicant", "-b",
433                              nvram_safe_get("lan_ifname"), background,
434                              "-Dmadwifi", psk, "-c", fstr);
435                 else
436                         eval("wpa_supplicant", background, "-Dmadwifi", psk,
437                              "-c", fstr);
438         } else {
439                 sysprintf("iwconfig %s key off", prefix);
440         }
441
442 }
443
444 void supplicant_main(int argc, char *argv[])
445 {
446         setupSupplicant(argv[1], argv[2]);
447 }
448
449 static void do_hostapd(char *fstr, char *prefix)
450 {
451         char fname[32];
452         char *debug;
453         FILE *fp;
454         int pid;
455
456         sprintf(fname, "/var/run/%s_hostapd.pid", prefix);
457
458         fp = fopen(fname, "rb");
459         if (fp) {
460                 fread(&pid, 4, 1, fp);
461                 fclose(fp);
462                 if (pid > 0)
463                         kill(pid, SIGTERM);
464         }
465
466         char *argv[] = { "hostapd", "-B", NULL, NULL, NULL };
467         int argc = 2;
468         debug = nvram_nget("%s_wpa_debug", prefix);
469         if (debug != NULL) {
470                 if (!strcmp(debug, "1"))
471                         argv[argc++] = "-d";
472                 else if (!strcmp(debug, "2"))
473                         argv[argc++] = "-dd";
474                 else if (!strcmp(debug, "3"))
475                         argv[argc++] = "-ddd";
476         }
477         argv[argc++] = fstr;
478         _evalpid(argv, NULL, 0, &pid);
479 //      eval( "hostapd", "-B", fstr );
480         fp = fopen(fname, "wb");
481         if (fp) {
482                 fwrite(&pid, 4, 1, fp);
483                 fclose(fp);
484         }
485
486 }
487
488 void setupHostAP(char *prefix, int iswan)
489 {
490 #ifdef HAVE_REGISTER
491         if (!isregistered())
492                 return;
493 #endif
494         char psk[32];
495         char akm[16];
496
497         sprintf(akm, "%s_akm", prefix);
498         if (nvram_match(akm, "8021X"))
499                 return;
500         if (nvram_match(akm, "wpa") || nvram_match(akm, "wpa2")
501             || nvram_match(akm, "wpa wpa2") || nvram_match(akm, "radius")) {
502                 if (iswan == 0)
503                         return;
504         }
505         if (nvram_match(akm, "psk") ||
506             nvram_match(akm, "psk2") ||
507             nvram_match(akm, "psk psk2") || nvram_match(akm, "wep")) {
508                 if (iswan == 1)
509                         return;
510         }
511         // wep key support
512         if (nvram_match(akm, "wep")) {
513                 int cnt = 1;
514                 int i;
515                 char bul[8];
516                 char *authmode = nvram_nget("%s_authmode", prefix);
517
518                 for (i = 1; i < 5; i++) {
519                         char *athkey = nvram_nget("%s_key%d", prefix, i);
520
521                         if (athkey != NULL && strlen(athkey) > 0) {
522                                 sprintf(bul, "[%d]", cnt++);
523                                 sysprintf("iwconfig %s key %s %s", prefix, bul,
524                                           athkey);
525                         }
526                 }
527                 sprintf(bul, "[%s]", nvram_nget("%s_key", prefix));
528                 sysprintf("iwconfig %s key %s", prefix, bul);
529
530                 if (!strcmp(authmode, "shared"))
531                         sysprintf("iwpriv %s authmode 2", prefix);
532                 else
533                         sysprintf("iwpriv %s authmode 1", prefix);
534         } else if (nvram_match(akm, "psk") ||
535                    nvram_match(akm, "psk2") ||
536                    nvram_match(akm, "psk psk2") ||
537                    nvram_match(akm, "wpa") ||
538                    nvram_match(akm, "wpa2") || nvram_match(akm, "wpa wpa2")) {
539                 char fstr[32];
540
541                 sprintf(fstr, "/tmp/%s_hostap.conf", prefix);
542                 FILE *fp = fopen(fstr, "wb");
543
544                 fprintf(fp, "interface=%s\n", prefix);
545                 // sprintf(buf, "rsn_preauth_interfaces=%s\n", "br0");
546                 if (nvram_nmatch("1", "%s_bridged", prefix))
547                         fprintf(fp, "bridge=%s\n", getBridge(prefix));
548
549                 fprintf(fp, "driver=madwifi\n");
550                 fprintf(fp, "logger_syslog=-1\n");
551                 fprintf(fp, "logger_syslog_level=2\n");
552                 fprintf(fp, "logger_stdout=-1\n");
553                 fprintf(fp, "logger_stdout_level=2\n");
554                 fprintf(fp, "debug=0\n");
555                 fprintf(fp, "dump_file=/tmp/hostapd.dump\n");
556                 // fprintf (fp, "eap_server=0\n");
557                 // fprintf (fp, "own_ip_addr=127.0.0.1\n");
558                 fprintf(fp, "eapol_version=1\n");
559                 fprintf(fp, "eapol_key_index_workaround=0\n");
560                 if (nvram_match(akm, "psk") || nvram_match(akm, "wpa"))
561                         fprintf(fp, "wpa=1\n");
562                 if (nvram_match(akm, "psk2") || nvram_match(akm, "wpa2"))
563                         fprintf(fp, "wpa=2\n");
564                 if (nvram_match(akm, "psk psk2")
565                     || nvram_match(akm, "wpa wpa2"))
566                         fprintf(fp, "wpa=3\n");
567
568                 if (nvram_match(akm, "psk") ||
569                     nvram_match(akm, "psk2") || nvram_match(akm, "psk psk2")) {
570                         fprintf(fp, "wpa_passphrase=%s\n",
571                                 nvram_nget("%s_wpa_psk", prefix));
572                         fprintf(fp, "wpa_key_mgmt=WPA-PSK\n");
573                 } else {
574                         // if (nvram_invmatch (akm, "radius"))
575                         fprintf(fp, "wpa_key_mgmt=WPA-EAP\n");
576                         // else
577                         // fprintf (fp, "macaddr_acl=2\n");
578                         fprintf(fp, "ieee8021x=1\n");
579                         // fprintf (fp, "accept_mac_file=/tmp/hostapd.accept\n");
580                         // fprintf (fp, "deny_mac_file=/tmp/hostapd.deny\n");
581                         fprintf(fp, "own_ip_addr=%s\n",
582                                 nvram_safe_get("lan_ipaddr"));
583                         fprintf(fp, "eap_server=0\n");
584                         fprintf(fp, "auth_algs=1\n");
585                         fprintf(fp, "radius_retry_primary_interval=60\n");
586                         fprintf(fp, "auth_server_addr=%s\n",
587                                 nvram_nget("%s_radius_ipaddr", prefix));
588                         fprintf(fp, "auth_server_port=%s\n",
589                                 nvram_nget("%s_radius_port", prefix));
590                         fprintf(fp, "auth_server_shared_secret=%s\n",
591                                 nvram_nget("%s_radius_key", prefix));
592                         if (nvram_nmatch("1", "%s_acct", prefix)) {
593                                 fprintf(fp, "acct_server_addr=%s\n",
594                                         nvram_nget("%s_acct_ipaddr", prefix));
595                                 fprintf(fp, "acct_server_port=%s\n",
596                                         nvram_nget("%s_acct_port", prefix));
597                                 fprintf(fp, "acct_server_shared_secret=%s\n",
598                                         nvram_nget("%s_acct_key", prefix));
599                         }
600                 }
601                 if (nvram_invmatch(akm, "radius")) {
602                         sprintf(psk, "%s_crypto", prefix);
603                         if (nvram_match(psk, "aes"))
604                                 fprintf(fp, "wpa_pairwise=CCMP\n");
605                         if (nvram_match(psk, "tkip"))
606                                 fprintf(fp, "wpa_pairwise=TKIP\n");
607                         if (nvram_match(psk, "tkip+aes"))
608                                 fprintf(fp, "wpa_pairwise=TKIP CCMP\n");
609                         fprintf(fp, "wpa_group_rekey=%s\n",
610                                 nvram_nget("%s_wpa_gtk_rekey", prefix));
611                 }
612                 // fprintf (fp, "jumpstart_p1=1\n");
613                 fclose(fp);
614                 do_hostapd(fstr, prefix);
615
616         } else if (nvram_match(akm, "radius")) {
617                 // wrt-radauth $IFNAME $server $port $share $override $mackey $maxun
618                 // &
619                 char *ifname = prefix;
620                 char *server = nvram_nget("%s_radius_ipaddr", prefix);
621                 char *port = nvram_nget("%s_radius_port", prefix);
622                 char *share = nvram_nget("%s_radius_key", prefix);
623                 char exec[64];
624                 char type[32];
625
626                 sprintf(type, "%s_radmactype", prefix);
627                 char *pragma = "";
628
629                 if (nvram_default_match(type, "0", "0"))
630                         pragma = "-n1 ";
631                 if (nvram_match(type, "1"))
632                         pragma = "-n2 ";
633                 if (nvram_match(type, "2"))
634                         pragma = "-n3 ";
635                 if (nvram_match(type, "3"))
636                         pragma = "";
637                 sleep(1);       // some delay is usefull
638                 sysprintf("wrt-radauth %s %s %s %s %s 1 1 0 &", pragma, prefix,
639                           server, port, share);
640         } else {
641                 sysprintf("iwconfig %s key off", prefix);
642         }
643
644 }
645
646 void start_hostapdwan(void)
647 {
648         char ath[32];
649         char *next;
650         char var[80];
651         int c = getdevicecount();
652         int i;
653
654         for (i = 0; i < c; i++) {
655                 sprintf(ath, "ath%d", i);
656                 if (nvram_nmatch("ap", "%s_mode", ath)
657                     || nvram_nmatch("wdsap", "%s_mode", ath))
658                         setupHostAP(ath, 1);
659                 char *vifs = nvram_nget("ath%d_vifs", i);
660
661                 if (vifs != NULL)
662                         foreach(var, vifs, next) {
663                         setupHostAP(var, 1);
664                         }
665         }
666
667 }
668
669 #define SIOCSSCANLIST           (SIOCDEVPRIVATE+6)
670 static void set_scanlist(char *dev, char *wif)
671 {
672         char var[32];
673         char *next;
674         struct iwreq iwr;
675         char scanlist[32];
676         char list[64];
677
678         sprintf(scanlist, "%s_scanlist", dev);
679         char *sl = nvram_default_get(scanlist, "default");
680         int c = 0;
681
682         sysprintf("iwpriv %s setscanlist -ALL", dev);
683         if (strlen(sl) > 0 && strcmp(sl, "default")) {
684                 foreach(var, sl, next) {
685                         sprintf(list, "+%s", var);
686                         sysprintf("iwpriv %s setscanlist %s", dev, list);
687                 }
688         } else {
689                 sysprintf("iwpriv %s setscanlist +ALL", dev);
690         }
691 }
692
693 static void set_rate(char *dev, char *priv)
694 {
695         char rate[32];
696         char maxrate[32];
697         char net[32];
698         char bw[32];
699         char xr[32];
700
701         sprintf(bw, "%s_channelbw", dev);
702         sprintf(net, "%s_net_mode", dev);
703         sprintf(rate, "%s_minrate", dev);
704         sprintf(maxrate, "%s_maxrate", dev);
705         sprintf(xr, "%s_xr", dev);
706         char *r = nvram_default_get(rate, "0");
707         char *mr = nvram_default_get(maxrate, "0");
708
709 #ifdef HAVE_WHRAG108
710         char *netmode;
711
712         if (!strcmp(dev, "ath0"))
713                 netmode = nvram_default_get(net, "a-only");
714         else
715                 netmode = nvram_default_get(net, "mixed");
716 #else
717         char *netmode = nvram_default_get(net, "mixed");
718 #endif
719
720         if (nvram_match(bw, "20") && nvram_match(xr, "0"))
721                 if (atof(r) == 27.0f || atof(r) == 1.5f || atof(r) == 2.0f
722                     || atof(r) == 3.0f || atof(r) == 4.5f || atof(r) == 9.0f
723                     || atof(r) == 13.5f) {
724                         nvram_set(rate, "0");
725                         r = "0";
726                 }
727         if (nvram_match(bw, "40"))
728                 if (atof(r) == 27.0f || atof(r) == 1.5f || atof(r) == 2.0f
729                     || atof(r) == 3.0f || atof(r) == 4.5f || atof(r) == 9.0f
730                     || atof(r) == 13.5f) {
731                         nvram_set(rate, "0");
732                         r = "0";
733                 }
734         if (nvram_match(bw, "10"))
735                 if (atof(r) > 27.0f || atof(r) == 1.5f || atof(r) == 2.0f
736                     || atof(r) == 13.5f) {
737                         nvram_set(rate, "0");
738                         r = "0";
739                 }
740         if (nvram_match(bw, "5"))
741                 if (atof(r) > 13.5) {
742                         nvram_set(rate, "0");
743                         r = "0";
744                 }
745         if (nvram_match(bw, "2"))
746                 if (atof(r) > 6.75) {
747                         nvram_set(rate, "0");
748                         r = "0";
749                 }
750         if (!strcmp(netmode, "b-only"))
751                 sysprintf("iwconfig %s rate 11M auto", priv);
752         else {
753                 sysprintf("iwconfig %s rate 54M auto", priv);
754         }
755         if (atol(mr) > 0)
756                 sysprintf("iwpriv %s maxrate %s", priv, mr);
757         if (atoi(mr) > 0)
758                 sysprintf("iwpriv %s minrate %s", priv, r);
759 }
760
761 static void set_netmode(char *wif, char *dev, char *use)
762 {
763         char net[16];
764         char mode[16];
765         char xr[16];
766         char comp[32];
767         char ff[16];
768         char bw[16];
769
770         sprintf(mode, "%s_mode", dev);
771         sprintf(net, "%s_net_mode", dev);
772         sprintf(bw, "%s_channelbw", dev);
773         sprintf(xr, "%s_xr", dev);
774 //    sprintf( comp, "%s_compression", dev );
775         sprintf(ff, "%s_ff", dev);
776 #ifdef HAVE_WHRAG108
777         char *netmode;
778
779         if (!strcmp(dev, "ath0"))
780                 netmode = nvram_default_get(net, "a-only");
781         else
782                 netmode = nvram_default_get(net, "mixed");
783 #else
784         char *netmode = nvram_default_get(net, "mixed");
785 #endif
786         // fprintf (stderr, "set netmode of %s to %s\n", net, netmode);
787         cprintf("configure net mode %s\n", netmode);
788
789         {
790 #ifdef HAVE_WHRAG108
791                 if (!strncmp(use, "ath0", 4)) {
792                         sysprintf("iwpriv %s mode 1", use);
793                 } else
794 #endif
795 #ifdef HAVE_TW6600
796                 if (!strncmp(use, "ath0", 4)) {
797                         sysprintf("iwpriv %s mode 1", use);
798                 } else
799 #endif
800                 {
801                         sysprintf("iwpriv %s turbo 0", use);
802                         sysprintf("iwpriv %s xr 0", use);
803                         if (!strcmp(netmode, "mixed"))
804                                 sysprintf("iwpriv %s mode 0", use);
805                         if (!strcmp(netmode, "b-only"))
806                                 sysprintf("iwpriv %s mode 2", use);
807                         if (!strcmp(netmode, "g-only")) {
808                                 sysprintf("iwpriv %s mode 3", use);
809                                 sysprintf("iwpriv %s pureg 1", use);
810                         }
811                         if (!strcmp(netmode, "ng-only")) {
812                                 sysprintf("iwpriv %s mode 7", use);
813                         }
814                         if (!strcmp(netmode, "na-only")) {
815                                 sysprintf("iwpriv %s mode 6", use);
816                         }
817                         if (!strcmp(netmode, "bg-mixed")) {
818                                 sysprintf("iwpriv %s mode 3", use);
819                         }
820
821                         if (!strcmp(netmode, "a-only"))
822                                 sysprintf("iwpriv %s mode 1", use);
823                 }
824         }
825         if (nvram_default_match(bw, "40", "20")) {
826                 {
827                         if (!strcmp(netmode, "g-only")) {
828                                 sysprintf("iwpriv %s mode 6", use);
829                         }
830                         if (!strcmp(netmode, "a-only")) {
831                                 sysprintf("iwpriv %s mode 5", use);
832                         }
833                         sysprintf("iwpriv %s turbo 1", use);
834                 }
835         } else {
836                 char *ext = nvram_get(xr);
837
838                 if (ext) {
839                         if (strcmp(ext, "1") == 0) {
840                                 sysprintf("iwpriv %s xr 1", use);
841                         } else {
842                                 sysprintf("iwpriv %s xr 0", use);
843                         }
844                 }
845         }
846 //    if( nvram_default_match( comp, "1", "0" ) )
847 //      sysprintf("iwpriv %s compression 1",use);
848 //    else
849 //      sysprintf("iwpriv %s compression 0",use);
850
851         if (nvram_default_match(ff, "1", "0"))
852                 sysprintf("iwpriv %s ff 1", use);
853         else
854                 sysprintf("iwpriv %s ff 0", use);
855
856 }
857
858 static void setRTS(char *use)
859 {
860         char rts[32];
861
862         sprintf(rts, "%s_protmode", use);
863         nvram_default_get(rts, "None");
864
865         sprintf(rts, "%s_rts", use);
866         nvram_default_get(rts, "0");
867
868         sprintf(rts, "%s_rtsvalue", use);
869         nvram_default_get(rts, "2346");
870
871         if (nvram_nmatch("1", "%s_rts", use)) {
872                 sysprintf("iwconfig %s rts %s", use,
873                           nvram_nget("%s_rtsvalue", use));
874         } else {
875                 sysprintf("iwconfig %s rts off", use);
876         }
877         if (nvram_nmatch("None", "%s_protmode", use))
878                 sysprintf("iwpriv %s protmode 0", use);
879         if (nvram_nmatch("CTS", "%s_protmode", use))
880                 sysprintf("iwpriv %s protmode 1", use);
881         if (nvram_nmatch("RTS/CTS", "%s_protmode", use))
882                 sysprintf("iwpriv %s protmode 2", use);
883 }
884
885 /*static void set_compression( int count )
886 {
887     char comp[32];
888     char wif[32];
889
890     sprintf( wif, "wifi%d", count );
891     sprintf( comp, "ath%d_compression", count );
892     if( nvram_default_match( comp, "1", "0" ) )
893         setsysctrl( wif, "compression", 1 );
894     else
895         setsysctrl( wif, "compression", 0 );
896 }
897 */
898 void setMacFilter(char *iface)
899 {
900         char *next;
901         char var[32];
902
903         sysprintf("ifconfig %s down", iface);
904         sysprintf("iwpriv %s maccmd 3", iface);
905
906         char nvvar[32];
907
908         sprintf(nvvar, "%s_macmode", iface);
909         if (nvram_match(nvvar, "deny")) {
910                 sysprintf("iwpriv %s maccmd 2", iface);
911                 sysprintf("ifconfig %s up", iface);
912                 char nvlist[32];
913
914                 sprintf(nvlist, "%s_maclist", iface);
915
916                 foreach(var, nvram_safe_get(nvlist), next) {
917                         sysprintf("iwpriv %s addmac %s", iface, var);
918                 }
919         } else if (nvram_match(nvvar, "allow")) {
920                 sysprintf("iwpriv %s maccmd 1", iface);
921                 sysprintf("ifconfig %s up", iface);
922
923                 char nvlist[32];
924
925                 sprintf(nvlist, "%s_maclist", iface);
926
927                 foreach(var, nvram_safe_get(nvlist), next) {
928                         sysprintf("iwpriv %s addmac %s", iface, var);
929                 }
930         } else {
931                 //undefined condition
932                 sysprintf("ifconfig %s up", iface);
933         }
934
935 }
936
937 #define IFUP (IFF_UP | IFF_RUNNING | IFF_BROADCAST | IFF_MULTICAST)
938
939 static void configure_single(int count)
940 {
941         char *next;
942         char var[80];
943         char mode[80];
944         int cnt = 0;
945         char dev[10];
946         char wif[10];
947         char mtikie[32];
948         char wl[16];
949         char channel[16];
950         char ssid[16];
951         char net[16];
952         char wifivifs[16];
953         char broadcast[16];
954         char power[32];
955         char sens[32];
956         char basedev[16];
957         char diversity[32];
958         char rxantenna[32];
959         char txantenna[32];
960         char athmac[16];
961         char maxassoc[32];
962         char wl_poll[32];
963
964         sprintf(wif, "wifi%d", count);
965         sprintf(dev, "ath%d", count);
966         sprintf(wifivifs, "ath%d_vifs", count);
967         sprintf(wl, "ath%d_mode", count);
968 #ifdef HAVE_REGISTER
969 int cpeonly = iscpe();
970 #else
971 int cpeonly=0;
972 #endif
973         if (cpeonly && nvram_match(wl,"ap"))
974             {
975             nvram_set(wl,"sta");
976             }
977         sprintf(channel, "ath%d_channel", count);
978         sprintf(power, "ath%d_txpwrdbm", count);
979         sprintf(sens, "ath%d_distance", count);
980         sprintf(diversity, "ath%d_diversity", count);
981         sprintf(txantenna, "ath%d_txantenna", count);
982         sprintf(rxantenna, "ath%d_rxantenna", count);
983         sprintf(athmac, "ath%d_hwaddr", count);
984
985         // create base device
986         cprintf("configure base interface %d\n", count);
987         sprintf(net, "%s_net_mode", dev);
988         if (nvram_match(net, "disabled"))
989                 return;
990         if (!count)
991                 strcpy(iflist, dev);
992 //    set_compression( count );
993         // create wds interface(s)
994         int s;
995
996         char *apm;
997         int vif = 0;
998         sprintf(wl_poll, "%s_pollingmode", dev);
999
1000         setsysctrl(wif, "pollingmode", atoi(nvram_default_get(wl_poll, "0")));
1001
1002         char *vifs = nvram_safe_get(wifivifs);
1003         char primary[32] = { 0 };
1004         if (vifs != NULL)
1005                 foreach(var, vifs, next) {
1006                 sprintf(mode, "%s_mode", var);
1007                 char *vapm = nvram_default_get(mode, "ap");
1008                 // create device
1009                 if (strlen(mode) > 0) {
1010                         if (!strcmp(vapm, "wet") || !strcmp(vapm, "sta")
1011                             || !strcmp(vapm, "wdssta"))
1012                                 sysprintf
1013                                     ("wlanconfig %s create wlandev %s wlanmode sta nosbeacon",
1014                                      var, wif);
1015                         else if (!strcmp(vapm, "ap") || !strcmp(vapm, "wdsap"))
1016                                 sysprintf
1017                                     ("wlanconfig %s create wlandev %s wlanmode ap",
1018                                      var, wif);
1019                         else
1020                                 sysprintf
1021                                     ("wlanconfig %s create wlandev %s wlanmode adhoc",
1022                                      var, wif);
1023                         vif = 1;
1024                         if (strlen(primary) == 0)
1025                                 strcpy(primary, var);
1026                         strcat(iflist, " ");
1027                         strcat(iflist, var);
1028                         char vathmac[16];
1029
1030                         sprintf(vathmac, "%s_hwaddr", var);
1031                         char vmacaddr[32];
1032
1033                         getMacAddr(var, vmacaddr);
1034                         nvram_set(vathmac, vmacaddr);
1035
1036                 }
1037                 }
1038         // create original primary interface
1039         apm = nvram_default_get(wl, "ap");
1040
1041         if (!strcmp(apm, "wet") || !strcmp(apm, "wdssta")
1042             || !strcmp(apm, "sta")) {
1043                 if (vif)
1044                         sysprintf
1045                             ("wlanconfig %s create wlandev %s wlanmode sta nosbeacon",
1046                              dev, wif);
1047                 else
1048                         sysprintf
1049                             ("wlanconfig %s create wlandev %s wlanmode sta",
1050                              dev, wif);
1051
1052         } else if (!strcmp(apm, "ap") || !strcmp(apm, "wdsap"))
1053                 sysprintf("wlanconfig %s create wlandev %s wlanmode ap", dev,
1054                           wif);
1055         else
1056                 sysprintf("wlanconfig %s create wlandev %s wlanmode adhoc", dev,
1057                           wif);
1058
1059         if (strlen(primary) == 0)
1060                 strcpy(primary, dev);
1061
1062 #if 0
1063 #endif
1064         cprintf("detect maxpower\n");
1065         apm = nvram_default_get(wl, "ap");
1066         char maxp[16];
1067
1068         vifs = nvram_safe_get(wifivifs);
1069         // fprintf(stderr,"vifs %s\n",vifs);
1070         char *useif = NULL;
1071         char copyvap[64];
1072
1073         if (vifs != NULL)
1074                 foreach(var, vifs, next) {
1075                 // fprintf(stderr,"vifs %s, %s\n",vifs, var);
1076                 if (!useif) {
1077                         strcpy(copyvap, var);
1078                         useif = copyvap;
1079                 }
1080                 }
1081         // config net mode
1082         if (useif)
1083                 set_netmode(wif, dev, useif);
1084         set_netmode(wif, dev, dev);
1085
1086         char wmm[32];
1087
1088         sprintf(wmm, "%s_wmm", dev);
1089         if (nvram_nmatch("1", "%s_pollingmode", dev))
1090                 sysprintf("iwpriv %s wmm 1", dev);
1091         else
1092                 sysprintf("iwpriv %s wmm %s", dev, nvram_default_get(wmm, "0"));
1093         char doth[32];
1094
1095         sprintf(doth, "%s_doth", dev);
1096         sysprintf("iwpriv %s doth %s", dev, nvram_default_get(doth, "0"));
1097         int disablescan = 0;
1098
1099         set_scanlist(dev, wif);
1100         if (strcmp(apm, "sta") && strcmp(apm, "wdssta") && strcmp(apm, "wet")) {
1101                 char *ch = nvram_default_get(channel, "0");
1102
1103                 if (strcmp(ch, "0") == 0) {
1104                         sysprintf("iwconfig %s channel 0", dev);
1105                 } else {
1106                         sysprintf("iwconfig %s freq %sM", dev, ch);
1107                 }
1108         }
1109
1110         if (useif)
1111                 set_netmode(wif, dev, useif);
1112         set_netmode(wif, dev, dev);
1113         setRTS(dev);
1114
1115         char macaddr[32];
1116
1117         getMacAddr(dev, macaddr);
1118         nvram_set(athmac, macaddr);
1119
1120         cprintf("adjust sensitivity\n");
1121
1122         int distance = atoi(nvram_default_get(sens, "2000"));   // to meter
1123         if (nvram_nmatch("1", "%s_pollingmode", var)) {
1124                 setdistance(wif, 100000, 20);
1125         } else {
1126
1127                 if (distance > 0) {
1128                         setsysctrl(wif, "dynack_count", 0);
1129                         char *chanbw = nvram_nget("%s_channelbw", dev);
1130
1131                         setdistance(wif, distance, atoi(chanbw));       // sets the receiver
1132                         // sensitivity
1133                 } else {
1134                         setsysctrl(wif, "acktimeout", 350);
1135                         setsysctrl(wif, "dynack_count", 20);
1136                 }
1137         }
1138         char wl_intmit[32];
1139         char wl_noise_immunity[32];
1140         char wl_ofdm_weak_det[32];
1141         char wl_csma[32];
1142
1143         sprintf(wl_intmit, "%s_intmit", dev);
1144         sprintf(wl_noise_immunity, "%s_noise_immunity", dev);
1145         sprintf(wl_ofdm_weak_det, "%s_ofdm_weak_det", dev);
1146         sprintf(wl_csma, "%s_csma", dev);
1147
1148         setsysctrl(wif, "csma", atoi(nvram_default_get(wl_csma, "1")));
1149         setsysctrl(wif, "intmit", atoi(nvram_default_get(wl_intmit, "-1")));
1150         setsysctrl(wif, "noise_immunity",
1151                    atoi(nvram_default_get(wl_noise_immunity, "-1")));
1152         setsysctrl(wif, "ofdm_weak_det",
1153                    atoi(nvram_default_get(wl_ofdm_weak_det, "1")));
1154
1155         if (isEMP(dev))         //check this only if the current installed card is usually a emp card. this is made to prevent card destruction
1156         {
1157                 if (nvram_nmatch("1", "%s_cardtype", dev)) {
1158                         setsysctrl(wif, "powerfix", 7); //increase outputpower by 7 dbm, we will do this in future for a and b band separate
1159                 }
1160
1161         }
1162
1163         char *enable = "enable";
1164         char *disable = "disable";
1165
1166 #ifdef HAVE_NS5
1167         char *gpio = "1";
1168 #endif
1169 #ifdef HAVE_NS3
1170         char *gpio = "1";
1171 #endif
1172 #ifdef HAVE_LC5
1173         char *gpio = "1";
1174 #endif
1175 #ifdef HAVE_NS2
1176         char *gpio = "7";
1177 #endif
1178 #ifdef HAVE_LC2
1179         enable = "disable";     // swap it
1180         disable = "enable";
1181         char *gpio = "2";
1182 #endif
1183
1184 #if defined(HAVE_NS2)  || defined(HAVE_NS5) || defined(HAVE_LC2) || defined(HAVE_LC5) || defined(HAVE_NS3)
1185         int tx = atoi(nvram_default_get(txantenna, "0"));
1186
1187         setsysctrl(wif, "diversity", 0);
1188         switch (tx) {
1189         case 0:         // vertical
1190                 setsysctrl(wif, "rxantenna", 2);
1191                 setsysctrl(wif, "txantenna", 2);
1192                 eval("gpio", enable, gpio);
1193                 break;
1194         case 1:         // horizontal
1195                 setsysctrl(wif, "rxantenna", 1);
1196                 setsysctrl(wif, "txantenna", 1);
1197                 eval("gpio", enable, gpio);
1198                 break;
1199         case 2:         // external
1200                 setsysctrl(wif, "rxantenna", 1);
1201                 setsysctrl(wif, "txantenna", 1);
1202                 eval("gpio", disable, gpio);
1203                 break;
1204         case 3:         // adaptive
1205                 setsysctrl(wif, "diversity", 1);
1206                 setsysctrl(wif, "rxantenna", 0);
1207                 setsysctrl(wif, "txantenna", 0);
1208                 eval("gpio", enable, gpio);
1209                 break;
1210         }
1211 #else
1212
1213 #if defined(HAVE_PICO2) || defined(HAVE_PICO2HP) || defined(HAVE_PICO5)
1214         int rx = 1;
1215         int tx = 1;
1216         int diva = 0;           //atoi( nvram_default_get( diversity, "0" ) );
1217 #elif defined(HAVE_EOC5610)
1218 //      int rx = atoi(nvram_default_get(txantenna, "1"));
1219 //      int tx = atoi(nvram_default_get(txantenna, "1"));
1220 //      int diva = 0;           //atoi( nvram_default_get( diversity, "0" ) );
1221     int rx = 1;
1222     int tx = 0; // fix to internal path, since both antennas use the same connector. so only the switch matters
1223         int diva = 1;           //1;// atoi( nvram_default_get( diversity, "0" ) );
1224 #elif defined(HAVE_EOC1650) || defined(HAVE_EOC2610)
1225 //      int rx = 2;             //atoi( nvram_default_get( txantenna, "2" ) ); // secondary antenna output is the internal antenna and should be used as default value
1226 //      int tx = 2;             //atoi( nvram_default_get( txantenna, "2" ) );
1227     int rx = 1;
1228     int tx = 0; // fix to internal path, since both antennas use the same connector. so only the switch matters
1229         int diva = 1;           //1;// atoi( nvram_default_get( diversity, "0" ) );
1230 #else
1231         int rx = atoi(nvram_default_get(rxantenna, "1"));
1232         int tx = atoi(nvram_default_get(txantenna, "1"));
1233         int diva = atoi(nvram_default_get(diversity, "0"));
1234 #endif
1235
1236         setsysctrl(wif, "diversity", diva);
1237         setsysctrl(wif, "rxantenna", rx);
1238         setsysctrl(wif, "txantenna", tx);
1239 #endif
1240         // setup vif interfaces first
1241         char chanshift_s[32];
1242
1243         sprintf(chanshift_s, "%s_chanshift", dev);
1244         char *chanshift = nvram_default_get(chanshift_s, "0");
1245
1246         sprintf(maxassoc, "%s_maxassoc", dev);
1247         sysprintf("iwpriv %s maxassoc %s", dev,
1248                   nvram_default_get(maxassoc, "256"));
1249
1250         switch (atoi(chanshift)) {
1251         case 15:
1252                 sysprintf("iwpriv %s channelshift -3", dev);
1253                 break;
1254         case 10:
1255                 sysprintf("iwpriv %s channelshift -2", dev);
1256                 break;
1257         case 5:
1258                 sysprintf("iwpriv %s channelshift -1", dev);
1259                 break;
1260         case 0:
1261                 sysprintf("iwpriv %s channelshift 0", dev);
1262                 break;
1263         case -5:
1264                 sysprintf("iwpriv %s channelshift 1", dev);
1265                 break;
1266         case -10:
1267                 sysprintf("iwpriv %s channelshift 2", dev);
1268                 break;
1269         case -15:
1270                 sysprintf("iwpriv %s channelshift 3", dev);
1271                 break;
1272         default:
1273                 sysprintf("iwpriv %s channelshift 0", dev);
1274                 break;
1275         }
1276         if (!strcmp(apm, "wdssta") || !strcmp(apm, "wdsap"))
1277                 sysprintf("iwpriv %s wds 1", dev);
1278
1279         if (!strcmp(apm, "wdsap"))
1280                 sysprintf("iwpriv %s wdssep 1", dev);
1281         else
1282                 sysprintf("iwpriv %s wdssep 0", dev);
1283
1284         vifs = nvram_safe_get(wifivifs);
1285         if (vifs != NULL)
1286                 foreach(var, vifs, next) {
1287                 sprintf(net, "%s_net_mode", var);
1288                 if (nvram_match(net, "disabled"))
1289                         continue;
1290                 sprintf(ssid, "%s_ssid", var);
1291                 sprintf(mode, "%s_mode", var);
1292                 sprintf(maxassoc, "%s_maxassoc", var);
1293                 sysprintf("iwpriv %s maxassoc %s", var,
1294                           nvram_default_get(maxassoc, "256"));
1295                 switch (atoi(chanshift)) {
1296                 case 15:
1297                         sysprintf("iwpriv %s channelshift -3", var);
1298                         break;
1299                 case 10:
1300                         sysprintf("iwpriv %s channelshift -2", var);
1301                         break;
1302                 case 5:
1303                         sysprintf("iwpriv %s channelshift -1", var);
1304                         break;
1305                 case 0:
1306                         sysprintf("iwpriv %s channelshift 0", var);
1307                         break;
1308                 case -5:
1309                         sysprintf("iwpriv %s channelshift 1", var);
1310                         break;
1311                 case -10:
1312                         sysprintf("iwpriv %s channelshift 2", var);
1313                         break;
1314                 case -15:
1315                         sysprintf("iwpriv %s channelshift 3", var);
1316                         break;
1317                 default:
1318                         sysprintf("iwpriv %s channelshift 0", var);
1319                         break;
1320                 }
1321                 char *mvap = nvram_default_get(mode, "ap");
1322                 set_scanlist(dev, wif);
1323                 setRTS(var);
1324
1325                 if (strcmp(mvap, "sta") && strcmp(mvap, "wdssta")
1326                     && strcmp(mvap, "wet")) {
1327                         cprintf("set channel\n");
1328                         char *ch = nvram_default_get(channel, "0");
1329
1330                         if (strcmp(ch, "0") == 0) {
1331                                 sysprintf("iwconfig %s channel 0", var);
1332                         } else {
1333                                 sysprintf("iwconfig %s freq %sM", var, ch);
1334                         }
1335                 }
1336                 sysprintf("iwpriv %s bgscan 0", var);
1337 #ifdef HAVE_MAKSAT
1338 #ifdef HAVE_MAKSAT_BLANK
1339                 sysprintf("iwconfig %s essid -- \"%s\"", var,
1340                           nvram_default_get(ssid, "default_vap"));
1341 #else
1342                 sysprintf("iwconfig %s essid -- \"%s\"", var,
1343                           nvram_default_get(ssid, "maksat_vap"));
1344 #endif
1345 #elif defined(HAVE_TRIMAX)
1346                 sysprintf("iwconfig %s essid -- \"%s\"", var,
1347                           nvram_default_get(ssid, "trimax_vap"));
1348 #elif defined(HAVE_TMK)
1349                 sysprintf("iwconfig %s essid -- \"%s\"", var,
1350                           nvram_default_get(ssid, "KMT_vap"));
1351 #else
1352 #ifdef HAVE_REGISTER
1353                 if (!isregistered())
1354                         sysprintf("iwconfig %s essid -- need_activation", var);
1355                 else
1356 #endif
1357                         sysprintf("iwconfig %s essid -- \"%s\"", var,
1358                                   nvram_default_get(ssid, "dd-wrt_vap"));
1359 #endif
1360                 cprintf("set broadcast flag vif %s\n", var);    // hide ssid
1361                 sprintf(broadcast, "%s_closed", var);
1362                 sysprintf("iwpriv %s hide_ssid %s", var,
1363                           nvram_default_get(broadcast, "0"));
1364                 sprintf(wmm, "%s_wmm", var);
1365                 if (nvram_nmatch("1", "%s_pollingmode", var))
1366                         sysprintf("iwpriv %s wmm 1", var);
1367                 else
1368                         sysprintf("iwpriv %s wmm %s", var,
1369                                   nvram_default_get(wmm, "0"));
1370                 char isolate[32];
1371
1372                 sprintf(isolate, "%s_ap_isolate", var);
1373                 if (nvram_default_match(isolate, "1", "0"))
1374                         sysprintf("iwpriv %s ap_bridge 0", var);
1375                 if (!strcmp(mvap, "wdssta") || !strcmp(mvap, "wdsap"))
1376                         sysprintf("iwpriv %s wds 1", var);
1377                 sprintf(mtikie, "%s_mtikie", var);
1378                 if (nvram_default_match(mtikie, "1", "0"))
1379                         sysprintf("iwpriv %s addmtikie 1", var);
1380
1381 #ifdef HAVE_BONDING
1382                 if (!strcmp(mvap, "wdsap") && !isBond(var))
1383 #else
1384                 if (!strcmp(mvap, "wdsap"))
1385 #endif
1386                         sysprintf("iwpriv %s wdssep 1", var);
1387                 else
1388                         sysprintf("iwpriv %s wdssep 0", var);
1389
1390                 sysprintf("iwpriv %s hostroaming 0", var);
1391                 cnt++;
1392                 }
1393
1394         sprintf(mtikie, "%s_mtikie", dev);
1395         if (nvram_default_match(mtikie, "1", "0"))
1396                 sysprintf("iwpriv %s addmtikie 1", dev);
1397
1398         char isolate[32];
1399
1400         sprintf(isolate, "%s_ap_isolate", dev);
1401         if (nvram_default_match(isolate, "1", "0"))
1402                 sysprintf("iwpriv %s ap_bridge 0", dev);
1403         sysprintf("iwpriv %s hostroaming 0", dev);
1404
1405         sprintf(ssid, "ath%d_ssid", count);
1406         sprintf(broadcast, "ath%d_closed", count);
1407
1408         memset(var, 0, 80);
1409
1410         cprintf("set ssid\n");
1411 #ifdef HAVE_MAKSAT
1412 #ifdef HAVE_MAKSAT_BLANK
1413         sysprintf("iwconfig %s essid -- \"%s\"", dev,
1414                   nvram_default_get(ssid, "default"));
1415 #else
1416         sysprintf("iwconfig %s essid -- \"%s\"", dev,
1417                   nvram_default_get(ssid, "maksat"));
1418 #endif
1419 #elif defined(HAVE_TRIMAX)
1420         sysprintf("iwconfig %s essid -- \"%s\"", dev,
1421                   nvram_default_get(ssid, "trimax"));
1422 #elif defined(HAVE_TMK)
1423         sysprintf("iwconfig %s essid -- \"%s\"", dev,
1424                   nvram_default_get(ssid, "KMT"));
1425 #else
1426 #ifdef HAVE_REGISTER
1427         if (!isregistered())
1428                 sysprintf("iwconfig %s essid -- need_activation", dev);
1429         else
1430 #endif
1431                 sysprintf("iwconfig %s essid -- \"%s\"", dev,
1432                           nvram_default_get(ssid, "dd-wrt"));
1433 #endif
1434         cprintf("set broadcast flag\n");        // hide ssid
1435         sysprintf("iwpriv %s hide_ssid %s", dev,
1436                   nvram_default_get(broadcast, "0"));
1437         sysprintf("iwpriv %s bgscan 0", dev);
1438         apm = nvram_default_get(wl, "ap");
1439
1440         char preamble[32];
1441
1442         sprintf(preamble, "%s_preamble", dev);
1443         if (nvram_default_match(preamble, "1", "0")) {
1444                 sysprintf("iwpriv %s shpreamble 1", dev);
1445         } else
1446                 sysprintf("iwpriv %s shpreamble 0", dev);
1447
1448         if (strcmp(apm, "sta") == 0 || strcmp(apm, "infra") == 0
1449             || strcmp(apm, "wet") == 0 || strcmp(apm, "wdssta") == 0) {
1450                 cprintf("set ssid\n");
1451 #ifdef HAVE_MAKSAT
1452 #ifdef HAVE_MAKSAT_BLANK
1453                 sysprintf("iwconfig %s essid -- \"%s\"", dev,
1454                           nvram_default_get(ssid, "default"));
1455 #else
1456                 sysprintf("iwconfig %s essid -- \"%s\"", dev,
1457                           nvram_default_get(ssid, "maksat"));
1458 #endif
1459 #elif defined(HAVE_TRIMAX)
1460                 sysprintf("iwconfig %s essid -- \"%s\"", dev,
1461                           nvram_default_get(ssid, "trimax"));
1462 #elif defined(HAVE_TMK)
1463                 sysprintf("iwconfig %s essid -- \"%s\"", dev,
1464                           nvram_default_get(ssid, "KMT"));
1465 #else
1466                 sysprintf("iwconfig %s essid -- \"%s\"", dev,
1467                           nvram_default_get(ssid, "dd-wrt"));
1468 #endif
1469         }
1470
1471         cprintf("adjust power\n");
1472
1473         int newpower = atoi(nvram_default_get(power, "16"));
1474
1475         sysprintf("iwconfig %s txpower %ddBm", dev, newpower);
1476
1477         cprintf("done()\n");
1478
1479         cprintf("setup encryption");
1480         // @todo ifup
1481         // netconfig
1482
1483         set_rate(dev, dev);
1484
1485         set_netmode(wif, dev, dev);
1486
1487         if (strcmp(apm, "sta")) {
1488                 char bridged[32];
1489
1490                 sprintf(bridged, "%s_bridged", dev);
1491                 if (nvram_default_match(bridged, "1", "1")) {
1492                         sysprintf("ifconfig %s 0.0.0.0 up", dev);
1493                         br_add_interface(getBridge(dev), dev);
1494                         sysprintf("ifconfig %s 0.0.0.0 up", dev);
1495                 } else {
1496                         sysprintf("ifconfig %s mtu %s", dev, getMTU(dev));
1497                         sysprintf("ifconfig %s %s netmask %s up", dev,
1498                                   nvram_nget("%s_ipaddr", dev),
1499                                   nvram_nget("%s_netmask", dev));
1500                 }
1501         } else {
1502                 char bridged[32];
1503
1504                 sprintf(bridged, "%s_bridged", dev);
1505                 if (nvram_default_match(bridged, "0", "1")) {
1506                         sysprintf("ifconfig %s mtu %s", dev, getMTU(dev));
1507                         sysprintf("ifconfig %s %s netmask %s up", dev,
1508                                   nvram_nget("%s_ipaddr", dev),
1509                                   nvram_nget("%s_netmask", dev));
1510                 }
1511
1512         }
1513         if (strcmp(apm, "sta") && strcmp(apm, "wdssta") && strcmp(apm, "wet"))
1514                 setupHostAP(dev, 0);
1515         else
1516                 setupSupplicant(dev, NULL);
1517
1518         // setup encryption
1519
1520         vifs = nvram_safe_get(wifivifs);
1521         if (vifs != NULL)
1522                 foreach(var, vifs, next) {
1523                 sprintf(mode, "%s_mode", var);
1524                 char *vapm = nvram_default_get(mode, "ap");
1525                 if (strcmp(vapm, "sta") && strcmp(vapm, "wdssta")
1526                     && strcmp(vapm, "wet"))
1527                         setupHostAP(var, 0);
1528                 else
1529                         setupSupplicant(var, NULL);
1530                 }
1531         /*
1532          * set_rate (dev);
1533          */
1534
1535         // vif netconfig
1536         vifs = nvram_safe_get(wifivifs);
1537         if (vifs != NULL && strlen(vifs) > 0) {
1538                 foreach(var, vifs, next) {
1539                         setMacFilter(var);
1540
1541                         sprintf(mode, "%s_mode", var);
1542                         char *m2 = nvram_default_get(mode, "ap");
1543
1544                         if (strcmp(m2, "sta")) {
1545                                 char bridged[32];
1546
1547                                 sprintf(bridged, "%s_bridged", var);
1548                                 if (nvram_default_match(bridged, "1", "1")) {
1549                                         sysprintf("ifconfig %s 0.0.0.0 up",
1550                                                   var);
1551                                         br_add_interface(getBridge(var), var);
1552                                         if (!strcmp(apm, "sta")
1553                                             || !strcmp(apm, "wdssta")
1554                                             || !strcmp(apm, "wet"))
1555                                                 sysprintf
1556                                                     ("ifconfig %s 0.0.0.0 down",
1557                                                      var);
1558                                         else {
1559                                                 sysprintf
1560                                                     ("ifconfig %s 0.0.0.0 down",
1561                                                      var);
1562                                                 sleep(1);
1563                                                 sysprintf
1564                                                     ("ifconfig %s 0.0.0.0 up",
1565                                                      var);
1566                                         }
1567                                 } else {
1568                                         char ip[32];
1569                                         char mask[32];
1570
1571                                         sprintf(ip, "%s_ipaddr", var);
1572                                         sprintf(mask, "%s_netmask", var);
1573                                         sysprintf("ifconfig %s mtu %s", var,
1574                                                   getMTU(var));
1575                                         sysprintf
1576                                             ("ifconfig %s %s netmask %s up",
1577                                              var, nvram_safe_get(ip),
1578                                              nvram_safe_get(mask));
1579                                         if (!strcmp(apm, "sta")
1580                                             || !strcmp(apm, "wdssta")
1581                                             || !strcmp(apm, "wet"))
1582                                                 sysprintf("ifconfig %s down",
1583                                                           var);
1584                                         else {
1585                                                 sysprintf("ifconfig %s down",
1586                                                           var);
1587                                                 sleep(1);
1588                                                 sysprintf
1589                                                     ("ifconfig %s %s netmask %s up",
1590                                                      var, nvram_safe_get(ip),
1591                                                      nvram_safe_get(mask));
1592                                         }
1593                                 }
1594                         }
1595                 }
1596         }
1597
1598         apm = nvram_default_get(wl, "ap");
1599         if (strcmp(apm, "sta") && strcmp(apm, "wdssta") && strcmp(apm, "wet")) {
1600                 cprintf("set channel\n");
1601                 char *ch = nvram_default_get(channel, "0");
1602
1603                 if (strcmp(ch, "0") == 0) {
1604                         sysprintf("iwconfig %s channel 0", dev);
1605                 } else {
1606                         char freq[64];
1607
1608                         sysprintf("iwconfig %s freq %sM", dev, ch);
1609                         sysprintf("ifconfig %s down", dev);
1610                         sleep(1);
1611                         sysprintf("ifconfig %s up", dev);
1612                 }
1613         }
1614         for (s = 1; s <= 10; s++) {
1615                 char wdsvarname[32] = { 0 };
1616                 char wdsdevname[32] = { 0 };
1617                 char wdsmacname[32] = { 0 };
1618                 char *wdsdev;
1619                 char *hwaddr;
1620
1621                 sprintf(wdsvarname, "%s_wds%d_enable", dev, s);
1622                 sprintf(wdsdevname, "%s_wds%d_if", dev, s);
1623                 sprintf(wdsmacname, "%s_wds%d_hwaddr", dev, s);
1624                 wdsdev = nvram_safe_get(wdsdevname);
1625                 if (strlen(wdsdev) == 0)
1626                         continue;
1627                 if (nvram_match(wdsvarname, "0"))
1628                         continue;
1629                 hwaddr = nvram_get(wdsmacname);
1630                 if (hwaddr != NULL) {
1631                         sysprintf("iwpriv %s wds_add %s", primary, hwaddr);
1632                         set_rate(dev, primary);
1633                 }
1634         }
1635
1636         for (s = 1; s <= 10; s++) {
1637                 char wdsvarname[32] = { 0 };
1638                 char wdsdevname[32] = { 0 };
1639                 char wdsmacname[32] = { 0 };
1640                 char *wdsdev;
1641                 char *hwaddr;
1642
1643                 sprintf(wdsvarname, "%s_wds%d_enable", dev, (11 - s));
1644                 sprintf(wdsdevname, "%s_wds%d_if", dev, (11 - s));
1645                 sprintf(wdsmacname, "%s_wds%d_hwaddr", dev, (11 - s));
1646                 wdsdev = nvram_safe_get(wdsdevname);
1647                 if (strlen(wdsdev) == 0)
1648                         continue;
1649                 if (nvram_match(wdsvarname, "0"))
1650                         continue;
1651                 hwaddr = nvram_get(wdsmacname);
1652                 if (hwaddr != NULL) {
1653                         sysprintf("ifconfig %s 0.0.0.0 up", wdsdev);
1654                 }
1655         }
1656
1657         sysprintf("iwconfig %s txpower %ddBm", dev, newpower);
1658
1659         setMacFilter(dev);
1660 }
1661
1662 void start_vifs(void)
1663 {
1664         char *next;
1665         char var[80];
1666         char *vifs;
1667         char mode[32];
1668         char *m;
1669         char wifivifs[32];
1670         int c = getdevicecount();
1671         int count = 0;
1672
1673         for (count = 0; count < c; count++) {
1674                 sprintf(wifivifs, "ath%d_vifs", count);
1675                 vifs = nvram_safe_get(wifivifs);
1676                 if (vifs != NULL && strlen(vifs) > 0) {
1677                         foreach(var, vifs, next) {
1678                                 setMacFilter(var);
1679
1680                                 sprintf(mode, "%s_mode", var);
1681                                 m = nvram_default_get(mode, "ap");
1682
1683                                 if (strcmp(m, "sta")) {
1684                                         char bridged[32];
1685
1686                                         sprintf(bridged, "%s_bridged", var);
1687                                         if (nvram_default_match
1688                                             (bridged, "1", "1")) {
1689                                                 eval("ifconfig", var, "0.0.0.0",
1690                                                      "up");
1691                                                 br_add_interface(getBridge(var),
1692                                                                  var);
1693                                                 eval("ifconfig", var, "0.0.0.0",
1694                                                      "up");
1695                                         } else {
1696                                                 char ip[32];
1697                                                 char mask[32];
1698
1699                                                 sprintf(ip, "%s_ipaddr", var);
1700                                                 sprintf(mask, "%s_netmask",
1701                                                         var);
1702                                                 eval("ifconfig", var, "mtu",
1703                                                      getMTU(var));
1704                                                 sysprintf
1705                                                     ("ifconfig %s %s netmask %s up",
1706                                                      var, nvram_safe_get(ip),
1707                                                      nvram_safe_get(mask));
1708                                         }
1709                                 }
1710                         }
1711                 }
1712         }
1713
1714 }
1715
1716 void stop_vifs(void)
1717 {
1718         char *next;
1719         char var[80];
1720         char *vifs;
1721         char mode[32];
1722         char *m;
1723         char wifivifs[32];
1724         int c = getdevicecount();
1725         int count = 0;
1726
1727         for (count = 0; count < c; count++) {
1728                 sprintf(wifivifs, "ath%d_vifs", count);
1729                 vifs = nvram_safe_get(wifivifs);
1730                 if (vifs != NULL && strlen(vifs) > 0) {
1731                         foreach(var, vifs, next) {
1732                                 eval("ifconfig", var, "down");
1733
1734                         }
1735                 }
1736         }
1737
1738 }
1739
1740 void start_duallink(void)
1741 {
1742
1743         if (nvram_match("duallink", "master")) {
1744                 sysprintf("ip route flush table 100");
1745                 sysprintf("ip route flush table 200");
1746                 sysprintf("ip route del fwmark 1 table 200");
1747                 sysprintf("iptables -t mangle -F PREROUTING");
1748                 sysprintf("ip route add %s/%s dev ath0 src %s table 100",
1749                           nvram_safe_get("ath0_ipaddr"),
1750                           nvram_safe_get("ath0_netmask"),
1751                           nvram_safe_get("ath0_ipaddr"));
1752                 sysprintf("ip route default via %s table 100",
1753                           nvram_safe_get("ath0_duallink_parent"));
1754                 sysprintf("ip route add %s/%s dev ath0 src %s table 200",
1755                           nvram_safe_get("ath1_ipaddr"),
1756                           nvram_safe_get("ath1_netmask"),
1757                           nvram_safe_get("ath1_ipaddr"));
1758                 sysprintf("ip route default via %s table 200",
1759                           nvram_safe_get("ath1_duallink_parent"));
1760                 sysprintf
1761                     ("iptables -t mangle -A PREROUTING -i br0 -j MARK --set-mark 1");
1762                 sysprintf("ip rule add fwmark 1 table 200");
1763         }
1764         if (nvram_match("duallink", "slave")) {
1765                 sysprintf("ip route flush table 100");
1766                 sysprintf("ip route flush table 200");
1767                 sysprintf("ip route del fwmark 1 table 100");
1768                 sysprintf("iptables -t mangle -F PREROUTING");
1769                 sysprintf("ip route add %s/%s dev ath0 src %s table 100",
1770                           nvram_safe_get("ath0_ipaddr"),
1771                           nvram_safe_get("ath0_netmask"),
1772                           nvram_safe_get("ath0_ipaddr"));
1773                 sysprintf("ip route default via %s table 100",
1774                           nvram_safe_get("ath0_duallink_parent"));
1775                 sysprintf("ip route add %s/%s dev ath0 src %s table 200",
1776                           nvram_safe_get("ath1_ipaddr"),
1777                           nvram_safe_get("ath1_netmask"),
1778                           nvram_safe_get("ath1_ipaddr"));
1779                 sysprintf("ip route default via %s table 200",
1780                           nvram_safe_get("ath1_duallink_parent"));
1781                 sysprintf
1782                     ("iptables -t mangle -A PREROUTING -i br0 -j MARK --set-mark 1");
1783                 sysprintf("ip rule add fwmark 1 table 100");
1784         }
1785
1786 }
1787
1788 extern void adjust_regulatory(int count);
1789
1790 void configure_wifi(void)       // madwifi implementation for atheros based
1791                                 // cards
1792 {
1793         deconfigure_wifi();
1794         /*
1795          * int s; int existed=0; for (s=0;s<10;s++) { char wif[32];
1796          * sprintf(wif,"wifi%d",s); if (ifexists(wif)) {
1797          * eval("ifconfig",wif,"down"); existed=1; } } #if defined(HAVE_FONERA)
1798          * || defined(HAVE_WHRAG108) eval("rmmod","ath_ahb"); insmod("ath_ahb",
1799          * "autocreate=none"); #else eval("rmmod","ath_pci"); insmod("ath_pci",
1800          * "autocreate=none"); #endif for (s=0;s<10;s++) { char wif[32];
1801          * sprintf(wif,"wifi%d",s); if (ifexists(wif)) eval("ifconfig",wif,"up");
1802          * }
1803          */
1804
1805         // bridge the virtual interfaces too
1806         memset(iflist, 0, 1024);
1807         /*
1808          * char countrycode[64]; char xchanmode[64]; char outdoor[64];
1809          *
1810          * if (strlen (nvram_safe_get ("wl_countrycode")) > 0) sprintf
1811          * (countrycode, "countrycode=%s", nvram_safe_get ("wl_countrycode"));
1812          * else sprintf (countrycode, "countrycode=0");
1813          *
1814          * if (strlen (nvram_safe_get ("wl_xchanmode")) > 0) sprintf (xchanmode,
1815          * "xchanmode=%s", nvram_safe_get ("wl_xchanmode")); else sprintf
1816          * (xchanmode, "xchanmode=0");
1817          *
1818          * if (strlen (nvram_safe_get ("wl_outdoor")) > 0) sprintf (outdoor,
1819          * "outdoor=%s", nvram_safe_get ("wl_outdoor")); else sprintf (outdoor,
1820          * "outdoor=0");
1821          */
1822
1823         int c = getdevicecount();
1824         int i;
1825         int changed = 0;
1826
1827         for (i = 0; i < c; i++)
1828                 adjust_regulatory(i);
1829
1830         for (i = 0; i < c; i++) {
1831 #ifdef REGDOMAIN_OVERRIDE
1832                 // SeG's dirty hack to make everything possible without any channel
1833                 // restrictions. regdomain 0x60 seems to be the best way
1834                 char regdomain[16];
1835
1836                 sprintf(regdomain, "ath%d_regdomain", i);
1837
1838                 // read current reg domain from atheros card
1839                 // the base io 0x50010000 is hardcoded here and can be different on
1840                 // non RB500 ports
1841                 // @fixme: detect io by reading pci data
1842
1843                 cprintf("get reg domain()\n");
1844                 int reg_domain = get_regdomain((0x50010000) + (0x10000 * i));
1845
1846                 if (reg_domain > -1)    // reg domain was successfully readed
1847                 {
1848                         if (nvram_get(regdomain) != NULL)       // reg domain is
1849                                 // defined in nvram
1850                         {
1851                                 int destination = atoi(nvram_safe_get(regdomain));      // read
1852
1853                                 // new
1854                                 // target
1855                                 // regdomain
1856                                 if (destination != reg_domain)  // check if changed
1857                                 {
1858                                         if (set_regdomain((0x50010000) + (0x10000 * i), destination) == 0)      // modifiy
1859                                                 // eeprom
1860                                                 // with
1861                                                 // new
1862                                                 // regdomain
1863                                                 changed = 1;
1864                                 }
1865                         }
1866
1867                 }
1868                 cprintf("configure next\n");
1869                 if (!changed)   // if regdomain not changed, configure it
1870 #endif
1871                 {
1872                         configure_single(i);
1873                 }
1874         }
1875
1876         if (changed)            // if changed, deconfigure myself and
1877                 // reconfigure me in the same way.
1878         {
1879                 deconfigure_wifi();
1880                 configure_wifi();
1881         }
1882         if (need_commit) {
1883                 nvram_commit();
1884                 need_commit = 0;
1885         }
1886         eval("killall", "-9", "roaming_daemon");
1887         if (getSTA() || getWET())
1888                 eval("roaming_daemon");
1889
1890         int cnt = getifcount("wifi");
1891         int s;
1892
1893         for (c = 0; c < cnt; c++) {
1894                 char br1enable[32];
1895                 char br1ipaddr[32];
1896                 char br1netmask[32];
1897
1898                 sprintf(br1enable, "ath%d_br1_enable", c);
1899                 sprintf(br1ipaddr, "ath%d_br1_ipaddr", c);
1900                 sprintf(br1netmask, "ath%d_br1_netmask", c);
1901                 if (nvram_get(br1enable) == NULL)
1902                         nvram_set(br1enable, "0");
1903                 if (nvram_get(br1ipaddr) == NULL)
1904                         nvram_set(br1ipaddr, "0.0.0.0");
1905                 if (nvram_get(br1netmask) == NULL)
1906                         nvram_set(br1netmask, "255.255.255.0");
1907                 if (nvram_match(br1enable, "1")) {
1908                         ifconfig("br1", 0, 0, 0);
1909
1910                         // eval ("ifconfig", "br1", "down");
1911                         br_del_bridge("br1");
1912                         br_add_bridge("br1");
1913
1914                         if (nvram_match("lan_stp", "0"))
1915                                 br_set_stp_state("br1", 0);     // eval ("brctl", "stp",
1916                         // "br1", "off");
1917                         else
1918                                 br_set_stp_state("br1", 1);     // eval ("brctl", "stp",
1919                         // "br1", "off");
1920                         br_set_bridge_forward_delay("br1", 1);
1921
1922                         /*
1923                          * Bring up and configure br1 interface
1924                          */
1925                         if (nvram_invmatch(br1ipaddr, "0.0.0.0")) {
1926                                 ifconfig("br1", IFUP, nvram_safe_get(br1ipaddr),
1927                                          nvram_safe_get(br1netmask));
1928
1929                                 if (nvram_match("lan_stp", "0"))
1930                                         br_set_stp_state("br1", 0);     // eval ("brctl",
1931                                 // "stp", "br1",
1932                                 // "off");
1933                                 else
1934                                         br_set_stp_state("br1", 1);     // eval ("brctl",
1935                                 // "stp", "br1",
1936                                 // "off");
1937
1938                         }
1939
1940                 }
1941         }
1942         for (c = 0; c < cnt; c++) {
1943
1944                 for (s = 1; s <= MAX_WDS_DEVS; s++) {
1945                         char wdsvarname[32] = { 0 };
1946                         char wdsdevname[32] = { 0 };
1947                         char *dev;
1948
1949                         char br1enable[32];
1950
1951                         sprintf(wdsvarname, "ath%d_wds%d_enable", c, s);
1952                         sprintf(wdsdevname, "ath%d_wds%d_if", c, s);
1953                         sprintf(br1enable, "ath%d_br1_enable", c);
1954                         if (nvram_get(wdsvarname) == NULL)
1955                                 nvram_set(wdsvarname, "0");
1956                         dev = nvram_safe_get(wdsdevname);
1957                         if (strlen(dev) == 0)
1958                                 continue;
1959                         ifconfig(dev, 0, 0, 0);
1960
1961                         // eval ("ifconfig", dev, "down");
1962                         if (nvram_match(wdsvarname, "1")) {
1963                                 char *wdsip;
1964                                 char *wdsnm;
1965                                 char wdsbc[32] = { 0 };
1966                                 wdsip = nvram_nget("ath%d_wds%d_ipaddr", c, s);
1967                                 wdsnm = nvram_nget("ath%d_wds%d_netmask", c, s);
1968
1969                                 snprintf(wdsbc, 31, "%s", wdsip);
1970                                 get_broadcast(wdsbc, wdsnm);
1971                                 eval("ifconfig", dev, wdsip, "broadcast",
1972                                      wdsbc, "netmask", wdsnm, "up");
1973                         } else if (nvram_match(wdsvarname, "2")
1974                                    && nvram_match(br1enable, "1")) {
1975                                 eval("ifconfig", dev, "up");
1976                                 sleep(1);
1977                                 br_add_interface("br1", dev);
1978                         } else if (nvram_match(wdsvarname, "3")) {
1979                                 ifconfig(dev, IFUP, 0, 0);
1980                                 sleep(1);
1981                                 br_add_interface(getBridge(dev), dev);
1982                         }
1983                 }
1984         }
1985         if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
1986                 return;
1987         struct ifreq ifr;
1988
1989 #ifdef HAVE_RB500
1990         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
1991         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
1992                 char eabuf[32];
1993
1994                 nvram_set("wl0_hwaddr",
1995                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
1996         }
1997 #endif
1998 #ifdef HAVE_X86
1999         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
2000         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
2001                 char eabuf[32];
2002
2003                 nvram_set("wl0_hwaddr",
2004                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
2005         }
2006 #endif
2007 #ifdef HAVE_XSCALE
2008         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
2009         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
2010                 char eabuf[32];
2011
2012                 nvram_set("wl0_hwaddr",
2013                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
2014         }
2015 #endif
2016 #ifdef HAVE_MAGICBOX
2017         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
2018         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
2019                 char eabuf[32];
2020
2021                 nvram_set("wl0_hwaddr",
2022                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
2023         }
2024 #endif
2025 #ifdef HAVE_FONERA
2026         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
2027         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
2028                 char eabuf[32];
2029
2030                 nvram_set("wl0_hwaddr",
2031                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
2032         }
2033 #endif
2034 #ifdef HAVE_LS2
2035         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
2036         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
2037                 char eabuf[32];
2038
2039                 nvram_set("wl0_hwaddr",
2040                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
2041         }
2042 #endif
2043 #ifdef HAVE_LS5
2044         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
2045         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
2046                 char eabuf[32];
2047
2048                 nvram_set("wl0_hwaddr",
2049                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
2050         }
2051 #endif
2052 #ifdef HAVE_WHRAG108
2053         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
2054         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
2055                 char eabuf[32];
2056
2057                 nvram_set("wl0_hwaddr",
2058                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
2059         }
2060 #endif
2061 #ifdef HAVE_PB42
2062         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
2063         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
2064                 char eabuf[32];
2065
2066                 nvram_set("wl0_hwaddr",
2067                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
2068         }
2069 #endif
2070 #ifdef HAVE_LSX
2071         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
2072         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
2073                 char eabuf[32];
2074
2075                 nvram_set("wl0_hwaddr",
2076                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
2077         }
2078 #endif
2079 #ifdef HAVE_DANUBE
2080         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
2081         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
2082                 char eabuf[32];
2083
2084                 nvram_set("wl0_hwaddr",
2085                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
2086         }
2087 #endif
2088 #ifdef HAVE_STORM
2089         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
2090         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
2091                 char eabuf[32];
2092
2093                 nvram_set("wl0_hwaddr",
2094                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
2095         }
2096 #endif
2097 #ifdef HAVE_ADM5120
2098         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
2099         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
2100                 char eabuf[32];
2101
2102                 nvram_set("wl0_hwaddr",
2103                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
2104         }
2105 #endif
2106 #ifdef HAVE_TW6600
2107         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
2108         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
2109                 char eabuf[32];
2110
2111                 nvram_set("wl0_hwaddr",
2112                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
2113         }
2114 #endif
2115 #ifdef HAVE_CA8
2116         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
2117         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
2118                 char eabuf[32];
2119
2120                 nvram_set("wl0_hwaddr",
2121                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
2122         }
2123 #endif
2124         close(s);
2125         reset_hwaddr(nvram_safe_get("lan_ifname"));
2126 }
2127
2128 void start_deconfigurewifi(void)
2129 {
2130         deconfigure_wifi();
2131 }
2132
2133 void start_configurewifi(void)
2134 {
2135         configure_wifi();
2136 }
2137 #endif
Note: See TracBrowser for help on using the browser.