You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
mac80211: avoid transmitting delBA to old AP
When roaming while we have active BA session, we can end up transmitting delBA frames to the old AP while we're already on the new AP's channel, which can cause warnings. Simply avoid sending those frames, but still tear down the internal session state, since they are not really necessary anyway as we will implicitly disassociate when sending the association to the new AP. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Acked-by: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
845d708e62
commit
53f73c09d6
+10
-7
@@ -101,16 +101,16 @@ void ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_supported_band *sband,
|
||||
ht_cap->mcs.rx_mask[32/8] |= 1;
|
||||
}
|
||||
|
||||
void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta)
|
||||
void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta, bool tx)
|
||||
{
|
||||
int i;
|
||||
|
||||
cancel_work_sync(&sta->ampdu_mlme.work);
|
||||
|
||||
for (i = 0; i < STA_TID_NUM; i++) {
|
||||
__ieee80211_stop_tx_ba_session(sta, i, WLAN_BACK_INITIATOR);
|
||||
__ieee80211_stop_tx_ba_session(sta, i, WLAN_BACK_INITIATOR, tx);
|
||||
__ieee80211_stop_rx_ba_session(sta, i, WLAN_BACK_RECIPIENT,
|
||||
WLAN_REASON_QSTA_LEAVE_QBSS);
|
||||
WLAN_REASON_QSTA_LEAVE_QBSS, tx);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,7 +135,7 @@ void ieee80211_ba_session_work(struct work_struct *work)
|
||||
if (test_and_clear_bit(tid, sta->ampdu_mlme.tid_rx_timer_expired))
|
||||
___ieee80211_stop_rx_ba_session(
|
||||
sta, tid, WLAN_BACK_RECIPIENT,
|
||||
WLAN_REASON_QSTA_TIMEOUT);
|
||||
WLAN_REASON_QSTA_TIMEOUT, true);
|
||||
|
||||
tid_tx = sta->ampdu_mlme.tid_tx[tid];
|
||||
if (!tid_tx)
|
||||
@@ -146,7 +146,8 @@ void ieee80211_ba_session_work(struct work_struct *work)
|
||||
else if (test_and_clear_bit(HT_AGG_STATE_WANT_STOP,
|
||||
&tid_tx->state))
|
||||
___ieee80211_stop_tx_ba_session(sta, tid,
|
||||
WLAN_BACK_INITIATOR);
|
||||
WLAN_BACK_INITIATOR,
|
||||
true);
|
||||
}
|
||||
mutex_unlock(&sta->ampdu_mlme.mtx);
|
||||
}
|
||||
@@ -214,9 +215,11 @@ void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata,
|
||||
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
||||
|
||||
if (initiator == WLAN_BACK_INITIATOR)
|
||||
__ieee80211_stop_rx_ba_session(sta, tid, WLAN_BACK_INITIATOR, 0);
|
||||
__ieee80211_stop_rx_ba_session(sta, tid, WLAN_BACK_INITIATOR, 0,
|
||||
true);
|
||||
else
|
||||
__ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_RECIPIENT);
|
||||
__ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_RECIPIENT,
|
||||
true);
|
||||
}
|
||||
|
||||
int ieee80211_send_smps_action(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
Reference in New Issue
Block a user