> -----Original Message-----
> From: Kumara Parameshwaran <kumaraparames...@gmail.com>
> Sent: Sunday, October 16, 2022 10:43 PM
> To: Hu, Jiayu <jiayu...@intel.com>
> Cc: dev@dpdk.org; Kumara Parameshwaran
> <kumaraparames...@gmail.com>; sta...@dpdk.org
> Subject: [PATCH v2] gro : check for payload length after the trim
> 
> From: Kumara Parameshwaran <kumaraparames...@gmail.com>
> 
> When packet is padded with extra bytes the the validation of the payload
> length should be done after the trim operation
> 
> Fixes: b8a55871d5af ("gro: trim tail padding bytes")
> Cc: sta...@dpdk.org
> 
> Signed-off-by: Kumara Parameshwaran <kumaraparames...@gmail.com>
> ---
> v1:
>       If there is padding to the ethernet frame cases where timestamp is
> disabled
>       the packet length should be validated with the total ip length as
> packet length
>       is used in the GRO merging logic
> 
> v2:
>       Trim the packet length and then check for the protocol payload
> validation  lib/gro/gro_tcp4.c | 11 ++++++-----  lib/gro/gro_udp4.c | 10
> +++++-----
>  2 files changed, 11 insertions(+), 10 deletions(-)
> 
> diff --git a/lib/gro/gro_tcp4.c b/lib/gro/gro_tcp4.c index
> 8f5e800250..0014096e63 100644
> --- a/lib/gro/gro_tcp4.c
> +++ b/lib/gro/gro_tcp4.c
> @@ -225,6 +225,12 @@ gro_tcp4_reassemble(struct rte_mbuf *pkt,
>        */
>       if (tcp_hdr->tcp_flags != RTE_TCP_ACK_FLAG)
>               return -1;
> +
> +     /* trim the tail padding bytes */
> +     ip_tlen = rte_be_to_cpu_16(ipv4_hdr->total_length);
> +     if (pkt->pkt_len > (uint32_t)(ip_tlen + pkt->l2_len))
> +             rte_pktmbuf_trim(pkt, pkt->pkt_len - ip_tlen - pkt->l2_len);
> +
>       /*
>        * Don't process the packet whose payload length is less than or
>        * equal to 0.
> @@ -233,11 +239,6 @@ gro_tcp4_reassemble(struct rte_mbuf *pkt,
>       if (tcp_dl <= 0)
>               return -1;
> 
> -     /* trim the tail padding bytes */
> -     ip_tlen = rte_be_to_cpu_16(ipv4_hdr->total_length);
> -     if (pkt->pkt_len > (uint32_t)(ip_tlen + pkt->l2_len))
> -             rte_pktmbuf_trim(pkt, pkt->pkt_len - ip_tlen - pkt->l2_len);
> -
>       /*
>        * Save IPv4 ID for the packet whose DF bit is 0. For the packet
>        * whose DF bit is 1, IPv4 ID is ignored.
> diff --git a/lib/gro/gro_udp4.c b/lib/gro/gro_udp4.c index
> 839f9748b7..42596d33b6 100644
> --- a/lib/gro/gro_udp4.c
> +++ b/lib/gro/gro_udp4.c
> @@ -220,6 +220,11 @@ gro_udp4_reassemble(struct rte_mbuf *pkt,
>       if (!is_ipv4_fragment(ipv4_hdr))
>               return -1;
> 
> +     ip_dl = rte_be_to_cpu_16(ipv4_hdr->total_length);
> +     /* trim the tail padding bytes */
> +     if (pkt->pkt_len > (uint32_t)(ip_dl + pkt->l2_len))
> +             rte_pktmbuf_trim(pkt, pkt->pkt_len - ip_dl - pkt->l2_len);
> +
>       /*
>        * Don't process the packet whose payload length is less than or
>        * equal to 0.
> @@ -227,14 +232,9 @@ gro_udp4_reassemble(struct rte_mbuf *pkt,
>       if (pkt->pkt_len <= hdr_len)
>               return -1;
> 
> -     ip_dl = rte_be_to_cpu_16(ipv4_hdr->total_length);
>       if (ip_dl <= pkt->l3_len)
>               return -1;
> 
> -     /* trim the tail padding bytes */
> -     if (pkt->pkt_len > (uint32_t)(ip_dl + pkt->l2_len))
> -             rte_pktmbuf_trim(pkt, pkt->pkt_len - ip_dl - pkt->l2_len);
> -
>       ip_dl -= pkt->l3_len;
>       ip_id = rte_be_to_cpu_16(ipv4_hdr->packet_id);
>       frag_offset = rte_be_to_cpu_16(ipv4_hdr->fragment_offset);
> --
> 2.25.1

Acked-by: Jiayu Hu <jiayu...@intel.com>

Thanks,
Jiayu

Reply via email to