xref: /minix3/external/bsd/bind/dist/lib/isc/unix/include/isc/net.h (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: net.h,v 1.6 2015/07/08 17:29:00 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2004, 2005, 2007, 2008, 2012-2014  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  * Copyright (C) 1999-2003  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 */
21*00b67f09SDavid van Moolenbroek 
22*00b67f09SDavid van Moolenbroek #ifndef ISC_NET_H
23*00b67f09SDavid van Moolenbroek #define ISC_NET_H 1
24*00b67f09SDavid van Moolenbroek 
25*00b67f09SDavid van Moolenbroek /*****
26*00b67f09SDavid van Moolenbroek  ***** Module Info
27*00b67f09SDavid van Moolenbroek  *****/
28*00b67f09SDavid van Moolenbroek 
29*00b67f09SDavid van Moolenbroek /*! \file
30*00b67f09SDavid van Moolenbroek  * \brief
31*00b67f09SDavid van Moolenbroek  * Basic Networking Types
32*00b67f09SDavid van Moolenbroek  *
33*00b67f09SDavid van Moolenbroek  * This module is responsible for defining the following basic networking
34*00b67f09SDavid van Moolenbroek  * types:
35*00b67f09SDavid van Moolenbroek  *
36*00b67f09SDavid van Moolenbroek  *\li		struct in_addr
37*00b67f09SDavid van Moolenbroek  *\li		struct in6_addr
38*00b67f09SDavid van Moolenbroek  *\li		struct in6_pktinfo
39*00b67f09SDavid van Moolenbroek  *\li		struct sockaddr
40*00b67f09SDavid van Moolenbroek  *\li		struct sockaddr_in
41*00b67f09SDavid van Moolenbroek  *\li		struct sockaddr_in6
42*00b67f09SDavid van Moolenbroek  *\li		struct sockaddr_storage
43*00b67f09SDavid van Moolenbroek  *\li		in_port_t
44*00b67f09SDavid van Moolenbroek  *
45*00b67f09SDavid van Moolenbroek  * It ensures that the AF_ and PF_ macros are defined.
46*00b67f09SDavid van Moolenbroek  *
47*00b67f09SDavid van Moolenbroek  * It declares ntoh[sl]() and hton[sl]().
48*00b67f09SDavid van Moolenbroek  *
49*00b67f09SDavid van Moolenbroek  * It declares inet_aton(), inet_ntop(), and inet_pton().
50*00b67f09SDavid van Moolenbroek  *
51*00b67f09SDavid van Moolenbroek  * It ensures that #INADDR_LOOPBACK, #INADDR_ANY, #IN6ADDR_ANY_INIT,
52*00b67f09SDavid van Moolenbroek  * in6addr_any, and in6addr_loopback are available.
53*00b67f09SDavid van Moolenbroek  *
54*00b67f09SDavid van Moolenbroek  * It ensures that IN_MULTICAST() is available to check for multicast
55*00b67f09SDavid van Moolenbroek  * addresses.
56*00b67f09SDavid van Moolenbroek  *
57*00b67f09SDavid van Moolenbroek  * MP:
58*00b67f09SDavid van Moolenbroek  *\li	No impact.
59*00b67f09SDavid van Moolenbroek  *
60*00b67f09SDavid van Moolenbroek  * Reliability:
61*00b67f09SDavid van Moolenbroek  *\li	No anticipated impact.
62*00b67f09SDavid van Moolenbroek  *
63*00b67f09SDavid van Moolenbroek  * Resources:
64*00b67f09SDavid van Moolenbroek  *\li	N/A.
65*00b67f09SDavid van Moolenbroek  *
66*00b67f09SDavid van Moolenbroek  * Security:
67*00b67f09SDavid van Moolenbroek  *\li	No anticipated impact.
68*00b67f09SDavid van Moolenbroek  *
69*00b67f09SDavid van Moolenbroek  * Standards:
70*00b67f09SDavid van Moolenbroek  *\li	BSD Socket API
71*00b67f09SDavid van Moolenbroek  *\li	RFC2553
72*00b67f09SDavid van Moolenbroek  */
73*00b67f09SDavid van Moolenbroek 
74*00b67f09SDavid van Moolenbroek /***
75*00b67f09SDavid van Moolenbroek  *** Imports.
76*00b67f09SDavid van Moolenbroek  ***/
77*00b67f09SDavid van Moolenbroek #include <isc/platform.h>
78*00b67f09SDavid van Moolenbroek 
79*00b67f09SDavid van Moolenbroek #include <sys/types.h>
80*00b67f09SDavid van Moolenbroek #include <sys/socket.h>		/* Contractual promise. */
81*00b67f09SDavid van Moolenbroek 
82*00b67f09SDavid van Moolenbroek #include <net/if.h>
83*00b67f09SDavid van Moolenbroek 
84*00b67f09SDavid van Moolenbroek #include <netinet/in.h>		/* Contractual promise. */
85*00b67f09SDavid van Moolenbroek #include <arpa/inet.h>		/* Contractual promise. */
86*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_NEEDNETINETIN6H
87*00b67f09SDavid van Moolenbroek #include <netinet/in6.h>	/* Required on UnixWare. */
88*00b67f09SDavid van Moolenbroek #endif
89*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_NEEDNETINET6IN6H
90*00b67f09SDavid van Moolenbroek #include <netinet6/in6.h>	/* Required on BSD/OS for in6_pktinfo. */
91*00b67f09SDavid van Moolenbroek #endif
92*00b67f09SDavid van Moolenbroek 
93*00b67f09SDavid van Moolenbroek #ifndef ISC_PLATFORM_HAVEIPV6
94*00b67f09SDavid van Moolenbroek #include <isc/ipv6.h>		/* Contractual promise. */
95*00b67f09SDavid van Moolenbroek #endif
96*00b67f09SDavid van Moolenbroek 
97*00b67f09SDavid van Moolenbroek #include <isc/lang.h>
98*00b67f09SDavid van Moolenbroek #include <isc/types.h>
99*00b67f09SDavid van Moolenbroek 
100*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_HAVEINADDR6
101*00b67f09SDavid van Moolenbroek #define in6_addr in_addr6	/*%< Required for pre RFC2133 implementations. */
102*00b67f09SDavid van Moolenbroek #endif
103*00b67f09SDavid van Moolenbroek 
104*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_HAVEIPV6
105*00b67f09SDavid van Moolenbroek #ifndef IN6ADDR_ANY_INIT
106*00b67f09SDavid van Moolenbroek #ifdef s6_addr
107*00b67f09SDavid van Moolenbroek /*%
108*00b67f09SDavid van Moolenbroek  * Required for some pre RFC2133 implementations.
109*00b67f09SDavid van Moolenbroek  * IN6ADDR_ANY_INIT and IN6ADDR_LOOPBACK_INIT were added in
110*00b67f09SDavid van Moolenbroek  * draft-ietf-ipngwg-bsd-api-04.txt or draft-ietf-ipngwg-bsd-api-05.txt.
111*00b67f09SDavid van Moolenbroek  * If 's6_addr' is defined then assume that there is a union and three
112*00b67f09SDavid van Moolenbroek  * levels otherwise assume two levels required.
113*00b67f09SDavid van Moolenbroek  */
114*00b67f09SDavid van Moolenbroek #define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
115*00b67f09SDavid van Moolenbroek #else
116*00b67f09SDavid van Moolenbroek #define IN6ADDR_ANY_INIT { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } }
117*00b67f09SDavid van Moolenbroek #endif
118*00b67f09SDavid van Moolenbroek #endif
119*00b67f09SDavid van Moolenbroek 
120*00b67f09SDavid van Moolenbroek #ifndef IN6ADDR_LOOPBACK_INIT
121*00b67f09SDavid van Moolenbroek #ifdef s6_addr
122*00b67f09SDavid van Moolenbroek /*% IPv6 address loopback init */
123*00b67f09SDavid van Moolenbroek #define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
124*00b67f09SDavid van Moolenbroek #else
125*00b67f09SDavid van Moolenbroek #define IN6ADDR_LOOPBACK_INIT { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } }
126*00b67f09SDavid van Moolenbroek #endif
127*00b67f09SDavid van Moolenbroek #endif
128*00b67f09SDavid van Moolenbroek 
129*00b67f09SDavid van Moolenbroek #ifndef IN6_IS_ADDR_V4MAPPED
130*00b67f09SDavid van Moolenbroek /*% Is IPv6 address V4 mapped? */
131*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_V4MAPPED(x) \
132*00b67f09SDavid van Moolenbroek 	 (memcmp((x)->s6_addr, in6addr_any.s6_addr, 10) == 0 && \
133*00b67f09SDavid van Moolenbroek 	  (x)->s6_addr[10] == 0xff && (x)->s6_addr[11] == 0xff)
134*00b67f09SDavid van Moolenbroek #endif
135*00b67f09SDavid van Moolenbroek 
136*00b67f09SDavid van Moolenbroek #ifndef IN6_IS_ADDR_V4COMPAT
137*00b67f09SDavid van Moolenbroek /*% Is IPv6 address V4 compatible? */
138*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_V4COMPAT(x) \
139*00b67f09SDavid van Moolenbroek 	 (memcmp((x)->s6_addr, in6addr_any.s6_addr, 12) == 0 && \
140*00b67f09SDavid van Moolenbroek 	 ((x)->s6_addr[12] != 0 || (x)->s6_addr[13] != 0 || \
141*00b67f09SDavid van Moolenbroek 	  (x)->s6_addr[14] != 0 || \
142*00b67f09SDavid van Moolenbroek 	  ((x)->s6_addr[15] != 0 && (x)->s6_addr[15] != 1)))
143*00b67f09SDavid van Moolenbroek #endif
144*00b67f09SDavid van Moolenbroek 
145*00b67f09SDavid van Moolenbroek #ifndef IN6_IS_ADDR_MULTICAST
146*00b67f09SDavid van Moolenbroek /*% Is IPv6 address multicast? */
147*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_MULTICAST(a)        ((a)->s6_addr[0] == 0xff)
148*00b67f09SDavid van Moolenbroek #endif
149*00b67f09SDavid van Moolenbroek 
150*00b67f09SDavid van Moolenbroek #ifndef IN6_IS_ADDR_LINKLOCAL
151*00b67f09SDavid van Moolenbroek /*% Is IPv6 address linklocal? */
152*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_LINKLOCAL(a) \
153*00b67f09SDavid van Moolenbroek 	(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
154*00b67f09SDavid van Moolenbroek #endif
155*00b67f09SDavid van Moolenbroek 
156*00b67f09SDavid van Moolenbroek #ifndef IN6_IS_ADDR_SITELOCAL
157*00b67f09SDavid van Moolenbroek /*% is IPv6 address sitelocal? */
158*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_SITELOCAL(a) \
159*00b67f09SDavid van Moolenbroek 	(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
160*00b67f09SDavid van Moolenbroek #endif
161*00b67f09SDavid van Moolenbroek 
162*00b67f09SDavid van Moolenbroek 
163*00b67f09SDavid van Moolenbroek #ifndef IN6_IS_ADDR_LOOPBACK
164*00b67f09SDavid van Moolenbroek /*% is IPv6 address loopback? */
165*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_LOOPBACK(x) \
166*00b67f09SDavid van Moolenbroek 	(memcmp((x)->s6_addr, in6addr_loopback.s6_addr, 16) == 0)
167*00b67f09SDavid van Moolenbroek #endif
168*00b67f09SDavid van Moolenbroek #endif
169*00b67f09SDavid van Moolenbroek 
170*00b67f09SDavid van Moolenbroek #ifndef AF_INET6
171*00b67f09SDavid van Moolenbroek /*% IPv6 */
172*00b67f09SDavid van Moolenbroek #define AF_INET6 99
173*00b67f09SDavid van Moolenbroek #endif
174*00b67f09SDavid van Moolenbroek 
175*00b67f09SDavid van Moolenbroek #ifndef PF_INET6
176*00b67f09SDavid van Moolenbroek /*% IPv6 */
177*00b67f09SDavid van Moolenbroek #define PF_INET6 AF_INET6
178*00b67f09SDavid van Moolenbroek #endif
179*00b67f09SDavid van Moolenbroek 
180*00b67f09SDavid van Moolenbroek #ifndef INADDR_LOOPBACK
181*00b67f09SDavid van Moolenbroek /*% inaddr loopback */
182*00b67f09SDavid van Moolenbroek #define INADDR_LOOPBACK 0x7f000001UL
183*00b67f09SDavid van Moolenbroek #endif
184*00b67f09SDavid van Moolenbroek 
185*00b67f09SDavid van Moolenbroek #ifndef ISC_PLATFORM_HAVEIN6PKTINFO
186*00b67f09SDavid van Moolenbroek /*% IPv6 packet info */
187*00b67f09SDavid van Moolenbroek struct in6_pktinfo {
188*00b67f09SDavid van Moolenbroek 	struct in6_addr ipi6_addr;    /*%< src/dst IPv6 address */
189*00b67f09SDavid van Moolenbroek 	unsigned int    ipi6_ifindex; /*%< send/recv interface index */
190*00b67f09SDavid van Moolenbroek };
191*00b67f09SDavid van Moolenbroek #endif
192*00b67f09SDavid van Moolenbroek 
193*00b67f09SDavid van Moolenbroek 
194*00b67f09SDavid van Moolenbroek #ifndef ISC_PLATFORM_HAVESOCKADDRSTORAGE
195*00b67f09SDavid van Moolenbroek #define _SS_MAXSIZE 128
196*00b67f09SDavid van Moolenbroek #define _SS_ALIGNSIZE  (sizeof (isc_uint64_t))
197*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_HAVESALEN
198*00b67f09SDavid van Moolenbroek #define _SS_PAD1SIZE (_SS_ALIGNSIZE - (2 * sizeof(isc_uint8_t)))
199*00b67f09SDavid van Moolenbroek #define _SS_PAD2SIZE (_SS_MAXSIZE - (_SS_ALIGNSIZE + _SS_PAD1SIZE \
200*00b67f09SDavid van Moolenbroek 		       + 2 * sizeof(isc_uint8_t)))
201*00b67f09SDavid van Moolenbroek #else
202*00b67f09SDavid van Moolenbroek #define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(isc_uint16_t))
203*00b67f09SDavid van Moolenbroek #define _SS_PAD2SIZE (_SS_MAXSIZE - (_SS_ALIGNSIZE + _SS_PAD1SIZE \
204*00b67f09SDavid van Moolenbroek 			+ sizeof(isc_uint16_t)))
205*00b67f09SDavid van Moolenbroek #endif
206*00b67f09SDavid van Moolenbroek 
207*00b67f09SDavid van Moolenbroek struct sockaddr_storage {
208*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_HAVESALEN
209*00b67f09SDavid van Moolenbroek        isc_uint8_t             ss_len;
210*00b67f09SDavid van Moolenbroek        isc_uint8_t             ss_family;
211*00b67f09SDavid van Moolenbroek #else
212*00b67f09SDavid van Moolenbroek        isc_uint16_t            ss_family;
213*00b67f09SDavid van Moolenbroek #endif
214*00b67f09SDavid van Moolenbroek        char                    __ss_pad1[_SS_PAD1SIZE];
215*00b67f09SDavid van Moolenbroek        isc_uint64_t            __ss_align;  /* field to force desired structure */
216*00b67f09SDavid van Moolenbroek        char                    __ss_pad2[_SS_PAD2SIZE];
217*00b67f09SDavid van Moolenbroek };
218*00b67f09SDavid van Moolenbroek #endif
219*00b67f09SDavid van Moolenbroek 
220*00b67f09SDavid van Moolenbroek #if defined(ISC_PLATFORM_HAVEIPV6) && defined(ISC_PLATFORM_NEEDIN6ADDRANY)
221*00b67f09SDavid van Moolenbroek extern const struct in6_addr isc_net_in6addrany;
222*00b67f09SDavid van Moolenbroek /*%
223*00b67f09SDavid van Moolenbroek  * Cope with a missing in6addr_any and in6addr_loopback.
224*00b67f09SDavid van Moolenbroek  */
225*00b67f09SDavid van Moolenbroek #define in6addr_any isc_net_in6addrany
226*00b67f09SDavid van Moolenbroek #endif
227*00b67f09SDavid van Moolenbroek 
228*00b67f09SDavid van Moolenbroek #if defined(ISC_PLATFORM_HAVEIPV6) && defined(ISC_PLATFORM_NEEDIN6ADDRLOOPBACK)
229*00b67f09SDavid van Moolenbroek extern const struct in6_addr isc_net_in6addrloop;
230*00b67f09SDavid van Moolenbroek #define in6addr_loopback isc_net_in6addrloop
231*00b67f09SDavid van Moolenbroek #endif
232*00b67f09SDavid van Moolenbroek 
233*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_FIXIN6ISADDR
234*00b67f09SDavid van Moolenbroek #undef  IN6_IS_ADDR_GEOGRAPHIC
235*00b67f09SDavid van Moolenbroek /*!
236*00b67f09SDavid van Moolenbroek  * \brief
237*00b67f09SDavid van Moolenbroek  * Fix UnixWare 7.1.1's broken IN6_IS_ADDR_* definitions.
238*00b67f09SDavid van Moolenbroek  */
239*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_GEOGRAPHIC(a) (((a)->S6_un.S6_l[0] & 0xE0) == 0x80)
240*00b67f09SDavid van Moolenbroek #undef  IN6_IS_ADDR_IPX
241*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_IPX(a)        (((a)->S6_un.S6_l[0] & 0xFE) == 0x04)
242*00b67f09SDavid van Moolenbroek #undef  IN6_IS_ADDR_LINKLOCAL
243*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_LINKLOCAL(a)  (((a)->S6_un.S6_l[0] & 0xC0FF) == 0x80FE)
244*00b67f09SDavid van Moolenbroek #undef  IN6_IS_ADDR_MULTICAST
245*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_MULTICAST(a)  (((a)->S6_un.S6_l[0] & 0xFF) == 0xFF)
246*00b67f09SDavid van Moolenbroek #undef  IN6_IS_ADDR_NSAP
247*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_NSAP(a)       (((a)->S6_un.S6_l[0] & 0xFE) == 0x02)
248*00b67f09SDavid van Moolenbroek #undef  IN6_IS_ADDR_PROVIDER
249*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_PROVIDER(a)   (((a)->S6_un.S6_l[0] & 0xE0) == 0x40)
250*00b67f09SDavid van Moolenbroek #undef  IN6_IS_ADDR_SITELOCAL
251*00b67f09SDavid van Moolenbroek #define IN6_IS_ADDR_SITELOCAL(a)  (((a)->S6_un.S6_l[0] & 0xC0FF) == 0xC0FE)
252*00b67f09SDavid van Moolenbroek #endif /* ISC_PLATFORM_FIXIN6ISADDR */
253*00b67f09SDavid van Moolenbroek 
254*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_NEEDPORTT
255*00b67f09SDavid van Moolenbroek /*%
256*00b67f09SDavid van Moolenbroek  * Ensure type in_port_t is defined.
257*00b67f09SDavid van Moolenbroek  */
258*00b67f09SDavid van Moolenbroek typedef isc_uint16_t in_port_t;
259*00b67f09SDavid van Moolenbroek #endif
260*00b67f09SDavid van Moolenbroek 
261*00b67f09SDavid van Moolenbroek #ifndef MSG_TRUNC
262*00b67f09SDavid van Moolenbroek /*%
263*00b67f09SDavid van Moolenbroek  * If this system does not have MSG_TRUNC (as returned from recvmsg())
264*00b67f09SDavid van Moolenbroek  * ISC_PLATFORM_RECVOVERFLOW will be defined.  This will enable the MSG_TRUNC
265*00b67f09SDavid van Moolenbroek  * faking code in socket.c.
266*00b67f09SDavid van Moolenbroek  */
267*00b67f09SDavid van Moolenbroek #define ISC_PLATFORM_RECVOVERFLOW
268*00b67f09SDavid van Moolenbroek #endif
269*00b67f09SDavid van Moolenbroek 
270*00b67f09SDavid van Moolenbroek /*% IP address. */
271*00b67f09SDavid van Moolenbroek #define ISC__IPADDR(x)	((isc_uint32_t)htonl((isc_uint32_t)(x)))
272*00b67f09SDavid van Moolenbroek 
273*00b67f09SDavid van Moolenbroek /*% Is IP address multicast? */
274*00b67f09SDavid van Moolenbroek #define ISC_IPADDR_ISMULTICAST(i) \
275*00b67f09SDavid van Moolenbroek 		(((isc_uint32_t)(i) & ISC__IPADDR(0xf0000000)) \
276*00b67f09SDavid van Moolenbroek 		 == ISC__IPADDR(0xe0000000))
277*00b67f09SDavid van Moolenbroek 
278*00b67f09SDavid van Moolenbroek #define ISC_IPADDR_ISEXPERIMENTAL(i) \
279*00b67f09SDavid van Moolenbroek 		(((isc_uint32_t)(i) & ISC__IPADDR(0xf0000000)) \
280*00b67f09SDavid van Moolenbroek 		 == ISC__IPADDR(0xf0000000))
281*00b67f09SDavid van Moolenbroek 
282*00b67f09SDavid van Moolenbroek /***
283*00b67f09SDavid van Moolenbroek  *** Functions.
284*00b67f09SDavid van Moolenbroek  ***/
285*00b67f09SDavid van Moolenbroek 
286*00b67f09SDavid van Moolenbroek ISC_LANG_BEGINDECLS
287*00b67f09SDavid van Moolenbroek 
288*00b67f09SDavid van Moolenbroek isc_result_t
289*00b67f09SDavid van Moolenbroek isc_net_probeipv4(void);
290*00b67f09SDavid van Moolenbroek /*%<
291*00b67f09SDavid van Moolenbroek  * Check if the system's kernel supports IPv4.
292*00b67f09SDavid van Moolenbroek  *
293*00b67f09SDavid van Moolenbroek  * Returns:
294*00b67f09SDavid van Moolenbroek  *
295*00b67f09SDavid van Moolenbroek  *\li	#ISC_R_SUCCESS		IPv4 is supported.
296*00b67f09SDavid van Moolenbroek  *\li	#ISC_R_NOTFOUND		IPv4 is not supported.
297*00b67f09SDavid van Moolenbroek  *\li	#ISC_R_DISABLED		IPv4 is disabled.
298*00b67f09SDavid van Moolenbroek  *\li	#ISC_R_UNEXPECTED
299*00b67f09SDavid van Moolenbroek  */
300*00b67f09SDavid van Moolenbroek 
301*00b67f09SDavid van Moolenbroek isc_result_t
302*00b67f09SDavid van Moolenbroek isc_net_probeipv6(void);
303*00b67f09SDavid van Moolenbroek /*%<
304*00b67f09SDavid van Moolenbroek  * Check if the system's kernel supports IPv6.
305*00b67f09SDavid van Moolenbroek  *
306*00b67f09SDavid van Moolenbroek  * Returns:
307*00b67f09SDavid van Moolenbroek  *
308*00b67f09SDavid van Moolenbroek  *\li	#ISC_R_SUCCESS		IPv6 is supported.
309*00b67f09SDavid van Moolenbroek  *\li	#ISC_R_NOTFOUND		IPv6 is not supported.
310*00b67f09SDavid van Moolenbroek  *\li	#ISC_R_DISABLED		IPv6 is disabled.
311*00b67f09SDavid van Moolenbroek  *\li	#ISC_R_UNEXPECTED
312*00b67f09SDavid van Moolenbroek  */
313*00b67f09SDavid van Moolenbroek 
314*00b67f09SDavid van Moolenbroek isc_result_t
315*00b67f09SDavid van Moolenbroek isc_net_probe_ipv6only(void);
316*00b67f09SDavid van Moolenbroek /*%<
317*00b67f09SDavid van Moolenbroek  * Check if the system's kernel supports the IPV6_V6ONLY socket option.
318*00b67f09SDavid van Moolenbroek  *
319*00b67f09SDavid van Moolenbroek  * Returns:
320*00b67f09SDavid van Moolenbroek  *
321*00b67f09SDavid van Moolenbroek  *\li	#ISC_R_SUCCESS		the option is supported for both TCP and UDP.
322*00b67f09SDavid van Moolenbroek  *\li	#ISC_R_NOTFOUND		IPv6 itself or the option is not supported.
323*00b67f09SDavid van Moolenbroek  *\li	#ISC_R_UNEXPECTED
324*00b67f09SDavid van Moolenbroek  */
325*00b67f09SDavid van Moolenbroek 
326*00b67f09SDavid van Moolenbroek isc_result_t
327*00b67f09SDavid van Moolenbroek isc_net_probe_ipv6pktinfo(void);
328*00b67f09SDavid van Moolenbroek /*
329*00b67f09SDavid van Moolenbroek  * Check if the system's kernel supports the IPV6_(RECV)PKTINFO socket option
330*00b67f09SDavid van Moolenbroek  * for UDP sockets.
331*00b67f09SDavid van Moolenbroek  *
332*00b67f09SDavid van Moolenbroek  * Returns:
333*00b67f09SDavid van Moolenbroek  *
334*00b67f09SDavid van Moolenbroek  * \li	#ISC_R_SUCCESS		the option is supported.
335*00b67f09SDavid van Moolenbroek  * \li	#ISC_R_NOTFOUND		IPv6 itself or the option is not supported.
336*00b67f09SDavid van Moolenbroek  * \li	#ISC_R_UNEXPECTED
337*00b67f09SDavid van Moolenbroek  */
338*00b67f09SDavid van Moolenbroek 
339*00b67f09SDavid van Moolenbroek void
340*00b67f09SDavid van Moolenbroek isc_net_disableipv4(void);
341*00b67f09SDavid van Moolenbroek 
342*00b67f09SDavid van Moolenbroek void
343*00b67f09SDavid van Moolenbroek isc_net_disableipv6(void);
344*00b67f09SDavid van Moolenbroek 
345*00b67f09SDavid van Moolenbroek void
346*00b67f09SDavid van Moolenbroek isc_net_enableipv4(void);
347*00b67f09SDavid van Moolenbroek 
348*00b67f09SDavid van Moolenbroek void
349*00b67f09SDavid van Moolenbroek isc_net_enableipv6(void);
350*00b67f09SDavid van Moolenbroek 
351*00b67f09SDavid van Moolenbroek isc_result_t
352*00b67f09SDavid van Moolenbroek isc_net_probeunix(void);
353*00b67f09SDavid van Moolenbroek /*
354*00b67f09SDavid van Moolenbroek  * Returns whether UNIX domain sockets are supported.
355*00b67f09SDavid van Moolenbroek  */
356*00b67f09SDavid van Moolenbroek 
357*00b67f09SDavid van Moolenbroek #define ISC_NET_DSCPRECVV4	0x01	/* Can receive sent DSCP value IPv4 */
358*00b67f09SDavid van Moolenbroek #define ISC_NET_DSCPRECVV6	0x02	/* Can receive sent DSCP value IPv6 */
359*00b67f09SDavid van Moolenbroek #define ISC_NET_DSCPSETV4	0x04	/* Can set DSCP on socket IPv4 */
360*00b67f09SDavid van Moolenbroek #define ISC_NET_DSCPSETV6	0x08	/* Can set DSCP on socket IPv6 */
361*00b67f09SDavid van Moolenbroek #define ISC_NET_DSCPPKTV4	0x10	/* Can set DSCP on per packet IPv4 */
362*00b67f09SDavid van Moolenbroek #define ISC_NET_DSCPPKTV6	0x20	/* Can set DSCP on per packet IPv6 */
363*00b67f09SDavid van Moolenbroek #define ISC_NET_DSCPALL		0x3f	/* All valid flags */
364*00b67f09SDavid van Moolenbroek 
365*00b67f09SDavid van Moolenbroek unsigned int
366*00b67f09SDavid van Moolenbroek isc_net_probedscp(void);
367*00b67f09SDavid van Moolenbroek /*%<
368*00b67f09SDavid van Moolenbroek  * Probe the level of DSCP support.
369*00b67f09SDavid van Moolenbroek  */
370*00b67f09SDavid van Moolenbroek 
371*00b67f09SDavid van Moolenbroek 
372*00b67f09SDavid van Moolenbroek isc_result_t
373*00b67f09SDavid van Moolenbroek isc_net_getudpportrange(int af, in_port_t *low, in_port_t *high);
374*00b67f09SDavid van Moolenbroek /*%<
375*00b67f09SDavid van Moolenbroek  * Returns system's default range of ephemeral UDP ports, if defined.
376*00b67f09SDavid van Moolenbroek  * If the range is not available or unknown, ISC_NET_PORTRANGELOW and
377*00b67f09SDavid van Moolenbroek  * ISC_NET_PORTRANGEHIGH will be returned.
378*00b67f09SDavid van Moolenbroek  *
379*00b67f09SDavid van Moolenbroek  * Requires:
380*00b67f09SDavid van Moolenbroek  *
381*00b67f09SDavid van Moolenbroek  *\li	'low' and 'high' must be non NULL.
382*00b67f09SDavid van Moolenbroek  *
383*00b67f09SDavid van Moolenbroek  * Returns:
384*00b67f09SDavid van Moolenbroek  *
385*00b67f09SDavid van Moolenbroek  *\li	*low and *high will be the ports specifying the low and high ends of
386*00b67f09SDavid van Moolenbroek  *	the range.
387*00b67f09SDavid van Moolenbroek  */
388*00b67f09SDavid van Moolenbroek 
389*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_NEEDNTOP
390*00b67f09SDavid van Moolenbroek const char *
391*00b67f09SDavid van Moolenbroek isc_net_ntop(int af, const void *src, char *dst, size_t size);
392*00b67f09SDavid van Moolenbroek #define inet_ntop isc_net_ntop
393*00b67f09SDavid van Moolenbroek #endif
394*00b67f09SDavid van Moolenbroek 
395*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_NEEDPTON
396*00b67f09SDavid van Moolenbroek int
397*00b67f09SDavid van Moolenbroek isc_net_pton(int af, const char *src, void *dst);
398*00b67f09SDavid van Moolenbroek #undef inet_pton
399*00b67f09SDavid van Moolenbroek #define inet_pton isc_net_pton
400*00b67f09SDavid van Moolenbroek #endif
401*00b67f09SDavid van Moolenbroek 
402*00b67f09SDavid van Moolenbroek int
403*00b67f09SDavid van Moolenbroek isc_net_aton(const char *cp, struct in_addr *addr);
404*00b67f09SDavid van Moolenbroek #undef inet_aton
405*00b67f09SDavid van Moolenbroek #define inet_aton isc_net_aton
406*00b67f09SDavid van Moolenbroek 
407*00b67f09SDavid van Moolenbroek ISC_LANG_ENDDECLS
408*00b67f09SDavid van Moolenbroek 
409*00b67f09SDavid van Moolenbroek #endif /* ISC_NET_H */
410