Commit f89e07d4cf26 ("mac80211: agg-rx: refuse ADDBA Request with timeout update") added a check to fail when ADDBA update would change the timeout param. This param is kept in tid_ampdu_rx context which is only allocated on HW that do not set SUPPORTS_REORDERING_BUFFER. Because the timeout check was done regardless of this param, ADDBA update always failed on those HW. Fix this by only checking tid_ampdu_rx->timeout only when SUPPORTS_REORDERING_BUFFER is not set. Fixes: f89e07d4cf26 ("mac80211: agg-rx: refuse ADDBA Request with timeout update") Signed-off-by: Remi Pommarel --- net/mac80211/agg-rx.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c index 7da909d78c68..099a291723e6 100644 --- a/net/mac80211/agg-rx.c +++ b/net/mac80211/agg-rx.c @@ -353,7 +353,16 @@ void __ieee80211_start_rx_ba_session(struct sta_info *sta, buf_size, sta->sta.addr); if (test_bit(tid, sta->ampdu_mlme.agg_session_valid)) { - if (sta->ampdu_mlme.tid_rx_token[tid] == dialog_token) { + if (sta->ampdu_mlme.tid_rx_token[tid] != dialog_token) { + ht_dbg_ratelimited(sta->sdata, + "unexpected AddBA Req from %pM on tid %u\n", + sta->sta.addr, tid); + + /* delete existing Rx BA session on the same tid */ + __ieee80211_stop_rx_ba_session(sta, tid, WLAN_BACK_RECIPIENT, + WLAN_STATUS_UNSPECIFIED_QOS, + false); + } else if (!ieee80211_hw_check(&local->hw, SUPPORTS_REORDERING_BUFFER)) { struct tid_ampdu_rx *tid_rx; ht_dbg_ratelimited(sta->sdata, @@ -374,14 +383,6 @@ void __ieee80211_start_rx_ba_session(struct sta_info *sta, goto end; } - ht_dbg_ratelimited(sta->sdata, - "unexpected AddBA Req from %pM on tid %u\n", - sta->sta.addr, tid); - - /* delete existing Rx BA session on the same tid */ - __ieee80211_stop_rx_ba_session(sta, tid, WLAN_BACK_RECIPIENT, - WLAN_STATUS_UNSPECIFIED_QOS, - false); } if (ieee80211_hw_check(&local->hw, SUPPORTS_REORDERING_BUFFER)) { -- 2.52.0