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

Revision 12308, 54.8 kB (checked in by BrainSlayer, 5 months ago)

experimental new 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         sprintf(channel, "ath%d_channel", count);
969         sprintf(power, "ath%d_txpwrdbm", count);
970         sprintf(sens, "ath%d_distance", count);
971         sprintf(diversity, "ath%d_diversity", count);
972         sprintf(txantenna, "ath%d_txantenna", count);
973         sprintf(rxantenna, "ath%d_rxantenna", count);
974         sprintf(athmac, "ath%d_hwaddr", count);
975
976         // create base device
977         cprintf("configure base interface %d\n", count);
978         sprintf(net, "%s_net_mode", dev);
979         if (nvram_match(net, "disabled"))
980                 return;
981         if (!count)
982                 strcpy(iflist, dev);
983 //    set_compression( count );
984         // create wds interface(s)
985         int s;
986
987         char *apm;
988         int vif = 0;
989         sprintf(wl_poll, "%s_pollingmode", dev);
990
991         setsysctrl(wif, "pollingmode", atoi(nvram_default_get(wl_poll, "0")));
992
993         char *vifs = nvram_safe_get(wifivifs);
994         char primary[32] = { 0 };
995         if (vifs != NULL)
996                 foreach(var, vifs, next) {
997                 sprintf(mode, "%s_mode", var);
998                 char *vapm = nvram_default_get(mode, "ap");
999                 // create device
1000                 if (strlen(mode) > 0) {
1001                         if (!strcmp(vapm, "wet") || !strcmp(vapm, "sta")
1002                             || !strcmp(vapm, "wdssta"))
1003                                 sysprintf
1004                                     ("wlanconfig %s create wlandev %s wlanmode sta nosbeacon",
1005                                      var, wif);
1006                         else if (!strcmp(vapm, "ap") || !strcmp(vapm, "wdsap"))
1007                                 sysprintf
1008                                     ("wlanconfig %s create wlandev %s wlanmode ap",
1009                                      var, wif);
1010                         else
1011                                 sysprintf
1012                                     ("wlanconfig %s create wlandev %s wlanmode adhoc",
1013                                      var, wif);
1014                         vif = 1;
1015                         if (strlen(primary) == 0)
1016                                 strcpy(primary, var);
1017                         strcat(iflist, " ");
1018                         strcat(iflist, var);
1019                         char vathmac[16];
1020
1021                         sprintf(vathmac, "%s_hwaddr", var);
1022                         char vmacaddr[32];
1023
1024                         getMacAddr(var, vmacaddr);
1025                         nvram_set(vathmac, vmacaddr);
1026
1027                 }
1028                 }
1029         // create original primary interface
1030         apm = nvram_default_get(wl, "ap");
1031
1032         if (!strcmp(apm, "wet") || !strcmp(apm, "wdssta")
1033             || !strcmp(apm, "sta")) {
1034                 if (vif)
1035                         sysprintf
1036                             ("wlanconfig %s create wlandev %s wlanmode sta nosbeacon",
1037                              dev, wif);
1038                 else
1039                         sysprintf
1040                             ("wlanconfig %s create wlandev %s wlanmode sta",
1041                              dev, wif);
1042
1043         } else if (!strcmp(apm, "ap") || !strcmp(apm, "wdsap"))
1044                 sysprintf("wlanconfig %s create wlandev %s wlanmode ap", dev,
1045                           wif);
1046         else
1047                 sysprintf("wlanconfig %s create wlandev %s wlanmode adhoc", dev,
1048                           wif);
1049
1050         if (strlen(primary) == 0)
1051                 strcpy(primary, dev);
1052
1053 #if 0
1054 #endif
1055         cprintf("detect maxpower\n");
1056         apm = nvram_default_get(wl, "ap");
1057         char maxp[16];
1058
1059         vifs = nvram_safe_get(wifivifs);
1060         // fprintf(stderr,"vifs %s\n",vifs);
1061         char *useif = NULL;
1062         char copyvap[64];
1063
1064         if (vifs != NULL)
1065                 foreach(var, vifs, next) {
1066                 // fprintf(stderr,"vifs %s, %s\n",vifs, var);
1067                 if (!useif) {
1068                         strcpy(copyvap, var);
1069                         useif = copyvap;
1070                 }
1071                 }
1072         // config net mode
1073         if (useif)
1074                 set_netmode(wif, dev, useif);
1075         set_netmode(wif, dev, dev);
1076
1077         char wmm[32];
1078
1079         sprintf(wmm, "%s_wmm", dev);
1080         if (nvram_nmatch("1", "%s_pollingmode", dev))
1081                 sysprintf("iwpriv %s wmm 1", dev);
1082         else
1083                 sysprintf("iwpriv %s wmm %s", dev, nvram_default_get(wmm, "0"));
1084         char doth[32];
1085
1086         sprintf(doth, "%s_doth", dev);
1087         sysprintf("iwpriv %s doth %s", dev, nvram_default_get(doth, "0"));
1088         int disablescan = 0;
1089
1090         set_scanlist(dev, wif);
1091         if (strcmp(apm, "sta") && strcmp(apm, "wdssta") && strcmp(apm, "wet")) {
1092                 char *ch = nvram_default_get(channel, "0");
1093
1094                 if (strcmp(ch, "0") == 0) {
1095                         sysprintf("iwconfig %s channel 0", dev);
1096                 } else {
1097                         sysprintf("iwconfig %s freq %sM", dev, ch);
1098                 }
1099         }
1100
1101         if (useif)
1102                 set_netmode(wif, dev, useif);
1103         set_netmode(wif, dev, dev);
1104         setRTS(dev);
1105
1106         char macaddr[32];
1107
1108         getMacAddr(dev, macaddr);
1109         nvram_set(athmac, macaddr);
1110
1111         cprintf("adjust sensitivity\n");
1112
1113         int distance = atoi(nvram_default_get(sens, "2000"));   // to meter
1114         if (nvram_nmatch("1", "%s_pollingmode", var)) {
1115                 setdistance(wif, 100000, 20);
1116         } else {
1117
1118                 if (distance > 0) {
1119                         setsysctrl(wif, "dynack_count", 0);
1120                         char *chanbw = nvram_nget("%s_channelbw", dev);
1121
1122                         setdistance(wif, distance, atoi(chanbw));       // sets the receiver
1123                         // sensitivity
1124                 } else {
1125                         setsysctrl(wif, "acktimeout", 350);
1126                         setsysctrl(wif, "dynack_count", 20);
1127                 }
1128         }
1129         char wl_intmit[32];
1130         char wl_noise_immunity[32];
1131         char wl_ofdm_weak_det[32];
1132         char wl_csma[32];
1133
1134         sprintf(wl_intmit, "%s_intmit", dev);
1135         sprintf(wl_noise_immunity, "%s_noise_immunity", dev);
1136         sprintf(wl_ofdm_weak_det, "%s_ofdm_weak_det", dev);
1137         sprintf(wl_csma, "%s_csma", dev);
1138
1139         setsysctrl(wif, "csma", atoi(nvram_default_get(wl_csma, "1")));
1140         setsysctrl(wif, "intmit", atoi(nvram_default_get(wl_intmit, "-1")));
1141         setsysctrl(wif, "noise_immunity",
1142                    atoi(nvram_default_get(wl_noise_immunity, "-1")));
1143         setsysctrl(wif, "ofdm_weak_det",
1144                    atoi(nvram_default_get(wl_ofdm_weak_det, "1")));
1145
1146         if (isEMP(dev))         //check this only if the current installed card is usually a emp card. this is made to prevent card destruction
1147         {
1148                 if (nvram_nmatch("1", "%s_cardtype", dev)) {
1149                         setsysctrl(wif, "powerfix", 7); //increase outputpower by 7 dbm, we will do this in future for a and b band separate
1150                 }
1151
1152         }
1153
1154         char *enable = "enable";
1155         char *disable = "disable";
1156
1157 #ifdef HAVE_NS5
1158         char *gpio = "1";
1159 #endif
1160 #ifdef HAVE_NS3
1161         char *gpio = "1";
1162 #endif
1163 #ifdef HAVE_LC5
1164         char *gpio = "1";
1165 #endif
1166 #ifdef HAVE_NS2
1167         char *gpio = "7";
1168 #endif
1169 #ifdef HAVE_LC2
1170         enable = "disable";     // swap it
1171         disable = "enable";
1172         char *gpio = "2";
1173 #endif
1174
1175 #if defined(HAVE_NS2)  || defined(HAVE_NS5) || defined(HAVE_LC2) || defined(HAVE_LC5) || defined(HAVE_NS3)
1176         int tx = atoi(nvram_default_get(txantenna, "0"));
1177
1178         setsysctrl(wif, "diversity", 0);
1179         switch (tx) {
1180         case 0:         // vertical
1181                 setsysctrl(wif, "rxantenna", 2);
1182                 setsysctrl(wif, "txantenna", 2);
1183                 eval("gpio", enable, gpio);
1184                 break;
1185         case 1:         // horizontal
1186                 setsysctrl(wif, "rxantenna", 1);
1187                 setsysctrl(wif, "txantenna", 1);
1188                 eval("gpio", enable, gpio);
1189                 break;
1190         case 2:         // external
1191                 setsysctrl(wif, "rxantenna", 1);
1192                 setsysctrl(wif, "txantenna", 1);
1193                 eval("gpio", disable, gpio);
1194                 break;
1195         case 3:         // adaptive
1196                 setsysctrl(wif, "diversity", 1);
1197                 setsysctrl(wif, "rxantenna", 0);
1198                 setsysctrl(wif, "txantenna", 0);
1199                 eval("gpio", enable, gpio);
1200                 break;
1201         }
1202 #else
1203
1204 #if defined(HAVE_PICO2) || defined(HAVE_PICO2HP) || defined(HAVE_PICO5)
1205         int rx = 1;
1206         int tx = 1;
1207         int diva = 0;           //atoi( nvram_default_get( diversity, "0" ) );
1208 #elif defined(HAVE_EOC5610)
1209 //      int rx = atoi(nvram_default_get(txantenna, "1"));
1210 //      int tx = atoi(nvram_default_get(txantenna, "1"));
1211 //      int diva = 0;           //atoi( nvram_default_get( diversity, "0" ) );
1212     int rx = 1;
1213     int tx = 0; // fix to internal path, since both antennas use the same connector. so only the switch matters
1214         int diva = 1;           //1;// atoi( nvram_default_get( diversity, "0" ) );
1215 #elif defined(HAVE_EOC1650) || defined(HAVE_EOC2610)
1216 //      int rx = 2;             //atoi( nvram_default_get( txantenna, "2" ) ); // secondary antenna output is the internal antenna and should be used as default value
1217 //      int tx = 2;             //atoi( nvram_default_get( txantenna, "2" ) );
1218     int rx = 1;
1219     int tx = 0; // fix to internal path, since both antennas use the same connector. so only the switch matters
1220         int diva = 1;           //1;// atoi( nvram_default_get( diversity, "0" ) );
1221 #else
1222         int rx = atoi(nvram_default_get(rxantenna, "1"));
1223         int tx = atoi(nvram_default_get(txantenna, "1"));
1224         int diva = atoi(nvram_default_get(diversity, "0"));
1225 #endif
1226
1227         setsysctrl(wif, "diversity", diva);
1228         setsysctrl(wif, "rxantenna", rx);
1229         setsysctrl(wif, "txantenna", tx);
1230 #endif
1231         // setup vif interfaces first
1232         char chanshift_s[32];
1233
1234         sprintf(chanshift_s, "%s_chanshift", dev);
1235         char *chanshift = nvram_default_get(chanshift_s, "0");
1236
1237         sprintf(maxassoc, "%s_maxassoc", dev);
1238         sysprintf("iwpriv %s maxassoc %s", dev,
1239                   nvram_default_get(maxassoc, "256"));
1240
1241         switch (atoi(chanshift)) {
1242         case 15:
1243                 sysprintf("iwpriv %s channelshift -3", dev);
1244                 break;
1245         case 10:
1246                 sysprintf("iwpriv %s channelshift -2", dev);
1247                 break;
1248         case 5:
1249                 sysprintf("iwpriv %s channelshift -1", dev);
1250                 break;
1251         case 0:
1252                 sysprintf("iwpriv %s channelshift 0", dev);
1253                 break;
1254         case -5:
1255                 sysprintf("iwpriv %s channelshift 1", dev);
1256                 break;
1257         case -10:
1258                 sysprintf("iwpriv %s channelshift 2", dev);
1259                 break;
1260         case -15:
1261                 sysprintf("iwpriv %s channelshift 3", dev);
1262                 break;
1263         default:
1264                 sysprintf("iwpriv %s channelshift 0", dev);
1265                 break;
1266         }
1267         if (!strcmp(apm, "wdssta") || !strcmp(apm, "wdsap"))
1268                 sysprintf("iwpriv %s wds 1", dev);
1269
1270         if (!strcmp(apm, "wdsap"))
1271                 sysprintf("iwpriv %s wdssep 1", dev);
1272         else
1273                 sysprintf("iwpriv %s wdssep 0", dev);
1274
1275         vifs = nvram_safe_get(wifivifs);
1276         if (vifs != NULL)
1277                 foreach(var, vifs, next) {
1278                 sprintf(net, "%s_net_mode", var);
1279                 if (nvram_match(net, "disabled"))
1280                         continue;
1281                 sprintf(ssid, "%s_ssid", var);
1282                 sprintf(mode, "%s_mode", var);
1283                 sprintf(maxassoc, "%s_maxassoc", var);
1284                 sysprintf("iwpriv %s maxassoc %s", var,
1285                           nvram_default_get(maxassoc, "256"));
1286                 switch (atoi(chanshift)) {
1287                 case 15:
1288                         sysprintf("iwpriv %s channelshift -3", var);
1289                         break;
1290                 case 10:
1291                         sysprintf("iwpriv %s channelshift -2", var);
1292                         break;
1293                 case 5:
1294                         sysprintf("iwpriv %s channelshift -1", var);
1295                         break;
1296                 case 0:
1297                         sysprintf("iwpriv %s channelshift 0", var);
1298                         break;
1299                 case -5:
1300                         sysprintf("iwpriv %s channelshift 1", var);
1301                         break;
1302                 case -10:
1303                         sysprintf("iwpriv %s channelshift 2", var);
1304                         break;
1305                 case -15:
1306                         sysprintf("iwpriv %s channelshift 3", var);
1307                         break;
1308                 default:
1309                         sysprintf("iwpriv %s channelshift 0", var);
1310                         break;
1311                 }
1312                 char *mvap = nvram_default_get(mode, "ap");
1313                 set_scanlist(dev, wif);
1314                 setRTS(var);
1315
1316                 if (strcmp(mvap, "sta") && strcmp(mvap, "wdssta")
1317                     && strcmp(mvap, "wet")) {
1318                         cprintf("set channel\n");
1319                         char *ch = nvram_default_get(channel, "0");
1320
1321                         if (strcmp(ch, "0") == 0) {
1322                                 sysprintf("iwconfig %s channel 0", var);
1323                         } else {
1324                                 sysprintf("iwconfig %s freq %sM", var, ch);
1325                         }
1326                 }
1327                 sysprintf("iwpriv %s bgscan 0", var);
1328 #ifdef HAVE_MAKSAT
1329 #ifdef HAVE_MAKSAT_BLANK
1330                 sysprintf("iwconfig %s essid -- \"%s\"", var,
1331                           nvram_default_get(ssid, "default_vap"));
1332 #else
1333                 sysprintf("iwconfig %s essid -- \"%s\"", var,
1334                           nvram_default_get(ssid, "maksat_vap"));
1335 #endif
1336 #elif defined(HAVE_TRIMAX)
1337                 sysprintf("iwconfig %s essid -- \"%s\"", var,
1338                           nvram_default_get(ssid, "trimax_vap"));
1339 #elif defined(HAVE_TMK)
1340                 sysprintf("iwconfig %s essid -- \"%s\"", var,
1341                           nvram_default_get(ssid, "KMT_vap"));
1342 #else
1343 #ifdef HAVE_REGISTER
1344                 if (!isregistered())
1345                         sysprintf("iwconfig %s essid -- need_activation", var);
1346                 else
1347 #endif
1348                         sysprintf("iwconfig %s essid -- \"%s\"", var,
1349                                   nvram_default_get(ssid, "dd-wrt_vap"));
1350 #endif
1351                 cprintf("set broadcast flag vif %s\n", var);    // hide ssid
1352                 sprintf(broadcast, "%s_closed", var);
1353                 sysprintf("iwpriv %s hide_ssid %s", var,
1354                           nvram_default_get(broadcast, "0"));
1355                 sprintf(wmm, "%s_wmm", var);
1356                 if (nvram_nmatch("1", "%s_pollingmode", var))
1357                         sysprintf("iwpriv %s wmm 1", var);
1358                 else
1359                         sysprintf("iwpriv %s wmm %s", var,
1360                                   nvram_default_get(wmm, "0"));
1361                 char isolate[32];
1362
1363                 sprintf(isolate, "%s_ap_isolate", var);
1364                 if (nvram_default_match(isolate, "1", "0"))
1365                         sysprintf("iwpriv %s ap_bridge 0", var);
1366                 if (!strcmp(mvap, "wdssta") || !strcmp(mvap, "wdsap"))
1367                         sysprintf("iwpriv %s wds 1", var);
1368                 sprintf(mtikie, "%s_mtikie", var);
1369                 if (nvram_default_match(mtikie, "1", "0"))
1370                         sysprintf("iwpriv %s addmtikie 1", var);
1371
1372 #ifdef HAVE_BONDING
1373                 if (!strcmp(mvap, "wdsap") && !isBond(var))
1374 #else
1375                 if (!strcmp(mvap, "wdsap"))
1376 #endif
1377                         sysprintf("iwpriv %s wdssep 1", var);
1378                 else
1379                         sysprintf("iwpriv %s wdssep 0", var);
1380
1381                 sysprintf("iwpriv %s hostroaming 0", var);
1382                 cnt++;
1383                 }
1384
1385         sprintf(mtikie, "%s_mtikie", dev);
1386         if (nvram_default_match(mtikie, "1", "0"))
1387                 sysprintf("iwpriv %s addmtikie 1", dev);
1388
1389         char isolate[32];
1390
1391         sprintf(isolate, "%s_ap_isolate", dev);
1392         if (nvram_default_match(isolate, "1", "0"))
1393                 sysprintf("iwpriv %s ap_bridge 0", dev);
1394         sysprintf("iwpriv %s hostroaming 0", dev);
1395
1396         sprintf(ssid, "ath%d_ssid", count);
1397         sprintf(broadcast, "ath%d_closed", count);
1398
1399         memset(var, 0, 80);
1400
1401         cprintf("set ssid\n");
1402 #ifdef HAVE_MAKSAT
1403 #ifdef HAVE_MAKSAT_BLANK
1404         sysprintf("iwconfig %s essid -- \"%s\"", dev,
1405                   nvram_default_get(ssid, "default"));
1406 #else
1407         sysprintf("iwconfig %s essid -- \"%s\"", dev,
1408                   nvram_default_get(ssid, "maksat"));
1409 #endif
1410 #elif defined(HAVE_TRIMAX)
1411         sysprintf("iwconfig %s essid -- \"%s\"", dev,
1412                   nvram_default_get(ssid, "trimax"));
1413 #elif defined(HAVE_TMK)
1414         sysprintf("iwconfig %s essid -- \"%s\"", dev,
1415                   nvram_default_get(ssid, "KMT"));
1416 #else
1417 #ifdef HAVE_REGISTER
1418         if (!isregistered())
1419                 sysprintf("iwconfig %s essid -- need_activation", dev);
1420         else
1421 #endif
1422                 sysprintf("iwconfig %s essid -- \"%s\"", dev,
1423                           nvram_default_get(ssid, "dd-wrt"));
1424 #endif
1425         cprintf("set broadcast flag\n");        // hide ssid
1426         sysprintf("iwpriv %s hide_ssid %s", dev,
1427                   nvram_default_get(broadcast, "0"));
1428         sysprintf("iwpriv %s bgscan 0", dev);
1429         apm = nvram_default_get(wl, "ap");
1430
1431         char preamble[32];
1432
1433         sprintf(preamble, "%s_preamble", dev);
1434         if (nvram_default_match(preamble, "1", "0")) {
1435                 sysprintf("iwpriv %s shpreamble 1", dev);
1436         } else
1437                 sysprintf("iwpriv %s shpreamble 0", dev);
1438
1439         if (strcmp(apm, "sta") == 0 || strcmp(apm, "infra") == 0
1440             || strcmp(apm, "wet") == 0 || strcmp(apm, "wdssta") == 0) {
1441                 cprintf("set ssid\n");
1442 #ifdef HAVE_MAKSAT
1443 #ifdef HAVE_MAKSAT_BLANK
1444                 sysprintf("iwconfig %s essid -- \"%s\"", dev,
1445                           nvram_default_get(ssid, "default"));
1446 #else
1447                 sysprintf("iwconfig %s essid -- \"%s\"", dev,
1448                           nvram_default_get(ssid, "maksat"));
1449 #endif
1450 #elif defined(HAVE_TRIMAX)
1451                 sysprintf("iwconfig %s essid -- \"%s\"", dev,
1452                           nvram_default_get(ssid, "trimax"));
1453 #elif defined(HAVE_TMK)
1454                 sysprintf("iwconfig %s essid -- \"%s\"", dev,
1455                           nvram_default_get(ssid, "KMT"));
1456 #else
1457                 sysprintf("iwconfig %s essid -- \"%s\"", dev,
1458                           nvram_default_get(ssid, "dd-wrt"));
1459 #endif
1460         }
1461
1462         cprintf("adjust power\n");
1463
1464         int newpower = atoi(nvram_default_get(power, "16"));
1465
1466         sysprintf("iwconfig %s txpower %ddBm", dev, newpower);
1467
1468         cprintf("done()\n");
1469
1470         cprintf("setup encryption");
1471         // @todo ifup
1472         // netconfig
1473
1474         set_rate(dev, dev);
1475
1476         set_netmode(wif, dev, dev);
1477
1478         if (strcmp(apm, "sta")) {
1479                 char bridged[32];
1480
1481                 sprintf(bridged, "%s_bridged", dev);
1482                 if (nvram_default_match(bridged, "1", "1")) {
1483                         sysprintf("ifconfig %s 0.0.0.0 up", dev);
1484                         br_add_interface(getBridge(dev), dev);
1485                         sysprintf("ifconfig %s 0.0.0.0 up", dev);
1486                 } else {
1487                         sysprintf("ifconfig %s mtu %s", dev, getMTU(dev));
1488                         sysprintf("ifconfig %s %s netmask %s up", dev,
1489                                   nvram_nget("%s_ipaddr", dev),
1490                                   nvram_nget("%s_netmask", dev));
1491                 }
1492         } else {
1493                 char bridged[32];
1494
1495                 sprintf(bridged, "%s_bridged", dev);
1496                 if (nvram_default_match(bridged, "0", "1")) {
1497                         sysprintf("ifconfig %s mtu %s", dev, getMTU(dev));
1498                         sysprintf("ifconfig %s %s netmask %s up", dev,
1499                                   nvram_nget("%s_ipaddr", dev),
1500                                   nvram_nget("%s_netmask", dev));
1501                 }
1502
1503         }
1504         if (strcmp(apm, "sta") && strcmp(apm, "wdssta") && strcmp(apm, "wet"))
1505                 setupHostAP(dev, 0);
1506         else
1507                 setupSupplicant(dev, NULL);
1508
1509         // setup encryption
1510
1511         vifs = nvram_safe_get(wifivifs);
1512         if (vifs != NULL)
1513                 foreach(var, vifs, next) {
1514                 sprintf(mode, "%s_mode", var);
1515                 char *vapm = nvram_default_get(mode, "ap");
1516                 if (strcmp(vapm, "sta") && strcmp(vapm, "wdssta")
1517                     && strcmp(vapm, "wet"))
1518                         setupHostAP(var, 0);
1519                 else
1520                         setupSupplicant(var, NULL);
1521                 }
1522         /*
1523          * set_rate (dev);
1524          */
1525
1526         // vif netconfig
1527         vifs = nvram_safe_get(wifivifs);
1528         if (vifs != NULL && strlen(vifs) > 0) {
1529                 foreach(var, vifs, next) {
1530                         setMacFilter(var);
1531
1532                         sprintf(mode, "%s_mode", var);
1533                         char *m2 = nvram_default_get(mode, "ap");
1534
1535                         if (strcmp(m2, "sta")) {
1536                                 char bridged[32];
1537
1538                                 sprintf(bridged, "%s_bridged", var);
1539                                 if (nvram_default_match(bridged, "1", "1")) {
1540                                         sysprintf("ifconfig %s 0.0.0.0 up",
1541                                                   var);
1542                                         br_add_interface(getBridge(var), var);
1543                                         if (!strcmp(apm, "sta")
1544                                             || !strcmp(apm, "wdssta")
1545                                             || !strcmp(apm, "wet"))
1546                                                 sysprintf
1547                                                     ("ifconfig %s 0.0.0.0 down",
1548                                                      var);
1549                                         else {
1550                                                 sysprintf
1551                                                     ("ifconfig %s 0.0.0.0 down",
1552                                                      var);
1553                                                 sleep(1);
1554                                                 sysprintf
1555                                                     ("ifconfig %s 0.0.0.0 up",
1556                                                      var);
1557                                         }
1558                                 } else {
1559                                         char ip[32];
1560                                         char mask[32];
1561
1562                                         sprintf(ip, "%s_ipaddr", var);
1563                                         sprintf(mask, "%s_netmask", var);
1564                                         sysprintf("ifconfig %s mtu %s", var,
1565                                                   getMTU(var));
1566                                         sysprintf
1567                                             ("ifconfig %s %s netmask %s up",
1568                                              var, nvram_safe_get(ip),
1569                                              nvram_safe_get(mask));
1570                                         if (!strcmp(apm, "sta")
1571                                             || !strcmp(apm, "wdssta")
1572                                             || !strcmp(apm, "wet"))
1573                                                 sysprintf("ifconfig %s down",
1574                                                           var);
1575                                         else {
1576                                                 sysprintf("ifconfig %s down",
1577                                                           var);
1578                                                 sleep(1);
1579                                                 sysprintf
1580                                                     ("ifconfig %s %s netmask %s up",
1581                                                      var, nvram_safe_get(ip),
1582                                                      nvram_safe_get(mask));
1583                                         }
1584                                 }
1585                         }
1586                 }
1587         }
1588
1589         apm = nvram_default_get(wl, "ap");
1590         if (strcmp(apm, "sta") && strcmp(apm, "wdssta") && strcmp(apm, "wet")) {
1591                 cprintf("set channel\n");
1592                 char *ch = nvram_default_get(channel, "0");
1593
1594                 if (strcmp(ch, "0") == 0) {
1595                         sysprintf("iwconfig %s channel 0", dev);
1596                 } else {
1597                         char freq[64];
1598
1599                         sysprintf("iwconfig %s freq %sM", dev, ch);
1600                         sysprintf("ifconfig %s down", dev);
1601                         sleep(1);
1602                         sysprintf("ifconfig %s up", dev);
1603                 }
1604         }
1605         for (s = 1; s <= 10; s++) {
1606                 char wdsvarname[32] = { 0 };
1607                 char wdsdevname[32] = { 0 };
1608                 char wdsmacname[32] = { 0 };
1609                 char *wdsdev;
1610                 char *hwaddr;
1611
1612                 sprintf(wdsvarname, "%s_wds%d_enable", dev, s);
1613                 sprintf(wdsdevname, "%s_wds%d_if", dev, s);
1614                 sprintf(wdsmacname, "%s_wds%d_hwaddr", dev, s);
1615                 wdsdev = nvram_safe_get(wdsdevname);
1616                 if (strlen(wdsdev) == 0)
1617                         continue;
1618                 if (nvram_match(wdsvarname, "0"))
1619                         continue;
1620                 hwaddr = nvram_get(wdsmacname);
1621                 if (hwaddr != NULL) {
1622                         sysprintf("iwpriv %s wds_add %s", primary, hwaddr);
1623                         set_rate(dev, primary);
1624                 }
1625         }
1626
1627         for (s = 1; s <= 10; s++) {
1628                 char wdsvarname[32] = { 0 };
1629                 char wdsdevname[32] = { 0 };
1630                 char wdsmacname[32] = { 0 };
1631                 char *wdsdev;
1632                 char *hwaddr;
1633
1634                 sprintf(wdsvarname, "%s_wds%d_enable", dev, (11 - s));
1635                 sprintf(wdsdevname, "%s_wds%d_if", dev, (11 - s));
1636                 sprintf(wdsmacname, "%s_wds%d_hwaddr", dev, (11 - s));
1637                 wdsdev = nvram_safe_get(wdsdevname);
1638                 if (strlen(wdsdev) == 0)
1639                         continue;
1640                 if (nvram_match(wdsvarname, "0"))
1641                         continue;
1642                 hwaddr = nvram_get(wdsmacname);
1643                 if (hwaddr != NULL) {
1644                         sysprintf("ifconfig %s 0.0.0.0 up", wdsdev);
1645                 }
1646         }
1647
1648         sysprintf("iwconfig %s txpower %ddBm", dev, newpower);
1649
1650         setMacFilter(dev);
1651 }
1652
1653 void start_vifs(void)
1654 {
1655         char *next;
1656         char var[80];
1657         char *vifs;
1658         char mode[32];
1659         char *m;
1660         char wifivifs[32];
1661         int c = getdevicecount();
1662         int count = 0;
1663
1664         for (count = 0; count < c; count++) {
1665                 sprintf(wifivifs, "ath%d_vifs", count);
1666                 vifs = nvram_safe_get(wifivifs);
1667                 if (vifs != NULL && strlen(vifs) > 0) {
1668                         foreach(var, vifs, next) {
1669                                 setMacFilter(var);
1670
1671                                 sprintf(mode, "%s_mode", var);
1672                                 m = nvram_default_get(mode, "ap");
1673
1674                                 if (strcmp(m, "sta")) {
1675                                         char bridged[32];
1676
1677                                         sprintf(bridged, "%s_bridged", var);
1678                                         if (nvram_default_match
1679                                             (bridged, "1", "1")) {
1680                                                 eval("ifconfig", var, "0.0.0.0",
1681                                                      "up");
1682                                                 br_add_interface(getBridge(var),
1683                                                                  var);
1684                                                 eval("ifconfig", var, "0.0.0.0",
1685                                                      "up");
1686                                         } else {
1687                                                 char ip[32];
1688                                                 char mask[32];
1689
1690                                                 sprintf(ip, "%s_ipaddr", var);
1691                                                 sprintf(mask, "%s_netmask",
1692                                                         var);
1693                                                 eval("ifconfig", var, "mtu",
1694                                                      getMTU(var));
1695                                                 sysprintf
1696                                                     ("ifconfig %s %s netmask %s up",
1697                                                      var, nvram_safe_get(ip),
1698                                                      nvram_safe_get(mask));
1699                                         }
1700                                 }
1701                         }
1702                 }
1703         }
1704
1705 }
1706
1707 void stop_vifs(void)
1708 {
1709         char *next;
1710         char var[80];
1711         char *vifs;
1712         char mode[32];
1713         char *m;
1714         char wifivifs[32];
1715         int c = getdevicecount();
1716         int count = 0;
1717
1718         for (count = 0; count < c; count++) {
1719                 sprintf(wifivifs, "ath%d_vifs", count);
1720                 vifs = nvram_safe_get(wifivifs);
1721                 if (vifs != NULL && strlen(vifs) > 0) {
1722                         foreach(var, vifs, next) {
1723                                 eval("ifconfig", var, "down");
1724
1725                         }
1726                 }
1727         }
1728
1729 }
1730
1731 void start_duallink(void)
1732 {
1733
1734         if (nvram_match("duallink", "master")) {
1735                 sysprintf("ip route flush table 100");
1736                 sysprintf("ip route flush table 200");
1737                 sysprintf("ip route del fwmark 1 table 200");
1738                 sysprintf("iptables -t mangle -F PREROUTING");
1739                 sysprintf("ip route add %s/%s dev ath0 src %s table 100",
1740                           nvram_safe_get("ath0_ipaddr"),
1741                           nvram_safe_get("ath0_netmask"),
1742                           nvram_safe_get("ath0_ipaddr"));
1743                 sysprintf("ip route default via %s table 100",
1744                           nvram_safe_get("ath0_duallink_parent"));
1745                 sysprintf("ip route add %s/%s dev ath0 src %s table 200",
1746                           nvram_safe_get("ath1_ipaddr"),
1747                           nvram_safe_get("ath1_netmask"),
1748                           nvram_safe_get("ath1_ipaddr"));
1749                 sysprintf("ip route default via %s table 200",
1750                           nvram_safe_get("ath1_duallink_parent"));
1751                 sysprintf
1752                     ("iptables -t mangle -A PREROUTING -i br0 -j MARK --set-mark 1");
1753                 sysprintf("ip rule add fwmark 1 table 200");
1754         }
1755         if (nvram_match("duallink", "slave")) {
1756                 sysprintf("ip route flush table 100");
1757                 sysprintf("ip route flush table 200");
1758                 sysprintf("ip route del fwmark 1 table 100");
1759                 sysprintf("iptables -t mangle -F PREROUTING");
1760                 sysprintf("ip route add %s/%s dev ath0 src %s table 100",
1761                           nvram_safe_get("ath0_ipaddr"),
1762                           nvram_safe_get("ath0_netmask"),
1763                           nvram_safe_get("ath0_ipaddr"));
1764                 sysprintf("ip route default via %s table 100",
1765                           nvram_safe_get("ath0_duallink_parent"));
1766                 sysprintf("ip route add %s/%s dev ath0 src %s table 200",
1767                           nvram_safe_get("ath1_ipaddr"),
1768                           nvram_safe_get("ath1_netmask"),
1769                           nvram_safe_get("ath1_ipaddr"));
1770                 sysprintf("ip route default via %s table 200",
1771                           nvram_safe_get("ath1_duallink_parent"));
1772                 sysprintf
1773                     ("iptables -t mangle -A PREROUTING -i br0 -j MARK --set-mark 1");
1774                 sysprintf("ip rule add fwmark 1 table 100");
1775         }
1776
1777 }
1778
1779 extern void adjust_regulatory(int count);
1780
1781 void configure_wifi(void)       // madwifi implementation for atheros based
1782                                 // cards
1783 {
1784         deconfigure_wifi();
1785         /*
1786          * int s; int existed=0; for (s=0;s<10;s++) { char wif[32];
1787          * sprintf(wif,"wifi%d",s); if (ifexists(wif)) {
1788          * eval("ifconfig",wif,"down"); existed=1; } } #if defined(HAVE_FONERA)
1789          * || defined(HAVE_WHRAG108) eval("rmmod","ath_ahb"); insmod("ath_ahb",
1790          * "autocreate=none"); #else eval("rmmod","ath_pci"); insmod("ath_pci",
1791          * "autocreate=none"); #endif for (s=0;s<10;s++) { char wif[32];
1792          * sprintf(wif,"wifi%d",s); if (ifexists(wif)) eval("ifconfig",wif,"up");
1793          * }
1794          */
1795
1796         // bridge the virtual interfaces too
1797         memset(iflist, 0, 1024);
1798         /*
1799          * char countrycode[64]; char xchanmode[64]; char outdoor[64];
1800          *
1801          * if (strlen (nvram_safe_get ("wl_countrycode")) > 0) sprintf
1802          * (countrycode, "countrycode=%s", nvram_safe_get ("wl_countrycode"));
1803          * else sprintf (countrycode, "countrycode=0");
1804          *
1805          * if (strlen (nvram_safe_get ("wl_xchanmode")) > 0) sprintf (xchanmode,
1806          * "xchanmode=%s", nvram_safe_get ("wl_xchanmode")); else sprintf
1807          * (xchanmode, "xchanmode=0");
1808          *
1809          * if (strlen (nvram_safe_get ("wl_outdoor")) > 0) sprintf (outdoor,
1810          * "outdoor=%s", nvram_safe_get ("wl_outdoor")); else sprintf (outdoor,
1811          * "outdoor=0");
1812          */
1813
1814         int c = getdevicecount();
1815         int i;
1816         int changed = 0;
1817
1818         for (i = 0; i < c; i++)
1819                 adjust_regulatory(i);
1820
1821         for (i = 0; i < c; i++) {
1822 #ifdef REGDOMAIN_OVERRIDE
1823                 // SeG's dirty hack to make everything possible without any channel
1824                 // restrictions. regdomain 0x60 seems to be the best way
1825                 char regdomain[16];
1826
1827                 sprintf(regdomain, "ath%d_regdomain", i);
1828
1829                 // read current reg domain from atheros card
1830                 // the base io 0x50010000 is hardcoded here and can be different on
1831                 // non RB500 ports
1832                 // @fixme: detect io by reading pci data
1833
1834                 cprintf("get reg domain()\n");
1835                 int reg_domain = get_regdomain((0x50010000) + (0x10000 * i));
1836
1837                 if (reg_domain > -1)    // reg domain was successfully readed
1838                 {
1839                         if (nvram_get(regdomain) != NULL)       // reg domain is
1840                                 // defined in nvram
1841                         {
1842                                 int destination = atoi(nvram_safe_get(regdomain));      // read
1843
1844                                 // new
1845                                 // target
1846                                 // regdomain
1847                                 if (destination != reg_domain)  // check if changed
1848                                 {
1849                                         if (set_regdomain((0x50010000) + (0x10000 * i), destination) == 0)      // modifiy
1850                                                 // eeprom
1851                                                 // with
1852                                                 // new
1853                                                 // regdomain
1854                                                 changed = 1;
1855                                 }
1856                         }
1857
1858                 }
1859                 cprintf("configure next\n");
1860                 if (!changed)   // if regdomain not changed, configure it
1861 #endif
1862                 {
1863                         configure_single(i);
1864                 }
1865         }
1866
1867         if (changed)            // if changed, deconfigure myself and
1868                 // reconfigure me in the same way.
1869         {
1870                 deconfigure_wifi();
1871                 configure_wifi();
1872         }
1873         if (need_commit) {
1874                 nvram_commit();
1875                 need_commit = 0;
1876         }
1877         eval("killall", "-9", "roaming_daemon");
1878         if (getSTA() || getWET())
1879                 eval("roaming_daemon");
1880
1881         int cnt = getifcount("wifi");
1882         int s;
1883
1884         for (c = 0; c < cnt; c++) {
1885                 char br1enable[32];
1886                 char br1ipaddr[32];
1887                 char br1netmask[32];
1888
1889                 sprintf(br1enable, "ath%d_br1_enable", c);
1890                 sprintf(br1ipaddr, "ath%d_br1_ipaddr", c);
1891                 sprintf(br1netmask, "ath%d_br1_netmask", c);
1892                 if (nvram_get(br1enable) == NULL)
1893                         nvram_set(br1enable, "0");
1894                 if (nvram_get(br1ipaddr) == NULL)
1895                         nvram_set(br1ipaddr, "0.0.0.0");
1896                 if (nvram_get(br1netmask) == NULL)
1897                         nvram_set(br1netmask, "255.255.255.0");
1898                 if (nvram_match(br1enable, "1")) {
1899                         ifconfig("br1", 0, 0, 0);
1900
1901                         // eval ("ifconfig", "br1", "down");
1902                         br_del_bridge("br1");
1903                         br_add_bridge("br1");
1904
1905                         if (nvram_match("lan_stp", "0"))
1906                                 br_set_stp_state("br1", 0);     // eval ("brctl", "stp",
1907                         // "br1", "off");
1908                         else
1909                                 br_set_stp_state("br1", 1);     // eval ("brctl", "stp",
1910                         // "br1", "off");
1911                         br_set_bridge_forward_delay("br1", 1);
1912
1913                         /*
1914                          * Bring up and configure br1 interface
1915                          */
1916                         if (nvram_invmatch(br1ipaddr, "0.0.0.0")) {
1917                                 ifconfig("br1", IFUP, nvram_safe_get(br1ipaddr),
1918                                          nvram_safe_get(br1netmask));
1919
1920                                 if (nvram_match("lan_stp", "0"))
1921                                         br_set_stp_state("br1", 0);     // eval ("brctl",
1922                                 // "stp", "br1",
1923                                 // "off");
1924                                 else
1925                                         br_set_stp_state("br1", 1);     // eval ("brctl",
1926                                 // "stp", "br1",
1927                                 // "off");
1928
1929                         }
1930
1931                 }
1932         }
1933         for (c = 0; c < cnt; c++) {
1934
1935                 for (s = 1; s <= MAX_WDS_DEVS; s++) {
1936                         char wdsvarname[32] = { 0 };
1937                         char wdsdevname[32] = { 0 };
1938                         char *dev;
1939
1940                         char br1enable[32];
1941
1942                         sprintf(wdsvarname, "ath%d_wds%d_enable", c, s);
1943                         sprintf(wdsdevname, "ath%d_wds%d_if", c, s);
1944                         sprintf(br1enable, "ath%d_br1_enable", c);
1945                         if (nvram_get(wdsvarname) == NULL)
1946                                 nvram_set(wdsvarname, "0");
1947                         dev = nvram_safe_get(wdsdevname);
1948                         if (strlen(dev) == 0)
1949                                 continue;
1950                         ifconfig(dev, 0, 0, 0);
1951
1952                         // eval ("ifconfig", dev, "down");
1953                         if (nvram_match(wdsvarname, "1")) {
1954                                 char *wdsip;
1955                                 char *wdsnm;
1956                                 char wdsbc[32] = { 0 };
1957                                 wdsip = nvram_nget("ath%d_wds%d_ipaddr", c, s);
1958                                 wdsnm = nvram_nget("ath%d_wds%d_netmask", c, s);
1959
1960                                 snprintf(wdsbc, 31, "%s", wdsip);
1961                                 get_broadcast(wdsbc, wdsnm);
1962                                 eval("ifconfig", dev, wdsip, "broadcast",
1963                                      wdsbc, "netmask", wdsnm, "up");
1964                         } else if (nvram_match(wdsvarname, "2")
1965                                    && nvram_match(br1enable, "1")) {
1966                                 eval("ifconfig", dev, "up");
1967                                 sleep(1);
1968                                 br_add_interface("br1", dev);
1969                         } else if (nvram_match(wdsvarname, "3")) {
1970                                 ifconfig(dev, IFUP, 0, 0);
1971                                 sleep(1);
1972                                 br_add_interface(getBridge(dev), dev);
1973                         }
1974                 }
1975         }
1976         if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
1977                 return;
1978         struct ifreq ifr;
1979
1980 #ifdef HAVE_RB500
1981         strncpy(ifr.ifr_name, "ath0", IFNAMSIZ);
1982         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
1983                 char eabuf[32];
1984
1985                 nvram_set("wl0_hwaddr",
1986                           ether_etoa(ifr.ifr_hwaddr.sa_data, eabuf));
1987         }
1988 #endif
1989 #ifdef HAVE_X86
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_XSCALE
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_MAGICBOX
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_FONERA
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_LS2
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_LS5
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_WHRAG108
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_PB42
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_LSX
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_DANUBE
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_STORM
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_ADM5120
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_TW6600
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_CA8
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         close(s);
2116         reset_hwaddr(nvram_safe_get("lan_ifname"));
2117 }
2118
2119 void start_deconfigurewifi(void)
2120 {
2121         deconfigure_wifi();
2122 }
2123
2124 void start_configurewifi(void)
2125 {
2126         configure_wifi();
2127 }
2128 #endif
Note: See TracBrowser for help on using the browser.