nl80211: Prefer newer scan result over older during duplicate removal
Previously, it was possible for bss_info_handler() to end up dropping a newer scan result entry if there were two entries with the same BSSID and SSID (i.e., only frequency was different) and we were not associated with either. This could happen, e.g., in some P2P use cases where device discovery may happen on different channels. Fix this by checking the age of the scan entries as well to prefer the most recent response. Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
9489637b42
commit
4ea6a47133
1 changed files with 5 additions and 3 deletions
|
@ -4996,7 +4996,8 @@ static int bss_info_handler(struct nl_msg *msg, void *arg)
|
||||||
* BSSID,SSID pair is seen on multiple channels. wpa_supplicant does
|
* BSSID,SSID pair is seen on multiple channels. wpa_supplicant does
|
||||||
* not use frequency as a separate key in the BSS table, so filter out
|
* not use frequency as a separate key in the BSS table, so filter out
|
||||||
* duplicated entries. Prefer associated BSS entry in such a case in
|
* duplicated entries. Prefer associated BSS entry in such a case in
|
||||||
* order to get the correct frequency into the BSS table.
|
* order to get the correct frequency into the BSS table. Similarly,
|
||||||
|
* prefer newer entries over older.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < res->num; i++) {
|
for (i = 0; i < res->num; i++) {
|
||||||
const u8 *s1, *s2;
|
const u8 *s1, *s2;
|
||||||
|
@ -5014,8 +5015,9 @@ static int bss_info_handler(struct nl_msg *msg, void *arg)
|
||||||
wpa_printf(MSG_DEBUG, "nl80211: Remove duplicated scan result "
|
wpa_printf(MSG_DEBUG, "nl80211: Remove duplicated scan result "
|
||||||
"for " MACSTR, MAC2STR(r->bssid));
|
"for " MACSTR, MAC2STR(r->bssid));
|
||||||
|
|
||||||
if ((r->flags & WPA_SCAN_ASSOCIATED) &&
|
if (((r->flags & WPA_SCAN_ASSOCIATED) &&
|
||||||
!(res->res[i]->flags & WPA_SCAN_ASSOCIATED)) {
|
!(res->res[i]->flags & WPA_SCAN_ASSOCIATED)) ||
|
||||||
|
r->age < res->res[i]->age) {
|
||||||
os_free(res->res[i]);
|
os_free(res->res[i]);
|
||||||
res->res[i] = r;
|
res->res[i] = r;
|
||||||
} else
|
} else
|
||||||
|
|
Loading…
Reference in a new issue