Subversion Repositories SvarDOS

Rev

Rev 616 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
207 mateuszvis 1
/*!\file netinet6/in6.h
2
 *
3
 */
4
 
5
/*      $FreeBSD: src/sys/netinet6/in6.h,v 1.22 2002/07/25 20:40:09 ume Exp $   */
6
/*	$KAME: in6.h,v 1.89 2001/05/27 13:28:35 itojun Exp $	*/
7
 
8
/*
9
 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
10
 * All rights reserved.
11
 *
12
 * Redistribution and use in source and binary forms, with or without
13
 * modification, are permitted provided that the following conditions
14
 * are met:
15
 * 1. Redistributions of source code must retain the above copyright
16
 *    notice, this list of conditions and the following disclaimer.
17
 * 2. Redistributions in binary form must reproduce the above copyright
18
 *    notice, this list of conditions and the following disclaimer in the
19
 *    documentation and/or other materials provided with the distribution.
20
 * 3. Neither the name of the project nor the names of its contributors
21
 *    may be used to endorse or promote products derived from this software
22
 *    without specific prior written permission.
23
 *
24
 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
25
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
28
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34
 * SUCH DAMAGE.
35
 */
36
 
37
/*
38
 * Copyright (c) 1982, 1986, 1990, 1993
39
 *	The Regents of the University of California.  All rights reserved.
40
 *
41
 * Redistribution and use in source and binary forms, with or without
42
 * modification, are permitted provided that the following conditions
43
 * are met:
44
 * 1. Redistributions of source code must retain the above copyright
45
 *    notice, this list of conditions and the following disclaimer.
46
 * 2. Redistributions in binary form must reproduce the above copyright
47
 *    notice, this list of conditions and the following disclaimer in the
48
 *    documentation and/or other materials provided with the distribution.
49
 * 3. All advertising materials mentioning features or use of this software
50
 *    must display the following acknowledgement:
51
 *	This product includes software developed by the University of
52
 *	California, Berkeley and its contributors.
53
 * 4. Neither the name of the University nor the names of its contributors
54
 *    may be used to endorse or promote products derived from this software
55
 *    without specific prior written permission.
56
 *
57
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
58
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
59
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
60
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
61
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
62
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
63
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
64
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
65
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
66
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
67
 * SUCH DAMAGE.
68
 *
69
 *	@(#)in.h	8.3 (Berkeley) 1/3/94
70
 */
71
 
72
#ifndef _NETINET6_IN6_H_
73
#define _NETINET6_IN6_H_
74
 
75
/*
76
 * Identification of the network protocol stack
77
 * for *BSD-current/release: http://www.kame.net/dev/cvsweb.cgi/kame/COVERAGE
78
 * has the table of implementation/integration differences.
79
 */
80
#define __KAME__
81
#define __KAME_VERSION		"20010528/FreeBSD"
82
 
83
/*
84
 * Local port number conventions:
85
 *
86
 * Ports < IPPORT_RESERVED are reserved for privileged processes (e.g. root),
87
 * unless a kernel is compiled with IPNOPRIVPORTS defined.
88
 *
89
 * When a user does a bind(2) or connect(2) with a port number of zero,
90
 * a non-conflicting local port address is chosen.
91
 *
92
 * The default range is IPPORT_ANONMIN to IPPORT_ANONMAX, although
93
 * that is settable by sysctl(3); net.inet.ip.anonportmin and
94
 * net.inet.ip.anonportmax respectively.
95
 *
96
 * A user may set the IPPROTO_IP option IP_PORTRANGE to change this
97
 * default assignment range.
98
 *
99
 * The value IP_PORTRANGE_DEFAULT causes the default behavior.
100
 *
101
 * The value IP_PORTRANGE_HIGH is the same as IP_PORTRANGE_DEFAULT,
102
 * and exists only for FreeBSD compatibility purposes.
103
 *
104
 * The value IP_PORTRANGE_LOW changes the range to the "low" are
105
 * that is (by convention) restricted to privileged processes.
106
 * This convention is based on "vouchsafe" principles only.
107
 * It is only secure if you trust the remote host to restrict these ports.
108
 * The range is IPPORT_RESERVEDMIN to IPPORT_RESERVEDMAX.
109
 */
