@@ -1207,6 +1207,12 @@ static int cand_pref_compar(const void *a, const void *b)
const struct neighbor_report *aa = a;
const struct neighbor_report *bb = b;
+ if (aa->disassoc_imminent && bb->disassoc_imminent)
+ return 0;
+ if (aa->disassoc_imminent)
+ return 1;
+ if (bb->disassoc_imminent)
+ return -1;
if (!aa->preference_present && !bb->preference_present)
return 0;
if (!aa->preference_present)
@@ -1485,8 +1491,6 @@ static void ieee802_11_rx_bss_trans_mgmt_req(struct wpa_supplicant *wpa_s,
wpa_msg(wpa_s, MSG_INFO, "WNM: Disassociation Imminent - "
"Disassociation Timer %u", wpa_s->wnm_dissoc_timer);
if (wpa_s->wnm_dissoc_timer && !wpa_s->scanning) {
- /* TODO: mark current BSS less preferred for
- * selection */
wpa_printf(MSG_DEBUG, "Trying to find another BSS");
wpa_supplicant_req_scan(wpa_s, 0, 0);
}
@@ -1526,6 +1530,10 @@ static void ieee802_11_rx_bss_trans_mgmt_req(struct wpa_supplicant *wpa_s,
rep = &wpa_s->wnm_neighbor_report_elements[
wpa_s->wnm_num_neighbor_report];
wnm_parse_neighbor_report(wpa_s, pos, len, rep);
+ if (wpa_s->wnm_mode & WNM_BSS_TM_REQ_DISASSOC_IMMINENT
+ && os_memcmp(rep->bssid, wpa_s->bssid, ETH_ALEN) == 0)
+ rep->disassoc_imminent = 1;
+
wpa_s->wnm_num_neighbor_report++;
#ifdef CONFIG_MBO
if (wpa_s->wnm_mbo_trans_reason_present &&
@@ -37,6 +37,7 @@ struct neighbor_report {
u32 distance; /* valid if bearing_present=1 */
u64 bss_term_tsf; /* valid if bss_term_present=1 */
u16 bss_term_dur; /* valid if bss_term_present=1 */
+ u8 disassoc_imminent;
unsigned int preference_present:1;
unsigned int tsf_present:1;
unsigned int country_present:1;