Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys Move the ICMP Extension structures from mpls_ttl.c to ip...



details:   https://anonhg.NetBSD.org/src/rev/69c551a8adfe
branches:  trunk
changeset: 829145:69c551a8adfe
user:      maxv <maxv%NetBSD.org@localhost>
date:      Fri Jan 19 10:54:31 2018 +0000

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

diffstat:

 sys/netinet/ip_icmp.h  |   36 +++++++++++++++-
 sys/netmpls/mpls_ttl.c |  110 +++++++++++++++++++++---------------------------
 2 files changed, 84 insertions(+), 62 deletions(-)

diffs (274 lines):

diff -r e229704ff401 -r 69c551a8adfe sys/netinet/ip_icmp.h
--- a/sys/netinet/ip_icmp.h     Fri Jan 19 10:21:24 2018 +0000
+++ b/sys/netinet/ip_icmp.h     Fri Jan 19 10:54:31 2018 +0000
@@ -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 @@
        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 @@
 #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
diff -r e229704ff401 -r 69c551a8adfe sys/netmpls/mpls_ttl.c
--- a/sys/netmpls/mpls_ttl.c    Fri Jan 19 10:21:24 2018 +0000
+++ b/sys/netmpls/mpls_ttl.c    Fri Jan 19 10:54:31 2018 +0000
@@ -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 @@
 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 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 @@
 #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 @@
                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 @@
         * 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 @@
         * 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 @@
        }
        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 @@
                        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 @@
 {
        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 @@
                /*
                 * 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));
                }
 



Home | Main Index | Thread Index | Old Index