qcacld-3.0: Let IOT APs recover by avoiding back to back DELBA
Station sends the BA and upgrades to the next possible BA window size upon receiving all frames successfully from the current window. Some IOT APs go out of sync from BA window size of the station when AP fails to receive the BA sent from station. AP transmits the frames again with previous window sequence number and won't be ack'ed by station hardware as BA window has already moved ahead. So, station deletes the upgraded BA and tries to fallback. Ideally, AP is supposed to consider the fact that "the previous window transmission was successful when station upgrades to next window size". But some APs take little longer time to recover/upgrade to next window size. Don't delete the BA immediately and have some tolerance(3 seconds) as the previous negotiated BA just got deleted. Change-Id: I6b277223f02dac521316cec20bd5d958785cc2e9 CRs-Fixed: 2970714
This commit is contained in:

committed by
Madan Koyyalamudi

parent
14d84bf050
commit
c65ead975b
@@ -4985,3 +4985,63 @@ QDF_STATUS mlme_cfg_get_eht_caps(struct wlan_objmgr_psoc *psoc,
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
QDF_STATUS
|
||||
wlan_mlme_set_ba_2k_jump_iot_ap(struct wlan_objmgr_vdev *vdev, bool found)
|
||||
{
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
|
||||
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->ba_2k_jump_iot_ap = found;
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
bool wlan_mlme_is_ba_2k_jump_iot_ap(struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
|
||||
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||
if (!mlme_priv) {
|
||||
mlme_legacy_err("vdev legacy private object is NULL");
|
||||
return false;
|
||||
}
|
||||
|
||||
return mlme_priv->ba_2k_jump_iot_ap;
|
||||
}
|
||||
|
||||
QDF_STATUS
|
||||
wlan_mlme_set_last_delba_sent_time(struct wlan_objmgr_vdev *vdev,
|
||||
qdf_time_t delba_sent_time)
|
||||
{
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
|
||||
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->last_delba_sent_time = delba_sent_time;
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
qdf_time_t
|
||||
wlan_mlme_get_last_delba_sent_time(struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
|
||||
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||
if (!mlme_priv) {
|
||||
mlme_legacy_err("vdev legacy private object is NULL");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return mlme_priv->last_delba_sent_time;
|
||||
}
|
||||
|
Reference in New Issue
Block a user