#ifndef ISC_NET_H
#define ISC_NET_H 1
#include <isc/platform.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#ifdef ISC_PLATFORM_NEEDNETINETIN6H
#include <netinet/in6.h>
#endif
#ifdef ISC_PLATFORM_NEEDNETINET6IN6H
#include <netinet6/in6.h>
#endif
#ifndef ISC_PLATFORM_HAVEIPV6
#include <isc/ipv6.h>
#endif
#include <isc/lang.h>
#include <isc/types.h>
#ifdef ISC_PLATFORM_HAVEINADDR6
#define in6_addr in_addr6
#endif
#ifdef ISC_PLATFORM_HAVEIPV6
#ifndef IN6ADDR_ANY_INIT
#ifdef s6_addr
#define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
#else
#define IN6ADDR_ANY_INIT { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } }
#endif
#endif
#ifndef IN6ADDR_LOOPBACK_INIT
#ifdef s6_addr
#define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
#else
#define IN6ADDR_LOOPBACK_INIT { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } }
#endif
#endif
#ifndef IN6_IS_ADDR_V4MAPPED
#define IN6_IS_ADDR_V4MAPPED(x) \
(memcmp((x)->s6_addr, in6addr_any.s6_addr, 10) == 0 && \
(x)->s6_addr[10] == 0xff && (x)->s6_addr[11] == 0xff)
#endif
#ifndef IN6_IS_ADDR_V4COMPAT
#define IN6_IS_ADDR_V4COMPAT(x) \
(memcmp((x)->s6_addr, in6addr_any.s6_addr, 12) == 0 && \
((x)->s6_addr[12] != 0 || (x)->s6_addr[13] != 0 || \
(x)->s6_addr[14] != 0 || \
((x)->s6_addr[15] != 0 && (x)->s6_addr[15] != 1)))
#endif
#ifndef IN6_IS_ADDR_MULTICAST
#define IN6_IS_ADDR_MULTICAST(a) ((a)->s6_addr[0] == 0xff)
#endif
#ifndef IN6_IS_ADDR_LINKLOCAL
#define IN6_IS_ADDR_LINKLOCAL(a) \
(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
#endif
#ifndef IN6_IS_ADDR_SITELOCAL
#define IN6_IS_ADDR_SITELOCAL(a) \
(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
#endif
#ifndef IN6_IS_ADDR_LOOPBACK
#define IN6_IS_ADDR_LOOPBACK(x) \
(memcmp((x)->s6_addr, in6addr_loopback.s6_addr, 16) == 0)
#endif
#endif
#ifndef AF_INET6
#define AF_INET6 99
#endif
#ifndef PF_INET6
#define PF_INET6 AF_INET6
#endif
#ifndef INADDR_LOOPBACK
#define INADDR_LOOPBACK 0x7f000001UL
#endif
#if 0
#ifndef ISC_PLATFORM_HAVEIN6PKTINFO
struct in6_pktinfo {
struct in6_addr ipi6_addr;
unsigned int ipi6_ifindex;
};
#endif
#endif
#if defined(ISC_PLATFORM_HAVEIPV6) && defined(ISC_PLATFORM_NEEDIN6ADDRANY)
extern const struct in6_addr isc_net_in6addrany;
#define in6addr_any isc_net_in6addrany
#endif
#if defined(ISC_PLATFORM_HAVEIPV6) && defined(ISC_PLATFORM_NEEDIN6ADDRLOOPBACK)
extern const struct in6_addr isc_net_in6addrloop;
#define in6addr_loopback isc_net_in6addrloop
#endif
#ifdef ISC_PLATFORM_FIXIN6ISADDR
#undef IN6_IS_ADDR_GEOGRAPHIC
#define IN6_IS_ADDR_GEOGRAPHIC(a) (((a)->S6_un.S6_l[0] & 0xE0) == 0x80)
#undef IN6_IS_ADDR_IPX
#define IN6_IS_ADDR_IPX(a) (((a)->S6_un.S6_l[0] & 0xFE) == 0x04)
#undef IN6_IS_ADDR_LINKLOCAL
#define IN6_IS_ADDR_LINKLOCAL(a) (((a)->S6_un.S6_l[0] & 0xC0FF) == 0x80FE)
#undef IN6_IS_ADDR_MULTICAST
#define IN6_IS_ADDR_MULTICAST(a) (((a)->S6_un.S6_l[0] & 0xFF) == 0xFF)
#undef IN6_IS_ADDR_NSAP
#define IN6_IS_ADDR_NSAP(a) (((a)->S6_un.S6_l[0] & 0xFE) == 0x02)
#undef IN6_IS_ADDR_PROVIDER
#define IN6_IS_ADDR_PROVIDER(a) (((a)->S6_un.S6_l[0] & 0xE0) == 0x40)
#undef IN6_IS_ADDR_SITELOCAL
#define IN6_IS_ADDR_SITELOCAL(a) (((a)->S6_un.S6_l[0] & 0xC0FF) == 0xC0FE)
#endif
#ifdef ISC_PLATFORM_NEEDPORTT
typedef isc_uint16_t in_port_t;
#endif
#ifndef MSG_TRUNC
#define ISC_PLATFORM_RECVOVERFLOW
#endif
#define ISC__IPADDR(x) ((isc_uint32_t)htonl((isc_uint32_t)(x)))
#define ISC_IPADDR_ISMULTICAST(i) \
(((isc_uint32_t)(i) & ISC__IPADDR(0xf0000000)) \
== ISC__IPADDR(0xe0000000))
ISC_LANG_BEGINDECLS
isc_result_t
isc_net_probeipv4(void);
isc_result_t
isc_net_probeipv6(void);
const char *
isc_net_ntop(int af, const void *src, char *dst, size_t size);
#ifdef ISC_PLATFORM_NEEDNTOP
#define inet_ntop isc_net_ntop
#endif
int
isc_net_pton(int af, const char *src, void *dst);
#ifdef ISC_PLATFORM_NEEDPTON
#undef inet_pton
#define inet_pton isc_net_pton
#endif
int
isc_net_aton(const char *cp, struct in_addr *addr);
#ifdef ISC_PLATFORM_NEEDATON
#define inet_aton isc_net_aton
#endif
ISC_LANG_ENDDECLS
#endif