From 847c26d19d9698d37e41d41d3c735edf42b83d28 Mon Sep 17 00:00:00 2001 From: Vijay Raj Date: Tue, 16 Apr 2024 22:41:13 -0700 Subject: [PATCH] qcacld-3.0: Avoid NSS and Antenna mode change during TDLS connection In the api hdd_set_nss_params() and hdd_set_antenna_mode() change in nss parameter or antenna mode cause the TDLS teardown. Add a check in api hdd_set_nss_params() and hdd_set_antenna_mode() to prevent change in parameter if there is a existing TDLS connection. Change-Id: I8a58b8b0a617a8de490907e4c3181b15d90e0dbb CRs-Fixed: 3789892 --- .../tdls/dispatcher/inc/wlan_tdls_api.h | 11 ++++- .../tdls/dispatcher/src/wlan_tdls_api.c | 45 +++++++++++++++++++ core/hdd/src/wlan_hdd_ioctl.c | 8 ++++ core/sme/src/common/sme_api.c | 11 ++++- 4 files changed, 72 insertions(+), 3 deletions(-) diff --git a/components/tdls/dispatcher/inc/wlan_tdls_api.h b/components/tdls/dispatcher/inc/wlan_tdls_api.h index a31b7c10af..b96b1ab56d 100644 --- a/components/tdls/dispatcher/inc/wlan_tdls_api.h +++ b/components/tdls/dispatcher/inc/wlan_tdls_api.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, 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 above @@ -104,6 +104,15 @@ wlan_tdls_notify_sta_connect(uint8_t vdev_id, bool tdls_prohibited, struct wlan_objmgr_vdev *vdev); +/** + * wlan_is_tdls_session_present() - Get TDLS session status + * @vdev: vdev pointer + * + * Return: QDF_STATUS_SUCCESS if success; other value if failed + */ +QDF_STATUS +wlan_is_tdls_session_present(struct wlan_objmgr_vdev *vdev); + /** * wlan_tdls_update_tx_pkt_cnt() - update tx pkt count * @vdev: tdls vdev object diff --git a/components/tdls/dispatcher/src/wlan_tdls_api.c b/components/tdls/dispatcher/src/wlan_tdls_api.c index 3a24555945..bf521799a6 100644 --- a/components/tdls/dispatcher/src/wlan_tdls_api.c +++ b/components/tdls/dispatcher/src/wlan_tdls_api.c @@ -31,6 +31,7 @@ #include #include "wlan_tdls_cfg_api.h" #include "wlan_policy_mgr_api.h" +#include "wlan_mlo_mgr_sta.h" static QDF_STATUS tdls_teardown_flush_cb(struct scheduler_msg *msg) { @@ -286,6 +287,50 @@ wlan_tdls_handle_sap_start(struct wlan_objmgr_psoc *psoc) {} #endif +#ifdef WLAN_FEATURE_11BE_MLO +static QDF_STATUS +wlan_mlo_is_tdls_session_present(struct wlan_objmgr_vdev *vdev) +{ + uint8_t i; + struct wlan_mlo_dev_context *ml_dev = vdev->mlo_dev_ctx; + + if (!ml_dev) { + tdls_err("MLO dev ctx is null"); + return QDF_STATUS_E_FAILURE; + } + + for (i = 0; i < ml_dev->wlan_vdev_count; i++) { + vdev = ml_dev->wlan_vdev_list[i]; + if (tdls_get_connected_peer_count_from_vdev(vdev) > 0) { + tdls_debug("TDLS session is present"); + return QDF_STATUS_SUCCESS; + } + } + + return QDF_STATUS_E_INVAL; +} +#else +static QDF_STATUS +wlan_mlo_is_tdls_session_present(struct wlan_objmgr_vdev *vdev) +{ + return QDF_STATUS_E_INVAL; +} +#endif + +QDF_STATUS +wlan_is_tdls_session_present(struct wlan_objmgr_vdev *vdev) +{ + if (mlo_is_mld_sta(vdev)) + return wlan_mlo_is_tdls_session_present(vdev); + + if (tdls_get_connected_peer_count_from_vdev(vdev) > 0) { + tdls_debug("TDLS session is present"); + return QDF_STATUS_SUCCESS; + } + + return QDF_STATUS_E_INVAL; +} + void wlan_tdls_notify_start_bss(struct wlan_objmgr_psoc *psoc, struct wlan_objmgr_vdev *vdev) { diff --git a/core/hdd/src/wlan_hdd_ioctl.c b/core/hdd/src/wlan_hdd_ioctl.c index 9b25c81cdb..b8b347600a 100644 --- a/core/hdd/src/wlan_hdd_ioctl.c +++ b/core/hdd/src/wlan_hdd_ioctl.c @@ -50,6 +50,7 @@ #include "wlan_reg_ucfg_api.h" #include "qdf_func_tracker.h" #include "wlan_cm_roam_ucfg_api.h" +#include "wlan_tdls_api.h" #if defined(LINUX_QCMBR) #define SIOCIOCTLTX99 (SIOCDEVPRIVATE+13) @@ -6063,6 +6064,13 @@ int hdd_set_antenna_mode(struct wlan_hdd_link_info *link_info, int mode) .timeout_ms = SME_POLICY_MGR_CMD_TIMEOUT, }; + if (QDF_STATUS_SUCCESS == + wlan_is_tdls_session_present(link_info->vdev)) { + hdd_debug("TDLS session exists"); + ret = -EINVAL; + goto exit; + } + switch (mode) { case HDD_ANTENNA_MODE_1X1: params.num_rx_chains = 1; diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 9c2cf06c53..b6b26efa21 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -89,6 +89,7 @@ #include "wlan_policy_mgr_ll_sap.h" #include "wlan_vdev_mgr_ucfg_api.h" #include "wlan_vdev_mlme_main.h" +#include "wlan_tdls_api.h" static QDF_STATUS init_sme_cmd_list(struct mac_context *mac); @@ -4780,7 +4781,7 @@ sme_nss_chains_update(mac_handle_t mac_handle, uint8_t vdev_id) { struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle); - QDF_STATUS status; + QDF_STATUS status = QDF_STATUS_E_FAILURE; struct wlan_mlme_nss_chains *dynamic_cfg; struct wlan_objmgr_vdev *vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc, @@ -4798,7 +4799,13 @@ sme_nss_chains_update(mac_handle_t mac_handle, if (ll_lt_sap_vdev_id != WLAN_INVALID_VDEV_ID) { sme_info_rl("LL_LT_SAP vdev %d present, chainmask config not allowed", ll_lt_sap_vdev_id); - return QDF_STATUS_E_FAILURE; + goto release_ref; + } + + if (QDF_STATUS_SUCCESS == wlan_is_tdls_session_present(vdev)) { + sme_debug("TDLS session exists"); + status = QDF_STATUS_E_FAILURE; + goto release_ref; } status = sme_acquire_global_lock(&mac_ctx->sme);