110
#if __BSD_VISIBLE
111
#define	IPV6PORT_RESERVED	1024
112
#define	IPV6PORT_ANONMIN	49152
113
#define	IPV6PORT_ANONMAX	65535
114
#define	IPV6PORT_RESERVEDMIN	600
115
#define	IPV6PORT_RESERVEDMAX	(IPV6PORT_RESERVED-1)
116
#endif
117
 
118
/*
119
 * IPv6 address
120
 */
121
struct in6_addr {
122
	union {
123
		uint8_t		__u6_addr8[16];
124
		uint16_t	__u6_addr16[8];
125
		uint32_t	__u6_addr32[4];
126
	} __u6_addr;			/* 128-bit IP6 address */
127
};
128
 
129
#define s6_addr   __u6_addr.__u6_addr8
130
#ifdef _KERNEL	/* XXX nonstandard */
131
#define s6_addr8  __u6_addr.__u6_addr8
132
#define s6_addr16 __u6_addr.__u6_addr16
133
#define s6_addr32 __u6_addr.__u6_addr32
134
#endif
135
 
136
#define INET6_ADDRSTRLEN	46
137
 
138
/*
139
 * XXX missing POSIX.1-2001 macro IPPROTO_IPV6.
140
 */
141
 
142
/*
143
 * Socket address for IPv6
144
 */
145
#if __BSD_VISIBLE
146
#define SIN6_LEN
147
#endif
148
 
149
struct sockaddr_in6 {
150
	uint8_t		sin6_len;	/* length of this struct */
151
	sa_family_t	sin6_family;	/* AF_INET6 */
152
	in_port_t	sin6_port;	/* Transport layer port # */
153
	uint32_t	sin6_flowinfo;	/* IP6 flow information */
154
	struct in6_addr	sin6_addr;	/* IP6 address */
155
	uint32_t	sin6_scope_id;	/* scope zone index */
156
};
157
 
158
/*
159
 * Local definition for masks
160
 */
161
#ifdef _KERNEL	/* XXX nonstandard */
162
#define IN6MASK0	{{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}}
163
#define IN6MASK32	{{{ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, \
164
			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}}
165
#define IN6MASK64	{{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
166
			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}}
167
#define IN6MASK96	{{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
168
			    0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }}}
169
#define IN6MASK128	{{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
170
			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }}}
171
#endif
172
 
173
#ifdef _KERNEL
174
extern const struct sockaddr_in6 sa6_any;
175
 
176
extern const struct in6_addr in6mask0;
177
extern const struct in6_addr in6mask32;
178
extern const struct in6_addr in6mask64;
179
extern const struct in6_addr in6mask96;
180
extern const struct in6_addr in6mask128;
181
#endif /* _KERNEL */
182
 
183
/*
184
 * Macros started with IPV6_ADDR is KAME local
185
 */
186
#ifdef _KERNEL	/* XXX nonstandard */
187
#if _BYTE_ORDER == _BIG_ENDIAN
188
#define IPV6_ADDR_INT32_ONE	1
189
#define IPV6_ADDR_INT32_TWO	2
190
#define IPV6_ADDR_INT32_MNL	0xff010000
191
#define IPV6_ADDR_INT32_MLL	0xff020000
192
#define IPV6_ADDR_INT32_SMP	0x0000ffff
193
#define IPV6_ADDR_INT16_ULL	0xfe80
194
#define IPV6_ADDR_INT16_USL	0xfec0
195
#define IPV6_ADDR_INT16_MLL	0xff02
196
#elif _BYTE_ORDER == _LITTLE_ENDIAN
197
#define IPV6_ADDR_INT32_ONE	0x01000000
198
#define IPV6_ADDR_INT32_TWO	0x02000000
199
#define IPV6_ADDR_INT32_MNL	0x000001ff
200
#define IPV6_ADDR_INT32_MLL	0x000002ff
201
#define IPV6_ADDR_INT32_SMP	0xffff0000
202
#define IPV6_ADDR_INT16_ULL	0x80fe
203
#define IPV6_ADDR_INT16_USL	0xc0fe
204
#define IPV6_ADDR_INT16_MLL	0x02ff
205
#endif
206
#endif
207
 
