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
This commit is contained in:
Sheenam Monga
2024-07-05 18:28:11 +05:30
committed by Ravindra Konda
parent 9c8536b86f
commit 35c8eefa9e
5 changed files with 77 additions and 23 deletions

View File

@@ -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_ */

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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");
}

View File

@@ -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,