Module Name:    src
Committed By:   maxv
Date:           Fri Jan 19 10:54:31 UTC 2018

Modified Files:
        src/sys/netinet: ip_icmp.h
        src/sys/netmpls: mpls_ttl.c

Log Message:
Move the ICMP Extension structures from mpls_ttl.c to ip_icmp.h; that's
part of the ICMP protocol (per RFC4884), and not specific to MPLS. Also
add ih_exthdr in struct icmp, the 'length' field appeared.

While here, style in MPLS.


To generate a diff of this commit:
cvs rdiff -u -r1.36 -r1.37 src/sys/netinet/ip_icmp.h
cvs rdiff -u -r1.9 -r1.10 src/sys/netmpls/mpls_ttl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/netinet/ip_icmp.h
diff -u src/sys/netinet/ip_icmp.h:1.36 src/sys/netinet/ip_icmp.h:1.37
--- src/sys/netinet/ip_icmp.h:1.36	Fri Jan 19 10:21:24 2018
+++ src/sys/netinet/ip_icmp.h	Fri Jan 19 10:54:31 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_icmp.h,v 1.36 2018/01/19 10:21:24 maxv Exp $	*/
+/*	$NetBSD: ip_icmp.h,v 1.37 2018/01/19 10:54:31 maxv Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1993
@@ -59,6 +59,13 @@ struct icmp {
 	union {
 		int32_t ih_void;
 
+		/* Extended Header (RFC4884) */
+		struct ih_exthdr {
+			u_int8_t iex_void1;
+			u_int8_t iex_length;
+			u_int16_t iex_void2;
+		} ih_exthdr __packed;
+
 		/* ICMP_PARAMPROB */
 		u_int8_t ih_pptr;
 
@@ -127,6 +134,33 @@ struct icmp {
 #define icmp_data	icmp_dun.id_data
 };
 
+#define ICMP_EXT_VERSION	2
+#define ICMP_EXT_OFFSET		128
+
+/*
+ * ICMP Extension Structure Header (RFC4884).
+ */
+struct icmp_ext_hdr {
+#if BYTE_ORDER == BIG_ENDIAN
+	u_int8_t version:4;
+	u_int8_t rsvd1:4;
+#else
+	u_int8_t rsvd1:4;
+	u_int8_t version:4;
+#endif
+	u_int8_t rsvd2;
+	u_int16_t checksum;
+} __packed;
+
+/*
+ * ICMP Extension Object Header (RFC4884).
+ */
+struct icmp_ext_obj_hdr {
+	u_int16_t length;
+	u_int8_t class_num;
+	u_int8_t c_type;
+} __packed;
+
 /*
  * Lower bounds on packet lengths for various types.
  * For the error advice packets must first insure that the

Index: src/sys/netmpls/mpls_ttl.c
diff -u src/sys/netmpls/mpls_ttl.c:1.9 src/sys/netmpls/mpls_ttl.c:1.10
--- src/sys/netmpls/mpls_ttl.c:1.9	Fri Dec  8 17:49:54 2017
+++ src/sys/netmpls/mpls_ttl.c	Fri Jan 19 10:54:31 2018
@@ -1,33 +1,4 @@
-/*	$NetBSD: mpls_ttl.c,v 1.9 2017/12/08 17:49:54 maxv Exp $ */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
+/*	$NetBSD: mpls_ttl.c,v 1.10 2018/01/19 10:54:31 maxv Exp $ */
 
 /*
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -66,6 +37,35 @@
  */
 
 /*
+ * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
  * Copyright (c) 1982, 1986, 1988, 1993
  *      The Regents of the University of California.  All rights reserved.
  *
@@ -97,7 +97,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mpls_ttl.c,v 1.9 2017/12/08 17:49:54 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mpls_ttl.c,v 1.10 2018/01/19 10:54:31 maxv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -130,33 +130,11 @@ __KERNEL_RCSID(0, "$NetBSD: mpls_ttl.c,v
 extern int icmpreturndatabytes;
 
 /* ICMP Extensions */
-
-#define ICMP_EXT_VERSION 2
-#define	MPLS_RETURN_DATA 128
-#define	ICMP_EXT_OFFSET	128
-
-struct icmp_ext_cmn_hdr {
-#if BYTE_ORDER == BIG_ENDIAN
-	unsigned char version:4;
-	unsigned char reserved1:4;
-#else
-	unsigned char reserved1:4;
-	unsigned char version:4;
-#endif
-	unsigned char reserved2;
-	unsigned short checksum;
-};
-
-struct icmp_ext_obj_hdr {
-	u_short length;
-	u_char class_num;
 #define MPLS_STACK_ENTRY_CLASS 1
-	u_char c_type;
 #define MPLS_STACK_ENTRY_C_TYPE 1
-};
 
 struct mpls_extension {
-	struct icmp_ext_cmn_hdr cmn_hdr;
+	struct icmp_ext_hdr cmn_hdr;
 	struct icmp_ext_obj_hdr obj_hdr;
 	union mpls_shim ms;
 } __packed;
