Browse Source

qcacmn: Get partner vdev using vdev ID instead of link ID

While notifying the ML connection status to the supplicant, partner vdev
information will be filled in the connect response. This partner vdev info
is populated using partner link IDs. This may cause issues since it is
not guaranteed that link id information in the partner vdev is valid while
notifying the connection status to the supplicant.

To address this, get partner vdev information using vdev ID instead of
link ID.

Change-Id: I5e45b038b1fe5b6ab9c6bbb514eefb0ad4c39e66
CRs-Fixed: 3117702
Bapiraju Alla 3 years ago
parent
commit
6bb2ad7c5b

+ 23 - 4
os_if/linux/mlme/src/osif_cm_connect_rsp.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2012-2015, 2020-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -380,6 +380,24 @@ osif_populate_fils_params(struct cfg80211_connect_resp_params *rsp_params,
 #endif
 
 #if defined(CFG80211_IFTYPE_MLO_LINK_SUPPORT) && defined(WLAN_FEATURE_11BE_MLO)
+#ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
+static struct wlan_objmgr_vdev *osif_get_partner_vdev(
+					struct wlan_objmgr_vdev *vdev,
+					struct mlo_link_info rsp_partner_info)
+{
+	return wlan_objmgr_get_vdev_by_id_from_pdev(
+						vdev->vdev_objmgr.wlan_pdev,
+						rsp_partner_info.vdev_id,
+						WLAN_MLO_MGR_ID);
+}
+#else
+static struct wlan_objmgr_vdev *osif_get_partner_vdev(
+					struct wlan_objmgr_vdev *vdev,
+					struct mlo_link_info rsp_partner_info)
+{
+	return mlo_get_vdev_by_link_id(vdev, rsp_partner_info.link_id);
+}
+#endif
 static void osif_fill_connect_resp_mlo_params(
 			struct wlan_objmgr_vdev *vdev,
 			struct wlan_cm_connect_resp *rsp,
@@ -431,15 +449,16 @@ static void osif_fill_connect_resp_mlo_params(
 			if (i == rsp->ml_parnter_info.num_partner_links)
 				break;
 
-			ml_vdev = mlo_get_vdev_by_link_id(
-					ml_vdev, rsp_partner_info[i].link_id);
+			ml_vdev = osif_get_partner_vdev(vdev,
+							rsp_partner_info[i]);
 
 			if (ml_vdev) {
 				osif_priv = wlan_vdev_get_ospriv(ml_vdev);
 				wlan_objmgr_vdev_release_ref(ml_vdev,
 							     WLAN_MLO_MGR_ID);
 			} else {
-				osif_err("Partner vdev not found");
+				osif_err("Partner vdev not found with vdev_id:%d",
+					 rsp_partner_info[i].vdev_id);
 				goto end;
 			}
 		}

+ 2 - 0
umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h

@@ -421,6 +421,7 @@ struct wlan_mlo_peer_context {
  * @link_id: link index
  * @chan_freq: Operating channel frequency
  * @nawds_config: peer's NAWDS configurarion
+ * @vdev_id: VDEV ID
  */
 struct mlo_link_info {
 	struct qdf_mac_addr link_addr;
@@ -429,6 +430,7 @@ struct mlo_link_info {
 #ifdef UMAC_SUPPORT_MLNAWDS
 	struct mlnawds_config nawds_config;
 #endif
+	uint8_t vdev_id;
 };
 
 /*

+ 16 - 14
umac/mlo_mgr/src/wlan_mlo_mgr_sta.c

@@ -507,7 +507,7 @@ static void
 mlo_send_link_connect(struct wlan_objmgr_vdev *vdev,
 		      struct wlan_mlo_dev_context *mlo_dev_ctx,
 		      struct element_info *assoc_rsp,
-		      struct mlo_partner_info ml_parnter_info)
+		      struct mlo_partner_info *ml_parnter_info)
 {
 	/* Create the secondary interface, Send keys if the last link */
 	uint8_t i, partner_idx = 0;
@@ -518,7 +518,7 @@ mlo_send_link_connect(struct wlan_objmgr_vdev *vdev,
 			vdev, ssid.ssid,
 			&ssid.length);
 
-	if (!ml_parnter_info.num_partner_links) {
+	if (!ml_parnter_info->num_partner_links) {
 		mlo_err("No patner info in connect resp");
 		return;
 	}
@@ -535,12 +535,14 @@ mlo_send_link_connect(struct wlan_objmgr_vdev *vdev,
 		wlan_vdev_mlme_feat_ext2_cap_set(mlo_dev_ctx->wlan_vdev_list[i],
 						 WLAN_VDEV_FEXT2_MLO_STA_LINK);
 		wlan_vdev_set_link_id(
-			mlo_dev_ctx->wlan_vdev_list[i],
-			ml_parnter_info.partner_link_info[partner_idx].link_id);
+		      mlo_dev_ctx->wlan_vdev_list[i],
+		      ml_parnter_info->partner_link_info[partner_idx].link_id);
+		ml_parnter_info->partner_link_info[partner_idx].vdev_id =
+			       wlan_vdev_get_id(mlo_dev_ctx->wlan_vdev_list[i]);
 		mlo_prepare_and_send_connect(
 				mlo_dev_ctx->wlan_vdev_list[i],
-				ml_parnter_info,
-				ml_parnter_info.partner_link_info[partner_idx],
+				*ml_parnter_info,
+				ml_parnter_info->partner_link_info[partner_idx],
 				ssid);
 		partner_idx++;
 	}
@@ -550,13 +552,13 @@ static void
 mlo_send_link_connect(struct wlan_objmgr_vdev *vdev,
 		      struct wlan_mlo_dev_context *mlo_dev_ctx,
 		      struct element_info *assoc_rsp,
-		      struct mlo_partner_info ml_parnter_info)
+		      struct mlo_partner_info *ml_parnter_info)
 {
 	struct wlan_ssid ssid = {0};
 	uint8_t i = 0;
 	uint8_t j = 0;
 
-	if (!ml_parnter_info.num_partner_links) {
+	if (!ml_parnter_info->num_partner_links) {
 		mlo_err("No patner info in connect resp");
 		return;
 	}
@@ -573,19 +575,19 @@ mlo_send_link_connect(struct wlan_objmgr_vdev *vdev,
 			if (qdf_test_bit(i, mlo_dev_ctx->sta_ctx->wlan_connected_links)) {
 				if (wlan_cm_is_vdev_disconnected(
 					mlo_dev_ctx->wlan_vdev_list[i])) {
-					for (j = 0; j < ml_parnter_info.num_partner_links; j++) {
+					for (j = 0; j < ml_parnter_info->num_partner_links; j++) {
 						if (mlo_dev_ctx->wlan_vdev_list[i]->vdev_mlme.mlo_link_id ==
-							ml_parnter_info.partner_link_info[j].link_id)
+							ml_parnter_info->partner_link_info[j].link_id)
 							break;
 					}
-					if (j < ml_parnter_info.num_partner_links) {
+					if (j < ml_parnter_info->num_partner_links) {
 						wlan_vdev_mlme_get_ssid(
 							vdev, ssid.ssid,
 							&ssid.length);
 						mlo_prepare_and_send_connect(
 							mlo_dev_ctx->wlan_vdev_list[i],
-							ml_parnter_info,
-							ml_parnter_info.partner_link_info[j],
+							*ml_parnter_info,
+							ml_parnter_info->partner_link_info[j],
 							ssid);
 					}
 					mlo_dev_lock_release(mlo_dev_ctx);
@@ -773,7 +775,7 @@ void mlo_sta_link_connect_notify(struct wlan_objmgr_vdev *vdev,
 		}
 		mlo_send_link_connect(vdev, mlo_dev_ctx,
 				      &rsp->connect_ies.assoc_rsp,
-				      rsp->ml_parnter_info);
+				      &rsp->ml_parnter_info);
 	}
 }