Browse Source

qcacmn: Update OSIF link info for assoc vdev after roaming

Once roaming is complete, the osif link info for Assoc vdev
is not updated, resulting in link switch on assoc vdev failure
after roaming.

Update OSIF link info for assoc vdev after roaming. Also clear
the OSIF link info upon roaming from multi link AP to single
link AP

Change-Id: I7a05d61011f6ac39e7107c4d2270aa3025d79142
CRs-Fixed: 3618994
Pragaspathi Thilagaraj 1 year ago
parent
commit
95caa8459f
2 changed files with 31 additions and 14 deletions
  1. 14 0
      os_if/linux/mlme/src/osif_cm_connect_rsp.c
  2. 17 14
      os_if/linux/mlme/src/osif_cm_roam_rsp.c

+ 14 - 0
os_if/linux/mlme/src/osif_cm_connect_rsp.c

@@ -35,6 +35,7 @@
 #include "wlan_objmgr_peer_obj.h"
 #include "wlan_objmgr_peer_obj.h"
 #include "utils_mlo.h"
 #include "utils_mlo.h"
 #include <wlan_mlo_mgr_link_switch.h>
 #include <wlan_mlo_mgr_link_switch.h>
+#include "wlan_crypto_global_api.h"
 
 
 #ifdef CONN_MGR_ADV_FEATURE
 #ifdef CONN_MGR_ADV_FEATURE
 void osif_cm_get_assoc_req_ie_data(struct element_info *assoc_req,
 void osif_cm_get_assoc_req_ie_data(struct element_info *assoc_req,
@@ -837,6 +838,7 @@ static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
 {
 {
 	struct cfg80211_bss *bss = NULL;
 	struct cfg80211_bss *bss = NULL;
 	struct ieee80211_channel *chan;
 	struct ieee80211_channel *chan;
+	int32_t akm;
 
 
 	if (QDF_IS_STATUS_SUCCESS(rsp->connect_status)) {
 	if (QDF_IS_STATUS_SUCCESS(rsp->connect_status)) {
 		chan = ieee80211_get_channel(osif_priv->wdev->wiphy,
 		chan = ieee80211_get_channel(osif_priv->wdev->wiphy,
@@ -854,12 +856,24 @@ static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
 		return;
 		return;
 	}
 	}
 
 
+	akm = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_KEY_MGMT);
 	if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev)) {
 	if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev)) {
 		if (osif_update_connect_results(
 		if (osif_update_connect_results(
 				osif_priv->wdev->netdev, bss,
 				osif_priv->wdev->netdev, bss,
 				rsp, vdev))
 				rsp, vdev))
 			osif_connect_bss(osif_priv->wdev->netdev,
 			osif_connect_bss(osif_priv->wdev->netdev,
 					 bss, rsp);
 					 bss, rsp);
+	} else if (osif_get_connect_status_code(rsp) == WLAN_STATUS_SUCCESS &&
+		   QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_OWE)) {
+		/*
+		 * For OWE roaming, link vdev is disconnected on receiving
+		 * roam synch indication. As part of the disconnect osif link
+		 * info will be cleared and connect request is prepared from
+		 * mlo roam module.
+		 * So update OSIF Link info for that case here.
+		 */
+		mlo_mgr_osif_update_connect_info(vdev,
+						 wlan_vdev_get_link_id(vdev));
 	}
 	}
 
 
 }
 }

+ 17 - 14
os_if/linux/mlme/src/osif_cm_roam_rsp.c

@@ -74,15 +74,18 @@ void osif_copy_roamed_info(struct cfg80211_roam_info *info,
 
 
 #if defined(CFG80211_SINGLE_NETDEV_MULTI_LINK_SUPPORT) && defined(WLAN_FEATURE_11BE_MLO)
 #if defined(CFG80211_SINGLE_NETDEV_MULTI_LINK_SUPPORT) && defined(WLAN_FEATURE_11BE_MLO)
 static void
 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_roam_populate_mlo_info_for_link(struct wlan_objmgr_vdev *roamed_vdev,
+				     struct cfg80211_roam_info *roam_info,
+				     uint8_t link_id, struct cfg80211_bss *bss,
+				     uint8_t *self_link_addr)
 {
 {
 	osif_debug("Link_id :%d", link_id);
 	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 = self_link_addr;
+	roam_info->valid_links |=  BIT(link_id);
+	roam_info->links[link_id].bssid = bss->bssid;
+	roam_info->links[link_id].bss = bss;
+	roam_info->links[link_id].addr = self_link_addr;
+
+	mlo_mgr_osif_update_connect_info(roamed_vdev, link_id);
 }
 }
 
 
 static void
 static void
@@ -134,10 +137,10 @@ osif_populate_partner_links_roam_mlo_params(struct wlan_objmgr_vdev *roamed_vdev
 			continue;
 			continue;
 		}
 		}
 
 
-		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);
+		osif_roam_populate_mlo_info_for_link(roamed_vdev,
+						     roam_info_params,
+						     link_id, bss,
+						     link_info->link_addr.bytes);
 	}
 	}
 }
 }
 
 
@@ -179,9 +182,9 @@ static void osif_fill_mlo_roam_params(struct wlan_objmgr_vdev *vdev,
 	}
 	}
 
 
 	assoc_link_id = wlan_vdev_get_link_id(vdev);
 	assoc_link_id = wlan_vdev_get_link_id(vdev);
-	osif_populate_mlo_info_for_link(info,
-					assoc_link_id, bss,
-					wlan_vdev_mlme_get_macaddr(vdev));
+	osif_roam_populate_mlo_info_for_link(vdev, info,
+					     assoc_link_id, bss,
+					     wlan_vdev_mlme_get_macaddr(vdev));
 
 
 	osif_populate_partner_links_roam_mlo_params(vdev, rsp, info);
 	osif_populate_partner_links_roam_mlo_params(vdev, rsp, info);
 }
 }