MLD STA: Fetch MLO association Link ID info to core wpa_supplicant

Fetch the MLO association Link ID info from the driver to the
wpa_supplicant instance of the corresponding MLD STA interface. This
info is needed when setting the MLO connection info to wpa_sm.

Signed-off-by: Veerendranath Jakkam <quic_vjakkam@quicinc.com>
This commit is contained in:
Veerendranath Jakkam 2022-10-19 19:43:50 +05:30 committed by Jouni Malinen
parent ee46b7d6d3
commit 73f540b6a7
6 changed files with 18 additions and 12 deletions

View file

@ -2742,6 +2742,7 @@ struct weighted_pcl {
struct driver_sta_mlo_info { struct driver_sta_mlo_info {
u16 valid_links; /* bitmap of valid link IDs */ u16 valid_links; /* bitmap of valid link IDs */
u8 assoc_link_id;
u8 ap_mld_addr[ETH_ALEN]; u8 ap_mld_addr[ETH_ALEN];
struct { struct {
u8 addr[ETH_ALEN]; u8 addr[ETH_ALEN];

View file

@ -1502,7 +1502,7 @@ static int nl80211_get_assoc_freq_handler(struct nl_msg *msg, void *arg)
} }
if (!drv->sta_mlo_info.valid_links || if (!drv->sta_mlo_info.valid_links ||
drv->mlo_assoc_link_id == link_id) { drv->sta_mlo_info.assoc_link_id == link_id) {
ctx->assoc_freq = freq; ctx->assoc_freq = freq;
wpa_printf(MSG_DEBUG, "nl80211: Associated on %u MHz", wpa_printf(MSG_DEBUG, "nl80211: Associated on %u MHz",
ctx->assoc_freq); ctx->assoc_freq);
@ -1530,7 +1530,7 @@ static int nl80211_get_assoc_freq_handler(struct nl_msg *msg, void *arg)
} }
if (!drv->sta_mlo_info.valid_links || if (!drv->sta_mlo_info.valid_links ||
drv->mlo_assoc_link_id == link_id) { drv->sta_mlo_info.assoc_link_id == link_id) {
os_memcpy(ctx->assoc_bssid, bssid, ETH_ALEN); os_memcpy(ctx->assoc_bssid, bssid, ETH_ALEN);
wpa_printf(MSG_DEBUG, "nl80211: Associated with " wpa_printf(MSG_DEBUG, "nl80211: Associated with "
MACSTR, MAC2STR(bssid)); MACSTR, MAC2STR(bssid));

View file

@ -128,7 +128,6 @@ struct wpa_driver_nl80211_data {
u8 bssid[ETH_ALEN]; u8 bssid[ETH_ALEN];
u8 prev_bssid[ETH_ALEN]; u8 prev_bssid[ETH_ALEN];
int associated; int associated;
int mlo_assoc_link_id;
struct driver_sta_mlo_info sta_mlo_info; struct driver_sta_mlo_info sta_mlo_info;
u8 ssid[SSID_MAX_LEN]; u8 ssid[SSID_MAX_LEN];
size_t ssid_len; size_t ssid_len;

View file

@ -524,6 +524,7 @@ static void nl80211_parse_mlo_info(struct wpa_driver_nl80211_data *drv,
{ {
const u8 *ml_ie; const u8 *ml_ie;
struct driver_sta_mlo_info *mlo = &drv->sta_mlo_info; struct driver_sta_mlo_info *mlo = &drv->sta_mlo_info;
int res;
if (!addr || !mlo_links || !resp_ie) if (!addr || !mlo_links || !resp_ie)
return; return;
@ -533,11 +534,14 @@ static void nl80211_parse_mlo_info(struct wpa_driver_nl80211_data *drv,
if (!ml_ie) if (!ml_ie)
return; return;
drv->mlo_assoc_link_id = nl80211_get_assoc_link_id(&ml_ie[3], res = nl80211_get_assoc_link_id(&ml_ie[3], ml_ie[1] - 1);
ml_ie[1] - 1); if (res < 0 || res >= MAX_NUM_MLD_LINKS) {
if (drv->mlo_assoc_link_id < 0 || wpa_printf(MSG_DEBUG,
drv->mlo_assoc_link_id >= MAX_NUM_MLD_LINKS) "nl80211: Could not find a valid association Link ID (res=%d)",
res);
return; return;
}
drv->sta_mlo_info.assoc_link_id = res;
os_memcpy(mlo->ap_mld_addr, nla_data(addr), ETH_ALEN); os_memcpy(mlo->ap_mld_addr, nla_data(addr), ETH_ALEN);
wpa_printf(MSG_DEBUG, "nl80211: AP MLD MAC Address " MACSTR, wpa_printf(MSG_DEBUG, "nl80211: AP MLD MAC Address " MACSTR,
@ -550,14 +554,14 @@ static void nl80211_parse_mlo_info(struct wpa_driver_nl80211_data *drv,
nl80211_parse_qca_vendor_mlo_link_info(mlo, mlo_links); nl80211_parse_qca_vendor_mlo_link_info(mlo, mlo_links);
#endif /* CONFIG_DRIVER_NL80211_QCA */ #endif /* CONFIG_DRIVER_NL80211_QCA */
if (!(mlo->valid_links & BIT(drv->mlo_assoc_link_id))) { if (!(mlo->valid_links & BIT(drv->sta_mlo_info.assoc_link_id))) {
wpa_printf(MSG_ERROR, "nl80211: Invalid MLO assoc link ID %d", wpa_printf(MSG_ERROR, "nl80211: Invalid MLO assoc link ID %d",
drv->mlo_assoc_link_id); drv->sta_mlo_info.assoc_link_id);
mlo->valid_links = 0; mlo->valid_links = 0;
return; return;
} }
os_memcpy(drv->bssid, mlo->links[drv->mlo_assoc_link_id].bssid, os_memcpy(drv->bssid, mlo->links[drv->sta_mlo_info.assoc_link_id].bssid,
ETH_ALEN); ETH_ALEN);
os_memcpy(drv->prev_bssid, drv->bssid, ETH_ALEN); os_memcpy(drv->prev_bssid, drv->bssid, ETH_ALEN);
} }
@ -922,7 +926,7 @@ static void mlme_event_ch_switch(struct wpa_driver_nl80211_data *drv,
EVENT_LINK_CH_SWITCH_STARTED, &data); EVENT_LINK_CH_SWITCH_STARTED, &data);
} }
if (link_id != drv->mlo_assoc_link_id) if (link_id != drv->sta_mlo_info.assoc_link_id)
return; return;
} }

View file

@ -3387,13 +3387,14 @@ static int wpa_drv_get_mlo_info(struct wpa_supplicant *wpa_s)
} }
} }
if (match && if (match && wpa_s->mlo_assoc_link_id == mlo.assoc_link_id &&
os_memcmp(wpa_s->ap_mld_addr, mlo.ap_mld_addr, os_memcmp(wpa_s->ap_mld_addr, mlo.ap_mld_addr,
ETH_ALEN) == 0) ETH_ALEN) == 0)
return 0; return 0;
} }
wpa_s->valid_links = mlo.valid_links; wpa_s->valid_links = mlo.valid_links;
wpa_s->mlo_assoc_link_id = mlo.assoc_link_id;
os_memcpy(wpa_s->ap_mld_addr, mlo.ap_mld_addr, ETH_ALEN); os_memcpy(wpa_s->ap_mld_addr, mlo.ap_mld_addr, ETH_ALEN);
for (i = 0; i < MAX_NUM_MLD_LINKS; i++) { for (i = 0; i < MAX_NUM_MLD_LINKS; i++) {
if (!(wpa_s->valid_links & BIT(i))) if (!(wpa_s->valid_links & BIT(i)))

View file

@ -740,6 +740,7 @@ struct wpa_supplicant {
int ap_ies_from_associnfo; int ap_ies_from_associnfo;
unsigned int assoc_freq; unsigned int assoc_freq;
u8 ap_mld_addr[ETH_ALEN]; u8 ap_mld_addr[ETH_ALEN];
u8 mlo_assoc_link_id;
u8 valid_links; /* bitmap of valid MLO link IDs */ u8 valid_links; /* bitmap of valid MLO link IDs */
struct { struct {
u8 addr[ETH_ALEN]; u8 addr[ETH_ALEN];