208
/*
209
 * Definition of some useful macros to handle IP6 addresses
210
 */
211
#if __BSD_VISIBLE
212
#define IN6ADDR_ANY_INIT \
213
	{{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
214
	    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}}
215
#define IN6ADDR_LOOPBACK_INIT \
216
	{{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
217
	    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
218
#define IN6ADDR_NODELOCAL_ALLNODES_INIT \
219
	{{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
220
	    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
221
#define IN6ADDR_LINKLOCAL_ALLNODES_INIT \
222
	{{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
223
	    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
224
#define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \
225
	{{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
226
	    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}}
227
#endif
228
 
229
extern const struct in6_addr in6addr_any;
230
extern const struct in6_addr in6addr_loopback;
231
#if __BSD_VISIBLE
232
extern const struct in6_addr in6addr_nodelocal_allnodes;
233
extern const struct in6_addr in6addr_linklocal_allnodes;
234
extern const struct in6_addr in6addr_linklocal_allrouters;
235
#endif
236
 
237
/*
238
 * Equality
239
 * NOTE: Some of kernel programming environment (for example, openbsd/sparc)
240
 * does not supply memcmp().  For userland memcmp() is preferred as it is
241
 * in ANSI standard.
242
 */
243
#ifdef _KERNEL
244
#define IN6_ARE_ADDR_EQUAL(a, b)			\
245
    (bcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0)
246
#else
247
#if __BSD_VISIBLE
248
#define IN6_ARE_ADDR_EQUAL(a, b)			\
249
    (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0)
250
#endif
251
#endif
252
 
253
#ifdef _KERNEL			/* non standard */
254
/* see if two addresses are equal in a scope-conscious manner. */
255
#define SA6_ARE_ADDR_EQUAL(a, b) \
256
	(((a)->sin6_scope_id == 0 || (b)->sin6_scope_id == 0 || \
257
	  ((a)->sin6_scope_id == (b)->sin6_scope_id)) && \
258
	 (bcmp(&(a)->sin6_addr, &(b)->sin6_addr, sizeof(struct in6_addr)) == 0))
259
#endif
260
 
261
/*
262
 * Unspecified
263
 */
264
#define IN6_IS_ADDR_UNSPECIFIED(a)	\
265
	((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) &&	\
266
	 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) &&	\
267
	 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) &&	\
268
	 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) == 0))
269
 
270
/*
271
 * Loopback
272
 */
273
#define IN6_IS_ADDR_LOOPBACK(a)		\
274
	((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) &&	\
275
	 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) &&	\
276
	 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) &&	\
277
	 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) == ntohl(1)))
278
 
279
/*
280
 * IPv4 compatible
281
 */
282
#define IN6_IS_ADDR_V4COMPAT(a)		\
283
	((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) &&	\
284
	 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) &&	\
285
	 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) &&	\
286
	 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) != 0) &&	\
287
	 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) != ntohl(1)))
288
 
289
/*
290
 * Mapped
291
 */
292
#define IN6_IS_ADDR_V4MAPPED(a)		      \
293
	((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) &&	\
294
	 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) &&	\
295
	 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == ntohl(0x0000ffff)))
296
 
297
/*
298
 * KAME Scope Values
299
 */
300
 
