Explorar el Código

qcacld-3.0: Fix to free copied reassoc response

During OWE roaming if north bound disconnect is received or
link vdev connection fails copied reassoc response is not freed.

Fix is to free the copied reassoc response in the disconnect path.

Change-Id: I19d839b63c774b29ee449635722fae744c7e461d
CRs-Fixed: 3404843
Amruta Kulkarni hace 2 años
padre
commit
c73843f146

+ 1 - 1
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_connect.c

@@ -1645,7 +1645,7 @@ cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev,
 		cm_update_tid_mapping(vdev);
 	}
 
-	mlo_roam_connect_complete(psoc, pdev, vdev, rsp);
+	mlo_roam_connect_complete(vdev);
 
 	if (op_mode == QDF_STA_MODE &&
 		(wlan_vdev_mlme_is_mlo_link_vdev(vdev) ||

+ 6 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_disconnect.c

@@ -33,6 +33,7 @@
 #include "wni_api.h"
 #include "connection_mgr/core/src/wlan_cm_roam.h"
 #include <wlan_mlo_mgr_sta.h>
+#include "wlan_mlo_mgr_roam.h"
 
 static void cm_abort_connect_request_timers(struct wlan_objmgr_vdev *vdev)
 {
@@ -86,6 +87,11 @@ QDF_STATUS cm_disconnect_start_ind(struct wlan_objmgr_vdev *vdev,
 	}
 	cm_abort_connect_request_timers(vdev);
 
+	if (req->source != CM_MLO_ROAM_INTERNAL_DISCONNECT) {
+		mlme_debug("Free copied reassoc rsp");
+		mlo_roam_free_copied_reassoc_rsp(vdev);
+	}
+
 	return QDF_STATUS_SUCCESS;
 }
 

+ 16 - 11
components/umac/mlme/mlo_mgr/inc/wlan_mlo_mgr_roam.h

@@ -291,19 +291,23 @@ mlo_roam_is_auth_status_connected(struct wlan_objmgr_psoc *psoc,
 
 /**
  * mlo_roam_connect_complete - roam connect complete api
- * @psoc: psoc pointer
- * @pdev: pdev pointer
  * @vdev: vdev pointer
- * @rsp: connect rsp pointer
  *
  * This api will be called after connect complete for roam 1x case.
  *
  * Return: none
  */
-void mlo_roam_connect_complete(struct wlan_objmgr_psoc *psoc,
-			       struct wlan_objmgr_pdev *pdev,
-			       struct wlan_objmgr_vdev *vdev,
-			       struct wlan_cm_connect_resp *rsp);
+void mlo_roam_connect_complete(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * mlo_roam_free_copied_reassoc_rsp - roam free copied reassoc rsp
+ * @vdev: vdev pointer
+ *
+ * This api will be called to free copied reassoc rsp.
+ *
+ * Return: none
+ */
+void mlo_roam_free_copied_reassoc_rsp(struct wlan_objmgr_vdev *vdev);
 
 #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
 /**
@@ -499,10 +503,11 @@ mlo_roam_is_auth_status_connected(struct wlan_objmgr_psoc *psoc,
 }
 
 static inline void
-mlo_roam_connect_complete(struct wlan_objmgr_psoc *psoc,
-			  struct wlan_objmgr_pdev *pdev,
-			  struct wlan_objmgr_vdev *vdev,
-			  struct wlan_cm_connect_resp *rsp)
+mlo_roam_connect_complete(struct wlan_objmgr_vdev *vdev)
+{}
+
+static inline void
+mlo_roam_free_copied_reassoc_rsp(struct wlan_objmgr_vdev *vdev)
 {}
 
 static inline QDF_STATUS

+ 23 - 5
components/umac/mlme/mlo_mgr/src/wlan_mlo_mgr_roam.c

@@ -294,9 +294,11 @@ QDF_STATUS mlo_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev,
 	 * 3. Roamed to AP with auth_status = ROAMED_AUTH_STATUS_CONNECTED
 	 */
 	if (sync_ind->num_setup_links < 2 ||
-	    sync_ind->auth_status == ROAM_AUTH_STATUS_CONNECTED)
+	    sync_ind->auth_status == ROAM_AUTH_STATUS_CONNECTED) {
+		mlme_debug("Roam auth status %d", sync_ind->auth_status);
 		mlo_update_vdev_after_roam(psoc, vdev_id,
 					   sync_ind->num_setup_links);
+	}
 
 	/* If EAPOL is offloaded to supplicant, link vdev/s are not up
 	 * at FW, in that case complete roam sync on assoc vdev
@@ -1109,10 +1111,26 @@ mlo_roam_prepare_and_send_link_connect_req(struct wlan_objmgr_vdev *assoc_vdev,
 	return status;
 }
 
-void mlo_roam_connect_complete(struct wlan_objmgr_psoc *psoc,
-			       struct wlan_objmgr_pdev *pdev,
-			       struct wlan_objmgr_vdev *vdev,
-			       struct wlan_cm_connect_resp *rsp)
+void mlo_roam_free_copied_reassoc_rsp(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_mlo_sta *sta_ctx;
+
+	if (!vdev)
+		return;
+
+	if (!vdev->mlo_dev_ctx)
+		return;
+
+	sta_ctx = vdev->mlo_dev_ctx->sta_ctx;
+	if (!sta_ctx || !sta_ctx->copied_reassoc_rsp ||
+	    !sta_ctx->copied_reassoc_rsp->roaming_info)
+		return;
+
+	mlo_roam_free_connect_rsp(sta_ctx->copied_reassoc_rsp);
+	sta_ctx->copied_reassoc_rsp = NULL;
+}
+
+void mlo_roam_connect_complete(struct wlan_objmgr_vdev *vdev)
 {
 	struct wlan_mlo_sta *sta_ctx;
 	uint8_t auth_status;