[PATCH ath-next 2/3] wifi: ath12k: rely on pskb_trim() to trim the received skb
Baochen Qiang
baochen.qiang at oss.qualcomm.com
Sun Nov 8 21:32:41 PST 2026
On 10/16/2026 11:16 PM, Lorenzo Bianconi wrote:
> 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);
Both IEEE80211_CCMP_MIC_LEN and MICHAEL_MIC_LEN are 8, and MICHAEL_MIC_LEN seems the right
name here, but it is unrelated to the pskb_trim() conversion. Better to mention it in the
commit log or move it to a separate patch?
> + if (err)
> + return err;
> + }
>
> /* Head */
> if (status->flag & RX_FLAG_IV_STRIPPED) {
>
More information about the ath12k
mailing list