Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/netinet/ip6.h
39475 views
1
/* $KAME: ip6.h,v 1.18 2001/03/29 05:34:30 itojun Exp $ */
2
3
/*-
4
* SPDX-License-Identifier: BSD-3-Clause
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. Neither the name of the University nor the names of its contributors
47
* may be used to endorse or promote products derived from this software
48
* without specific prior written permission.
49
*
50
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
51
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
52
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
53
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
54
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
55
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
56
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
57
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
58
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
59
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
60
* SUCH DAMAGE.
61
*/
62
63
#ifndef _NETINET_IP6_H_
64
#define _NETINET_IP6_H_
65
66
/*
67
* Definition for internet protocol version 6.
68
* RFC 2460
69
*/
70
71
struct ip6_hdr {
72
union {
73
struct ip6_hdrctl {
74
u_int32_t ip6_un1_flow; /* 20 bits of flow-ID */
75
u_int16_t ip6_un1_plen; /* payload length */
76
u_int8_t ip6_un1_nxt; /* next header */
77
u_int8_t ip6_un1_hlim; /* hop limit */
78
} ip6_un1;
79
u_int8_t ip6_un2_vfc; /* 4 bits version, top 4 bits class */
80
} ip6_ctlun;
81
struct in6_addr ip6_src; /* source address */
82
struct in6_addr ip6_dst; /* destination address */
83
} __packed;
84
85
#define ip6_vfc ip6_ctlun.ip6_un2_vfc
86
#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
87
#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
88
#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
89
#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
90
#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
91
92
#define IPV6_VERSION 0x60
93
#define IPV6_VERSION_MASK 0xf0
94
95
#if BYTE_ORDER == BIG_ENDIAN
96
#define IPV6_FLOWINFO_MASK 0x0fffffff /* flow info (28 bits) */
97
#define IPV6_FLOWLABEL_MASK 0x000fffff /* flow label (20 bits) */
98
#define IPV6_ECN_MASK 0x00300000 /* ECN code point (2 bits) */
99
#else
100
#if BYTE_ORDER == LITTLE_ENDIAN
101
#define IPV6_FLOWINFO_MASK 0xffffff0f /* flow info (28 bits) */
102
#define IPV6_FLOWLABEL_MASK 0xffff0f00 /* flow label (20 bits) */
103
#define IPV6_ECN_MASK 0x00003000 /* ECN code point (2 bits) */
104
#endif /* LITTLE_ENDIAN */
105
#endif
106
#define IPV6_FLOWLABEL_LEN 20
107
108
#define IPV6_TRAFFIC_CLASS(ip6) ((ntohl((ip6)->ip6_flow) >> IPV6_FLOWLABEL_LEN) & 0xff)
109
#define IPV6_DSCP(ip6) ((ntohl((ip6)->ip6_flow) >> IPV6_FLOWLABEL_LEN) & 0xfc)
110
#define IPV6_ECN(ip6) ((ntohl((ip6)->ip6_flow) >> IPV6_FLOWLABEL_LEN) & 0x03)
111
112
/*
113
* Extension Headers
114
*/
115
116
struct ip6_ext {
117
u_int8_t ip6e_nxt;
118
u_int8_t ip6e_len;
119
} __packed;
120
121
/* Hop-by-Hop options header */
122
/* XXX should we pad it to force alignment on an 8-byte boundary? */
123
struct ip6_hbh {
124
u_int8_t ip6h_nxt; /* next header */
125
u_int8_t ip6h_len; /* length in units of 8 octets */
126
/* followed by options */
127
} __packed;
128
129
/* Destination options header */
130
/* XXX should we pad it to force alignment on an 8-byte boundary? */
131
struct ip6_dest {
132
u_int8_t ip6d_nxt; /* next header */
133
u_int8_t ip6d_len; /* length in units of 8 octets */
134
/* followed by options */
135
} __packed;
136
137
/* Option types and related macros */
138
#define IP6OPT_PAD1 0x00 /* 00 0 00000 */
139
#define IP6OPT_PADN 0x01 /* 00 0 00001 */
140
#define IP6OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */
141
#define IP6OPT_NSAP_ADDR 0xC3 /* 11 0 00011 */
142
#define IP6OPT_TUNNEL_LIMIT 0x04 /* 00 0 00100 */
143
#ifndef _KERNEL
144
#define IP6OPT_RTALERT 0x05 /* 00 0 00101 (KAME definition) */
145
#endif
146
#define IP6OPT_ROUTER_ALERT 0x05 /* 00 0 00101 (RFC3542, recommended) */
147
148
#define IP6OPT_RTALERT_LEN 4
149
#define IP6OPT_RTALERT_MLD 0 /* Datagram contains an MLD message */
150
#define IP6OPT_RTALERT_RSVP 1 /* Datagram contains an RSVP message */
151
#define IP6OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */
152
#define IP6OPT_MINLEN 2
153
154
#define IP6OPT_EID 0x8a /* 10 0 01010 */
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
/* IPv6 options: common part */
165
struct ip6_opt {
166
u_int8_t ip6o_type;
167
u_int8_t ip6o_len;
168
} __packed;
169
170
/* Jumbo Payload Option */
171
struct ip6_opt_jumbo {
172
u_int8_t ip6oj_type;
173
u_int8_t ip6oj_len;
174
u_int8_t ip6oj_jumbo_len[4];
175
} __packed;
176
#define IP6OPT_JUMBO_LEN 6
177
178
/* NSAP Address Option */
179
struct ip6_opt_nsap {
180
u_int8_t ip6on_type;
181
u_int8_t ip6on_len;
182
u_int8_t ip6on_src_nsap_len;
183
u_int8_t ip6on_dst_nsap_len;
184
/* followed by source NSAP */
185
/* followed by destination NSAP */
186
} __packed;
187
188
/* Tunnel Limit Option */
189
struct ip6_opt_tunnel {
190
u_int8_t ip6ot_type;
191
u_int8_t ip6ot_len;
192
u_int8_t ip6ot_encap_limit;
193
} __packed;
194
195
/* Router Alert Option */
196
struct ip6_opt_router {
197
u_int8_t ip6or_type;
198
u_int8_t ip6or_len;
199
u_int8_t ip6or_value[2];
200
} __packed;
201
/* Router alert values (in network byte order) */
202
#if BYTE_ORDER == BIG_ENDIAN
203
#define IP6_ALERT_MLD 0x0000
204
#define IP6_ALERT_RSVP 0x0001
205
#define IP6_ALERT_AN 0x0002
206
#else
207
#if BYTE_ORDER == LITTLE_ENDIAN
208
#define IP6_ALERT_MLD 0x0000
209
#define IP6_ALERT_RSVP 0x0100
210
#define IP6_ALERT_AN 0x0200
211
#endif /* LITTLE_ENDIAN */
212
#endif
213
214
/* Routing header */
215
struct ip6_rthdr {
216
u_int8_t ip6r_nxt; /* next header */
217
u_int8_t ip6r_len; /* length in units of 8 octets */
218
u_int8_t ip6r_type; /* routing type */
219
u_int8_t ip6r_segleft; /* segments left */
220
/* followed by routing type specific data */
221
} __packed;
222
223
/* Type 0 Routing header, deprecated by RFC 5095. */
224
struct ip6_rthdr0 {
225
u_int8_t ip6r0_nxt; /* next header */
226
u_int8_t ip6r0_len; /* length in units of 8 octets */
227
u_int8_t ip6r0_type; /* always zero */
228
u_int8_t ip6r0_segleft; /* segments left */
229
u_int32_t ip6r0_reserved; /* reserved field */
230
/* followed by up to 127 struct in6_addr */
231
} __packed;
232
233
/* Fragment header */
234
struct ip6_frag {
235
u_int8_t ip6f_nxt; /* next header */
236
u_int8_t ip6f_reserved; /* reserved field */
237
u_int16_t ip6f_offlg; /* offset, reserved, and flag */
238
u_int32_t ip6f_ident; /* identification */
239
} __packed;
240
241
#if BYTE_ORDER == BIG_ENDIAN
242
#define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */
243
#define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */
244
#define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */
245
#else /* BYTE_ORDER == LITTLE_ENDIAN */
246
#define IP6F_OFF_MASK 0xf8ff /* mask out offset from _offlg */
247
#define IP6F_RESERVED_MASK 0x0600 /* reserved bits in ip6f_offlg */
248
#define IP6F_MORE_FRAG 0x0100 /* more-fragments flag */
249
#endif /* BYTE_ORDER == LITTLE_ENDIAN */
250
251
/*
252
* Internet implementation parameters.
253
*/
254
#define IPV6_MAXHLIM 255 /* maximum hoplimit */
255
#define IPV6_DEFHLIM 64 /* default hlim */
256
#define IPV6_DEFFRAGTTL 60000 /* Default fragment packets lifetime, in milliseconds */
257
#define IPV6_HLIMDEC 1 /* subtracted when forwarding */
258
259
#define IPV6_MMTU 1280 /* minimal MTU and reassembly. 1024 + 256 */
260
#define IPV6_MAXPACKET 65535 /* ip6 max packet size without Jumbo payload*/
261
#define IPV6_MAXOPTHDR 2048 /* max option header size, 256 64-bit words */
262
263
#endif /* not _NETINET_IP6_H_ */
264
265