Home | History | Annotate | Download | only in tcpdump
      1 /* @(#) $Header: /tcpdump/master/tcpdump/ip6.h,v 1.8 2007-08-29 02:31:44 mcr Exp $ (LBL) */
      2 /*	NetBSD: ip6.h,v 1.9 2000/07/13 05:34:21 itojun Exp 	*/
      3 /*	$KAME: ip6.h,v 1.9 2000/07/02 21:01:32 itojun Exp $	*/
      4 
      5 /*
      6  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
      7  * All rights reserved.
      8  *
      9  * Redistribution and use in source and binary forms, with or without
     10  * modification, are permitted provided that the following conditions
     11  * are met:
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  * 3. Neither the name of the project nor the names of its contributors
     18  *    may be used to endorse or promote products derived from this software
     19  *    without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
     22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
     25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     31  * SUCH DAMAGE.
     32  */
     33 
     34 /*
     35  * Copyright (c) 1982, 1986, 1993
     36  *	The Regents of the University of California.  All rights reserved.
     37  *
     38  * Redistribution and use in source and binary forms, with or without
     39  * modification, are permitted provided that the following conditions
     40  * are met:
     41  * 1. Redistributions of source code must retain the above copyright
     42  *    notice, this list of conditions and the following disclaimer.
     43  * 2. Redistributions in binary form must reproduce the above copyright
     44  *    notice, this list of conditions and the following disclaimer in the
     45  *    documentation and/or other materials provided with the distribution.
     46  * 3. All advertising materials mentioning features or use of this software
     47  *    must display the following acknowledgement:
     48  *	This product includes software developed by the University of
     49  *	California, Berkeley and its contributors.
     50  * 4. Neither the name of the University nor the names of its contributors
     51  *    may be used to endorse or promote products derived from this software
     52  *    without specific prior written permission.
     53  *
     54  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     55  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     56  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     57  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     58  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     59  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     60  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     61  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     62  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     63  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     64  * SUCH DAMAGE.
     65  *
     66  *	@(#)ip.h	8.1 (Berkeley) 6/10/93
     67  */
     68 
     69 #ifndef _NETINET_IP6_H_
     70 #define _NETINET_IP6_H_
     71 
     72 /*
     73  * Definition for internet protocol version 6.
     74  * RFC 2460
     75  */
     76 
     77 struct ip6_hdr {
     78 	union {
     79 		struct ip6_hdrctl {
     80 			u_int32_t ip6_un1_flow;	/* 20 bits of flow-ID */
     81 			u_int16_t ip6_un1_plen;	/* payload length */
     82 			u_int8_t  ip6_un1_nxt;	/* next header */
     83 			u_int8_t  ip6_un1_hlim;	/* hop limit */
     84 		} ip6_un1;
     85 		u_int8_t ip6_un2_vfc;	/* 4 bits version, top 4 bits class */
     86 	} ip6_ctlun;
     87 	struct in6_addr ip6_src;	/* source address */
     88 	struct in6_addr ip6_dst;	/* destination address */
     89 } UNALIGNED;
     90 
     91 #define ip6_vfc		ip6_ctlun.ip6_un2_vfc
     92 #define ip6_flow	ip6_ctlun.ip6_un1.ip6_un1_flow
     93 #define ip6_plen	ip6_ctlun.ip6_un1.ip6_un1_plen
     94 #define ip6_nxt		ip6_ctlun.ip6_un1.ip6_un1_nxt
     95 #define ip6_hlim	ip6_ctlun.ip6_un1.ip6_un1_hlim
     96 #define ip6_hops	ip6_ctlun.ip6_un1.ip6_un1_hlim
     97 
     98 /* in network endian */
     99 #define IPV6_FLOWINFO_MASK	((u_int32_t)htonl(0x0fffffff))	/* flow info (28 bits) */
    100 #define IPV6_FLOWLABEL_MASK	((u_int32_t)htonl(0x000fffff))	/* flow label (20 bits) */
    101 #if 1
    102 /* ECN bits proposed by Sally Floyd */
    103 #define IP6TOS_CE		0x01	/* congestion experienced */
    104 #define IP6TOS_ECT		0x02	/* ECN-capable transport */
    105 #endif
    106 
    107 /*
    108  * Extension Headers
    109  */
    110 
    111 struct	ip6_ext {
    112 	u_int8_t ip6e_nxt;
    113 	u_int8_t ip6e_len;
    114 } UNALIGNED;
    115 
    116 /* Hop-by-Hop options header */
    117 struct ip6_hbh {
    118 	u_int8_t ip6h_nxt;	/* next header */
    119 	u_int8_t ip6h_len;	/* length in units of 8 octets */
    120 	/* followed by options */
    121 } UNALIGNED;
    122 
    123 /* Destination options header */
    124 struct ip6_dest {
    125 	u_int8_t ip6d_nxt;	/* next header */
    126 	u_int8_t ip6d_len;	/* length in units of 8 octets */
    127 	/* followed by options */
    128 } UNALIGNED;
    129 
    130 /* Option types and related macros */
    131 #define IP6OPT_PAD1		0x00	/* 00 0 00000 */
    132 #define IP6OPT_PADN		0x01	/* 00 0 00001 */
    133 #define IP6OPT_JUMBO		0xC2	/* 11 0 00010 = 194 */
    134 #define IP6OPT_JUMBO_LEN	6
    135 #define IP6OPT_ROUTER_ALERT	0x05	/* 00 0 00101 */
    136 
    137 #define IP6OPT_RTALERT_LEN	4
    138 #define IP6OPT_RTALERT_MLD	0	/* Datagram contains an MLD message */
    139 #define IP6OPT_RTALERT_RSVP	1	/* Datagram contains an RSVP message */
    140 #define IP6OPT_RTALERT_ACTNET	2 	/* contains an Active Networks msg */
    141 #define IP6OPT_MINLEN		2
    142 
    143 #define IP6OPT_BINDING_UPDATE	0xc6	/* 11 0 00110 */
    144 #define IP6OPT_BINDING_ACK	0x07	/* 00 0 00111 */
    145 #define IP6OPT_BINDING_REQ	0x08	/* 00 0 01000 */
    146 #define IP6OPT_HOME_ADDRESS	0xc9	/* 11 0 01001 */
    147 #define IP6OPT_EID		0x8a	/* 10 0 01010 */
    148 
    149 #define IP6OPT_TYPE(o)		((o) & 0xC0)
    150 #define IP6OPT_TYPE_SKIP	0x00
    151 #define IP6OPT_TYPE_DISCARD	0x40
    152 #define IP6OPT_TYPE_FORCEICMP	0x80
    153 #define IP6OPT_TYPE_ICMP	0xC0
    154 
    155 #define IP6OPT_MUTABLE		0x20
    156 
    157 /* Routing header */
    158 struct ip6_rthdr {
    159 	u_int8_t  ip6r_nxt;	/* next header */
    160 	u_int8_t  ip6r_len;	/* length in units of 8 octets */
    161 	u_int8_t  ip6r_type;	/* routing type */
    162 	u_int8_t  ip6r_segleft;	/* segments left */
    163 	/* followed by routing type specific data */
    164 } UNALIGNED;
    165 
    166 /* Type 0 Routing header */
    167 struct ip6_rthdr0 {
    168 	u_int8_t  ip6r0_nxt;		/* next header */
    169 	u_int8_t  ip6r0_len;		/* length in units of 8 octets */
    170 	u_int8_t  ip6r0_type;		/* always zero */
    171 	u_int8_t  ip6r0_segleft;	/* segments left */
    172 	u_int8_t  ip6r0_reserved;	/* reserved field */
    173 	u_int8_t  ip6r0_slmap[3];	/* strict/loose bit map */
    174 	struct in6_addr ip6r0_addr[1];	/* up to 23 addresses */
    175 } UNALIGNED;
    176 
    177 /* Fragment header */
    178 struct ip6_frag {
    179 	u_int8_t  ip6f_nxt;		/* next header */
    180 	u_int8_t  ip6f_reserved;	/* reserved field */
    181 	u_int16_t ip6f_offlg;		/* offset, reserved, and flag */
    182 	u_int32_t ip6f_ident;		/* identification */
    183 } UNALIGNED;
    184 
    185 #define IP6F_OFF_MASK		0xfff8	/* mask out offset from ip6f_offlg */
    186 #define IP6F_RESERVED_MASK	0x0006	/* reserved bits in ip6f_offlg */
    187 #define IP6F_MORE_FRAG		0x0001	/* more-fragments flag */
    188 
    189 /* in print-ip6.c */
    190 extern int nextproto6_cksum(const struct ip6_hdr *, const u_int8_t *, u_int, u_int);
    191 
    192 #endif /* not _NETINET_IP6_H_ */
    193