> From: Thomas Monjalon [mailto:[email protected]]
> Sent: Monday, 2 November 2026 12.27
> 
> 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,

Great review feedback!

I'm not using GRO, so I didn't know the expected behavior.
I spotted this by random luck, and it looked completely wrong, so I sent a 
quick patch.

> 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.

Now that I have learned that gro_udp4_reassemble() doesn't want UDP packets, it 
wants fragments, then the correct comparison is:

 #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_FRAG) && \
                (RTE_ETH_IS_TUNNEL_PKT(ptype) == 0))

But then the macro name seems misleading.
Renaming it to IS_IPV4_FRAG_PKT() might be confusing when used in the code 
below, so adding a comment to the macro definition is probably better.

Under all circumstances, the formula "((ptype & RTE_PTYPE_L4_UDP) == 
RTE_PTYPE_L4_UDP)" is wrong:
It not only matches UDP packets (0x200) and IP fragments (0x300), it matches 
anything with the 0x200 bit set, including RTE_PTYPE_L4_NONFRAG (0x600) and 
RTE_PTYPE_L4_IGMP (0x700).

> 
> 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?
> "

I will look into it later, when I have time for it.
Marking the patch Changes Requested for now.

Anyone feel free to take over and fix it.

Reply via email to