xref: /minix3/external/bsd/bind/dist/lib/isc/include/isc/ipv6.h (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: ipv6.h,v 1.4 2014/12/10 04:38:00 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2004, 2005, 2007  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  * Copyright (C) 1999-2002  Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek  *
7*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek  *
11*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek  */
19*00b67f09SDavid van Moolenbroek 
20*00b67f09SDavid van Moolenbroek /* Id: ipv6.h,v 1.24 2007/06/19 23:47:18 tbox Exp  */
21*00b67f09SDavid van Moolenbroek 
22*00b67f09SDavid van Moolenbroek #ifndef ISC_IPV6_H
23*00b67f09SDavid van Moolenbroek #define ISC_IPV6_H 1
24*00b67f09SDavid van Moolenbroek 
25*00b67f09SDavid van Moolenbroek /*!
26*00b67f09SDavid van Moolenbroek  * Also define LWRES_IPV6_H to keep it from being included if liblwres is
27*00b67f09SDavid van Moolenbroek  * being used, or redefinition errors will occur.
28*00b67f09SDavid van Moolenbroek  */
29*00b67f09SDavid van Moolenbroek #define LWRES_IPV6_H 1
30*00b67f09SDavid van Moolenbroek 
31*00b67f09SDavid van Moolenbroek /*****
32*00b67f09SDavid van Moolenbroek  ***** Module Info
33*00b67f09SDavid van Moolenbroek  *****/
34*00b67f09SDavid van Moolenbroek 
35*00b67f09SDavid van Moolenbroek /*! \file isc/ipv6.h
36*00b67f09SDavid van Moolenbroek  * \brief IPv6 definitions for systems which do not support IPv6.
37*00b67f09SDavid van Moolenbroek  *
38*00b67f09SDavid van Moolenbroek  * \li MP:
39*00b67f09SDavid van Moolenbroek  *	No impact.
40*00b67f09SDavid van Moolenbroek  *
41*00b67f09SDavid van Moolenbroek  * \li Reliability:
42*00b67f09SDavid van Moolenbroek  *	No anticipated impact.
43*00b67f09SDavid van Moolenbroek  *
44*00b67f09SDavid van Moolenbroek  * \li Resources:
45*00b67f09SDavid van Moolenbroek  *	N/A.
46*00b67f09SDavid van Moolenbroek  *
47*00b67f09SDavid van Moolenbroek  * \li Security:
48*00b67f09SDavid van Moolenbroek  *	No anticipated impact.
49*00b67f09SDavid van Moolenbroek  *
50*00b67f09SDavid van Moolenbroek  * \li Standards:
51*00b67f09SDavid van Moolenbroek  *	RFC2553.
52*00b67f09SDavid van Moolenbroek  */
53*00b67f09SDavid van Moolenbroek 
54*00b67f09SDavid van Moolenbroek /***
55*00b67f09SDavid van Moolenbroek  *** Imports.
56*00b67f09SDavid van Moolenbroek  ***/
57*00b67f09SDavid van Moolenbroek 
58*00b67f09SDavid van Moolenbroek #include <isc/int.h>
59*00b67f09SDavid van Moolenbroek #include <isc/platform.h>
60*00b67f09SDavid van Moolenbroek 
61*00b67f09SDavid van Moolenbroek /***
62*00b67f09SDavid van Moolenbroek  *** Types.
63*00b67f09SDavid van Moolenbroek  ***/
64*00b67f09SDavid van Moolenbroek 
65*00b67f09SDavid van Moolenbroek struct in6_addr {
66*00b67f09SDavid van Moolenbroek         union {
67*00b67f09SDavid van Moolenbroek 		isc_uint8_t	_S6_u8[16];
68*00b67f09SDavid van Moolenbroek 		isc_uint16_t	_S6_u16[8];
69*00b67f09SDavid van Moolenbroek 		isc_uint32_t	_S6_u32[4];
70*00b67f09SDavid van Moolenbroek         } _S6_un;
71*00b67f09SDavid van Moolenbroek };
72*00b67f09SDavid van Moolenbroek #define s6_addr		_S6_un._S6_u8
73*00b67f09SDavid van Moolenbroek #define s6_addr8	_S6_un._S6_u8
74*00b67f09SDavid van Moolenbroek #define s6_addr16	_S6_un._S6_u16
75*00b67f09SDavid van Moolenbroek #define s6_addr32	_S6_un._S6_u32
76*00b67f09SDavid van Moolenbroek 
77*00b67f09SDavid van Moolenbroek #define IN6ADDR_ANY_INIT 	{{{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }}}
78*00b67f09SDavid van Moolenbroek #define IN6ADDR_LOOPBACK_INIT 	{{{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }}}
79*00b67f09SDavid van Moolenbroek 
80*00b67f09SDavid van Moolenbroek LIBISC_EXTERNAL_DATA extern const struct in6_addr in6addr_any;
81*00b67f09SDavid van Moolenbroek LIBISC_EXTERNAL_DATA extern const struct in6_addr in6addr_loopback;
82*00b67f09SDavid van Moolenbroek 
83*00b67f09SDavid van Moolenbroek struct sockaddr_in6 {
84*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_HAVESALEN
85*00b67f09SDavid van Moolenbroek 	isc_uint8_t		sin6_len;
86*00b67f09SDavid van Moolenbroek 	isc_uint8_t		sin6_family;
87*00b67f09SDavid van Moolenbroek #else
88*00b67f09SDavid van Moolenbroek 	isc_uint16_t		sin6_family;
89*00b67f09SDavid van Moolenbroek #endif
90*00b67f09SDavid van Moolenbroek 	isc_uint16_t		sin6_port;
91*00b67f09SDavid van Moolenbroek 	isc_uint32_t		sin6_flowinfo;
92*00b67f09SDavid van Moolenbroek 	struct in6_addr		sin6_addr;
93*00b67f09SDavid van Moolenbroek 	isc_uint32_t		sin6_scope_id;
94*00b67f09SDavid van Moolenbroek };
95*00b67f09SDavid van Moolenbroek 
96*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_HAVESALEN
97*00b67f09SDavid van Moolenbroek #define SIN6_LEN 1
98*00b67f09SDavid van Moolenbroek #endif
99*00b67f09SDavid van Moolenbroek 
100*00b67f09SDavid van Moolenbroek /*%
101*00b67f09SDavid van Moolenbroek  * Unspecified
102*00b67f09SDavid van Moolenbroek  */
103*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_UNSPECIFIED(a)      \
104*00b67f09SDavid van Moolenbroek         (((a)->s6_addr32[0] == 0) &&    \
105*00b67f09SDavid van Moolenbroek          ((a)->s6_addr32[1] == 0) &&    \
106*00b67f09SDavid van Moolenbroek          ((a)->s6_addr32[2] == 0) &&    \
107*00b67f09SDavid van Moolenbroek          ((a)->s6_addr32[3] == 0))
108*00b67f09SDavid van Moolenbroek 
109*00b67f09SDavid van Moolenbroek /*%
110*00b67f09SDavid van Moolenbroek  * Loopback
111*00b67f09SDavid van Moolenbroek  */
112*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_LOOPBACK(a)         \
113*00b67f09SDavid van Moolenbroek         (((a)->s6_addr32[0] == 0) &&    \
114*00b67f09SDavid van Moolenbroek          ((a)->s6_addr32[1] == 0) &&    \
115*00b67f09SDavid van Moolenbroek          ((a)->s6_addr32[2] == 0) &&    \
116*00b67f09SDavid van Moolenbroek          ((a)->s6_addr32[3] == htonl(1)))
117*00b67f09SDavid van Moolenbroek 
118*00b67f09SDavid van Moolenbroek /*%
119*00b67f09SDavid van Moolenbroek  * IPv4 compatible
120*00b67f09SDavid van Moolenbroek  */
121*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_V4COMPAT(a)         \
122*00b67f09SDavid van Moolenbroek         (((a)->s6_addr32[0] == 0) &&    \
123*00b67f09SDavid van Moolenbroek          ((a)->s6_addr32[1] == 0) &&    \
124*00b67f09SDavid van Moolenbroek          ((a)->s6_addr32[2] == 0) &&    \
125*00b67f09SDavid van Moolenbroek          ((a)->s6_addr32[3] != 0) &&    \
126*00b67f09SDavid van Moolenbroek          ((a)->s6_addr32[3] != htonl(1)))
127*00b67f09SDavid van Moolenbroek 
128*00b67f09SDavid van Moolenbroek /*%
129*00b67f09SDavid van Moolenbroek  * Mapped
130*00b67f09SDavid van Moolenbroek  */
131*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_V4MAPPED(a)               \
132*00b67f09SDavid van Moolenbroek         (((a)->s6_addr32[0] == 0) &&          \
133*00b67f09SDavid van Moolenbroek          ((a)->s6_addr32[1] == 0) &&          \
134*00b67f09SDavid van Moolenbroek          ((a)->s6_addr32[2] == htonl(0x0000ffff)))
135*00b67f09SDavid van Moolenbroek 
136*00b67f09SDavid van Moolenbroek /*%
137*00b67f09SDavid van Moolenbroek  * Multicast
138*00b67f09SDavid van Moolenbroek  */
139*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_MULTICAST(a)	\
140*00b67f09SDavid van Moolenbroek 	((a)->s6_addr8[0] == 0xffU)
141*00b67f09SDavid van Moolenbroek 
142*00b67f09SDavid van Moolenbroek /*%
143*00b67f09SDavid van Moolenbroek  * Unicast link / site local.
144*00b67f09SDavid van Moolenbroek  */
145*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_LINKLOCAL(a)	\
146*00b67f09SDavid van Moolenbroek 	(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
147*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_SITELOCAL(a)	\
148*00b67f09SDavid van Moolenbroek 	(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
149*00b67f09SDavid van Moolenbroek 
150*00b67f09SDavid van Moolenbroek #endif /* ISC_IPV6_H */
151