aboutsummaryrefslogtreecommitdiffstats
path: root/package/network/utils/iwinfo
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2013-06-09 14:39:09 +0000
committerJo-Philipp Wich <jow@openwrt.org>2013-06-09 14:39:09 +0000
commit113981176cef2a561b486af4f23affb5b9d88c00 (patch)
treeabe9c892feb4831e876275e63b2ae25cd5c868df /package/network/utils/iwinfo
parentf70a350203959a36c78f214fd125ef08a9c0333b (diff)
downloadmaster-187ad058-113981176cef2a561b486af4f23affb5b9d88c00.tar.gz
master-187ad058-113981176cef2a561b486af4f23affb5b9d88c00.tar.bz2
master-187ad058-113981176cef2a561b486af4f23affb5b9d88c00.zip
libiwinfo: ignore log messages from wpa_supplicant while scanning
wpa_supplicant may send log and event messages intermixed with the expected scan results. This makes "iwinfo wlan0 scan" and LuCI "site survey" display nothing when many AP's are around. Eliminate the CTRL-EVENT-BSS-ADDED events, interspersed log messages, lines with unexpected format. Increase timeout to handle the max number of channels (2.4, 3.6, 4.9, 5 GHz). Insure receive buffer is null-terminated. Signed-off-by: Jean-Pierre Tosoni <jp.tosoni@acksys.fr> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36888 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/network/utils/iwinfo')
-rw-r--r--package/network/utils/iwinfo/src/iwinfo_nl80211.c63
1 files changed, 47 insertions, 16 deletions
diff --git a/package/network/utils/iwinfo/src/iwinfo_nl80211.c b/package/network/utils/iwinfo/src/iwinfo_nl80211.c
index 700410939d..051d34dd1c 100644
--- a/package/network/utils/iwinfo/src/iwinfo_nl80211.c
+++ b/package/network/utils/iwinfo/src/iwinfo_nl80211.c
@@ -540,16 +540,21 @@ static char * nl80211_wpactl_info(const char *ifname, const char *cmd,
{
send(sock, "ATTACH", 6, 0);
- if (nl80211_wpactl_recv(sock, buffer, sizeof(buffer)) <= 0)
+ if (nl80211_wpactl_recv(sock, buffer, sizeof(buffer)-1) <= 0)
goto out;
}
send(sock, cmd, strlen(cmd), 0);
- while( numtry++ < 5 )
+ /* we might have to scan up to 72 channels / 256ms per channel */
+ /* this makes up to 18.5s hence 10 tries */
+ while( numtry++ < 10 )
{
- if (nl80211_wpactl_recv(sock, buffer, sizeof(buffer)) <= 0)
+ char *bracket;
+
+ /* make sure there is a terminating nul byte */
+ if (nl80211_wpactl_recv(sock, buffer, sizeof(buffer)-1) <= 0)
{
if (event)
continue;
@@ -559,6 +564,13 @@ static char * nl80211_wpactl_info(const char *ifname, const char *cmd,
if ((!event && buffer[0] != '<') || (event && strstr(buffer, event)))
break;
+
+ /* there may be more than max(numtry) BSS-ADDED events */
+ /* ignore them similar to wpa_cli */
+ if (buffer[0] == '<' &&
+ (bracket=strchr(buffer,'>')) != NULL &&
+ strncmp(bracket+1,"CTRL-EVENT-BSS-ADDED",20) == 0)
+ numtry--;
}
rv = buffer;
@@ -1751,8 +1763,10 @@ static int nl80211_get_scanlist_cb(struct nl_msg *msg, void *arg)
if (caps & (1<<1))
sl->e->mode = IWINFO_OPMODE_ADHOC;
- else
+ else if (caps & (1<<0))
sl->e->mode = IWINFO_OPMODE_MASTER;
+ else
+ sl->e->mode = IWINFO_OPMODE_MESHPOINT;
if (caps & (1<<4))
sl->e->crypto.enabled = 1;
@@ -1852,14 +1866,26 @@ int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
{
nl80211_get_quality_max(ifname, &qmax);
- /* skip header line */
- while (*res++ != '\n');
-
- count = 0;
+ count = -1;
- while (sscanf(res, "%17s %d %d %255s%*[ \t]%127[^\n]\n",
- bssid, &freq, &rssi, cipher, ssid) > 0)
- {
+ do {
+ if (res[0] == '<')
+ {
+ /* skip log lines */
+ goto nextline;
+ }
+ if (count < 0)
+ {
+ /* skip header line */
+ count++;
+ goto nextline;
+ }
+ if (sscanf(res, "%17s %d %d %255s%*[ \t]%127[^\n]\n",
+ bssid, &freq, &rssi, cipher, ssid) < 5)
+ {
+ /* skip malformed lines */
+ goto nextline;
+ }
/* BSSID */
e->mac[0] = strtol(&bssid[0], NULL, 16);
e->mac[1] = strtol(&bssid[3], NULL, 16);
@@ -1872,7 +1898,10 @@ int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
memcpy(e->ssid, ssid, min(strlen(ssid), sizeof(e->ssid) - 1));
/* Mode (assume master) */
- e->mode = IWINFO_OPMODE_MASTER;
+ if (strstr(cipher,"[MESH]"))
+ e->mode = IWINFO_OPMODE_MESHPOINT;
+ else
+ e->mode = IWINFO_OPMODE_MASTER;
/* Channel */
e->channel = nl80211_freq2channel(freq);
@@ -1904,16 +1933,18 @@ int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
/* Crypto */
nl80211_get_scancrypto(cipher, &e->crypto);
- /* advance to next line */
- while (*res && *res++ != '\n');
-
count++;
e++;
memset(ssid, 0, sizeof(ssid));
memset(bssid, 0, sizeof(bssid));
memset(cipher, 0, sizeof(cipher));
- }
+
+ nextline:
+ /* advance to next line */
+ while( *res && *res++ != '\n' );
+ }
+ while( *res );
*len = count * sizeof(struct iwinfo_scanlist_entry);
return 0;