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
{
send(sock, "ATTACH", 6, 0);
{
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);
goto out;
}
send(sock, cmd, strlen(cmd), 0);
+ /* 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 && buffer[0] != '<') || (event && strstr(buffer, event)))
break;
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--;
if (caps & (1<<1))
sl->e->mode = IWINFO_OPMODE_ADHOC;
if (caps & (1<<1))
sl->e->mode = IWINFO_OPMODE_ADHOC;
+ else if (caps & (1<<0))
sl->e->mode = IWINFO_OPMODE_MASTER;
sl->e->mode = IWINFO_OPMODE_MASTER;
+ else
+ sl->e->mode = IWINFO_OPMODE_MESHPOINT;
if (caps & (1<<4))
sl->e->crypto.enabled = 1;
if (caps & (1<<4))
sl->e->crypto.enabled = 1;
{
nl80211_get_quality_max(ifname, &qmax);
{
nl80211_get_quality_max(ifname, &qmax);
- /* skip header line */
- while (*res++ != '\n');
-
- count = 0;
- 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);
/* BSSID */
e->mac[0] = strtol(&bssid[0], NULL, 16);
e->mac[1] = strtol(&bssid[3], NULL, 16);
memcpy(e->ssid, ssid, min(strlen(ssid), sizeof(e->ssid) - 1));
/* Mode (assume master) */
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);
/* Channel */
e->channel = nl80211_freq2channel(freq);
/* Crypto */
nl80211_get_scancrypto(cipher, &e->crypto);
/* 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));
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;
*len = count * sizeof(struct iwinfo_scanlist_entry);
return 0;