[PATCH] gro: fix packet type comparisons
Thomas Monjalon
thomas at monjalon.net
Mon Nov 2 12:26:46 CET 2026
17/10/2026 19:02, Morten Brørup:
> Identifying packet types requires masking with the mask, not the value,
> before comparing to the value.
[...]
> #define IS_IPV4_UDP_PKT(ptype) (RTE_ETH_IS_IPV4_HDR(ptype) && \
> - ((ptype & RTE_PTYPE_L4_UDP) == RTE_PTYPE_L4_UDP) && \
> + ((ptype & RTE_PTYPE_L4_MASK) == RTE_PTYPE_L4_UDP) && \
> (RTE_ETH_IS_TUNNEL_PKT(ptype) == 0))
[...]
> #define IS_IPV4_VXLAN_UDP4_PKT(ptype) (RTE_ETH_IS_IPV4_HDR(ptype) && \
> - ((ptype & RTE_PTYPE_L4_UDP) == RTE_PTYPE_L4_UDP) && \
> - ((ptype & RTE_PTYPE_TUNNEL_VXLAN) == \
> + ((ptype & RTE_PTYPE_L4_MASK) == RTE_PTYPE_L4_UDP) && \
> + ((ptype & RTE_PTYPE_TUNNEL_MASK) == \
> RTE_PTYPE_TUNNEL_VXLAN) && \
> - ((ptype & RTE_PTYPE_INNER_L4_UDP) == \
> + ((ptype & RTE_PTYPE_INNER_L4_MASK) == \
> RTE_PTYPE_INNER_L4_UDP) && \
My AI is not happy:
"
The UDP checks introduce a regression.
gro_udp4_reassemble() only processes IPv4 fragments, but the new comparison:
(ptype & RTE_PTYPE_L4_MASK) == RTE_PTYPE_L4_UDP
rejects packets marked RTE_PTYPE_L4_FRAG.
The previous check accepted them because RTE_PTYPE_L4_FRAG is 0x300 and RTE_PTYPE_L4_UDP is 0x200.
The same applies to IS_IPV4_VXLAN_UDP4_PKT():
requiring an exact match against RTE_PTYPE_INNER_L4_UDP excludes inner fragments,
which are precisely what gro_vxlan_udp4_reassemble() processes.
Could you preserve fragment handling in both UDP checks and add regression tests?
"
More information about the stable
mailing list