[PATCH 4/6] ip_frag: drop IPv6 fragments with unexpected headers

Konstantin Ananyev konstantin.ananyev at huawei.com
Tue Jun 30 11:21:50 CEST 2026



> DPDK version of IPv6 reassembly only handles a fragment header placed
> directly after the IPv6 header. With other extension headers in the
> unfragmentable part, ipv6_frag_reassemble() patches the wrong
> next-header field, miscomputes the payload length, and shifts the
> wrong bytes, corrupting the result.
> 
> Drop the fragment when l3_len covers more than the IPv6 and fragment
> headers. RFC 8200 allows a receiver to discard packets whose extension
> headers are not in the recommended order, and RFC 9099 recommends
> dropping non-conforming fragmented IPv6 packets, so dropping here is
> permitted rather than a deviation.
> 
> Fixes: 4f1a8f633862 ("ip_frag: add IPv6 reassembly")
> Cc: stable at dpdk.org
> 
> Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
> ---
>  lib/ip_frag/rte_ipv6_reassembly.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
> 
> diff --git a/lib/ip_frag/rte_ipv6_reassembly.c b/lib/ip_frag/rte_ipv6_reassembly.c
> index 0e809a01e5..7c1659002b 100644
> --- a/lib/ip_frag/rte_ipv6_reassembly.c
> +++ b/lib/ip_frag/rte_ipv6_reassembly.c
> @@ -180,6 +180,19 @@ rte_ipv6_frag_reassemble_packet(struct rte_ip_frag_tbl
> *tbl,
>  		return NULL;
>  	}
> 
> +	/*
> +	 * Only a fragment header directly following the IPv6 header is
> +	 * supported. Other extension headers in the unfragmentable part are
> +	 * not handled: ipv6_frag_reassemble() assumes l3_len covers exactly
> +	 * the IPv6 and fragment headers when it patches the next-header field
> +	 * and removes the fragment header. Drop the fragment rather than
> +	 * produce a corrupt datagram.
> +	 */
> +	if (mb->l3_len != sizeof(struct rte_ipv6_hdr) + sizeof(*frag_hdr)) {
> +		IP_FRAG_MBUF2DR(dr, mb);
> +		return NULL;
> +	}
> +

Hmm, not sure this is a right thing.
Yes, we don't support properly ipv6 options that are *before* fragment hreader
(so called Per-Fragment  Headers), but AFAIR we do support ipv6 options
that come *after* fragment header (Extension headers). 

>  	if (unlikely(trim > 0))
>  		rte_pktmbuf_trim(mb, trim);
> 
> --
> 2.53.0



More information about the stable mailing list