mac80211: fix handling of PS filtering with fast-xmit
Fixes dropped packets in the tx path in case a non-PS station triggers the tx filter. Signed-off-by: Felix Fietkau <nbd@openwrt.org> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
babc305e21
commit
f7418bc10d
|
@ -101,6 +101,7 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,
|
||||||
* when it wakes up for the next time.
|
* when it wakes up for the next time.
|
||||||
*/
|
*/
|
||||||
set_sta_flag(sta, WLAN_STA_CLEAR_PS_FILT);
|
set_sta_flag(sta, WLAN_STA_CLEAR_PS_FILT);
|
||||||
|
ieee80211_clear_fast_xmit(sta);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This code races in the following way:
|
* This code races in the following way:
|
||||||
|
|
|
@ -1218,8 +1218,10 @@ ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
if (!tx->sta)
|
if (!tx->sta)
|
||||||
info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT;
|
info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT;
|
||||||
else if (test_and_clear_sta_flag(tx->sta, WLAN_STA_CLEAR_PS_FILT))
|
else if (test_and_clear_sta_flag(tx->sta, WLAN_STA_CLEAR_PS_FILT)) {
|
||||||
info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT;
|
info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT;
|
||||||
|
ieee80211_check_fast_xmit(tx->sta);
|
||||||
|
}
|
||||||
|
|
||||||
info->flags |= IEEE80211_TX_CTL_FIRST_FRAGMENT;
|
info->flags |= IEEE80211_TX_CTL_FIRST_FRAGMENT;
|
||||||
|
|
||||||
|
@ -2451,7 +2453,8 @@ void ieee80211_check_fast_xmit(struct sta_info *sta)
|
||||||
|
|
||||||
if (test_sta_flag(sta, WLAN_STA_PS_STA) ||
|
if (test_sta_flag(sta, WLAN_STA_PS_STA) ||
|
||||||
test_sta_flag(sta, WLAN_STA_PS_DRIVER) ||
|
test_sta_flag(sta, WLAN_STA_PS_DRIVER) ||
|
||||||
test_sta_flag(sta, WLAN_STA_PS_DELIVER))
|
test_sta_flag(sta, WLAN_STA_PS_DELIVER) ||
|
||||||
|
test_sta_flag(sta, WLAN_STA_CLEAR_PS_FILT))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (sdata->noack_map)
|
if (sdata->noack_map)
|
||||||
|
|
Loading…
Reference in New Issue