On Thu, 18 Dec 2025 14:39:32 +0530
Rakesh Kudurumalla <[email protected]> wrote:
> Inner l2 length needs to be updated to include GRE and NVGRE
> headers. Not updating this would cause failures for applications
> which would be expecting l2_len field to be valid for
> inner checksum offload cases.
>
> Fixes: 76730c7b9b5a ("app/testpmd: use packet type parsing API")
>
> Signed-off-by: Rakesh Kudurumalla <[email protected]>
> ---
>
> V2: update innner l2 length based of GRE header flags
> for key, sequence and checksum
>
> lib/net/rte_net.c | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> diff --git a/lib/net/rte_net.c b/lib/net/rte_net.c
> index c70b57fdc0..a24a0db526 100644
> --- a/lib/net/rte_net.c
> +++ b/lib/net/rte_net.c
> @@ -480,6 +480,19 @@ uint32_t rte_net_get_ptype(const struct rte_mbuf *m,
> return pkt_type;
>
> pkt_type |= ptype_tunnel_without_udp(&proto, m, &off);
> + if ((pkt_type & RTE_PTYPE_TUNNEL_MASK) == RTE_PTYPE_TUNNEL_GRE
> ||
> + (pkt_type & RTE_PTYPE_TUNNEL_MASK) ==
> RTE_PTYPE_TUNNEL_NVGRE) {
> + const struct rte_gre_hdr *gh;
> +
> + gh = rte_pktmbuf_read(m, prev_off, sizeof(*gh), NULL);
This looks wrong. rte_pktmbuf_read() is intended to handle non-contiguous data
and you should pass a temporary header buffer for it to use.
Or if you can verify that the header is in first mbuf and does not span
segments, then just use rte_pktmbuf_mtod_offset.