From c73843f14655ebe6941acf3b49b19e0e6cbbdc13 Mon Sep 17 00:00:00 2001 From: Amruta Kulkarni Date: Tue, 14 Feb 2023 12:10:40 -0800 Subject: [PATCH] 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 --- .../core/src/wlan_cm_vdev_connect.c | 2 +- .../core/src/wlan_cm_vdev_disconnect.c | 6 ++++ .../umac/mlme/mlo_mgr/inc/wlan_mlo_mgr_roam.h | 27 ++++++++++-------- .../umac/mlme/mlo_mgr/src/wlan_mlo_mgr_roam.c | 28 +++++++++++++++---- 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_connect.c b/components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_connect.c index 67a195f2cf..8c3789ec42 100644 --- a/components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_connect.c +++ b/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) || diff --git a/components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_disconnect.c b/components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_disconnect.c index fc6407d2fe..12968a03f3 100644 --- a/components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_disconnect.c +++ b/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 +#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; } diff --git a/components/umac/mlme/mlo_mgr/inc/wlan_mlo_mgr_roam.h b/components/umac/mlme/mlo_mgr/inc/wlan_mlo_mgr_roam.h index 47ae138a9a..94f33d29de 100644 --- a/components/umac/mlme/mlo_mgr/inc/wlan_mlo_mgr_roam.h +++ b/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 diff --git a/components/umac/mlme/mlo_mgr/src/wlan_mlo_mgr_roam.c b/components/umac/mlme/mlo_mgr/src/wlan_mlo_mgr_roam.c index fa63829726..6ab20935ff 100644 --- a/components/umac/mlme/mlo_mgr/src/wlan_mlo_mgr_roam.c +++ b/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;