From bf0462e93e56a570da53305c024208dd948b2894 Mon Sep 17 00:00:00 2001 From: Jingxiang Ge Date: Wed, 14 Dec 2022 21:49:51 +0800 Subject: [PATCH] qcacld-3.0: clear rate info in mlme priv for non-support rates When update rate info to vdev mlme_priv, if in current assocrsp there is no extend rate or mcs rate, need to clear such info. otherwise such info is still last connection information. the link rate will display wrongly, test step as: 1 connect with 11g AP 2 config AP to 11b, then connect manually 3 link speed will be wrong on sta side if extend rate or mcs rate is not present, clear ext_opr_rate_set and mcs_rate_set. Change-Id: I8ff1b5804dbbe463d6949d0431079174446c64ad CRs-Fixed: 3356077 --- .../mlme/dispatcher/inc/wlan_mlme_api.h | 16 +++++++ .../mlme/dispatcher/src/wlan_mlme_api.c | 42 +++++++++++++++++++ .../src/pe/lim/lim_process_assoc_rsp_frame.c | 4 ++ 3 files changed, 62 insertions(+) diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index fb5fec2069..c6b5fcd48b 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -3613,6 +3613,14 @@ qdf_size_t mlme_get_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst, QDF_STATUS mlme_set_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src, qdf_size_t len); +/** + * mlme_clear_ext_opr_rate() - clear extended operational rate + * @vdev: vdev pointer + * + * Return: QDF_SUCCESS if success + */ +QDF_STATUS mlme_clear_ext_opr_rate(struct wlan_objmgr_vdev *vdev); + /** * mlme_get_mcs_rate() - get MCS based rate * @vdev: vdev pointer @@ -3635,6 +3643,14 @@ qdf_size_t mlme_get_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst, QDF_STATUS mlme_set_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src, qdf_size_t len); +/** + * mlme_clear_mcs_rate() - clear MCS based rate + * @vdev: vdev pointer + * + * Return: QDF_SUCCESS if success + */ +QDF_STATUS mlme_clear_mcs_rate(struct wlan_objmgr_vdev *vdev); + /** * wlan_mlme_is_sta_mon_conc_supported() - Check if STA + Monitor mode * concurrency is supported diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index 2ba680c7de..fe9f66e08e 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -5623,6 +5623,27 @@ QDF_STATUS mlme_set_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src, return QDF_STATUS_SUCCESS; } +QDF_STATUS mlme_clear_ext_opr_rate(struct wlan_objmgr_vdev *vdev) +{ + struct mlme_legacy_priv *mlme_priv; + + if (!vdev) { + mlme_legacy_err("invalid params"); + return QDF_STATUS_E_INVAL; + } + + mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); + if (!mlme_priv) { + mlme_legacy_err("vdev legacy private object is NULL"); + return QDF_STATUS_E_FAILURE; + } + + mlme_priv->ext_opr_rate_set.len = 0; + qdf_mem_set(mlme_priv->ext_opr_rate_set.data, CFG_STR_DATA_LEN, 0); + + return QDF_STATUS_SUCCESS; +} + qdf_size_t mlme_get_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst, qdf_size_t len) { @@ -5679,6 +5700,27 @@ QDF_STATUS mlme_set_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src, return QDF_STATUS_SUCCESS; } +QDF_STATUS mlme_clear_mcs_rate(struct wlan_objmgr_vdev *vdev) +{ + struct mlme_legacy_priv *mlme_priv; + + if (!vdev) { + mlme_legacy_err("invalid params"); + return QDF_STATUS_E_INVAL; + } + + mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); + if (!mlme_priv) { + mlme_legacy_err("vdev legacy private object is NULL"); + return QDF_STATUS_E_FAILURE; + } + + mlme_priv->mcs_rate_set.len = 0; + qdf_mem_set(mlme_priv->mcs_rate_set.data, CFG_STR_DATA_LEN, 0); + + return QDF_STATUS_SUCCESS; +} + static enum monitor_mode_concurrency wlan_mlme_get_monitor_mode_concurrency(struct wlan_objmgr_psoc *psoc) { diff --git a/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c b/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c index 272a867d9e..51628938ef 100644 --- a/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c +++ b/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c @@ -920,9 +920,13 @@ lim_update_vdev_rate_set(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, mlme_set_ext_opr_rate(vdev, assoc_resp->extendedRates.rate, assoc_resp->extendedRates.numRates); + else + mlme_clear_ext_opr_rate(vdev); if (assoc_resp->HTCaps.present) lim_update_mcs_rate_set(vdev, &assoc_resp->HTCaps); + else + mlme_clear_mcs_rate(vdev); wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID); }