From 35c8eefa9e3a57d397253f0b450d59746738f7e3 Mon Sep 17 00:00:00 2001 From: Sheenam Monga Date: Fri, 5 Jul 2024 18:28:11 +0530 Subject: [PATCH] qcacld-3.0: Don't send sta keepalive time greater than configured val currently if bss_max_idle_period is greater than default configured value of sta_keep_alive then same value will be sent to FW. If any AP sets bss_max_idle_period to greater than sta_keep_alive then reset is not done on vdev stop due to which same value will be set for new connection. Fix is to not to send bss_max_idle_period as time period limit because same value is updated in bss_max_idle_period of interface. So, default configured value of sta_keep_alive_timer is required to be passed for threshold validation. value reset is required once vdev stop happens to avoid same keep alive even if bss_max_idle_period is not advertised by AP. CRs-Fixed: 3861815 Change-Id: I457a436a4c8a561600e93b3d5deaa0399fbd2c7d --- .../mlme/dispatcher/inc/wlan_mlme_api.h | 23 +++++++++++ .../mlme/dispatcher/src/wlan_mlme_api.c | 41 +++++++++++++++++++ .../mlme/dispatcher/src/wlan_mlme_ucfg_api.c | 12 +----- core/wma/src/wma_dev_if.c | 20 ++++----- core/wma/src/wma_utils.c | 4 +- 5 files changed, 77 insertions(+), 23 deletions(-) diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index d4e8129a9e..8e0b3c9f8a 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -5002,4 +5002,27 @@ void wlan_mlme_set_keepalive_period(struct wlan_objmgr_vdev *vdev, * Return: Keep alive period. */ uint16_t wlan_mlme_get_keepalive_period(struct wlan_objmgr_vdev *vdev); + +/** + * wlan_mlme_reset_sta_keepalive_period() - Reset keep alive period to default + * cfg whether it is set by userspace or via assoc rsp + * @psoc: pointer to psoc object + * @vdev: VDEV object + * + * Return: None + */ +void wlan_mlme_reset_sta_keepalive_period(struct wlan_objmgr_psoc *psoc, + struct wlan_objmgr_vdev *vdev); + +/** + * wlan_mlme_get_sta_keep_alive_period() - get keep alive period + * @psoc: pointer to psoc object + * @keep_alive_period: keep alive period + * + * Return: QDF STATUS + */ +QDF_STATUS +wlan_mlme_get_sta_keep_alive_period(struct wlan_objmgr_psoc *psoc, + uint32_t *keep_alive_period); + #endif /* _WLAN_MLME_API_H_ */ diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index 80f0405dd9..5b399f693a 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -8432,3 +8432,44 @@ uint16_t wlan_mlme_get_keepalive_period(struct wlan_objmgr_vdev *vdev) return mlme_priv->keep_alive_period; } + +void wlan_mlme_reset_sta_keepalive_period(struct wlan_objmgr_psoc *psoc, + struct wlan_objmgr_vdev *vdev) +{ + struct mlme_legacy_priv *mlme_priv; + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) { + mlme_err("invalid mlem object"); + return; + } + mlme_obj->cfg.sta.sta_keep_alive_period = + cfg_default(CFG_INFRA_STA_KEEP_ALIVE_PERIOD); + mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); + if (!mlme_priv) { + mlme_err("vdev legacy private object is NULL"); + return; + } + + mlme_priv->keep_alive_period = + cfg_default(CFG_INFRA_STA_KEEP_ALIVE_PERIOD); +} + +QDF_STATUS +wlan_mlme_get_sta_keep_alive_period(struct wlan_objmgr_psoc *psoc, + uint32_t *keep_alive_period) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) { + *keep_alive_period = + cfg_default(CFG_INFRA_STA_KEEP_ALIVE_PERIOD); + return QDF_STATUS_E_INVAL; + } + + *keep_alive_period = mlme_obj->cfg.sta.sta_keep_alive_period; + + return QDF_STATUS_SUCCESS; +} diff --git a/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c b/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c index 59f253ced7..66aff1d41f 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c @@ -251,17 +251,7 @@ QDF_STATUS ucfg_mlme_get_sta_keep_alive_period(struct wlan_objmgr_psoc *psoc, uint32_t *val) { - struct wlan_mlme_psoc_ext_obj *mlme_obj; - - mlme_obj = mlme_get_psoc_ext_obj(psoc); - if (!mlme_obj) { - *val = cfg_default(CFG_INFRA_STA_KEEP_ALIVE_PERIOD); - return QDF_STATUS_E_INVAL; - } - - *val = mlme_obj->cfg.sta.sta_keep_alive_period; - - return QDF_STATUS_SUCCESS; + return wlan_mlme_get_sta_keep_alive_period(psoc, val); } QDF_STATUS diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 311bd1f691..7c364897b3 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -4142,7 +4142,6 @@ void wma_remove_req(tp_wma_handle wma, uint8_t vdev_id, * @shortSlotTimeSupported: short slot time * @llbCoexist: llbCoexist * @maxTxPower: max tx power - * @bss_max_idle_period: BSS max idle period * * Return: QDF_STATUS */ @@ -4150,14 +4149,14 @@ static QDF_STATUS wma_vdev_set_bss_params(tp_wma_handle wma, int vdev_id, tSirMacBeaconInterval beaconInterval, uint8_t dtimPeriod, uint8_t shortSlotTimeSupported, - uint8_t llbCoexist, int8_t maxTxPower, - uint16_t bss_max_idle_period) + uint8_t llbCoexist, int8_t maxTxPower) { uint32_t slot_time; struct wma_txrx_node *intr = wma->interfaces; struct dev_set_param setparam[MAX_VDEV_SET_BSS_PARAMS]; uint8_t index = 0; enum ieee80211_protmode prot_mode; + uint32_t keep_alive_period; QDF_STATUS ret; ret = QDF_STATUS_E_FAILURE; @@ -4235,11 +4234,12 @@ wma_vdev_set_bss_params(tp_wma_handle wma, int vdev_id, goto error; } mlme_set_max_reg_power(intr[vdev_id].vdev, maxTxPower); - if (bss_max_idle_period) - wma_set_sta_keep_alive( + wlan_mlme_get_sta_keep_alive_period(wma->psoc, + &keep_alive_period); + wma_set_sta_keep_alive( wma, vdev_id, SIR_KEEP_ALIVE_NULL_PKT, - bss_max_idle_period, + keep_alive_period, NULL, NULL, NULL); error: return ret; @@ -4394,7 +4394,7 @@ QDF_STATUS wma_post_vdev_start_setup(uint8_t vdev_id) mlme_obj->proto.generic.dtim_period, mlme_obj->proto.generic.slot_time, mlme_obj->proto.generic.protection_mode, - bss_power, 0)) { + bss_power)) { wma_err("Failed to set wma_vdev_set_bss_params"); } @@ -4711,8 +4711,7 @@ QDF_STATUS wma_send_peer_assoc_req(struct bss_params *add_bss) add_bss->dtimPeriod, add_bss->shortSlotTimeSupported, add_bss->llbCoexist, - add_bss->maxTxPower, - add_bss->bss_max_idle_period)) { + add_bss->maxTxPower)) { wma_err("Failed to set bss params"); } @@ -5414,8 +5413,7 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params) if (wma_vdev_set_bss_params(wma, params->smesessionId, iface->beaconInterval, iface->dtimPeriod, iface->shortSlotTimeSupported, - iface->llbCoexist, maxTxPower, - iface->bss_max_idle_period)) { + iface->llbCoexist, maxTxPower)) { wma_err("Failed to bss params"); } diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index b2d85ce9da..10ce12e04e 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -4081,12 +4081,14 @@ QDF_STATUS wma_send_vdev_stop_to_fw(t_wma_handle *wma, uint8_t vdev_id) return status; } + wlan_mlme_reset_sta_keepalive_period(wma->psoc, iface->vdev); + iface->bss_max_idle_period = 0; + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(iface->vdev); if (!vdev_mlme) { wma_err("Failed to get vdev mlme obj for vdev id %d", vdev_id); return status; } - /* * Reset the dynamic nss chains config to the ini values, as when the * vdev gets its started again, this would be a fresh connection,