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 */ 375