diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2005-12-13 17:09:15 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2005-12-13 17:09:15 +0000 |
commit | 29493a01b04e660b70b0c3782c0c481582825d5e (patch) | |
tree | 17dff6d1349322ceb79db5dbc4a5a87615db8b5f /package/wificonf/wificonf.c | |
parent | 4593c1cd676c6f062a42aeff61c0625651829bb4 (diff) |
improve wificonf watchdog for client mode (should be somewhat reliable now)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk/openwrt@2654 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/wificonf/wificonf.c')
-rw-r--r-- | package/wificonf/wificonf.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/package/wificonf/wificonf.c b/package/wificonf/wificonf.c index a93bba3eda..60ffd900aa 100644 --- a/package/wificonf/wificonf.c +++ b/package/wificonf/wificonf.c @@ -395,7 +395,7 @@ 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; if (fork()) return; @@ -415,11 +415,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++) { |