mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-10-29 09:32:34 +00:00
64 lines
2.4 KiB
Diff
64 lines
2.4 KiB
Diff
From d911f48294852be77371a675ab294e7c4f8d3b60 Mon Sep 17 00:00:00 2001
|
|
From: Sven Eckelmann <sven@narfation.org>
|
|
Date: Thu, 5 Sep 2024 16:13:01 +0530
|
|
Subject: [PATCH] wifi: ath11k: Don't drop tx_status when peer cannot be found
|
|
When a station is idle for a long time, hostapd will try to send a QoS
|
|
NULL frame to the station. The skb will be added to ack_status_frame,
|
|
waiting for a completion via ieee80211_report_ack_skb().
|
|
When a peer is removed before the tx_complete arrives, the
|
|
peer will be missing. Using dev_kfree_skb_any() which goes through
|
|
mac80211 will not delete the entry from ack_status_frames. This IDR
|
|
will therefore run full after 8K request were generated for such clients.
|
|
At this point, the access point will then just stall and not allow any new
|
|
clients because idr_alloc() for ack_status_frame will fail.
|
|
ieee80211_free_txskb() on the other hand will call
|
|
ieee80211_report_ack_skb() and make sure to remove the entry from
|
|
ack_status_frame.
|
|
Fixes: ff0d702450e5 (105-ath11k-fix-monitor-crash-if-tx-offload-is-enabled.patch)
|
|
92450479b82c (039-mac80211-ath11k-add-HE-TX-rate-reporting-to-radiotap.patch)
|
|
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
|
---
|
|
drivers/net/wireless/ath/ath11k/dp_tx.c | 4 ++--
|
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
--- a/drivers/net/wireless/ath/ath11k/dp_tx.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/dp_tx.c
|
|
@@ -555,12 +555,12 @@ ath11k_dp_tx_htt_tx_complete_buf(struct
|
|
kfree_skb_list(skb_shinfo(msdu)->frag_list);
|
|
skb_shinfo(msdu)->frag_list = NULL;
|
|
}
|
|
- dev_kfree_skb(msdu);
|
|
+ ieee80211_free_txskb(ar->hw, msdu);
|
|
return;
|
|
}
|
|
|
|
if (unlikely(!skb_cb->vif)) {
|
|
- dev_kfree_skb_any(msdu);
|
|
+ ieee80211_free_txskb(ar->hw, msdu);
|
|
return;
|
|
}
|
|
|
|
@@ -716,12 +716,12 @@ static void ath11k_dp_tx_complete_msdu(s
|
|
rcu_read_lock();
|
|
|
|
if (unlikely(!rcu_dereference(ab->pdevs_active[ar->pdev_idx]))) {
|
|
- dev_kfree_skb_any(msdu);
|
|
+ ieee80211_free_txskb(ar->hw, msdu);
|
|
goto exit;
|
|
}
|
|
|
|
if (unlikely(!skb_cb->vif)) {
|
|
- dev_kfree_skb_any(msdu);
|
|
+ ieee80211_free_txskb(ar->hw, msdu);
|
|
goto exit;
|
|
}
|
|
|
|
@@ -788,7 +788,7 @@ static void ath11k_dp_tx_complete_msdu(s
|
|
"dp_tx: failed to find the peer with peer_id %d\n",
|
|
ts.peer_id);
|
|
spin_unlock_bh(&ab->base_lock);
|
|
- dev_kfree_skb_any(msdu);
|
|
+ ieee80211_free_txskb(ar->hw, msdu);
|
|
goto exit;
|
|
}
|
|
arsta = (struct ath11k_sta *)peer->sta->drv_priv;
|