[PATCH ath-next 2/3] wifi: ath12k: rely on pskb_trim() to trim the received skb
Lorenzo Bianconi
lorenzo.bianconi at oss.qualcomm.com
Fri Oct 16 08:16:28 PDT 2026
Prepare the RX path for handling non-linear SKBs introduced by the
following RX batching change.
pskb_trim() can fail when trimming shared fragments, so propagate errors
from ath12k_dp_rx_h_undecap() and drop the affected frame instead of
delivering it with an untrimmed FCS, MIC, or ICV trailer.
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.1.c7-00108-QCAHMTSWPL_V1.0_V2.0_SILICONZ_UPSTREAM-3
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi at oss.qualcomm.com>
---
drivers/net/wireless/ath/ath12k/dp_rx.c | 48 ++++++++++++++++++++++++---------
1 file changed, 35 insertions(+), 13 deletions(-)
diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c
index 40b8da34268f..4f37ef12e40f 100644
--- a/drivers/net/wireless/ath/ath12k/dp_rx.c
+++ b/drivers/net/wireless/ath/ath12k/dp_rx.c
@@ -1010,6 +1010,7 @@ static int ath12k_dp_rx_h_undecap_raw(struct ath12k_pdev_dp *dp_pdev,
struct ieee80211_hdr *hdr;
size_t hdr_len;
size_t crypto_len;
+ int err;
if (!rxcb->is_first_msdu ||
!(rxcb->is_first_msdu && rxcb->is_last_msdu)) {
@@ -1020,7 +1021,9 @@ static int ath12k_dp_rx_h_undecap_raw(struct ath12k_pdev_dp *dp_pdev,
if (msdu->len < FCS_LEN)
return -EINVAL;
- skb_trim(msdu, msdu->len - FCS_LEN);
+ err = pskb_trim(msdu, msdu->len - FCS_LEN);
+ if (err)
+ return err;
if (!decrypted)
return 0;
@@ -1029,28 +1032,47 @@ static int ath12k_dp_rx_h_undecap_raw(struct ath12k_pdev_dp *dp_pdev,
/* Tail */
if (status->flag & RX_FLAG_IV_STRIPPED) {
- skb_trim(msdu, msdu->len -
- ath12k_dp_rx_crypto_mic_len(dp, enctype));
+ err = pskb_trim(msdu,
+ msdu->len -
+ ath12k_dp_rx_crypto_mic_len(dp, enctype));
+ if (err)
+ return err;
- skb_trim(msdu, msdu->len -
- ath12k_dp_rx_crypto_icv_len(dp_pdev, enctype));
+ err = pskb_trim(msdu,
+ msdu->len -
+ ath12k_dp_rx_crypto_icv_len(dp_pdev, enctype));
+ if (err)
+ return err;
} else {
/* MIC */
- if (status->flag & RX_FLAG_MIC_STRIPPED)
- skb_trim(msdu, msdu->len -
- ath12k_dp_rx_crypto_mic_len(dp, enctype));
+ if (status->flag & RX_FLAG_MIC_STRIPPED) {
+ err = pskb_trim(msdu,
+ msdu->len -
+ ath12k_dp_rx_crypto_mic_len(dp,
+ enctype));
+ if (err)
+ return err;
+ }
/* ICV */
- if (status->flag & RX_FLAG_ICV_STRIPPED)
- skb_trim(msdu, msdu->len -
- ath12k_dp_rx_crypto_icv_len(dp_pdev, enctype));
+ if (status->flag & RX_FLAG_ICV_STRIPPED) {
+ err = pskb_trim(msdu,
+ msdu->len -
+ ath12k_dp_rx_crypto_icv_len(dp_pdev,
+ enctype));
+ if (err)
+ return err;
+ }
}
/* MMIC */
if ((status->flag & RX_FLAG_MMIC_STRIPPED) &&
!ieee80211_has_morefrags(hdr->frame_control) &&
- enctype == HAL_ENCRYPT_TYPE_TKIP_MIC)
- skb_trim(msdu, msdu->len - IEEE80211_CCMP_MIC_LEN);
+ enctype == HAL_ENCRYPT_TYPE_TKIP_MIC) {
+ err = pskb_trim(msdu, msdu->len - MICHAEL_MIC_LEN);
+ if (err)
+ return err;
+ }
/* Head */
if (status->flag & RX_FLAG_IV_STRIPPED) {
--
2.56.0
More information about the ath12k
mailing list