301
#ifdef _KERNEL	/* XXX nonstandard */
302
#define IPV6_ADDR_SCOPE_NODELOCAL	0x01
303
#define IPV6_ADDR_SCOPE_LINKLOCAL	0x02
304
#define IPV6_ADDR_SCOPE_SITELOCAL	0x05
305
#define IPV6_ADDR_SCOPE_ORGLOCAL	0x08	/* just used in this file */
306
#define IPV6_ADDR_SCOPE_GLOBAL		0x0e
307
#else
308
#define __IPV6_ADDR_SCOPE_NODELOCAL	0x01
309
#define __IPV6_ADDR_SCOPE_LINKLOCAL	0x02
310
#define __IPV6_ADDR_SCOPE_SITELOCAL	0x05
311
#define __IPV6_ADDR_SCOPE_ORGLOCAL	0x08	/* just used in this file */
312
#define __IPV6_ADDR_SCOPE_GLOBAL	0x0e
313
#endif
314
 
315
/*
316
 * Unicast Scope
317
 * Note that we must check topmost 10 bits only, not 16 bits (see RFC2373).
318
 */
319
#define IN6_IS_ADDR_LINKLOCAL(a)	\
320
	(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
321
#define IN6_IS_ADDR_SITELOCAL(a)	\
322
	(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
323
 
324
/*
325
 * Multicast
326
 */
327
#define IN6_IS_ADDR_MULTICAST(a)	((a)->s6_addr[0] == 0xff)
328
 
329
#ifdef _KERNEL	/* XXX nonstandard */
330
#define IPV6_ADDR_MC_SCOPE(a)		((a)->s6_addr[1] & 0x0f)
331
#else
332
#define __IPV6_ADDR_MC_SCOPE(a)		((a)->s6_addr[1] & 0x0f)
333
#endif
334
 
335
/*
336
 * Multicast Scope
337
 */
338
#ifdef _KERNEL	/* refers nonstandard items */
339
#define IN6_IS_ADDR_MC_NODELOCAL(a)	\
340
	(IN6_IS_ADDR_MULTICAST(a) &&	\
341
	 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_NODELOCAL))
342
#define IN6_IS_ADDR_MC_LINKLOCAL(a)	\
343
	(IN6_IS_ADDR_MULTICAST(a) &&	\
344
	 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_LINKLOCAL))
345
#define IN6_IS_ADDR_MC_SITELOCAL(a)	\
346
	(IN6_IS_ADDR_MULTICAST(a) && 	\
347
	 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_SITELOCAL))
348
#define IN6_IS_ADDR_MC_ORGLOCAL(a)	\
349
	(IN6_IS_ADDR_MULTICAST(a) &&	\
350
	 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_ORGLOCAL))
351
#define IN6_IS_ADDR_MC_GLOBAL(a)	\
352
	(IN6_IS_ADDR_MULTICAST(a) &&	\
353
	 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_GLOBAL))
354
#else
355
#define IN6_IS_ADDR_MC_NODELOCAL(a)	\
356
	(IN6_IS_ADDR_MULTICAST(a) &&	\
357
	 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL))
358
#define IN6_IS_ADDR_MC_LINKLOCAL(a)	\
359
	(IN6_IS_ADDR_MULTICAST(a) &&	\
360
	 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL))
361
#define IN6_IS_ADDR_MC_SITELOCAL(a)	\
362
	(IN6_IS_ADDR_MULTICAST(a) && 	\
363
	 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL))
364
#define IN6_IS_ADDR_MC_ORGLOCAL(a)	\
365
	(IN6_IS_ADDR_MULTICAST(a) &&	\
366
	 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL))
367
#define IN6_IS_ADDR_MC_GLOBAL(a)	\
368
	(IN6_IS_ADDR_MULTICAST(a) &&	\
369
	 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL))
370
#endif
371
 
372
#ifdef _KERNEL	/* nonstandard */
373
/*
374
 * KAME Scope
375
 */
