瀏覽代碼

qcacmn: Update scan mlme BSS info after roaming

After roaming update scan mlme bss info and update AP
channel info MLO mgr API are not called. This causes the
wrong channel width to be updated in the get_channel
command leading to disconnect.

Update standby link vdev scan entry state after roaming and
refactor the scan mlme info updation logic in a new API.

CRs-Fixed: 3753587
Change-Id: I5bcd4c807f6e23b5d604eec1158c21ccb4f29b58
Pragaspathi Thilagaraj 1 年之前
父節點
當前提交
6680ed52fb

+ 62 - 29
umac/mlme/connection_mgr/core/src/wlan_cm_connect.c

@@ -3020,12 +3020,32 @@ QDF_STATUS cm_notify_connect_complete(struct cnx_mgr *cm_ctx,
 }
 
 #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
-static void cm_update_link_channel_info(struct wlan_objmgr_vdev *vdev,
-					struct qdf_mac_addr *mac_addr,
-					qdf_freq_t freq)
+static enum phy_ch_width
+cm_get_ch_width_from_phymode(enum wlan_phymode phy_mode)
+{
+	enum phy_ch_width ch_width;
+
+	if (IS_WLAN_PHYMODE_320MHZ(phy_mode))
+		ch_width = CH_WIDTH_320MHZ;
+	else if (IS_WLAN_PHYMODE_160MHZ(phy_mode))
+		ch_width = CH_WIDTH_160MHZ;
+	else if (IS_WLAN_PHYMODE_80MHZ(phy_mode))
+		ch_width = CH_WIDTH_80MHZ;
+	else if (IS_WLAN_PHYMODE_40MHZ(phy_mode))
+		ch_width = CH_WIDTH_40MHZ;
+	else
+		ch_width = CH_WIDTH_20MHZ;
+
+	return ch_width;
+}
+
+static
+void cm_update_link_channel_info(struct wlan_objmgr_vdev *vdev,
+				 struct qdf_mac_addr *mac_addr,
+				 qdf_freq_t freq)
 {
-	uint8_t link_id;
 	struct wlan_objmgr_pdev *pdev;
+	uint8_t link_id;
 	struct scan_cache_entry *cache_entry;
 	struct wlan_channel channel = {0};
 
@@ -3037,14 +3057,14 @@ static void cm_update_link_channel_info(struct wlan_objmgr_vdev *vdev,
 		return;
 	}
 
-	link_id = wlan_vdev_get_link_id(vdev);
+	link_id = cache_entry->ml_info.self_link_id;
+
 	channel.ch_freq = cache_entry->channel.chan_freq;
 	channel.ch_ieee = wlan_reg_freq_to_chan(pdev, channel.ch_freq);
 	channel.ch_phymode = cache_entry->phy_mode;
 	channel.ch_cfreq1 = cache_entry->channel.cfreq0;
 	channel.ch_cfreq2 = cache_entry->channel.cfreq1;
-	channel.ch_width =
-		wlan_mlme_get_ch_width_from_phymode(cache_entry->phy_mode);
+	channel.ch_width = cm_get_ch_width_from_phymode(cache_entry->phy_mode);
 	/*
 	 * Supplicant needs non zero center_freq1 in case of 20 MHz connection
 	 * also as a response of get_channel request. In case of 20 MHz channel
@@ -3065,12 +3085,44 @@ static void cm_update_link_channel_info(struct wlan_objmgr_vdev *vdev,
 }
 #endif
 
+void cm_update_scan_mlme_info(struct cnx_mgr *cm_ctx,
+			      struct wlan_cm_connect_resp *resp)
+{
+	struct mlme_info mlme_info = {0};
+	struct bss_info bss_info = {0};
+
+	/* Update scan entry in case connect is success or fails with bssid */
+	if (qdf_is_macaddr_zero(&resp->bssid))
+		goto update_standby;
+
+	if (QDF_IS_STATUS_SUCCESS(resp->connect_status))
+		mlme_info.assoc_state = SCAN_ENTRY_CON_STATE_ASSOC;
+	else
+		mlme_info.assoc_state = SCAN_ENTRY_CON_STATE_NONE;
+
+	qdf_copy_macaddr(&bss_info.bssid, &resp->bssid);
+	bss_info.freq = resp->freq;
+
+	bss_info.ssid.length = resp->ssid.length;
+	qdf_mem_copy(&bss_info.ssid.ssid, resp->ssid.ssid,
+		     bss_info.ssid.length);
+
+	wlan_scan_update_mlme_by_bssinfo(
+				wlan_vdev_get_pdev(cm_ctx->vdev),
+				&bss_info, &mlme_info);
+	cm_update_link_channel_info(cm_ctx->vdev, &resp->bssid,
+				    resp->freq);
+
+update_standby:
+	cm_standby_link_update_mlme_by_bssid(cm_ctx->vdev,
+					     mlme_info.assoc_state,
+					     resp->ssid);
+}
+
 QDF_STATUS cm_connect_complete(struct cnx_mgr *cm_ctx,
 			       struct wlan_cm_connect_resp *resp)
 {
 	enum wlan_cm_sm_state sm_state;
-	struct bss_info bss_info;
-	struct mlme_info mlme_info = {0};
 	bool send_ind = true;
 
 	/*
@@ -3096,27 +3148,8 @@ QDF_STATUS cm_connect_complete(struct cnx_mgr *cm_ctx,
 	if (send_ind)
 		cm_notify_connect_complete(cm_ctx, resp, 1);
 
-	/* Update scan entry in case connect is success or fails with bssid */
-	if (!qdf_is_macaddr_zero(&resp->bssid)) {
-		if (QDF_IS_STATUS_SUCCESS(resp->connect_status))
-			mlme_info.assoc_state = SCAN_ENTRY_CON_STATE_ASSOC;
-		else
-			mlme_info.assoc_state = SCAN_ENTRY_CON_STATE_NONE;
-		qdf_copy_macaddr(&bss_info.bssid, &resp->bssid);
-		bss_info.freq = resp->freq;
-		bss_info.ssid.length = resp->ssid.length;
-		qdf_mem_copy(&bss_info.ssid.ssid, resp->ssid.ssid,
-			     bss_info.ssid.length);
-		wlan_scan_update_mlme_by_bssinfo(
-					wlan_vdev_get_pdev(cm_ctx->vdev),
-					&bss_info, &mlme_info);
-		cm_update_link_channel_info(cm_ctx->vdev, &resp->bssid,
-					    resp->freq);
-	}
 
-	cm_standby_link_update_mlme_by_bssid(cm_ctx->vdev,
-					     mlme_info.assoc_state,
-					     resp->ssid);
+	cm_update_scan_mlme_info(cm_ctx, resp);
 
 	mlme_debug(CM_PREFIX_FMT,
 		   CM_PREFIX_REF(wlan_vdev_get_id(cm_ctx->vdev),

+ 30 - 0
umac/mlme/connection_mgr/core/src/wlan_cm_main_api.h

@@ -257,6 +257,36 @@ QDF_STATUS cm_notify_connect_complete(struct cnx_mgr *cm_ctx,
 				      struct wlan_cm_connect_resp *resp,
 				      bool acquire_lock);
 
+/**
+ * cm_update_scan_mlme_info() - This API would be called after connect complete
+ * request or roam synch completion.
+ * @cm_ctx: connection manager context
+ * @resp: Connection complete resp.
+ *
+ * This API would be called after connection completion resp or roam synch
+ * propagation completion. This will update the assoc state in the scan
+ * entries
+ *
+ * Return: QDF status
+ */
+void cm_update_scan_mlme_info(struct cnx_mgr *cm_ctx,
+			      struct wlan_cm_connect_resp *resp);
+
+/**
+ * cm_update_scan_mlme_info() - This API would be called after connect complete
+ * request or roam synch completion.
+ * @cm_ctx: connection manager context
+ * @resp: Connection complete resp.
+ *
+ * This API would be called after connection completion resp or roam synch
+ * propagation completion. This will update the assoc state in the scan
+ * entries
+ *
+ * Return: QDF status
+ */
+void cm_update_scan_mlme_info(struct cnx_mgr *cm_ctx,
+			      struct wlan_cm_connect_resp *resp);
+
 /**
  * cm_connect_complete() - This API would be called after connect complete
  * request from the serialization.

+ 11 - 0
umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_api.h

@@ -92,6 +92,17 @@ QDF_STATUS wlan_cm_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev,
 				       QDF_STATUS status,
 				       struct qdf_mac_addr *peer_mac);
 
+/**
+ * wlan_cm_update_scan_mlme_info() - Called after connect/roam complete
+ * to update the scan cache with assoc state
+ * @vdev: vdev object pointer
+ * @resp: Connect response
+ *
+ * Return: QDF_STATUS
+ */
+void wlan_cm_update_scan_mlme_info(struct wlan_objmgr_vdev *vdev,
+				   struct wlan_cm_connect_resp *resp);
+
 /**
  * wlan_cm_connect_rsp() - Connection manager connect response
  * @vdev: vdev pointer

+ 11 - 0
umac/mlme/connection_mgr/dispatcher/src/wlan_cm_api.c

@@ -89,6 +89,17 @@ QDF_STATUS wlan_cm_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev,
 		return cm_bss_peer_create_rsp(vdev, status, peer_mac);
 }
 
+void wlan_cm_update_scan_mlme_info(struct wlan_objmgr_vdev *vdev,
+				   struct wlan_cm_connect_resp *resp)
+{
+	struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev);
+
+	if (!cm_ctx)
+		return;
+
+	return cm_update_scan_mlme_info(cm_ctx, resp);
+}
+
 QDF_STATUS wlan_cm_connect_rsp(struct wlan_objmgr_vdev *vdev,
 			       struct wlan_cm_connect_resp *resp)
 {

+ 1 - 18
umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2024 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
@@ -452,23 +452,6 @@ QDF_STATUS
 ucfg_scan_db_iterate(struct wlan_objmgr_pdev *pdev,
 	scan_iterator_func func, void *arg);
 
-/**
- * ucfg_scan_update_mlme_by_bssinfo() - The Public API to update mlme
- * info in the scan entry
- * @pdev: pdev object
- * @bss_info: bssid info to find the matching scan entry
- * @mlme_info: mlme info to be updated.
- *
- * The Public API to update mlme info in the scan entry.
- * Post a msg to target_if queue
- *
- * Return: 0 for success or error code.
- */
-QDF_STATUS
-ucfg_scan_update_mlme_by_bssinfo(struct wlan_objmgr_pdev *pdev,
-	struct bss_info *bss_info,
-	struct mlme_info *mlme_info);
-
 /**
  * ucfg_scan_register_event_handler() - The Public API to register
  * an event cb handler

+ 1 - 11
umac/scan/dispatcher/src/wlan_scan_ucfg_api.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2024 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
@@ -1613,16 +1613,6 @@ ucfg_scan_set_global_config(struct wlan_objmgr_psoc *psoc,
 	return status;
 }
 
-QDF_STATUS ucfg_scan_update_mlme_by_bssinfo(struct wlan_objmgr_pdev *pdev,
-		struct bss_info *bss_info, struct mlme_info *mlme)
-{
-	QDF_STATUS status;
-
-	status = scm_scan_update_mlme_by_bssinfo(pdev, bss_info, mlme);
-
-	return status;
-}
-
 QDF_STATUS
 ucfg_scan_get_global_config(struct wlan_objmgr_psoc *psoc,
 			       enum scan_config config, uint32_t *val)