]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/ntp/lib/isc/win32/include/isc/net.h
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / ntp / lib / isc / win32 / include / isc / net.h
1 /*
2  * Copyright (C) 2004, 2005, 2007, 2008, 2012  Internet Systems Consortium, Inc. ("ISC")
3  * Copyright (C) 1999-2003  Internet Software Consortium.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15  * PERFORMANCE OF THIS SOFTWARE.
16  */
17
18 /* $Id$ */
19
20 #ifndef ISC_NET_H
21 #define ISC_NET_H 1
22
23 #include <errno.h>
24
25 /*
26  * Also define LWRES_IPV6_H to keep it from being included if liblwres is
27  * being used, or redefinition errors will occur.
28  */
29 #define LWRES_IPV6_H 1
30
31
32
33 /*****
34  ***** Module Info
35  *****/
36
37 /*
38  * Basic Networking Types
39  *
40  * This module is responsible for defining the following basic networking
41  * types:
42  *
43  *              struct in_addr
44  *              struct in6_addr
45  *              struct in6_pktinfo
46  *              struct sockaddr
47  *              struct sockaddr_in
48  *              struct sockaddr_in6
49  *              in_port_t
50  *
51  * It ensures that the AF_ and PF_ macros are defined.
52  *
53  * It declares ntoh[sl]() and hton[sl]().
54  *
55  * It declares inet_aton(), inet_ntop(), and inet_pton().
56  *
57  * It ensures that INADDR_ANY, IN6ADDR_ANY_INIT, in6addr_any, and
58  * in6addr_loopback are available.
59  *
60  * It ensures that IN_MULTICAST() is available to check for multicast
61  * addresses.
62  *
63  * MP:
64  *      No impact.
65  *
66  * Reliability:
67  *      No anticipated impact.
68  *
69  * Resources:
70  *      N/A.
71  *
72  * Security:
73  *      No anticipated impact.
74  *
75  * Standards:
76  *      BSD Socket API
77  *      RFC2553
78  */
79
80 /***
81  *** Imports.
82  ***/
83 #include <isc/platform.h>
84
85 /*
86  * Because of some sort of problem in the MS header files, this cannot
87  * be simple "#include <winsock2.h>", because winsock2.h tries to include
88  * windows.h, which then generates an error out of mswsock.h.  _You_
89  * figure it out.
90  */
91 #ifndef _WINSOCKAPI_
92 #define _WINSOCKAPI_   /* Prevent inclusion of winsock.h in windows.h */
93 #endif
94
95 #include <winsock2.h>
96
97 #include <sys/types.h>
98
99 #include <isc/lang.h>
100 #include <isc/types.h>
101
102 #include <ws2tcpip.h>
103 #include <isc/ipv6.h>
104
105 /*
106  * This is here because named client, interfacemgr.c, etc. use the name as
107  * a variable
108  */
109 #undef interface
110
111 #ifndef INADDR_LOOPBACK
112 #define INADDR_LOOPBACK 0x7f000001UL
113 #endif
114
115 #ifndef ISC_PLATFORM_HAVEIN6PKTINFO
116 struct in6_pktinfo {
117         struct in6_addr ipi6_addr;    /* src/dst IPv6 address */
118         unsigned int    ipi6_ifindex; /* send/recv interface index */
119 };
120 #endif
121
122 #if _MSC_VER < 1300
123 #define in6addr_any isc_net_in6addrany
124 #define in6addr_loopback isc_net_in6addrloop
125 #endif
126
127 /*
128  * Ensure type in_port_t is defined.
129  */
130 #ifdef ISC_PLATFORM_NEEDPORTT
131 typedef isc_uint16_t in_port_t;
132 #endif
133
134 /*
135  * If this system does not have MSG_TRUNC (as returned from recvmsg())
136  * ISC_PLATFORM_RECVOVERFLOW will be defined.  This will enable the MSG_TRUNC
137  * faking code in socket.c.
138  */
139 #ifndef MSG_TRUNC
140 #define ISC_PLATFORM_RECVOVERFLOW
141 #endif
142
143 #define ISC__IPADDR(x)  ((isc_uint32_t)htonl((isc_uint32_t)(x)))
144
145 #define ISC_IPADDR_ISMULTICAST(i) \
146                 (((isc_uint32_t)(i) & ISC__IPADDR(0xf0000000)) \
147                  == ISC__IPADDR(0xe0000000))
148
149 #define ISC_IPADDR_ISEXPERIMENTAL(i) \
150                 (((isc_uint32_t)(i) & ISC__IPADDR(0xf0000000)) \
151                  == ISC__IPADDR(0xf0000000))
152
153 /*
154  * Fix the FD_SET and FD_CLR Macros to properly cast
155  */
156 #undef FD_CLR
157 #define FD_CLR(fd, set) do { \
158     u_int __i; \
159     for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \
160         if (((fd_set FAR *)(set))->fd_array[__i] == (SOCKET) fd) { \
161             while (__i < ((fd_set FAR *)(set))->fd_count-1) { \
162                 ((fd_set FAR *)(set))->fd_array[__i] = \
163                     ((fd_set FAR *)(set))->fd_array[__i+1]; \
164                 __i++; \
165             } \
166             ((fd_set FAR *)(set))->fd_count--; \
167             break; \
168         } \
169     } \
170 } while (0)
171
172 #undef FD_SET
173 #define FD_SET(fd, set) do { \
174     u_int __i; \
175     for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \
176         if (((fd_set FAR *)(set))->fd_array[__i] == (SOCKET)(fd)) { \
177             break; \
178         } \
179     } \
180     if (__i == ((fd_set FAR *)(set))->fd_count) { \
181         if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) { \
182             ((fd_set FAR *)(set))->fd_array[__i] = (SOCKET)(fd); \
183             ((fd_set FAR *)(set))->fd_count++; \
184         } \
185     } \
186 } while (0)
187
188 /*
189  * Windows Sockets errors redefined as regular Berkeley error constants.
190  * These are usually commented out in Windows NT to avoid conflicts with errno.h.
191  * Use the WSA constants instead.
192  * Starting with VC9 (VC++ 2010) many of these are defined incompatibly
193  * by errno.h -- #undef the conflicting values, which are not relevant to
194  * Win32.
195  */
196
197 #undef EWOULDBLOCK
198 #define EWOULDBLOCK             WSAEWOULDBLOCK
199 #undef EINPROGRESS
200 #define EINPROGRESS             WSAEINPROGRESS
201 #undef EALREADY
202 #define EALREADY                WSAEALREADY
203 #undef ENOTSOCK
204 #define ENOTSOCK                WSAENOTSOCK
205 #undef EDESTADDRREQ
206 #define EDESTADDRREQ            WSAEDESTADDRREQ
207 #undef EMSGSIZE
208 #define EMSGSIZE                WSAEMSGSIZE
209 #undef EPROTOTYPE
210 #define EPROTOTYPE              WSAEPROTOTYPE
211 #undef ENOPROTOOPT
212 #define ENOPROTOOPT             WSAENOPROTOOPT
213 #undef EPROTONOSUPPORT
214 #define EPROTONOSUPPORT         WSAEPROTONOSUPPORT
215 #define ESOCKTNOSUPPORT         WSAESOCKTNOSUPPORT
216 #undef EOPNOTSUPP
217 #define EOPNOTSUPP              WSAEOPNOTSUPP
218 #define EPFNOSUPPORT            WSAEPFNOSUPPORT
219 #undef EAFNOSUPPORT
220 #define EAFNOSUPPORT            WSAEAFNOSUPPORT
221 #undef EADDRINUSE
222 #define EADDRINUSE              WSAEADDRINUSE
223 #undef EADDRNOTAVAIL
224 #define EADDRNOTAVAIL           WSAEADDRNOTAVAIL
225 #undef ENETDOWN
226 #define ENETDOWN                WSAENETDOWN
227 #undef ENETUNREACH
228 #define ENETUNREACH             WSAENETUNREACH
229 #undef ENETRESET
230 #define ENETRESET               WSAENETRESET
231 #undef ECONNABORTED
232 #define ECONNABORTED            WSAECONNABORTED
233 #undef ECONNRESET
234 #define ECONNRESET              WSAECONNRESET
235 #undef ENOBUFS
236 #define ENOBUFS                 WSAENOBUFS
237 #undef EISCONN
238 #define EISCONN                 WSAEISCONN
239 #undef ENOTCONN
240 #define ENOTCONN                WSAENOTCONN
241 #define ESHUTDOWN               WSAESHUTDOWN
242 #define ETOOMANYREFS            WSAETOOMANYREFS
243 #undef ETIMEDOUT
244 #define ETIMEDOUT               WSAETIMEDOUT
245 #undef ECONNREFUSED
246 #define ECONNREFUSED            WSAECONNREFUSED
247 #undef ELOOP
248 #define ELOOP                   WSAELOOP
249 #define EHOSTDOWN               WSAEHOSTDOWN
250 #undef EHOSTUNREACH
251 #define EHOSTUNREACH            WSAEHOSTUNREACH
252 #define EPROCLIM                WSAEPROCLIM
253 #define EUSERS                  WSAEUSERS
254 #define EDQUOT                  WSAEDQUOT
255 #define ESTALE                  WSAESTALE
256 #define EREMOTE                 WSAEREMOTE
257
258
259 /***
260  *** Functions.
261  ***/
262
263 ISC_LANG_BEGINDECLS
264
265 isc_result_t
266 isc_net_probeipv4(void);
267 /*
268  * Check if the system's kernel supports IPv4.
269  *
270  * Returns:
271  *
272  *      ISC_R_SUCCESS           IPv4 is supported.
273  *      ISC_R_NOTFOUND          IPv4 is not supported.
274  *      ISC_R_DISABLED          IPv4 is disabled.
275  *      ISC_R_UNEXPECTED
276  */
277
278 isc_result_t
279 isc_net_probeipv6(void);
280 /*
281  * Check if the system's kernel supports IPv6.
282  *
283  * Returns:
284  *
285  *      ISC_R_SUCCESS           IPv6 is supported.
286  *      ISC_R_NOTFOUND          IPv6 is not supported.
287  *      ISC_R_DISABLED          IPv6 is disabled.
288  *      ISC_R_UNEXPECTED
289  */
290
291 isc_result_t
292 isc_net_probeunix(void);
293 /*
294  * Check if UNIX domain sockets are supported.
295  *
296  * Returns:
297  *
298  *      ISC_R_SUCCESS
299  *      ISC_R_NOTFOUND
300  */
301
302 isc_result_t
303 isc_net_probe_ipv6only(void);
304 /*
305  * Check if the system's kernel supports the IPV6_V6ONLY socket option.
306  *
307  * Returns:
308  *
309  *      ISC_R_SUCCESS           the option is supported for both TCP and UDP.
310  *      ISC_R_NOTFOUND          IPv6 itself or the option is not supported.
311  *      ISC_R_UNEXPECTED
312  */
313
314 isc_result_t
315 isc_net_probe_ipv6pktinfo(void);
316 /*
317  * Check if the system's kernel supports the IPV6_(RECV)PKTINFO socket option
318  * for UDP sockets.
319  *
320  * Returns:
321  *
322  *      ISC_R_SUCCESS           the option is supported.
323  *      ISC_R_NOTFOUND          IPv6 itself or the option is not supported.
324  *      ISC_R_UNEXPECTED
325  */
326
327 void
328 isc_net_disableipv4(void);
329
330 void
331 isc_net_disableipv6(void);
332
333 void
334 isc_net_enableipv4(void);
335
336 void
337 isc_net_enableipv6(void);
338
339 isc_result_t
340 isc_net_getudpportrange(int af, in_port_t *low, in_port_t *high);
341 /*%<
342  * Returns system's default range of ephemeral UDP ports, if defined.
343  * If the range is not available or unknown, ISC_NET_PORTRANGELOW and
344  * ISC_NET_PORTRANGEHIGH will be returned.
345  *
346  * Requires:
347  *
348  *\li   'low' and 'high' must be non NULL.
349  *
350  * Returns:
351  *
352  *\li   *low and *high will be the ports specifying the low and high ends of
353  *      the range.
354  */
355
356 #ifdef ISC_PLATFORM_NEEDNTOP
357 const char *
358 isc_net_ntop(int af, const void *src, char *dst, size_t size);
359 #define inet_ntop isc_net_ntop
360 #endif
361
362 #ifdef ISC_PLATFORM_NEEDPTON
363 int
364 isc_net_pton(int af, const char *src, void *dst);
365 #define inet_pton isc_net_pton
366 #endif
367
368 int
369 isc_net_aton(const char *cp, struct in_addr *addr);
370 #define inet_aton isc_net_aton
371
372 ISC_LANG_ENDDECLS
373
374 #endif /* ISC_NET_H */