376
#define IN6_IS_SCOPE_LINKLOCAL(a)	\
377
	((IN6_IS_ADDR_LINKLOCAL(a)) ||	\
378
	 (IN6_IS_ADDR_MC_LINKLOCAL(a)))
379
 
380
#define IFA6_IS_DEPRECATED(a) \
381
	((a)->ia6_lifetime.ia6t_preferred != 0 && \
382
	 (a)->ia6_lifetime.ia6t_preferred < time_second)
383
#define IFA6_IS_INVALID(a) \
384
	((a)->ia6_lifetime.ia6t_expire != 0 && \
385
	 (a)->ia6_lifetime.ia6t_expire < time_second)
386
#endif /* _KERNEL */
387
 
388
/*
389
 * IP6 route structure
390
 */
391
struct route_in6 {
392
	struct	rtentry *ro_rt;
393
	struct	sockaddr_in6 ro_dst;
394
};
395
 
396
/*
397
 * Options for use with [gs]etsockopt at the IPV6 level.
398
 * First word of comment is data type; bool is stored in int.
399
 */
400
#define IPV6_JOIN_GROUP		12 /* ip6_mreq; join a group membership */
401
#define IPV6_LEAVE_GROUP	13 /* ip6_mreq; leave a group membership */
402
#define IPV6_MULTICAST_HOPS	10 /* int; set/get IP6 multicast hops */
403
#define IPV6_MULTICAST_IF	9  /* u_int; set/get IP6 multicast i/f  */
404
#define IPV6_MULTICAST_LOOP	11 /* u_int; set/get IP6 multicast loopback */
405
#define IPV6_UNICAST_HOPS	4  /* int; IP6 hops */
406
#define IPV6_V6ONLY		27 /* bool; only bind INET6 at wildcard bind */
407
 
408
#if __BSD_VISIBLE
409
/* no hdrincl */
410
#if 0 /* the followings are relic in IPv4 and hence are disabled */
411
#define IPV6_OPTIONS		1  /* buf/ip6_opts; set/get IP6 options */
412
#define IPV6_RECVOPTS		5  /* bool; receive all IP6 opts w/dgram */
413
#define IPV6_RECVRETOPTS	6  /* bool; receive IP6 opts for response */
414
#define IPV6_RECVDSTADDR	7  /* bool; receive IP6 dst addr w/dgram */
415
#define IPV6_RETOPTS		8  /* ip6_opts; set/get IP6 options */
416
#endif
417
#define IPV6_SOCKOPT_RESERVED1	3  /* reserved for future use */
418
#define IPV6_PORTRANGE		14 /* int; range to choose for unspec port */
419
#define ICMP6_FILTER		18 /* icmp6_filter; icmp6 filter */
420
/* RFC2292 options */
421
#define IPV6_PKTINFO		19 /* bool; send/recv if, src/dst addr */
422
#define IPV6_HOPLIMIT		20 /* bool; hop limit */
423
#define IPV6_NEXTHOP		21 /* bool; next hop addr */
424
#define IPV6_HOPOPTS		22 /* bool; hop-by-hop option */
425
#define IPV6_DSTOPTS		23 /* bool; destination option */
426
#define IPV6_RTHDR		24 /* bool; routing header */
427
#define IPV6_PKTOPTIONS		25 /* buf/cmsghdr; set/get IPv6 options */
428
 
429
#define IPV6_CHECKSUM		26 /* int; checksum offset for raw socket */
430
#ifndef _KERNEL
431
#define IPV6_BINDV6ONLY		IPV6_V6ONLY
432
#endif
433
 
434
#if 1 /* IPSEC */
435
#define IPV6_IPSEC_POLICY	28 /* struct; get/set security policy */
436
#endif
437
#define IPV6_FAITH		29 /* bool; accept FAITH'ed connections */
438
 
