[PATCH v2 04/17] MLD STA: Fetch MLO assoc link ID info to core wpa_supplicant

Veerendranath Jakkam quic_vjakkam at quicinc.com
Sat Oct 1 01:21:16 PDT 2022


Add support to fetch MLO association link ID info from driver to
wpa_supplicant instance of corresponding MLD STA interface. This info
needed when setting the MLO connection info to wpa_sm.

Signed-off-by: Veerendranath Jakkam <quic_vjakkam at quicinc.com>
---
 src/drivers/driver.h               |  1 +
 src/drivers/driver_nl80211.c       |  4 ++--
 src/drivers/driver_nl80211.h       |  1 -
 src/drivers/driver_nl80211_event.c | 16 ++++++++--------
 wpa_supplicant/events.c            |  3 ++-
 wpa_supplicant/wpa_supplicant_i.h  |  1 +
 6 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 36ecf72..93bdca2 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -2737,6 +2737,7 @@ struct weighted_pcl {
 
 struct driver_sta_mlo_info {
 	u16 valid_links; /* bitmap of valid link IDs */
+	u8 assoc_link_id;
 	u8 ap_mld_addr[ETH_ALEN];
 	struct {
 		u8 addr[ETH_ALEN];
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 5316991..ad4a742 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -1501,7 +1501,7 @@ static int nl80211_get_assoc_freq_handler(struct nl_msg *msg, void *arg)
 		}
 
 		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;
 			wpa_printf(MSG_DEBUG, "nl80211: Associated on %u MHz",
 				   ctx->assoc_freq);
@@ -1529,7 +1529,7 @@ static int nl80211_get_assoc_freq_handler(struct nl_msg *msg, void *arg)
 		}
 
 		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);
 			wpa_printf(MSG_DEBUG, "nl80211: Associated with "
 				   MACSTR, MAC2STR(bssid));
diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h
index 3eb2a74..0b8b0ce 100644
--- a/src/drivers/driver_nl80211.h
+++ b/src/drivers/driver_nl80211.h
@@ -128,7 +128,6 @@ struct wpa_driver_nl80211_data {
 	u8 bssid[ETH_ALEN];
 	u8 prev_bssid[ETH_ALEN];
 	int associated;
-	int mlo_assoc_link_id;
 	struct driver_sta_mlo_info sta_mlo_info;
 	u8 ssid[SSID_MAX_LEN];
 	size_t ssid_len;
diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c
index 996a892..151aadd 100644
--- a/src/drivers/driver_nl80211_event.c
+++ b/src/drivers/driver_nl80211_event.c
@@ -528,10 +528,10 @@ static void nl80211_parse_mlo_info(struct wpa_driver_nl80211_data *drv,
 	if (!ml_ie)
 		return;
 
-	drv->mlo_assoc_link_id = nl80211_get_assoc_link_id(&ml_ie[3],
-							   ml_ie[1] - 1);
-	if (drv->mlo_assoc_link_id < 0 ||
-	    drv->mlo_assoc_link_id >= MAX_NUM_MLD_LINKS)
+	drv->sta_mlo_info.assoc_link_id = nl80211_get_assoc_link_id(
+						&ml_ie[3], ml_ie[1] - 1);
+	if (drv->sta_mlo_info.assoc_link_id < 0 ||
+	    drv->sta_mlo_info.assoc_link_id >= MAX_NUM_MLD_LINKS)
 		return;
 
 	os_memcpy(mlo->ap_mld_addr, nla_data(addr), ETH_ALEN);
@@ -545,14 +545,14 @@ static void nl80211_parse_mlo_info(struct wpa_driver_nl80211_data *drv,
 		nl80211_parse_qca_vendor_mlo_link_info(mlo, mlo_links);
 #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",
-			   drv->mlo_assoc_link_id);
+			   drv->sta_mlo_info.assoc_link_id);
 		mlo->valid_links = 0;
 		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);
 	os_memcpy(drv->prev_bssid, drv->bssid, ETH_ALEN);
 }
@@ -917,7 +917,7 @@ static void mlme_event_ch_switch(struct wpa_driver_nl80211_data *drv,
 				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;
 	}
 
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index e0a97bc..f3cbe97 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -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,
 			      ETH_ALEN) == 0)
 			return 0;
 	}
 
 	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);
 	for (i = 0; i < MAX_NUM_MLD_LINKS; i++) {
 		if (!(wpa_s->valid_links & BIT(i)))
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index 813e5ac..05349a6 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -740,6 +740,7 @@ struct wpa_supplicant {
 	int ap_ies_from_associnfo;
 	unsigned int assoc_freq;
 	u8 ap_mld_addr[ETH_ALEN];
+	u8 mlo_assoc_link_id;
 	u8 valid_links; /* bitmap of valid MLO link IDs */
 	struct {
 		u8 addr[ETH_ALEN];
-- 
2.7.4




More information about the Hostap mailing list