MLD: Add support for disabled APs
An affiliated AP of an AP MLD can temporarily be disabled. Other affiliated APs of the AP MLD indicate this in the Reduced Neighbor Report (RNR) elements added to their Beacon and Probe Response frames. When an affiliated AP is disabled, it should be included in the association exchange, but can be activated only after it is enabled. Add support identifying disabled APs and propagate the information to the driver within the associate() callback. Signed-off-by: Ilan Peer <ilan.peer@intel.com> Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
This commit is contained in:
parent
981e8c1e49
commit
5927455b8b
6 changed files with 22 additions and 1 deletions
|
@ -2522,6 +2522,15 @@ struct ieee80211_he_mu_edca_parameter_set {
|
||||||
#define RNR_BSS_PARAM_CO_LOCATED BIT(6)
|
#define RNR_BSS_PARAM_CO_LOCATED BIT(6)
|
||||||
#define RNR_20_MHZ_PSD_MAX_TXPOWER 255 /* dBm */
|
#define RNR_20_MHZ_PSD_MAX_TXPOWER 255 /* dBm */
|
||||||
|
|
||||||
|
/* IEEE P802.11be/D5.0, Figure 9-704c - MLD Parameters subfield format */
|
||||||
|
/* B0..B7: AP MLD ID */
|
||||||
|
/* B8..B11: Link ID */
|
||||||
|
/* B12..B19: BSS Parameters Change Count */
|
||||||
|
/* B20: All Updates Included */
|
||||||
|
#define RNR_TBTT_INFO_MLD_PARAM2_ALL_UPDATE_INC 0x10
|
||||||
|
/* B21: Disabled Link Indication */
|
||||||
|
#define RNR_TBTT_INFO_MLD_PARAM2_LINK_DISABLED 0x20
|
||||||
|
|
||||||
/* IEEE P802.11be/D2.3, 9.4.2.311 - EHT Operation element */
|
/* IEEE P802.11be/D2.3, 9.4.2.311 - EHT Operation element */
|
||||||
|
|
||||||
/* Figure 9-1002b: EHT Operation Parameters field subfields */
|
/* Figure 9-1002b: EHT Operation Parameters field subfields */
|
||||||
|
|
|
@ -950,6 +950,7 @@ struct wpa_driver_mld_params {
|
||||||
const u8 *ies;
|
const u8 *ies;
|
||||||
size_t ies_len;
|
size_t ies_len;
|
||||||
int error;
|
int error;
|
||||||
|
bool disabled;
|
||||||
} mld_links[MAX_NUM_MLD_LINKS];
|
} mld_links[MAX_NUM_MLD_LINKS];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1553,6 +1553,8 @@ wpa_bss_parse_ml_rnr_ap_info(struct wpa_supplicant *wpa_s,
|
||||||
os_memcpy(l->bssid, ap_info->data + 1,
|
os_memcpy(l->bssid, ap_info->data + 1,
|
||||||
ETH_ALEN);
|
ETH_ALEN);
|
||||||
l->freq = neigh_bss->freq;
|
l->freq = neigh_bss->freq;
|
||||||
|
l->disabled = mld_params[2] &
|
||||||
|
RNR_TBTT_INFO_MLD_PARAM2_LINK_DISABLED;
|
||||||
bss->n_mld_links++;
|
bss->n_mld_links++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,6 +133,9 @@ struct wpa_bss {
|
||||||
u8 link_id;
|
u8 link_id;
|
||||||
u8 bssid[ETH_ALEN];
|
u8 bssid[ETH_ALEN];
|
||||||
int freq;
|
int freq;
|
||||||
|
|
||||||
|
/* Whether the link is valid but currently disabled */
|
||||||
|
bool disabled;
|
||||||
} mld_links[MAX_NUM_MLD_LINKS];
|
} mld_links[MAX_NUM_MLD_LINKS];
|
||||||
|
|
||||||
/* followed by ie_len octets of IEs */
|
/* followed by ie_len octets of IEs */
|
||||||
|
|
|
@ -536,6 +536,7 @@ static void wpas_sme_set_mlo_links(struct wpa_supplicant *wpa_s,
|
||||||
os_memcpy(wpa_s->links[link_id].bssid, bssid, ETH_ALEN);
|
os_memcpy(wpa_s->links[link_id].bssid, bssid, ETH_ALEN);
|
||||||
wpa_s->links[link_id].freq = bss->mld_links[i].freq;
|
wpa_s->links[link_id].freq = bss->mld_links[i].freq;
|
||||||
wpa_s->links[link_id].bss = wpa_bss_get_bssid(wpa_s, bssid);
|
wpa_s->links[link_id].bss = wpa_bss_get_bssid(wpa_s, bssid);
|
||||||
|
wpa_s->links[link_id].disabled = bss->mld_links[i].disabled;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2591,9 +2592,13 @@ mscs_fail:
|
||||||
wpa_s->links[i].bssid;
|
wpa_s->links[i].bssid;
|
||||||
params.mld_params.mld_links[i].freq =
|
params.mld_params.mld_links[i].freq =
|
||||||
wpa_s->links[i].freq;
|
wpa_s->links[i].freq;
|
||||||
|
params.mld_params.mld_links[i].disabled =
|
||||||
|
wpa_s->links[i].disabled;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "MLD: id=%u, freq=%d, " MACSTR,
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"MLD: id=%u, freq=%d, disabled=%u, " MACSTR,
|
||||||
i, wpa_s->links[i].freq,
|
i, wpa_s->links[i].freq,
|
||||||
|
wpa_s->links[i].disabled,
|
||||||
MAC2STR(wpa_s->links[i].bssid));
|
MAC2STR(wpa_s->links[i].bssid));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -735,6 +735,7 @@ struct wpa_supplicant {
|
||||||
u8 bssid[ETH_ALEN];
|
u8 bssid[ETH_ALEN];
|
||||||
unsigned int freq;
|
unsigned int freq;
|
||||||
struct wpa_bss *bss;
|
struct wpa_bss *bss;
|
||||||
|
bool disabled;
|
||||||
} links[MAX_NUM_MLD_LINKS];
|
} links[MAX_NUM_MLD_LINKS];
|
||||||
u8 *last_con_fail_realm;
|
u8 *last_con_fail_realm;
|
||||||
size_t last_con_fail_realm_len;
|
size_t last_con_fail_realm_len;
|
||||||
|
|
Loading…
Reference in a new issue