439
#if 1 /* IPV6FIREWALL */
440
#define IPV6_FW_ADD		30 /* add a firewall rule to chain */
441
#define IPV6_FW_DEL		31 /* delete a firewall rule from chain */
442
#define IPV6_FW_FLUSH		32 /* flush firewall rule chain */
443
#define IPV6_FW_ZERO		33 /* clear single/all firewall counter(s) */
444
#define IPV6_FW_GET		34 /* get entire firewall rule chain */
445
#endif
446
 
447
/* to define items, should talk with KAME guys first, for *BSD compatibility */
448
 
449
#define IPV6_RTHDR_LOOSE     0 /* this hop need not be a neighbor. XXX old spec */
450
#define IPV6_RTHDR_STRICT    1 /* this hop must be a neighbor. XXX old spec */
451
#define IPV6_RTHDR_TYPE_0    0 /* IPv6 routing header type 0 */
452
 
453
/*
454
 * Defaults and limits for options
455
 */
456
#define IPV6_DEFAULT_MULTICAST_HOPS 1	/* normally limit m'casts to 1 hop */
457
#define IPV6_DEFAULT_MULTICAST_LOOP 1	/* normally hear sends if a member */
458
 
459
/*
460
 * Argument structure for IPV6_JOIN_GROUP and IPV6_LEAVE_GROUP.
461
 */
462
struct ipv6_mreq {
463
	struct in6_addr	ipv6mr_multiaddr;
464
	unsigned int	ipv6mr_interface;
465
};
466
 
467
/*
468
 * IPV6_PKTINFO: Packet information(RFC2292 sec 5)
469
 */
470
struct in6_pktinfo {
471
	struct in6_addr	ipi6_addr;	/* src/dst IPv6 address */
472
	unsigned int	ipi6_ifindex;	/* send/recv interface index */
473
};
474
 
475
/*
476
 * Argument for IPV6_PORTRANGE:
477
 * - which range to search when port is unspecified at bind() or connect()
478
 */
479
#define	IPV6_PORTRANGE_DEFAULT	0	/* default range */
480
#define	IPV6_PORTRANGE_HIGH	1	/* "high" - request firewall bypass */
481
#define	IPV6_PORTRANGE_LOW	2	/* "low" - vouchsafe security */
482
 
483
/*
484
 * Definitions for inet6 sysctl operations.
485
 *
486
 * Third level is protocol number.
487
 * Fourth level is desired variable within that protocol.
488
 */
489
#define IPV6PROTO_MAXID	(IPPROTO_PIM + 1)	/* don't list to IPV6PROTO_MAX */
490
 
