[PATCH rtw-next v5 08/10] wifi: rtw89: skip host-side TX hooks for injected frames
From: Enver Ikromov
Date: Fri Nov 13 2026 - 18:57:00 EST
Several TX hooks assume frames that were built by the local network
stack for an associated link:
- rtw89_traffic_stats_accu() and rtw89_core_tx_btc_spec_pkt_notify()
inspect ip_hdr()/udp_hdr(). For frames injected on a monitor
interface the network header points into the 802.11 header, so
traffic statistics and BT-coexistence notifications are derived
from unrelated bytes.
- rtw89_wow_parse_akm() records the AKM from (Re)Association Request
frames for WoWLAN, which an injected frame must not change.
- rtw89_core_tx_update_he_qos_htc(), rtw89_core_tx_update_ampdu_info(),
and rtw89_core_txq_check_agg() mutate QoS/HTC headers, enable A-MPDU
aggregation, or start/stop BA sessions based on link state, while
injected frames are expected to be sent as supplied.
Skip these hooks when IEEE80211_TX_CTL_INJECTED is set.
Signed-off-by: Enver Ikromov <owner@xxxxxxxxxxxxxx>
---
drivers/net/wireless/realtek/rtw89/core.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
index 7003c24..84c12c6 100644
--- a/drivers/net/wireless/realtek/rtw89/core.c
+++ b/drivers/net/wireless/realtek/rtw89/core.c
@@ -1351,9 +1351,11 @@ rtw89_core_tx_update_desc_info(struct rtw89_dev *rtwdev,
break;
case RTW89_CORE_TX_TYPE_DATA:
rtw89_core_tx_update_data_info(rtwdev, tx_req);
- pkt_type = rtw89_core_tx_btc_spec_pkt_notify(rtwdev, tx_req);
- rtw89_core_tx_update_he_qos_htc(rtwdev, tx_req, pkt_type);
- rtw89_core_tx_update_ampdu_info(rtwdev, tx_req, pkt_type);
+ if (likely(!(info->flags & IEEE80211_TX_CTL_INJECTED))) {
+ pkt_type = rtw89_core_tx_btc_spec_pkt_notify(rtwdev, tx_req);
+ rtw89_core_tx_update_he_qos_htc(rtwdev, tx_req, pkt_type);
+ rtw89_core_tx_update_ampdu_info(rtwdev, tx_req, pkt_type);
+ }
rtw89_core_tx_update_llc_hdr(rtwdev, desc_info, skb);
break;
default:
@@ -1477,8 +1479,10 @@ static int rtw89_core_tx_write_link(struct rtw89_dev *rtwdev,
tx_req.rtwsta_link = rtwsta_link;
tx_req.with_wait = !!wait;
- rtw89_traffic_stats_accu(rtwdev, rtwvif, skb, true, true);
- rtw89_wow_parse_akm(rtwdev, skb);
+ if (likely(!(IEEE80211_SKB_CB(skb)->flags & IEEE80211_TX_CTL_INJECTED))) {
+ rtw89_traffic_stats_accu(rtwdev, rtwvif, skb, true, true);
+ rtw89_wow_parse_akm(rtwdev, skb);
+ }
rtw89_core_tx_update_desc_info(rtwdev, &tx_req);
rtw89_core_tx_wake(rtwdev, &tx_req);
@@ -4740,6 +4744,9 @@ static void rtw89_core_txq_check_agg(struct rtw89_dev *rtwdev,
struct ieee80211_sta *sta = txq->sta;
struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta);
+ if (unlikely(IEEE80211_SKB_CB(skb)->flags & IEEE80211_TX_CTL_INJECTED))
+ return;
+
if (test_bit(RTW89_TXQ_F_FORBID_BA, rtwtxq->flags))
return;
--
2.56.0.windows.4