sync with kmod-madwifi
[openwrt.git] / package / wificonf / wificonf.c
index a93bba3..1ac0ca8 100644 (file)
@@ -395,7 +395,8 @@ void start_watchdog(int skfd, char *ifname)
        FILE *f;
        char *v, *next;
        unsigned char buf[8192], buf2[8192], wbuf[80], *p, *tmp;
-       int wds = 0, i, restart_wds;
+       int wds = 0, i, j, restart_wds;
+       wlc_ssid_t ssid;
 
        if (fork())
                return;
@@ -415,11 +416,41 @@ void start_watchdog(int skfd, char *ifname)
                }
        }
        v = nvram_safe_get(wl_var("ssid"));
+       ssid.SSID_len = strlen(v);
+       strncpy(ssid.SSID, v, 32);
        
        for (;;) {
                sleep(5);
-               if (bcom_ioctl(skfd, ifname, WLC_GET_BSSID, buf, 6) < 0)
-                       bcom_ioctl(skfd, ifname, WLC_SET_SSID, v, strlen(v));
+
+               /* client mode */
+               bcom_ioctl(skfd, ifname, WLC_GET_AP, &i, sizeof(i));
+               if (!i) {
+                       i = 0;
+                       if (bcom_ioctl(skfd, ifname, WLC_GET_BSSID, buf, 6) < 0) 
+                               i = 1;
+                       memcpy(buf + 6, "\x00\x00\x00\x00\x00\x00", 6);
+                       if (memcmp(buf, buf + 6, 6) == 0)
+                               i = 1;
+                       
+                       memset(buf, 0, 8192);
+                       strcpy(buf, "sta_info");
+                       bcom_ioctl(skfd, ifname, WLC_GET_BSSID, buf + strlen(buf) + 1, 6);
+                       if (bcom_ioctl(skfd, ifname, WLC_GET_VAR, buf, 8192) < 0) {
+                               i = 1;
+                       } else {
+                               sta_info_t *sta = (sta_info_t *) (buf + 4);
+                               if ((sta->flags & 0x18) != 0x18) 
+                                       i = 1;
+                               if (sta->idle > 20)
+                                       i = 1;
+                       }
+                       
+                       if (i) 
+                               bcom_ioctl(skfd, ifname, WLC_SET_SSID, &ssid, sizeof(ssid));
+               }
+
+               
+               /* wds */
                p = buf2;
                restart_wds = 0;
                for (i = 0; i < wds; i++) {
@@ -520,7 +551,7 @@ static void setup_bcom_vif_sec(int skfd, char *ifname, int vif)
                                wep = 1;
                                bcom_set_bss_int(skfd, ifname, vif, "wsec", WEP_ENABLED);
                                bcom_set_bss_int(skfd, ifname, vif, "wsec_restrict", 1);
-                               bcom_set_bss_int(skfd, ifname, vif, "auth", 1);
+                               bcom_set_bss_int(skfd, ifname, vif, "auth", nvram_enabled(vif_var(vif, "auth")));
                        } else {
                                wep = 0;
                        }
@@ -837,8 +868,14 @@ static void setup_bcom_old(int skfd, char *ifname)
                bcom_ioctl(skfd, ifname, WLC_SET_EAP_RESTRICT, &val, sizeof(val));
                bcom_set_int(skfd, ifname, "sup_wpa", 0);
        }
+
+       if (v = nvram_get(wl_var("auth"))) {
+               val = atoi(v);
+               bcom_ioctl(skfd, ifname, WLC_SET_AUTH, &val, sizeof(val));
+       }
 }
 
+
 static void set_wext_ssid(int skfd, char *ifname)
 {
        char *buffer;
This page took 0.02538 seconds and 4 git commands to generate.