1*00b67f09SDavid van Moolenbroek /* $NetBSD: net.h,v 1.9 2014/12/10 04:38:01 christos Exp $ */ 2*00b67f09SDavid van Moolenbroek 3*00b67f09SDavid van Moolenbroek /* 4*00b67f09SDavid van Moolenbroek * Copyright (C) 2004, 2005, 2007, 2008, 2012, 2013 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 * 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 33*00b67f09SDavid van Moolenbroek /***** 34*00b67f09SDavid van Moolenbroek ***** Module Info 35*00b67f09SDavid van Moolenbroek *****/ 36*00b67f09SDavid van Moolenbroek 37*00b67f09SDavid van Moolenbroek /* 38*00b67f09SDavid van Moolenbroek * Basic Networking Types 39*00b67f09SDavid van Moolenbroek * 40*00b67f09SDavid van Moolenbroek * This module is responsible for defining the following basic networking 41*00b67f09SDavid van Moolenbroek * types: 42*00b67f09SDavid van Moolenbroek * 43*00b67f09SDavid van Moolenbroek * struct in_addr 44*00b67f09SDavid van Moolenbroek * struct in6_addr 45*00b67f09SDavid van Moolenbroek * struct in6_pktinfo 46*00b67f09SDavid van Moolenbroek * struct sockaddr 47*00b67f09SDavid van Moolenbroek * struct sockaddr_in 48*00b67f09SDavid van Moolenbroek * struct sockaddr_in6 49*00b67f09SDavid van Moolenbroek * in_port_t 50*00b67f09SDavid van Moolenbroek * 51*00b67f09SDavid van Moolenbroek * It ensures that the AF_ and PF_ macros are defined. 52*00b67f09SDavid van Moolenbroek * 53*00b67f09SDavid van Moolenbroek * It declares ntoh[sl]() and hton[sl](). 54*00b67f09SDavid van Moolenbroek * 55*00b67f09SDavid van Moolenbroek * It declares inet_aton(), inet_ntop(), and inet_pton(). 56*00b67f09SDavid van Moolenbroek * 57*00b67f09SDavid van Moolenbroek * It ensures that INADDR_ANY, IN6ADDR_ANY_INIT, in6addr_any, and 58*00b67f09SDavid van Moolenbroek * in6addr_loopback are available. 59*00b67f09SDavid van Moolenbroek * 60*00b67f09SDavid van Moolenbroek * It ensures that IN_MULTICAST() is available to check for multicast 61*00b67f09SDavid van Moolenbroek * addresses. 62*00b67f09SDavid van Moolenbroek * 63*00b67f09SDavid van Moolenbroek * MP: 64*00b67f09SDavid van Moolenbroek * No impact. 65*00b67f09SDavid van Moolenbroek * 66*00b67f09SDavid van Moolenbroek * Reliability: 67*00b67f09SDavid van Moolenbroek * No anticipated impact. 68*00b67f09SDavid van Moolenbroek * 69*00b67f09SDavid van Moolenbroek * Resources: 70*00b67f09SDavid van Moolenbroek * N/A. 71*00b67f09SDavid van Moolenbroek * 72*00b67f09SDavid van Moolenbroek * Security: 73*00b67f09SDavid van Moolenbroek * No anticipated impact. 74*00b67f09SDavid van Moolenbroek * 75*00b67f09SDavid van Moolenbroek * Standards: 76*00b67f09SDavid van Moolenbroek * BSD Socket API 77*00b67f09SDavid van Moolenbroek * RFC2553 78*00b67f09SDavid van Moolenbroek */ 79*00b67f09SDavid van Moolenbroek 80*00b67f09SDavid van Moolenbroek /*** 81*00b67f09SDavid van Moolenbroek *** Imports. 82*00b67f09SDavid van Moolenbroek ***/ 83*00b67f09SDavid van Moolenbroek #include <isc/platform.h> 84*00b67f09SDavid van Moolenbroek 85*00b67f09SDavid van Moolenbroek /* 86*00b67f09SDavid van Moolenbroek * Because of some sort of problem in the MS header files, this cannot 87*00b67f09SDavid van Moolenbroek * be simple "#include <winsock2.h>", because winsock2.h tries to include 88*00b67f09SDavid van Moolenbroek * windows.h, which then generates an error out of mswsock.h. _You_ 89*00b67f09SDavid van Moolenbroek * figure it out. 90*00b67f09SDavid van Moolenbroek */ 91*00b67f09SDavid van Moolenbroek #ifndef _WINSOCKAPI_ 92*00b67f09SDavid van Moolenbroek #define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */ 93*00b67f09SDavid van Moolenbroek #endif 94*00b67f09SDavid van Moolenbroek 95*00b67f09SDavid van Moolenbroek #include <winsock2.h> 96*00b67f09SDavid van Moolenbroek 97*00b67f09SDavid van Moolenbroek #include <sys/types.h> 98*00b67f09SDavid van Moolenbroek 99*00b67f09SDavid van Moolenbroek #include <isc/lang.h> 100*00b67f09SDavid van Moolenbroek #include <isc/types.h> 101*00b67f09SDavid van Moolenbroek 102*00b67f09SDavid van Moolenbroek #include <ws2tcpip.h> 103*00b67f09SDavid van Moolenbroek #include <isc/ipv6.h> 104*00b67f09SDavid van Moolenbroek 105*00b67f09SDavid van Moolenbroek /* 106*00b67f09SDavid van Moolenbroek * This is here because named client, interfacemgr.c, etc. use the name as 107*00b67f09SDavid van Moolenbroek * a variable 108*00b67f09SDavid van Moolenbroek */ 109*00b67f09SDavid van Moolenbroek #undef interface 110*00b67f09SDavid van Moolenbroek 111*00b67f09SDavid van Moolenbroek #ifndef INADDR_LOOPBACK 112*00b67f09SDavid van Moolenbroek #define INADDR_LOOPBACK 0x7f000001UL 113*00b67f09SDavid van Moolenbroek #endif 114*00b67f09SDavid van Moolenbroek 115*00b67f09SDavid van Moolenbroek #ifndef ISC_PLATFORM_HAVEIN6PKTINFO 116*00b67f09SDavid van Moolenbroek struct in6_pktinfo { 117*00b67f09SDavid van Moolenbroek struct in6_addr ipi6_addr; /* src/dst IPv6 address */ 118*00b67f09SDavid van Moolenbroek unsigned int ipi6_ifindex; /* send/recv interface index */ 119*00b67f09SDavid van Moolenbroek }; 120*00b67f09SDavid van Moolenbroek #endif 121*00b67f09SDavid van Moolenbroek 122*00b67f09SDavid van Moolenbroek #if _MSC_VER < 1300 123*00b67f09SDavid van Moolenbroek #define in6addr_any isc_in6addr_any 124*00b67f09SDavid van Moolenbroek #define in6addr_loopback isc_in6addr_loopback 125*00b67f09SDavid van Moolenbroek #endif 126*00b67f09SDavid van Moolenbroek 127*00b67f09SDavid van Moolenbroek /* 128*00b67f09SDavid van Moolenbroek * Ensure type in_port_t is defined. 129*00b67f09SDavid van Moolenbroek */ 130*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_NEEDPORTT 131*00b67f09SDavid van Moolenbroek typedef isc_uint16_t in_port_t; 132*00b67f09SDavid van Moolenbroek #endif 133*00b67f09SDavid van Moolenbroek 134*00b67f09SDavid van Moolenbroek /* 135*00b67f09SDavid van Moolenbroek * If this system does not have MSG_TRUNC (as returned from recvmsg()) 136*00b67f09SDavid van Moolenbroek * ISC_PLATFORM_RECVOVERFLOW will be defined. This will enable the MSG_TRUNC 137*00b67f09SDavid van Moolenbroek * faking code in socket.c. 138*00b67f09SDavid van Moolenbroek */ 139*00b67f09SDavid van Moolenbroek #ifndef MSG_TRUNC 140*00b67f09SDavid van Moolenbroek #define ISC_PLATFORM_RECVOVERFLOW 141*00b67f09SDavid van Moolenbroek #endif 142*00b67f09SDavid van Moolenbroek 143*00b67f09SDavid van Moolenbroek #define ISC__IPADDR(x) ((isc_uint32_t)htonl((isc_uint32_t)(x))) 144*00b67f09SDavid van Moolenbroek 145*00b67f09SDavid van Moolenbroek #define ISC_IPADDR_ISMULTICAST(i) \ 146*00b67f09SDavid van Moolenbroek (((isc_uint32_t)(i) & ISC__IPADDR(0xf0000000)) \ 147*00b67f09SDavid van Moolenbroek == ISC__IPADDR(0xe0000000)) 148*00b67f09SDavid van Moolenbroek 149*00b67f09SDavid van Moolenbroek #define ISC_IPADDR_ISEXPERIMENTAL(i) \ 150*00b67f09SDavid van Moolenbroek (((isc_uint32_t)(i) & ISC__IPADDR(0xf0000000)) \ 151*00b67f09SDavid van Moolenbroek == ISC__IPADDR(0xf0000000)) 152*00b67f09SDavid van Moolenbroek 153*00b67f09SDavid van Moolenbroek /* 154*00b67f09SDavid van Moolenbroek * Fix the FD_SET and FD_CLR Macros to properly cast 155*00b67f09SDavid van Moolenbroek */ 156*00b67f09SDavid van Moolenbroek #undef FD_CLR 157*00b67f09SDavid van Moolenbroek #define FD_CLR(fd, set) do { \ 158*00b67f09SDavid van Moolenbroek u_int __i; \ 159*00b67f09SDavid van Moolenbroek for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \ 160*00b67f09SDavid van Moolenbroek if (((fd_set FAR *)(set))->fd_array[__i] == (SOCKET) fd) { \ 161*00b67f09SDavid van Moolenbroek while (__i < ((fd_set FAR *)(set))->fd_count-1) { \ 162*00b67f09SDavid van Moolenbroek ((fd_set FAR *)(set))->fd_array[__i] = \ 163*00b67f09SDavid van Moolenbroek ((fd_set FAR *)(set))->fd_array[__i+1]; \ 164*00b67f09SDavid van Moolenbroek __i++; \ 165*00b67f09SDavid van Moolenbroek } \ 166*00b67f09SDavid van Moolenbroek ((fd_set FAR *)(set))->fd_count--; \ 167*00b67f09SDavid van Moolenbroek break; \ 168*00b67f09SDavid van Moolenbroek } \ 169*00b67f09SDavid van Moolenbroek } \ 170*00b67f09SDavid van Moolenbroek } while (0) 171*00b67f09SDavid van Moolenbroek 172*00b67f09SDavid van Moolenbroek #undef FD_SET 173*00b67f09SDavid van Moolenbroek #define FD_SET(fd, set) do { \ 174*00b67f09SDavid van Moolenbroek u_int __i; \ 175*00b67f09SDavid van Moolenbroek for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \ 176*00b67f09SDavid van Moolenbroek if (((fd_set FAR *)(set))->fd_array[__i] == (SOCKET)(fd)) { \ 177*00b67f09SDavid van Moolenbroek break; \ 178*00b67f09SDavid van Moolenbroek } \ 179*00b67f09SDavid van Moolenbroek } \ 180*00b67f09SDavid van Moolenbroek if (__i == ((fd_set FAR *)(set))->fd_count) { \ 181*00b67f09SDavid van Moolenbroek if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) { \ 182*00b67f09SDavid van Moolenbroek ((fd_set FAR *)(set))->fd_array[__i] = (SOCKET)(fd); \ 183*00b67f09SDavid van Moolenbroek ((fd_set FAR *)(set))->fd_count++; \ 184*00b67f09SDavid van Moolenbroek } \ 185*00b67f09SDavid van Moolenbroek } \ 186*00b67f09SDavid van Moolenbroek } while (0) 187*00b67f09SDavid van Moolenbroek 188*00b67f09SDavid van Moolenbroek /* 189*00b67f09SDavid van Moolenbroek * Windows Sockets errors redefined as regular Berkeley error constants. 190*00b67f09SDavid van Moolenbroek * These are usually commented out in Windows NT to avoid conflicts with errno.h. 191*00b67f09SDavid van Moolenbroek * Use the WSA constants instead. 192*00b67f09SDavid van Moolenbroek */ 193*00b67f09SDavid van Moolenbroek 194*00b67f09SDavid van Moolenbroek #include <errno.h> 195*00b67f09SDavid van Moolenbroek 196*00b67f09SDavid van Moolenbroek #ifndef EWOULDBLOCK 197*00b67f09SDavid van Moolenbroek #define EWOULDBLOCK WSAEWOULDBLOCK 198*00b67f09SDavid van Moolenbroek #endif 199*00b67f09SDavid van Moolenbroek #ifndef EINPROGRESS 200*00b67f09SDavid van Moolenbroek #define EINPROGRESS WSAEINPROGRESS 201*00b67f09SDavid van Moolenbroek #endif 202*00b67f09SDavid van Moolenbroek #ifndef EALREADY 203*00b67f09SDavid van Moolenbroek #define EALREADY WSAEALREADY 204*00b67f09SDavid van Moolenbroek #endif 205*00b67f09SDavid van Moolenbroek #ifndef ENOTSOCK 206*00b67f09SDavid van Moolenbroek #define ENOTSOCK WSAENOTSOCK 207*00b67f09SDavid van Moolenbroek #endif 208*00b67f09SDavid van Moolenbroek #ifndef EDESTADDRREQ 209*00b67f09SDavid van Moolenbroek #define EDESTADDRREQ WSAEDESTADDRREQ 210*00b67f09SDavid van Moolenbroek #endif 211*00b67f09SDavid van Moolenbroek #ifndef EMSGSIZE 212*00b67f09SDavid van Moolenbroek #define EMSGSIZE WSAEMSGSIZE 213*00b67f09SDavid van Moolenbroek #endif 214*00b67f09SDavid van Moolenbroek #ifndef EPROTOTYPE 215*00b67f09SDavid van Moolenbroek #define EPROTOTYPE WSAEPROTOTYPE 216*00b67f09SDavid van Moolenbroek #endif 217*00b67f09SDavid van Moolenbroek #ifndef ENOPROTOOPT 218*00b67f09SDavid van Moolenbroek #define ENOPROTOOPT WSAENOPROTOOPT 219*00b67f09SDavid van Moolenbroek #endif 220*00b67f09SDavid van Moolenbroek #ifndef EPROTONOSUPPORT 221*00b67f09SDavid van Moolenbroek #define EPROTONOSUPPORT WSAEPROTONOSUPPORT 222*00b67f09SDavid van Moolenbroek #endif 223*00b67f09SDavid van Moolenbroek #ifndef ESOCKTNOSUPPORT 224*00b67f09SDavid van Moolenbroek #define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT 225*00b67f09SDavid van Moolenbroek #endif 226*00b67f09SDavid van Moolenbroek #ifndef EOPNOTSUPP 227*00b67f09SDavid van Moolenbroek #define EOPNOTSUPP WSAEOPNOTSUPP 228*00b67f09SDavid van Moolenbroek #endif 229*00b67f09SDavid van Moolenbroek #ifndef EPFNOSUPPORT 230*00b67f09SDavid van Moolenbroek #define EPFNOSUPPORT WSAEPFNOSUPPORT 231*00b67f09SDavid van Moolenbroek #endif 232*00b67f09SDavid van Moolenbroek #ifndef EAFNOSUPPORT 233*00b67f09SDavid van Moolenbroek #define EAFNOSUPPORT WSAEAFNOSUPPORT 234*00b67f09SDavid van Moolenbroek #endif 235*00b67f09SDavid van Moolenbroek #ifndef EADDRINUSE 236*00b67f09SDavid van Moolenbroek #define EADDRINUSE WSAEADDRINUSE 237*00b67f09SDavid van Moolenbroek #endif 238*00b67f09SDavid van Moolenbroek #ifndef EADDRNOTAVAIL 239*00b67f09SDavid van Moolenbroek #define EADDRNOTAVAIL WSAEADDRNOTAVAIL 240*00b67f09SDavid van Moolenbroek #endif 241*00b67f09SDavid van Moolenbroek #ifndef ENETDOWN 242*00b67f09SDavid van Moolenbroek #define ENETDOWN WSAENETDOWN 243*00b67f09SDavid van Moolenbroek #endif 244*00b67f09SDavid van Moolenbroek #ifndef ENETUNREACH 245*00b67f09SDavid van Moolenbroek #define ENETUNREACH WSAENETUNREACH 246*00b67f09SDavid van Moolenbroek #endif 247*00b67f09SDavid van Moolenbroek #ifndef ENETRESET 248*00b67f09SDavid van Moolenbroek #define ENETRESET WSAENETRESET 249*00b67f09SDavid van Moolenbroek #endif 250*00b67f09SDavid van Moolenbroek #ifndef ECONNABORTED 251*00b67f09SDavid van Moolenbroek #define ECONNABORTED WSAECONNABORTED 252*00b67f09SDavid van Moolenbroek #endif 253*00b67f09SDavid van Moolenbroek #ifndef ECONNRESET 254*00b67f09SDavid van Moolenbroek #define ECONNRESET WSAECONNRESET 255*00b67f09SDavid van Moolenbroek #endif 256*00b67f09SDavid van Moolenbroek #ifndef ENOBUFS 257*00b67f09SDavid van Moolenbroek #define ENOBUFS WSAENOBUFS 258*00b67f09SDavid van Moolenbroek #endif 259*00b67f09SDavid van Moolenbroek #ifndef EISCONN 260*00b67f09SDavid van Moolenbroek #define EISCONN WSAEISCONN 261*00b67f09SDavid van Moolenbroek #endif 262*00b67f09SDavid van Moolenbroek #ifndef ENOTCONN 263*00b67f09SDavid van Moolenbroek #define ENOTCONN WSAENOTCONN 264*00b67f09SDavid van Moolenbroek #endif 265*00b67f09SDavid van Moolenbroek #ifndef ESHUTDOWN 266*00b67f09SDavid van Moolenbroek #define ESHUTDOWN WSAESHUTDOWN 267*00b67f09SDavid van Moolenbroek #endif 268*00b67f09SDavid van Moolenbroek #ifndef ETOOMANYREFS 269*00b67f09SDavid van Moolenbroek #define ETOOMANYREFS WSAETOOMANYREFS 270*00b67f09SDavid van Moolenbroek #endif 271*00b67f09SDavid van Moolenbroek #ifndef ETIMEDOUT 272*00b67f09SDavid van Moolenbroek #define ETIMEDOUT WSAETIMEDOUT 273*00b67f09SDavid van Moolenbroek #endif 274*00b67f09SDavid van Moolenbroek #ifndef ECONNREFUSED 275*00b67f09SDavid van Moolenbroek #define ECONNREFUSED WSAECONNREFUSED 276*00b67f09SDavid van Moolenbroek #endif 277*00b67f09SDavid van Moolenbroek #ifndef ELOOP 278*00b67f09SDavid van Moolenbroek #define ELOOP WSAELOOP 279*00b67f09SDavid van Moolenbroek #endif 280*00b67f09SDavid van Moolenbroek #ifndef EHOSTDOWN 281*00b67f09SDavid van Moolenbroek #define EHOSTDOWN WSAEHOSTDOWN 282*00b67f09SDavid van Moolenbroek #endif 283*00b67f09SDavid van Moolenbroek #ifndef EHOSTUNREACH 284*00b67f09SDavid van Moolenbroek #define EHOSTUNREACH WSAEHOSTUNREACH 285*00b67f09SDavid van Moolenbroek #endif 286*00b67f09SDavid van Moolenbroek #ifndef EPROCLIM 287*00b67f09SDavid van Moolenbroek #define EPROCLIM WSAEPROCLIM 288*00b67f09SDavid van Moolenbroek #endif 289*00b67f09SDavid van Moolenbroek #ifndef EUSERS 290*00b67f09SDavid van Moolenbroek #define EUSERS WSAEUSERS 291*00b67f09SDavid van Moolenbroek #endif 292*00b67f09SDavid van Moolenbroek #ifndef EDQUOT 293*00b67f09SDavid van Moolenbroek #define EDQUOT WSAEDQUOT 294*00b67f09SDavid van Moolenbroek #endif 295*00b67f09SDavid van Moolenbroek #ifndef ESTALE 296*00b67f09SDavid van Moolenbroek #define ESTALE WSAESTALE 297*00b67f09SDavid van Moolenbroek #endif 298*00b67f09SDavid van Moolenbroek #ifndef EREMOTE 299*00b67f09SDavid van Moolenbroek #define EREMOTE WSAEREMOTE 300*00b67f09SDavid van Moolenbroek #endif 301*00b67f09SDavid van Moolenbroek 302*00b67f09SDavid van Moolenbroek 303*00b67f09SDavid van Moolenbroek /*** 304*00b67f09SDavid van Moolenbroek *** Functions. 305*00b67f09SDavid van Moolenbroek ***/ 306*00b67f09SDavid van Moolenbroek 307*00b67f09SDavid van Moolenbroek ISC_LANG_BEGINDECLS 308*00b67f09SDavid van Moolenbroek 309*00b67f09SDavid van Moolenbroek isc_result_t 310*00b67f09SDavid van Moolenbroek isc_net_probeipv4(void); 311*00b67f09SDavid van Moolenbroek /* 312*00b67f09SDavid van Moolenbroek * Check if the system's kernel supports IPv4. 313*00b67f09SDavid van Moolenbroek * 314*00b67f09SDavid van Moolenbroek * Returns: 315*00b67f09SDavid van Moolenbroek * 316*00b67f09SDavid van Moolenbroek * ISC_R_SUCCESS IPv4 is supported. 317*00b67f09SDavid van Moolenbroek * ISC_R_NOTFOUND IPv4 is not supported. 318*00b67f09SDavid van Moolenbroek * ISC_R_DISABLED IPv4 is disabled. 319*00b67f09SDavid van Moolenbroek * ISC_R_UNEXPECTED 320*00b67f09SDavid van Moolenbroek */ 321*00b67f09SDavid van Moolenbroek 322*00b67f09SDavid van Moolenbroek isc_result_t 323*00b67f09SDavid van Moolenbroek isc_net_probeipv6(void); 324*00b67f09SDavid van Moolenbroek /* 325*00b67f09SDavid van Moolenbroek * Check if the system's kernel supports IPv6. 326*00b67f09SDavid van Moolenbroek * 327*00b67f09SDavid van Moolenbroek * Returns: 328*00b67f09SDavid van Moolenbroek * 329*00b67f09SDavid van Moolenbroek * ISC_R_SUCCESS IPv6 is supported. 330*00b67f09SDavid van Moolenbroek * ISC_R_NOTFOUND IPv6 is not supported. 331*00b67f09SDavid van Moolenbroek * ISC_R_DISABLED IPv6 is disabled. 332*00b67f09SDavid van Moolenbroek * ISC_R_UNEXPECTED 333*00b67f09SDavid van Moolenbroek */ 334*00b67f09SDavid van Moolenbroek 335*00b67f09SDavid van Moolenbroek isc_result_t 336*00b67f09SDavid van Moolenbroek isc_net_probeunix(void); 337*00b67f09SDavid van Moolenbroek /* 338*00b67f09SDavid van Moolenbroek * Check if UNIX domain sockets are supported. 339*00b67f09SDavid van Moolenbroek * 340*00b67f09SDavid van Moolenbroek * Returns: 341*00b67f09SDavid van Moolenbroek * 342*00b67f09SDavid van Moolenbroek * ISC_R_SUCCESS 343*00b67f09SDavid van Moolenbroek * ISC_R_NOTFOUND 344*00b67f09SDavid van Moolenbroek */ 345*00b67f09SDavid van Moolenbroek 346*00b67f09SDavid van Moolenbroek #define ISC_NET_DSCPRECVV4 0x01 /* Can receive sent DSCP value IPv4 */ 347*00b67f09SDavid van Moolenbroek #define ISC_NET_DSCPRECVV6 0x02 /* Can receive sent DSCP value IPv6 */ 348*00b67f09SDavid van Moolenbroek #define ISC_NET_DSCPSETV4 0x04 /* Can set DSCP on socket IPv4 */ 349*00b67f09SDavid van Moolenbroek #define ISC_NET_DSCPSETV6 0x08 /* Can set DSCP on socket IPv6 */ 350*00b67f09SDavid van Moolenbroek #define ISC_NET_DSCPPKTV4 0x10 /* Can set DSCP on per packet IPv4 */ 351*00b67f09SDavid van Moolenbroek #define ISC_NET_DSCPPKTV6 0x20 /* Can set DSCP on per packet IPv6 */ 352*00b67f09SDavid van Moolenbroek #define ISC_NET_DSCPALL 0x3f /* All valid flags */ 353*00b67f09SDavid van Moolenbroek 354*00b67f09SDavid van Moolenbroek unsigned int 355*00b67f09SDavid van Moolenbroek isc_net_probedscp(void); 356*00b67f09SDavid van Moolenbroek /*%< 357*00b67f09SDavid van Moolenbroek * Probe the level of DSCP support. 358*00b67f09SDavid van Moolenbroek */ 359*00b67f09SDavid van Moolenbroek 360*00b67f09SDavid van Moolenbroek isc_result_t 361*00b67f09SDavid van Moolenbroek isc_net_probe_ipv6only(void); 362*00b67f09SDavid van Moolenbroek /* 363*00b67f09SDavid van Moolenbroek * Check if the system's kernel supports the IPV6_V6ONLY socket option. 364*00b67f09SDavid van Moolenbroek * 365*00b67f09SDavid van Moolenbroek * Returns: 366*00b67f09SDavid van Moolenbroek * 367*00b67f09SDavid van Moolenbroek * ISC_R_SUCCESS the option is supported for both TCP and UDP. 368*00b67f09SDavid van Moolenbroek * ISC_R_NOTFOUND IPv6 itself or the option is not supported. 369*00b67f09SDavid van Moolenbroek * ISC_R_UNEXPECTED 370*00b67f09SDavid van Moolenbroek */ 371*00b67f09SDavid van Moolenbroek 372*00b67f09SDavid van Moolenbroek isc_result_t 373*00b67f09SDavid van Moolenbroek isc_net_probe_ipv6pktinfo(void); 374*00b67f09SDavid van Moolenbroek /* 375*00b67f09SDavid van Moolenbroek * Check if the system's kernel supports the IPV6_(RECV)PKTINFO socket option 376*00b67f09SDavid van Moolenbroek * for UDP sockets. 377*00b67f09SDavid van Moolenbroek * 378*00b67f09SDavid van Moolenbroek * Returns: 379*00b67f09SDavid van Moolenbroek * 380*00b67f09SDavid van Moolenbroek * ISC_R_SUCCESS the option is supported. 381*00b67f09SDavid van Moolenbroek * ISC_R_NOTFOUND IPv6 itself or the option is not supported. 382*00b67f09SDavid van Moolenbroek * ISC_R_UNEXPECTED 383*00b67f09SDavid van Moolenbroek */ 384*00b67f09SDavid van Moolenbroek 385*00b67f09SDavid van Moolenbroek void 386*00b67f09SDavid van Moolenbroek isc_net_disableipv4(void); 387*00b67f09SDavid van Moolenbroek 388*00b67f09SDavid van Moolenbroek void 389*00b67f09SDavid van Moolenbroek isc_net_disableipv6(void); 390*00b67f09SDavid van Moolenbroek 391*00b67f09SDavid van Moolenbroek void 392*00b67f09SDavid van Moolenbroek isc_net_enableipv4(void); 393*00b67f09SDavid van Moolenbroek 394*00b67f09SDavid van Moolenbroek void 395*00b67f09SDavid van Moolenbroek isc_net_enableipv6(void); 396*00b67f09SDavid van Moolenbroek 397*00b67f09SDavid van Moolenbroek isc_result_t 398*00b67f09SDavid van Moolenbroek isc_net_getudpportrange(int af, in_port_t *low, in_port_t *high); 399*00b67f09SDavid van Moolenbroek /*%< 400*00b67f09SDavid van Moolenbroek * Returns system's default range of ephemeral UDP ports, if defined. 401*00b67f09SDavid van Moolenbroek * If the range is not available or unknown, ISC_NET_PORTRANGELOW and 402*00b67f09SDavid van Moolenbroek * ISC_NET_PORTRANGEHIGH will be returned. 403*00b67f09SDavid van Moolenbroek * 404*00b67f09SDavid van Moolenbroek * Requires: 405*00b67f09SDavid van Moolenbroek * 406*00b67f09SDavid van Moolenbroek *\li 'low' and 'high' must be non NULL. 407*00b67f09SDavid van Moolenbroek * 408*00b67f09SDavid van Moolenbroek * Returns: 409*00b67f09SDavid van Moolenbroek * 410*00b67f09SDavid van Moolenbroek *\li *low and *high will be the ports specifying the low and high ends of 411*00b67f09SDavid van Moolenbroek * the range. 412*00b67f09SDavid van Moolenbroek */ 413*00b67f09SDavid van Moolenbroek 414*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_NEEDNTOP 415*00b67f09SDavid van Moolenbroek const char * 416*00b67f09SDavid van Moolenbroek isc_net_ntop(int af, const void *src, char *dst, size_t size); 417*00b67f09SDavid van Moolenbroek #define inet_ntop isc_net_ntop 418*00b67f09SDavid van Moolenbroek #endif 419*00b67f09SDavid van Moolenbroek 420*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_NEEDPTON 421*00b67f09SDavid van Moolenbroek int 422*00b67f09SDavid van Moolenbroek isc_net_pton(int af, const char *src, void *dst); 423*00b67f09SDavid van Moolenbroek #define inet_pton isc_net_pton 424*00b67f09SDavid van Moolenbroek #endif 425*00b67f09SDavid van Moolenbroek 426*00b67f09SDavid van Moolenbroek int 427*00b67f09SDavid van Moolenbroek isc_net_aton(const char *cp, struct in_addr *addr); 428*00b67f09SDavid van Moolenbroek #define inet_aton isc_net_aton 429*00b67f09SDavid van Moolenbroek 430*00b67f09SDavid van Moolenbroek ISC_LANG_ENDDECLS 431*00b67f09SDavid van Moolenbroek 432*00b67f09SDavid van Moolenbroek #endif /* ISC_NET_H */ 433