Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Oct 2019 12:16:15 +0000 (UTC)
From:      "Bjoern A. Zeeb" <bz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r354020 - head/sys/netinet6
Message-ID:  <201910241216.x9OCGFWH031845@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bz
Date: Thu Oct 24 12:16:15 2019
New Revision: 354020
URL: https://svnweb.freebsd.org/changeset/base/354020

Log:
  frag6:  leave a note about upper layer header checks TBD
  
  Per sepcification the upper layer header needs to be within the first
  fragment.  The check was not done so far and there is an open review for
  related work, so just leave a note as to where to put it.
  Move the extraction of frag offset up to this as it is needed to determine
  whether this is a first fragment or not.
  
  MFC after:	3 weeks
  Sponsored by:	Netflix

Modified:
  head/sys/netinet6/frag6.c

Modified: head/sys/netinet6/frag6.c
==============================================================================
--- head/sys/netinet6/frag6.c	Thu Oct 24 11:58:24 2019	(r354019)
+++ head/sys/netinet6/frag6.c	Thu Oct 24 12:16:15 2019	(r354020)
@@ -468,6 +468,18 @@ frag6_input(struct mbuf **mp, int *offp, int proto)
 	else if (atomic_load_int(&frag6_nfrags) >= (u_int)ip6_maxfrags)
 		goto dropfrag2;
 
+	/*
+	 * Validate that a full header chain to the ULP is present in the
+	 * packet containing the first fragment as per RFC RFC7112 and
+	 * RFC 8200 pages 18,19:
+	 * The first fragment packet is composed of:
+	 * (3)  Extension headers, if any, and the Upper-Layer header.  These
+	 *      headers must be in the first fragment.  ...
+	 */
+	fragoff = ntohs(ip6f->ip6f_offlg & IP6F_OFF_MASK);
+	/* XXX TODO.  thj has D16851 open for this. */
+	/* Send ICMPv6 4,3 in case of violation. */
+
 	/* Store receive network interface pointer for later. */
 	srcifp = m->m_pkthdr.rcvif;
 
@@ -546,7 +558,6 @@ frag6_input(struct mbuf **mp, int *offp, int proto)
 	 * If it is the 1st fragment, record the length of the
 	 * unfragmentable part and the next header of the fragment header.
 	 */
-	fragoff = ntohs(ip6f->ip6f_offlg & IP6F_OFF_MASK);
 	if (fragoff == 0) {
 		q6->ip6q_unfrglen = offset - sizeof(struct ip6_hdr) -
 		    sizeof(struct ip6_frag);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201910241216.x9OCGFWH031845>