@@ -166,11 +144,11 @@ static void mpls_icmp_error(struct mbuf 
 static struct mbuf *ip4_check(struct mbuf *);
 
 /*
- * References: RFC 4884 and RFC 4950
+ * Send an ICMP Extended error message. References: RFC4884 and RFC4950.
+ *
  * This should be in sync with icmp_error() in sys/netinet/ip_icmp.c
  * XXX: is called only for ICMP_TIMXCEED_INTRANS but code is too general
  */
-
 static void
 mpls_icmp_error(struct mbuf *n, int type, int code, n_long dest,
     int destmtu, union mpls_shim *shim)
@@ -200,6 +178,7 @@ mpls_icmp_error(struct mbuf *n, int type
 #endif
 	if (type != ICMP_REDIRECT)
 		ICMP_STATINC(ICMP_STAT_ERROR);
+
 	/*
 	 * Don't send error if the original packet was encrypted.
 	 * Don't send error if not the first fragment of message.
@@ -217,6 +196,7 @@ mpls_icmp_error(struct mbuf *n, int type
 		ICMP_STATINC(ICMP_STAT_OLDICMP);
 		goto freeit;
 	}
+
 	/* Don't send error in response to a multicast or broadcast packet */
 	if (n->m_flags & (M_BCAST|M_MCAST))
 		goto freeit;
@@ -232,6 +212,7 @@ mpls_icmp_error(struct mbuf *n, int type
 	 * Now, formulate icmp message
 	 */
 	icmplen = min(ICMP_EXT_OFFSET, ntohs(oip->ip_len));
+
 	/*
 	 * Defend against mbuf chains shorter than oip->ip_len - oiplen:
 	 */
@@ -252,7 +233,7 @@ mpls_icmp_error(struct mbuf *n, int type
 	 * icmp_sysctl will keep things below that limit.
 	 */
 
-	KASSERT (packetlen <= MCLBYTES);
+	KASSERT(packetlen <= MCLBYTES);
 
 	m = m_gethdr(M_DONTWAIT, MT_HEADER);
 	if (m && (packetlen > MHLEN)) {
@@ -264,6 +245,7 @@ mpls_icmp_error(struct mbuf *n, int type
 	}
 	if (m == NULL)
 		goto freeit;
+
 	MCLAIM(m, n->m_owner);
 	m->m_len = packetlen;
 	if ((m->m_flags & M_EXT) == 0)
@@ -351,6 +333,12 @@ ip4_check(struct mbuf *m)
 			return NULL;
 		iph = mtod(m, struct ip *);
 	}
+
+	/*
+	 * RFC1122: packets with a multicast source address are
+	 * not allowed.
+	 * RFC1122: 127/8 must not appear on wire.
+	 */
 	if (IN_MULTICAST(iph->ip_src.s_addr) ||
 	    (ntohl(iph->ip_dst.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET ||
 	    (ntohl(iph->ip_src.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET ||
@@ -374,7 +362,7 @@ mpls_ttl_dec(struct mbuf *m)
 {
 	union mpls_shim *mshim;
 #ifdef INET
-	union mpls_shim top_shim, bossh;
+	union mpls_shim top_shim, bos_shim;
 #endif
 
 	if (__predict_false(m->m_len < sizeof(union mpls_shim) &&
@@ -394,18 +382,18 @@ mpls_ttl_dec(struct mbuf *m)
 		/*
 		 * Shim ttl exceeded. Send back ICMP type 11 code 0.
 		 */
-		bossh.s_addr = mshim->s_addr;
+		bos_shim.s_addr = mshim->s_addr;
 		top_shim.s_addr = htonl(mshim->s_addr);
 		m_adj(m, sizeof(union mpls_shim));
 
 		/* Goto BOS */
-		while (bossh.shim.bos == 0) {
+		while (bos_shim.shim.bos == 0) {
 			if (m->m_len < sizeof(union mpls_shim) &&
 			    (m = m_pullup(m, sizeof(union mpls_shim))) == NULL) {
 				m_freem(m);
 				return NULL;
 			}
-			bossh.s_addr = ntohl(mtod(m, union mpls_shim *)->s_addr);
+			bos_shim.s_addr = ntohl(mtod(m, union mpls_shim *)->s_addr);
 			m_adj(m, sizeof(union mpls_shim));
 		}
 

Reply via email to