Deleted Added
full compact
ip6.h (57917) ip6.h (62587)
1/*
2 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the project nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * $FreeBSD: head/sys/netinet6/ip6.h 57917 2000-03-11 20:44:53Z shin $
30 */
1/* $FreeBSD: head/sys/netinet6/ip6.h 62587 2000-07-04 16:35:15Z itojun $ */
2/* $KAME: ip6.h,v 1.7 2000/03/25 07:23:36 sumikawa Exp $ */
31
3
32/*
33 * Copyright (c) 1982, 1986, 1993
34 * The Regents of the University of California. All rights reserved.
35 *
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
38 * are met:
39 * 1. Redistributions of source code must retain the above copyright
40 * notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 * notice, this list of conditions and the following disclaimer in the
43 * documentation and/or other materials provided with the distribution.
44 * 3. All advertising materials mentioning features or use of this software
45 * must display the following acknowledgement:
46 * This product includes software developed by the University of
47 * California, Berkeley and its contributors.
48 * 4. Neither the name of the University nor the names of its contributors
49 * may be used to endorse or promote products derived from this software
50 * without specific prior written permission.
51 *
52 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62 * SUCH DAMAGE.
63 *
64 * @(#)ip.h 8.1 (Berkeley) 6/10/93
65 */
66
67#ifndef _NETINET6_IPV6_H_
68#define _NETINET6_IPV6_H_
69
70#if !defined(_KERNEL) && !defined(__KAME_NETINET_IP6_H_INCLUDED_)
71#error "do not include netinet6/ip6.h directly, include netinet/ip6.h"
72#endif
73
74/*
75 * Definition for internet protocol version 6.
76 * RFC 2460
77 */
78
79struct ip6_hdr {
80 union {
81 struct ip6_hdrctl {
82 u_int32_t ip6_un1_flow; /* 4 bits version,
83 * 8 bits traffic
84 * class,
85 * 20 bits flow-ID */
86 u_int16_t ip6_un1_plen; /* payload length */
87 u_int8_t ip6_un1_nxt; /* next header */
88 u_int8_t ip6_un1_hlim; /* hop limit */
89 } ip6_un1;
90 u_int8_t ip6_un2_vfc; /* 4 bits version,
91 * top 4 bits trafic class */
92 } ip6_ctlun;
93 struct in6_addr ip6_src; /* source address */
94 struct in6_addr ip6_dst; /* destination address */
95};
96
97#define ip6_vfc ip6_ctlun.ip6_un2_vfc
98#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
99#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
100#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
101#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
102#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
103
104#define IPV6_VERSION 0x60
105#define IPV6_VERSION_MASK 0xf0
106
107#if BYTE_ORDER == BIG_ENDIAN
108#define IPV6_FLOWINFO_MASK 0x0fffffff /* flow info (28 bits) */
109#define IPV6_FLOWLABEL_MASK 0x000fffff /* flow label (20 bits) */
110#endif /* BIG_ENDIAN */
111#if BYTE_ORDER == LITTLE_ENDIAN
112#define IPV6_FLOWINFO_MASK 0xffffff0f /* flow info (28 bits) */
113#define IPV6_FLOWLABEL_MASK 0xffff0f00 /* flow label (20 bits) */
114#endif /* LITTLE_ENDIAN */
115/* ECN bits proposed by Sally Floyd */
116#define IP6TOS_CE 0x01 /* congestion experienced */
117#define IP6TOS_ECT 0x02 /* ECN-capable transport */
118
119/*
120 * Extension Headers
121 */
122
123struct ip6_ext {
124 u_char ip6e_nxt;
125 u_char ip6e_len;
126};
127
128/* Hop-by-Hop options header */
129/* XXX should we pad it to force alignment on an 8-byte boundary? */
130struct ip6_hbh {
131 u_int8_t ip6h_nxt; /* next header */
132 u_int8_t ip6h_len; /* length in units of 8 octets */
133 /* followed by options */
134};
135
136/* Destination options header */
137/* XXX should we pad it to force alignment on an 8-byte boundary? */
138struct ip6_dest {
139 u_int8_t ip6d_nxt; /* next header */
140 u_int8_t ip6d_len; /* length in units of 8 octets */
141 /* followed by options */
142};
143
144/* Option types and related macros */
145#define IP6OPT_PAD1 0x00 /* 00 0 00000 */
146#define IP6OPT_PADN 0x01 /* 00 0 00001 */
147#define IP6OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */
148#define IP6OPT_JUMBO_LEN 6
149#define IP6OPT_RTALERT 0x05 /* 00 0 00101 */
150#define IP6OPT_RTALERT_LEN 4
151#define IP6OPT_RTALERT_MLD 0 /* Datagram contains an MLD message */
152#define IP6OPT_RTALERT_RSVP 1 /* Datagram contains an RSVP message */
153#define IP6OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */
154#define IP6OPT_MINLEN 2
155
156#define IP6OPT_TYPE(o) ((o) & 0xC0)
157#define IP6OPT_TYPE_SKIP 0x00
158#define IP6OPT_TYPE_DISCARD 0x40
159#define IP6OPT_TYPE_FORCEICMP 0x80
160#define IP6OPT_TYPE_ICMP 0xC0
161
162#define IP6OPT_MUTABLE 0x20
163
164/* Routing header */
165struct ip6_rthdr {
166 u_int8_t ip6r_nxt; /* next header */
167 u_int8_t ip6r_len; /* length in units of 8 octets */
168 u_int8_t ip6r_type; /* routing type */
169 u_int8_t ip6r_segleft; /* segments left */
170 /* followed by routing type specific data */
171};
172
173/* Type 0 Routing header */
174struct ip6_rthdr0 {
175 u_int8_t ip6r0_nxt; /* next header */
176 u_int8_t ip6r0_len; /* length in units of 8 octets */
177 u_int8_t ip6r0_type; /* always zero */
178 u_int8_t ip6r0_segleft; /* segments left */
179 u_int8_t ip6r0_reserved; /* reserved field */
180 u_int8_t ip6r0_slmap[3]; /* strict/loose bit map */
181 struct in6_addr ip6r0_addr[1]; /* up to 23 addresses */
182};
183
184/* Fragment header */
185struct ip6_frag {
186 u_int8_t ip6f_nxt; /* next header */
187 u_int8_t ip6f_reserved; /* reserved field */
188 u_int16_t ip6f_offlg; /* offset, reserved, and flag */
189 u_int32_t ip6f_ident; /* identification */
190};
191
192#if BYTE_ORDER == BIG_ENDIAN
193#define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */
194#define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */
195#define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */
196#else /* BYTE_ORDER == LITTLE_ENDIAN */
197#define IP6F_OFF_MASK 0xf8ff /* mask out offset from _offlg */
198#define IP6F_RESERVED_MASK 0x0600 /* reserved bits in ip6f_offlg */
199#define IP6F_MORE_FRAG 0x0100 /* more-fragments flag */
200#endif /* BYTE_ORDER == LITTLE_ENDIAN */
201
202/*
203 * Internet implementation parameters.
204 */
205#define IPV6_MAXHLIM 255 /* maximun hoplimit */
206#define IPV6_DEFHLIM 64 /* default hlim */
207#define IPV6_FRAGTTL 120 /* ttl for fragment packets, in slowtimo tick */
208#define IPV6_HLIMDEC 1 /* subtracted when forwaeding */
209
210#define IPV6_MMTU 1280 /* minimal MTU and reassembly. 1024 + 256 */
211#define IPV6_MAXPACKET 65535 /* ip6 max packet size without Jumbo payload*/
212
213/*
214 * IP6_EXTHDR_CHECK ensures that region between the IP6 header and the
215 * target header (including IPv6 itself, extension headers and
216 * TCP/UDP/ICMP6 headers) are continuous. KAME requires drivers
217 * to store incoming data into one internal mbuf or one or more external
218 * mbufs(never into two or more internal mbufs). Thus, the third case is
219 * supposed to never be matched but is prepared just in case.
220 */
221
222#define IP6_EXTHDR_CHECK(m, off, hlen, ret) \
223do { \
224 if ((m)->m_next != NULL) { \
225 if (((m)->m_flags & M_LOOP) && \
226 ((m)->m_len < (off) + (hlen)) && \
227 (((m) = m_pullup((m), (off) + (hlen))) == NULL)) { \
228 ip6stat.ip6s_exthdrtoolong++; \
229 return ret; \
230 } else if ((m)->m_flags & M_EXT) { \
231 if ((m)->m_len < (off) + (hlen)) { \
232 ip6stat.ip6s_exthdrtoolong++; \
233 m_freem(m); \
234 return ret; \
235 } \
236 } else { \
237 if ((m)->m_len < (off) + (hlen)) { \
238 ip6stat.ip6s_exthdrtoolong++; \
239 m_freem(m); \
240 return ret; \
241 } \
242 } \
243 } else { \
244 if ((m)->m_len < (off) + (hlen)) { \
245 ip6stat.ip6s_tooshort++; \
246 in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_truncated); \
247 m_freem(m); \
248 return ret; \
249 } \
250 } \
251} while (0)
252
253#endif /* not _NETINET_IPV6_H_ */
4#error "netinet6/ip6.h is obsolete. use netinet/ip6.h"