Quellcode durchsuchen

qcacmn: Update self link address also after roaming

When updating the AP link address and channel info after
roaming, update the self link address also to the link switch
context on each vdev. This information will be fetched while
sending roam + auth event to userspace after roaming.

Change-Id: I363a5ee8d65bb21d84c15879996369f4e397f2a6
CRs-Fixed: 3589401
Pragaspathi Thilagaraj vor 1 Jahr
Ursprung
Commit
7f18f6e441

+ 29 - 25
os_if/linux/mlme/src/osif_cm_roam_rsp.c

@@ -73,26 +73,24 @@ void osif_copy_roamed_info(struct cfg80211_roam_info *info,
 #endif
 
 #if defined(CFG80211_SINGLE_NETDEV_MULTI_LINK_SUPPORT) && defined(WLAN_FEATURE_11BE_MLO)
-static
-void osif_populate_mlo_info_for_link(struct wlan_objmgr_vdev *vdev,
-				     struct cfg80211_roam_info *roam_info_params,
-				     uint8_t link_id,
-				     struct cfg80211_bss *bss)
+static void
+osif_populate_mlo_info_for_link(struct cfg80211_roam_info *roam_info_params,
+				uint8_t link_id, struct cfg80211_bss *bss,
+				uint8_t *self_link_addr)
 {
 	osif_debug("Link_id :%d", link_id);
 	roam_info_params->valid_links |=  BIT(link_id);
 	roam_info_params->links[link_id].bssid = bss->bssid;
 	roam_info_params->links[link_id].bss = bss;
-	roam_info_params->links[link_id].addr =
-					 wlan_vdev_mlme_get_macaddr(vdev);
+	roam_info_params->links[link_id].addr = self_link_addr;
 }
 
 static void
-osif_populate_partner_links_roam_mlo_params(struct wlan_objmgr_pdev *pdev,
+osif_populate_partner_links_roam_mlo_params(struct wlan_objmgr_vdev *roamed_vdev,
 					    struct wlan_cm_connect_resp *rsp,
 					    struct cfg80211_roam_info *roam_info_params)
 {
-	struct wlan_objmgr_vdev *partner_vdev;
+	struct wlan_objmgr_pdev *pdev;
 	struct mlo_link_info *rsp_partner_info;
 	struct mlo_partner_info assoc_partner_info = {0};
 	struct cfg80211_bss *bss = NULL;
@@ -100,12 +98,17 @@ osif_populate_partner_links_roam_mlo_params(struct wlan_objmgr_pdev *pdev,
 	uint8_t link_id = 0, num_links;
 	int i;
 
+	pdev = wlan_vdev_get_pdev(roamed_vdev);
+	if (!pdev)
+		return;
+
 	qdf_status = osif_get_partner_info_from_mlie(rsp, &assoc_partner_info);
 	if (QDF_IS_STATUS_ERROR(qdf_status))
 		return;
 
 	num_links = rsp->ml_parnter_info.num_partner_links;
 	for (i = 0 ; i < num_links; i++) {
+		struct mlo_link_info *link_info;
 		rsp_partner_info = &rsp->ml_parnter_info.partner_link_info[i];
 
 		qdf_status = osif_get_link_id_from_assoc_ml_ie(rsp_partner_info,
@@ -114,24 +117,26 @@ osif_populate_partner_links_roam_mlo_params(struct wlan_objmgr_pdev *pdev,
 		if (QDF_IS_STATUS_ERROR(qdf_status))
 			continue;
 
-		partner_vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev,
-						      rsp_partner_info->vdev_id,
-						      WLAN_MLO_MGR_ID);
-		if (!partner_vdev)
+		link_info = mlo_mgr_get_ap_link_by_link_id(roamed_vdev,
+							   link_id);
+		if (!link_info) {
+			osif_debug("link info not found for link_id:%d",
+				   link_id);
 			continue;
+		}
 
-		bss = osif_get_chan_bss_from_kernel(partner_vdev,
+		bss = osif_get_chan_bss_from_kernel(roamed_vdev,
 						    rsp_partner_info, rsp);
 		if (!bss) {
-			wlan_objmgr_vdev_release_ref(partner_vdev,
-						     WLAN_MLO_MGR_ID);
+			osif_debug("kernel bss not found for link_id:%d",
+				   link_id);
 			continue;
 		}
 
-		osif_populate_mlo_info_for_link(partner_vdev,
-						roam_info_params,
-						link_id, bss);
-		wlan_objmgr_vdev_release_ref(partner_vdev, WLAN_MLO_MGR_ID);
+		osif_populate_mlo_info_for_link(roam_info_params,
+						link_id, bss,
+						link_info->link_addr.bytes);
+		mlo_mgr_osif_update_connect_info(roamed_vdev, link_id);
 	}
 }
 
@@ -173,12 +178,11 @@ static void osif_fill_mlo_roam_params(struct wlan_objmgr_vdev *vdev,
 	}
 
 	assoc_link_id = wlan_vdev_get_link_id(vdev);
-	osif_populate_mlo_info_for_link(vdev, info,
-					assoc_link_id, bss);
+	osif_populate_mlo_info_for_link(info,
+					assoc_link_id, bss,
+					wlan_vdev_mlme_get_macaddr(vdev));
 
-	osif_populate_partner_links_roam_mlo_params(wlan_vdev_get_pdev(vdev),
-						    rsp,
-						    info);
+	osif_populate_partner_links_roam_mlo_params(vdev, rsp, info);
 }
 #else
 static void osif_fill_mlo_roam_params(struct wlan_objmgr_vdev *vdev,

+ 0 - 15
umac/mlo_mgr/inc/wlan_mlo_mgr_link_switch.h

@@ -192,21 +192,6 @@ mlo_mgr_update_link_info_mac_addr(struct wlan_objmgr_vdev *vdev,
  */
 void mlo_mgr_update_link_info_reset(struct wlan_mlo_dev_context *ml_dev);
 
-/**
- * mlo_mgr_roam_update_ap_link_info() - Update AP links information
- * @vdev: Object Manager vdev
- * @link_id: Link id of the AP MLD link
- * @ap_link_addr: AP link addresses
- * @channel: wlan channel information of the link
- *
- * Update AP link information for each link of AP MLD
- * Return: void
- */
-void mlo_mgr_roam_update_ap_link_info(struct wlan_objmgr_vdev *vdev,
-				      uint8_t link_id,
-				      uint8_t *ap_link_addr,
-				      struct wlan_channel channel);
-
 /**
  * mlo_mgr_update_ap_link_info() - Update AP links information
  * @vdev: Object Manager vdev

+ 0 - 28
umac/mlo_mgr/src/wlan_mlo_mgr_link_switch.c

@@ -55,34 +55,6 @@ void mlo_mgr_update_link_info_mac_addr(struct wlan_objmgr_vdev *vdev,
 	}
 }
 
-void mlo_mgr_roam_update_ap_link_info(struct wlan_objmgr_vdev *vdev,
-				      uint8_t link_id, uint8_t *ap_link_addr,
-				      struct wlan_channel channel)
-{
-	struct mlo_link_info *link_info;
-	uint8_t iter;
-
-	if (!vdev || !vdev->mlo_dev_ctx || !vdev->mlo_dev_ctx->link_ctx ||
-	    !ap_link_addr)
-		return;
-
-	for (iter = 0; iter < WLAN_MAX_ML_BSS_LINKS; iter++) {
-		link_info = &vdev->mlo_dev_ctx->link_ctx->links_info[iter];
-		if (link_id == link_info->link_id)
-			break;
-	}
-
-	if (iter == WLAN_MAX_ML_BSS_LINKS)
-		return;
-
-	qdf_mem_copy(&link_info->ap_link_addr, ap_link_addr, QDF_MAC_ADDR_SIZE);
-	qdf_mem_copy(link_info->link_chan_info, &channel, sizeof(channel));
-
-	mlo_debug("Update AP Link info for link_id: %d, vdev_id:%d, link_addr:" QDF_MAC_ADDR_FMT,
-		  link_info->link_id, link_info->vdev_id,
-		  QDF_MAC_ADDR_REF(link_info->ap_link_addr.bytes));
-}
-
 void mlo_mgr_update_ap_link_info(struct wlan_objmgr_vdev *vdev, uint8_t link_id,
 				 uint8_t *ap_link_addr,
 				 struct wlan_channel channel)