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