491
#define CTL_IPV6PROTO_NAMES { \
492
	{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
493
	{ 0, 0 }, \
494
	{ "tcp6", CTLTYPE_NODE }, \
495
	{ 0, 0 }, \
496
	{ 0, 0 }, \
497
	{ 0, 0 }, \
498
	{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
499
	{ 0, 0 }, \
500
	{ 0, 0 }, \
501
	{ "udp6", CTLTYPE_NODE }, \
502
	{ 0, 0 }, \
503
	{ 0, 0 }, \
504
	{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
505
	{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
506
	{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
507
	{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
508
	{ 0, 0 }, \
509
	{ "ip6", CTLTYPE_NODE }, \
510
	{ 0, 0 }, \
511
	{ 0, 0 }, \
512
	{ 0, 0 }, \
513
	{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
514
	{ 0, 0 }, \
515
	{ "ipsec6", CTLTYPE_NODE }, \
516
	{ 0, 0 }, \
517
	{ 0, 0 }, \
518
	{ 0, 0 }, \
519
	{ 0, 0 }, \
520
	{ 0, 0 }, \
521
	{ 0, 0 }, \
522
	{ "icmp6", CTLTYPE_NODE }, \
523
	{ 0, 0 }, \
524
	{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
525
	{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
526
	{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
527
	{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
528
	{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
529
	{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
530
	{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
531
	{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
532
	{ 0, 0 }, \
533
	{ 0, 0 }, \
534
	{ 0, 0 }, \
535
	{ "pim6", CTLTYPE_NODE }, \
536
}
537
 
538
/*
539
 * Names for IP sysctl objects
540
 */
541
#define IPV6CTL_FORWARDING	1	/* act as router */
542
#define IPV6CTL_SENDREDIRECTS	2	/* may send redirects when forwarding*/
543
#define IPV6CTL_DEFHLIM		3	/* default Hop-Limit */
544
#ifdef notyet
545
#define IPV6CTL_DEFMTU		4	/* default MTU */
546
#endif
547
#define IPV6CTL_FORWSRCRT	5	/* forward source-routed dgrams */
548
#define IPV6CTL_STATS		6	/* stats */
549
#define IPV6CTL_MRTSTATS	7	/* multicast forwarding stats */
550
#define IPV6CTL_MRTPROTO	8	/* multicast routing protocol */
551
#define IPV6CTL_MAXFRAGPACKETS	9	/* max packets reassembly queue */
552
#define IPV6CTL_SOURCECHECK	10	/* verify source route and intf */
553
#define IPV6CTL_SOURCECHECK_LOGINT 11	/* minimume logging interval */
554
#define IPV6CTL_ACCEPT_RTADV	12
555
#define IPV6CTL_KEEPFAITH	13
556
#define IPV6CTL_LOG_INTERVAL	14
557
#define IPV6CTL_HDRNESTLIMIT	15
558
#define IPV6CTL_DAD_COUNT	16
559
#define IPV6CTL_AUTO_FLOWLABEL	17
560
#define IPV6CTL_DEFMCASTHLIM	18
561
#define IPV6CTL_GIF_HLIM	19	/* default HLIM for gif encap packet */
562
#define IPV6CTL_KAME_VERSION	20
563
#define IPV6CTL_USE_DEPRECATED	21	/* use deprecated addr (RFC2462 5.5.4) */
564
#define IPV6CTL_RR_PRUNE	22	/* walk timer for router renumbering */
565
#if 0	/* obsolete */
566
#define IPV6CTL_MAPPED_ADDR	23
567
#endif
568
#define IPV6CTL_V6ONLY		24
569
#define IPV6CTL_RTEXPIRE	25	/* cloned route expiration time */
570
#define IPV6CTL_RTMINEXPIRE	26	/* min value for expiration time */
571
#define IPV6CTL_RTMAXCACHE	27	/* trigger level for dynamic expire */
572
 
573
#define IPV6CTL_USETEMPADDR	32	/* use temporary addresses (RFC3041) */
574
#define IPV6CTL_TEMPPLTIME	33	/* preferred lifetime for tmpaddrs */
575
#define IPV6CTL_TEMPVLTIME	34	/* valid lifetime for tmpaddrs */
576
#define IPV6CTL_AUTO_LINKLOCAL	35	/* automatic link-local addr assign */
577
#define IPV6CTL_RIP6STATS	36	/* raw_ip6 stats */
578
 
579
/* New entries should be added here from current IPV6CTL_MAXID value. */
580
/* to define items, should talk with KAME guys first, for *BSD compatibility */
581
#define IPV6CTL_MAXID		37
582
 
583
/*
584
 * Redefinition of mbuf flags
585
 */
586
#define	M_AUTHIPHDR	M_PROTO2
587
#define	M_DECRYPTED	M_PROTO3
588
#define	M_LOOP		M_PROTO4
589
#define	M_AUTHIPDGM	M_PROTO5
590
 
591
#ifdef _KERNEL
592
struct cmsghdr;
593
 
594
int	in6_cksum __P((struct mbuf *, u_int8_t, u_int32_t, u_int32_t));
595
int	in6_localaddr __P((struct in6_addr *));
596
int	in6_addrscope __P((struct in6_addr *));
597
struct	in6_ifaddr *in6_ifawithscope __P((struct ifnet *, struct in6_addr *));
598
struct	in6_ifaddr *in6_ifawithifp __P((struct ifnet *, struct in6_addr *));
599
extern void in6_if_up __P((struct ifnet *));
600
struct sockaddr;
601
extern	u_char	ip6_protox[];
602
 
603
void	in6_sin6_2_sin __P((struct sockaddr_in *sin,
604
			    struct sockaddr_in6 *sin6));
605
void	in6_sin_2_v4mapsin6 __P((struct sockaddr_in *sin,
606
				 struct sockaddr_in6 *sin6));
607
void	in6_sin6_2_sin_in_sock __P((struct sockaddr *nam));
608
void	in6_sin_2_v4mapsin6_in_sock __P((struct sockaddr **nam));
609
 
610
#define	satosin6(sa)	((struct sockaddr_in6 *)(sa))
611
#define	sin6tosa(sin6)	((struct sockaddr *)(sin6))
612
#define	ifatoia6(ifa)	((struct in6_ifaddr *)(ifa))
613
 
614
extern int	(*faithprefix_p)(struct in6_addr *);
615
#endif /* _KERNEL */
616
 
617
#ifdef _BSD_SIZE_T_
618
typedef	_BSD_SIZE_T_	size_t;
619
#undef _BSD_SIZE_T_
620
#endif
621
 
622
__BEGIN_DECLS
623
struct cmsghdr;
624
 
625
extern int inet6_option_space __P((int));
626
extern int inet6_option_init __P((void *, struct cmsghdr **, int));
627
extern int inet6_option_append __P((struct cmsghdr *, const uint8_t *,
628
	int, int));
629
extern uint8_t *inet6_option_alloc __P((struct cmsghdr *, int, int, int));
630
extern int inet6_option_next __P((const struct cmsghdr *, uint8_t **));
631
extern int inet6_option_find __P((const struct cmsghdr *, uint8_t **, int));
632
 
633
extern size_t inet6_rthdr_space __P((int, int));
634
extern struct cmsghdr *inet6_rthdr_init __P((void *, int));
635
extern int inet6_rthdr_add __P((struct cmsghdr *, const struct in6_addr *,
636
		unsigned int));
637
extern int inet6_rthdr_lasthop __P((struct cmsghdr *, unsigned int));
638
#if 0 /* not implemented yet */
639
extern int inet6_rthdr_reverse __P((const struct cmsghdr *, struct cmsghdr *));
640
#endif
641
extern int inet6_rthdr_segments __P((const struct cmsghdr *));
642
extern struct in6_addr *inet6_rthdr_getaddr __P((struct cmsghdr *, int));
643
extern int inet6_rthdr_getflags __P((const struct cmsghdr *, int));
644
 
645
extern int inet6_opt_init __P((void *, size_t));
646
extern int inet6_opt_append __P((void *, size_t, int, uint8_t,
647
				 size_t, uint8_t, void **));
648
extern int inet6_opt_finish __P((void *, size_t, int));
649
extern int inet6_opt_set_val __P((void *, size_t, void *, int));
650
 
651
extern int inet6_opt_next __P((void *, size_t, int, uint8_t *,
652
			       size_t *, void **));
653
extern int inet6_opt_find __P((void *, size_t, int, uint8_t,
654
			  size_t *, void **));
655
extern int inet6_opt_get_val __P((void *, size_t, void *, int));
656
extern size_t inet6_rth_space __P((int, int));
657
extern void *inet6_rth_init __P((void *, int, int, int));
658
extern int inet6_rth_add __P((void *, const struct in6_addr *));
659
extern int inet6_rth_reverse __P((const void *, void *));
660
extern int inet6_rth_segments __P((const void *));
661
extern struct in6_addr *inet6_rth_getaddr __P((const void *, int));
662
__END_DECLS
663
 
664
#endif /* __BSD_VISIBLE */
665
 
666
#endif /* !_NETINET6_IN6_H_ */