[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