#ifndef _NETINET_IN_H
#define _NETINET_IN_H
#include <sys/feature_tests.h>
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#if !defined(_XPG4_2) || defined(__EXTENSIONS__)
#include <sys/socket_impl.h>
#endif
#ifndef _SOCKLEN_T
#define _SOCKLEN_T
#if defined(_XPG4_2) && !defined(_XPG5) && !defined(_LP64)
typedef size_t socklen_t;
#else
typedef uint32_t socklen_t;
#endif
#if defined(_XPG4_2) || defined(_BOOT)
typedef socklen_t *Psocklen_t;
#else
typedef void *Psocklen_t;
#endif
#endif
#if !defined(_XPG4_2) || defined(__EXTENSIONS__) || defined(_XPG5)
#include <sys/byteorder.h>
#endif
#ifndef _IN_PORT_T
#define _IN_PORT_T
typedef uint16_t in_port_t;
#endif
#ifndef _IN_ADDR_T
#define _IN_ADDR_T
typedef uint32_t in_addr_t;
#endif
#ifndef _IPADDR_T
#define _IPADDR_T
typedef uint32_t ipaddr_t;
#endif
#if !defined(_XPG4_2) || defined(_XPG6) || defined(__EXTENSIONS__)
struct in6_addr {
union {
#ifdef _KERNEL
uint32_t _S6_u32[4];
uint16_t _S6_u16[8];
uint8_t _S6_u8[16];
#else
uint8_t _S6_u8[16];
uint16_t _S6_u16[8];
uint32_t _S6_u32[4];
#endif
uint32_t __S6_align;
} _S6_un;
};
#define s6_addr _S6_un._S6_u8
#ifdef _KERNEL
#define s6_addr8 _S6_un._S6_u8
#define s6_addr16 _S6_un._S6_u16
#define s6_addr32 _S6_un._S6_u32
#endif
typedef struct in6_addr in6_addr_t;
#endif
#ifndef _SA_FAMILY_T
#define _SA_FAMILY_T
typedef uint16_t sa_family_t;
#endif
#define IPPROTO_IP 0
#define IPPROTO_HOPOPTS 0
#define IPPROTO_ICMP 1
#define IPPROTO_IGMP 2
#define IPPROTO_GGP 3
#define IPPROTO_ENCAP 4
#define IPPROTO_TCP 6
#define IPPROTO_EGP 8
#define IPPROTO_PUP 12
#define IPPROTO_UDP 17
#define IPPROTO_IDP 22
#define IPPROTO_IPV6 41
#define IPPROTO_ROUTING 43
#define IPPROTO_FRAGMENT 44
#define IPPROTO_RSVP 46
#define IPPROTO_ESP 50
#define IPPROTO_AH 51
#define IPPROTO_ICMPV6 58
#define IPPROTO_NONE 59
#define IPPROTO_DSTOPTS 60
#define IPPROTO_HELLO 63
#define IPPROTO_ND 77
#define IPPROTO_EON 80
#define IPPROTO_OSPF 89
#define IPPROTO_PIM 103
#define IPPROTO_SCTP 132
#define IPPROTO_MH 135
#define IPPROTO_HIP 139
#define IPPROTO_SHIM6 140
#define IPPROTO_RAW 255
#define IPPROTO_MAX 256
#if !defined(_XPG4_2) || defined(__EXTENSIONS__)
#define PROTO_SDP 257
#endif
#define IPPORT_ECHO 7
#define IPPORT_DISCARD 9
#define IPPORT_SYSTAT 11
#define IPPORT_DAYTIME 13
#define IPPORT_NETSTAT 15
#define IPPORT_CHARGEN 19
#define IPPORT_FTP 21
#define IPPORT_TELNET 23
#define IPPORT_SMTP 25
#define IPPORT_TIMESERVER 37
#define IPPORT_NAMESERVER 42
#define IPPORT_WHOIS 43
#define IPPORT_DOMAIN 53
#define IPPORT_MDNS 5353
#define IPPORT_MTP 57
#define IPPORT_BOOTPS 67
#define IPPORT_BOOTPC 68
#define IPPORT_TFTP 69
#define IPPORT_RJE 77
#define IPPORT_FINGER 79
#define IPPORT_HTTP 80
#define IPPORT_HTTP_ALT 8080
#define IPPORT_TTYLINK 87
#define IPPORT_SUPDUP 95
#define IPPORT_NTP 123
#define IPPORT_NETBIOS_NS 137
#define IPPORT_NETBIOS_DGM 138
#define IPPORT_NETBIOS_SSN 139
#define IPPORT_LDAP 389
#define IPPORT_SLP 427
#define IPPORT_MIP 434
#define IPPORT_SMB 445
#define IPPORT_VXLAN 4789
#define IPPORT_IKE 500
#define IPPORT_IKE_NATT 4500
#define IPPORT_EXECSERVER 512
#define IPPORT_LOGINSERVER 513
#define IPPORT_CMDSERVER 514
#define IPPORT_PRINTER 515
#define IPPORT_EFSSERVER 520
#define IPPORT_BIFFUDP 512
#define IPPORT_WHOSERVER 513
#define IPPORT_SYSLOG 514
#define IPPORT_TALK 517
#define IPPORT_ROUTESERVER 520
#define IPPORT_RIPNG 521
#define IPPORT_DHCPV6C 546
#define IPPORT_DHCPV6S 547
#define IPPORT_SOCKS 1080
#define IPPORT_RESERVED 1024
#define IPPORT_USERRESERVED 5000
#ifdef _KERNEL
#define IPPORT_DYNAMIC_MIN 49152
#define IPPORT_DYNAMIC_MAX 65535
#endif
#define IMPLINK_IP 155
#define IMPLINK_LOWEXPER 156
#define IMPLINK_HIGHEXPER 158
#if !defined(_XPG4_2) || defined(__EXTENSIONS__)
#define _S_un_b S_un_b
#define _S_un_w S_un_w
#define _S_addr S_addr
#define _S_un S_un
#endif
struct in_addr {
union {
struct { uint8_t s_b1, s_b2, s_b3, s_b4; } _S_un_b;
struct { uint16_t s_w1, s_w2; } _S_un_w;
#if !defined(_XPG4_2) || defined(__EXTENSIONS__)
uint32_t _S_addr;
#else
in_addr_t _S_addr;
#endif
} _S_un;
#define s_addr _S_un._S_addr
#define s_host _S_un._S_un_b.s_b2
#define s_net _S_un._S_un_b.s_b1
#define s_imp _S_un._S_un_w.s_w2
#define s_impno _S_un._S_un_b.s_b4
#define s_lh _S_un._S_un_b.s_b3
};
#define IN_CLASSA(i) (((i) & 0x80000000U) == 0)
#define IN_CLASSA_NET 0xff000000U
#define IN_CLASSA_NSHIFT 24
#define IN_CLASSA_HOST 0x00ffffffU
#define IN_CLASSA_MAX 128
#define IN_CLASSB(i) (((i) & 0xc0000000U) == 0x80000000U)
#define IN_CLASSB_NET 0xffff0000U
#define IN_CLASSB_NSHIFT 16
#define IN_CLASSB_HOST 0x0000ffffU
#define IN_CLASSB_MAX 65536
#define IN_CLASSC(i) (((i) & 0xe0000000U) == 0xc0000000U)
#define IN_CLASSC_NET 0xffffff00U
#define IN_CLASSC_NSHIFT 8
#define IN_CLASSC_HOST 0x000000ffU
#define IN_CLASSD(i) (((i) & 0xf0000000U) == 0xe0000000U)
#define IN_CLASSD_NET 0xf0000000U
#define IN_CLASSD_NSHIFT 28
#define IN_CLASSD_HOST 0x0fffffffU
#define IN_CLASSE(i) (((i) & 0xf0000000U) == 0xf0000000U)
#define IN_CLASSE_NET 0xffffffffU
#define IN_MULTICAST(i) IN_CLASSD(i)
#ifndef _KERNEL
#define IN_EXPERIMENTAL(i) (((i) & 0xe0000000U) == 0xe0000000U)
#define IN_BADCLASS(i) (((i) & 0xf0000000U) == 0xf0000000U)
#endif
#define INADDR_ANY 0x00000000U
#define INADDR_LOOPBACK 0x7F000001U
#define INADDR_BROADCAST 0xffffffffU
#define INADDR_NONE 0xffffffffU
#define INADDR_UNSPEC_GROUP 0xe0000000U
#define INADDR_ALLHOSTS_GROUP 0xe0000001U
#define INADDR_ALLRTRS_GROUP 0xe0000002U
#define INADDR_ALLRPTS_GROUP 0xe0000016U
#define INADDR_MAX_LOCAL_GROUP 0xe00000ffU
#define IN_AUTOCONF_NET 0xa9fe0000U
#define IN_AUTOCONF_MASK 0xffff0000U
#define IN_PRIVATE8_NET 0x0a000000U
#define IN_PRIVATE8_MASK 0xff000000U
#define IN_PRIVATE12_NET 0xac100000U
#define IN_PRIVATE12_MASK 0xfff00000U
#define IN_PRIVATE16_NET 0xc0a80000U
#define IN_PRIVATE16_MASK 0xffff0000U
#define IN_LINKLOCAL(i) (((i) & IN_AUTOCONF_MASK) == IN_AUTOCONF_NET)
#if !defined(_XPG4_2) || !defined(__EXTENSIONS__)
#define INADDR_6TO4RRANYCAST 0xc0586301U
#endif
#define IN_LOOPBACKNET 127
#if !defined(_XPG4_2) || !defined(__EXTENSIONS__)
#define IN_SET_LOOPBACK_ADDR(a) \
{ (a)->sin_addr.s_addr = htonl(INADDR_LOOPBACK); \
(a)->sin_family = AF_INET; }
#endif
struct sockaddr_in {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
#if !defined(_XPG4_2) || defined(__EXTENSIONS__)
char sin_zero[8];
#else
unsigned char sin_zero[8];
#endif
};
#if !defined(_XPG4_2) || defined(_XPG6) || defined(__EXTENSIONS__)
struct sockaddr_in6 {
sa_family_t sin6_family;
in_port_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id;
uint32_t __sin6_src_id;
};
#ifdef _BIG_ENDIAN
#define IPV6_FLOWINFO_FLOWLABEL 0x000fffffU
#define IPV6_FLOWINFO_TCLASS 0x0ff00000U
#else
#define IPV6_FLOWINFO_FLOWLABEL 0xffff0f00U
#define IPV6_FLOWINFO_TCLASS 0x0000f00fU
#endif
#ifdef _KERNEL
#define IN6ADDR_ANY_INIT { 0, 0, 0, 0 }
#ifdef _BIG_ENDIAN
#define IN6ADDR_LOOPBACK_INIT { 0, 0, 0, 0x00000001U }
#else
#define IN6ADDR_LOOPBACK_INIT { 0, 0, 0, 0x01000000U }
#endif
#else
#define IN6ADDR_ANY_INIT { 0, 0, 0, 0, \
0, 0, 0, 0, \
0, 0, 0, 0, \
0, 0, 0, 0 }
#define IN6ADDR_LOOPBACK_INIT { 0, 0, 0, 0, \
0, 0, 0, 0, \
0, 0, 0, 0, \
0, 0, 0, 0x1U }
#endif
#define IN6_IS_ADDR_UNSPECIFIED(addr) \
(((addr)->_S6_un._S6_u32[3] == 0) && \
((addr)->_S6_un._S6_u32[2] == 0) && \
((addr)->_S6_un._S6_u32[1] == 0) && \
((addr)->_S6_un._S6_u32[0] == 0))
#ifdef _BIG_ENDIAN
#define IN6_IS_ADDR_LOOPBACK(addr) \
(((addr)->_S6_un._S6_u32[3] == 0x00000001) && \
((addr)->_S6_un._S6_u32[2] == 0) && \
((addr)->_S6_un._S6_u32[1] == 0) && \
((addr)->_S6_un._S6_u32[0] == 0))
#else
#define IN6_IS_ADDR_LOOPBACK(addr) \
(((addr)->_S6_un._S6_u32[3] == 0x01000000) && \
((addr)->_S6_un._S6_u32[2] == 0) && \
((addr)->_S6_un._S6_u32[1] == 0) && \
((addr)->_S6_un._S6_u32[0] == 0))
#endif
#ifdef _BIG_ENDIAN
#define IN6_IS_ADDR_MULTICAST(addr) \
(((addr)->_S6_un._S6_u32[0] & 0xff000000) == 0xff000000)
#else
#define IN6_IS_ADDR_MULTICAST(addr) \
(((addr)->_S6_un._S6_u32[0] & 0x000000ff) == 0x000000ff)
#endif
#ifdef _BIG_ENDIAN
#define IN6_IS_ADDR_LINKLOCAL(addr) \
(((addr)->_S6_un._S6_u32[0] & 0xffc00000) == 0xfe800000)
#else
#define IN6_IS_ADDR_LINKLOCAL(addr) \
(((addr)->_S6_un._S6_u32[0] & 0x0000c0ff) == 0x000080fe)
#endif
#ifdef _BIG_ENDIAN
#define IN6_IS_ADDR_SITELOCAL(addr) \
(((addr)->_S6_un._S6_u32[0] & 0xffc00000) == 0xfec00000)
#else
#define IN6_IS_ADDR_SITELOCAL(addr) \
(((addr)->_S6_un._S6_u32[0] & 0x0000c0ff) == 0x0000c0fe)
#endif
#ifdef _BIG_ENDIAN
#define IN6_IS_ADDR_V4MAPPED(addr) \
(((addr)->_S6_un._S6_u32[2] == 0x0000ffff) && \
((addr)->_S6_un._S6_u32[1] == 0) && \
((addr)->_S6_un._S6_u32[0] == 0))
#else
#define IN6_IS_ADDR_V4MAPPED(addr) \
(((addr)->_S6_un._S6_u32[2] == 0xffff0000U) && \
((addr)->_S6_un._S6_u32[1] == 0) && \
((addr)->_S6_un._S6_u32[0] == 0))
#endif
#ifdef _BIG_ENDIAN
#define IN6_IS_ADDR_V4MAPPED_ANY(addr) \
(((addr)->_S6_un._S6_u32[3] == 0) && \
((addr)->_S6_un._S6_u32[2] == 0x0000ffff) && \
((addr)->_S6_un._S6_u32[1] == 0) && \
((addr)->_S6_un._S6_u32[0] == 0))
#else
#define IN6_IS_ADDR_V4MAPPED_ANY(addr) \
(((addr)->_S6_un._S6_u32[3] == 0) && \
((addr)->_S6_un._S6_u32[2] == 0xffff0000U) && \
((addr)->_S6_un._S6_u32[1] == 0) && \
((addr)->_S6_un._S6_u32[0] == 0))
#endif
#ifdef _BIG_ENDIAN
#define IN6_IS_ADDR_V4COMPAT(addr) \
(((addr)->_S6_un._S6_u32[2] == 0) && \
((addr)->_S6_un._S6_u32[1] == 0) && \
((addr)->_S6_un._S6_u32[0] == 0) && \
!((addr)->_S6_un._S6_u32[3] == 0) && \
!((addr)->_S6_un._S6_u32[3] == 0x00000001))
#else
#define IN6_IS_ADDR_V4COMPAT(addr) \
(((addr)->_S6_un._S6_u32[2] == 0) && \
((addr)->_S6_un._S6_u32[1] == 0) && \
((addr)->_S6_un._S6_u32[0] == 0) && \
!((addr)->_S6_un._S6_u32[3] == 0) && \
!((addr)->_S6_un._S6_u32[3] == 0x01000000))
#endif
#ifdef _BIG_ENDIAN
#define IN6_IS_ADDR_MC_RESERVED(addr) \
(((addr)->_S6_un._S6_u32[0] & 0xff0f0000) == 0xff000000)
#else
#define IN6_IS_ADDR_MC_RESERVED(addr) \
(((addr)->_S6_un._S6_u32[0] & 0x00000fff) == 0x000000ff)
#endif
#ifdef _BIG_ENDIAN
#define IN6_IS_ADDR_MC_NODELOCAL(addr) \
(((addr)->_S6_un._S6_u32[0] & 0xff0f0000) == 0xff010000)
#else
#define IN6_IS_ADDR_MC_NODELOCAL(addr) \
(((addr)->_S6_un._S6_u32[0] & 0x00000fff) == 0x000001ff)
#endif
#ifdef _BIG_ENDIAN
#define IN6_IS_ADDR_MC_LINKLOCAL(addr) \
(((addr)->_S6_un._S6_u32[0] & 0xff0f0000) == 0xff020000)
#else
#define IN6_IS_ADDR_MC_LINKLOCAL(addr) \
(((addr)->_S6_un._S6_u32[0] & 0x00000fff) == 0x000002ff)
#endif
#ifdef _BIG_ENDIAN
#define IN6_IS_ADDR_MC_SITELOCAL(addr) \
(((addr)->_S6_un._S6_u32[0] & 0xff0f0000) == 0xff050000)
#else
#define IN6_IS_ADDR_MC_SITELOCAL(addr) \
(((addr)->_S6_un._S6_u32[0] & 0x00000fff) == 0x000005ff)
#endif
#ifdef _BIG_ENDIAN
#define IN6_IS_ADDR_MC_ORGLOCAL(addr) \
(((addr)->_S6_un._S6_u32[0] & 0xff0f0000) == 0xff080000)
#else
#define IN6_IS_ADDR_MC_ORGLOCAL(addr) \
(((addr)->_S6_un._S6_u32[0] & 0x00000fff) == 0x000008ff)
#endif
#ifdef _BIG_ENDIAN
#define IN6_IS_ADDR_MC_GLOBAL(addr) \
(((addr)->_S6_un._S6_u32[0] & 0xff0f0000) == 0xff0e0000)
#else
#define IN6_IS_ADDR_MC_GLOBAL(addr) \
(((addr)->_S6_un._S6_u32[0] & 0x00000fff) == 0x00000eff)
#endif
#ifdef _BIG_ENDIAN
#define IN6_IS_ADDR_MC_SOLICITEDNODE(addr) \
(((addr)->_S6_un._S6_u32[0] == 0xff020000) && \
((addr)->_S6_un._S6_u32[1] == 0x00000000) && \
((addr)->_S6_un._S6_u32[2] == 0x00000001) && \
(((addr)->_S6_un._S6_u32[3] & 0xff000000) == 0xff000000))
#else
#define IN6_IS_ADDR_MC_SOLICITEDNODE(addr) \
(((addr)->_S6_un._S6_u32[0] == 0x000002ff) && \
((addr)->_S6_un._S6_u32[1] == 0x00000000) && \
((addr)->_S6_un._S6_u32[2] == 0x01000000) && \
(((addr)->_S6_un._S6_u32[3] & 0x000000ff) == 0x000000ff))
#endif
#ifdef _BIG_ENDIAN
#define IN6_IS_ADDR_6TO4(addr) \
(((addr)->_S6_un._S6_u32[0] & 0xffff0000) == 0x20020000)
#else
#define IN6_IS_ADDR_6TO4(addr) \
(((addr)->_S6_un._S6_u32[0] & 0x0000ffff) == 0x00000220)
#endif
#define IN6_ARE_6TO4_PREFIX_EQUAL(addr1, addr2) \
(((addr1)->_S6_un._S6_u32[0] == (addr2)->_S6_un._S6_u32[0]) && \
((addr1)->_S6_un._S6_u8[4] == (addr2)->_S6_un._S6_u8[4]) && \
((addr1)->_S6_un._S6_u8[5] == (addr2)->_S6_un._S6_u8[5]))
#define IN6_IS_ADDR_LINKSCOPE(addr) \
(IN6_IS_ADDR_LINKLOCAL(addr) || IN6_IS_ADDR_MC_LINKLOCAL(addr) || \
IN6_IS_ADDR_MC_NODELOCAL(addr))
#define IN6_V4MAPPED_TO_INADDR(v6, v4) \
((v4)->s_addr = (v6)->_S6_un._S6_u32[3])
#define IN6_V4MAPPED_TO_IPADDR(v6, v4) \
((v4) = (v6)->_S6_un._S6_u32[3])
#ifdef _BIG_ENDIAN
#define IN6_INADDR_TO_V4MAPPED(v4, v6) \
((v6)->_S6_un._S6_u32[3] = (v4)->s_addr, \
(v6)->_S6_un._S6_u32[2] = 0x0000ffff, \
(v6)->_S6_un._S6_u32[1] = 0, \
(v6)->_S6_un._S6_u32[0] = 0)
#define IN6_IPADDR_TO_V4MAPPED(v4, v6) \
((v6)->_S6_un._S6_u32[3] = (v4), \
(v6)->_S6_un._S6_u32[2] = 0x0000ffff, \
(v6)->_S6_un._S6_u32[1] = 0, \
(v6)->_S6_un._S6_u32[0] = 0)
#else
#define IN6_INADDR_TO_V4MAPPED(v4, v6) \
((v6)->_S6_un._S6_u32[3] = (v4)->s_addr, \
(v6)->_S6_un._S6_u32[2] = 0xffff0000U, \
(v6)->_S6_un._S6_u32[1] = 0, \
(v6)->_S6_un._S6_u32[0] = 0)
#define IN6_IPADDR_TO_V4MAPPED(v4, v6) \
((v6)->_S6_un._S6_u32[3] = (v4), \
(v6)->_S6_un._S6_u32[2] = 0xffff0000U, \
(v6)->_S6_un._S6_u32[1] = 0, \
(v6)->_S6_un._S6_u32[0] = 0)
#endif
#define IN6_6TO4_TO_V4ADDR(v6, v4) \
((v4)->_S_un._S_un_b.s_b1 = (v6)->_S6_un._S6_u8[2], \
(v4)->_S_un._S_un_b.s_b2 = (v6)->_S6_un._S6_u8[3], \
(v4)->_S_un._S_un_b.s_b3 = (v6)->_S6_un._S6_u8[4], \
(v4)->_S_un._S_un_b.s_b4 = (v6)->_S6_un._S6_u8[5])
#ifdef _BIG_ENDIAN
#define IN6_V4ADDR_TO_6TO4(v4, v6) \
((v6)->_S6_un._S6_u8[0] = 0x20, \
(v6)->_S6_un._S6_u8[1] = 0x02, \
(v6)->_S6_un._S6_u8[2] = (v4)->_S_un._S_un_b.s_b1, \
(v6)->_S6_un._S6_u8[3] = (v4)->_S_un._S_un_b.s_b2, \
(v6)->_S6_un._S6_u8[4] = (v4)->_S_un._S_un_b.s_b3, \
(v6)->_S6_un._S6_u8[5] = (v4)->_S_un._S_un_b.s_b4, \
(v6)->_S6_un._S6_u8[6] = 0, \
(v6)->_S6_un._S6_u8[7] = 0, \
(v6)->_S6_un._S6_u32[2] = 0, \
(v6)->_S6_un._S6_u32[3] = 0x00000001U)
#else
#define IN6_V4ADDR_TO_6TO4(v4, v6) \
((v6)->_S6_un._S6_u8[0] = 0x20, \
(v6)->_S6_un._S6_u8[1] = 0x02, \
(v6)->_S6_un._S6_u8[2] = (v4)->_S_un._S_un_b.s_b1, \
(v6)->_S6_un._S6_u8[3] = (v4)->_S_un._S_un_b.s_b2, \
(v6)->_S6_un._S6_u8[4] = (v4)->_S_un._S_un_b.s_b3, \
(v6)->_S6_un._S6_u8[5] = (v4)->_S_un._S_un_b.s_b4, \
(v6)->_S6_un._S6_u8[6] = 0, \
(v6)->_S6_un._S6_u8[7] = 0, \
(v6)->_S6_un._S6_u32[2] = 0, \
(v6)->_S6_un._S6_u32[3] = 0x01000000U)
#endif
#define IN6_ARE_ADDR_EQUAL(addr1, addr2) \
(((addr1)->_S6_un._S6_u32[3] == (addr2)->_S6_un._S6_u32[3]) && \
((addr1)->_S6_un._S6_u32[2] == (addr2)->_S6_un._S6_u32[2]) && \
((addr1)->_S6_un._S6_u32[1] == (addr2)->_S6_un._S6_u32[1]) && \
((addr1)->_S6_un._S6_u32[0] == (addr2)->_S6_un._S6_u32[0]))
#define IN6_MASK_FROM_PREFIX(qoctet, prefix) \
((((qoctet) + 1) * 32 < (prefix)) ? 0xFFFFFFFFu : \
((((qoctet) * 32) >= (prefix)) ? 0x00000000u : \
0xFFFFFFFFu << (((qoctet) + 1) * 32 - (prefix))))
#define IN6_ARE_PREFIXEDADDR_EQUAL(addr1, addr2, prefix) \
(((ntohl((addr1)->_S6_un._S6_u32[0]) & \
IN6_MASK_FROM_PREFIX(0, prefix)) == \
(ntohl((addr2)->_S6_un._S6_u32[0]) & \
IN6_MASK_FROM_PREFIX(0, prefix))) && \
((ntohl((addr1)->_S6_un._S6_u32[1]) & \
IN6_MASK_FROM_PREFIX(1, prefix)) == \
(ntohl((addr2)->_S6_un._S6_u32[1]) & \
IN6_MASK_FROM_PREFIX(1, prefix))) && \
((ntohl((addr1)->_S6_un._S6_u32[2]) & \
IN6_MASK_FROM_PREFIX(2, prefix)) == \
(ntohl((addr2)->_S6_un._S6_u32[2]) & \
IN6_MASK_FROM_PREFIX(2, prefix))) && \
((ntohl((addr1)->_S6_un._S6_u32[3]) & \
IN6_MASK_FROM_PREFIX(3, prefix)) == \
(ntohl((addr2)->_S6_un._S6_u32[3]) & \
IN6_MASK_FROM_PREFIX(3, prefix))))
#endif
#ifndef IP_OPTIONS
#define IP_OPTIONS 1
#endif
#define IP_HDRINCL 2
#ifndef IP_TOS
#define IP_TOS 3
#endif
#ifndef IP_TTL
#define IP_TTL 4
#endif
#define IP_RECVOPTS 0x5
#define IP_RECVRETOPTS 0x6
#define IP_RECVDSTADDR 0x7
#define IP_RETOPTS 0x8
#define IP_RECVIF 0x9
#define IP_RECVSLLA 0xa
#define IP_RECVTTL 0xb
#define IP_RECVTOS 0xc
#define IP_MULTICAST_IF 0x10
#define IP_MULTICAST_TTL 0x11
#define IP_MULTICAST_LOOP 0x12
#define IP_ADD_MEMBERSHIP 0x13
#define IP_DROP_MEMBERSHIP 0x14
#define IP_BLOCK_SOURCE 0x15
#define IP_UNBLOCK_SOURCE 0x16
#define IP_ADD_SOURCE_MEMBERSHIP 0x17
#define IP_DROP_SOURCE_MEMBERSHIP 0x18
#define IP_NEXTHOP 0x19
#define IP_PKTINFO 0x1a
#define IP_RECVPKTINFO 0x1a
#define IP_DONTFRAG 0x1b
#define IP_MINTTL 0x1c
#if !defined(_XPG4_2) || defined(__EXTENSIONS__)
#define IP_SEC_OPT 0x22
#define IPSEC_PREF_NEVER 0x01
#define IPSEC_PREF_REQUIRED 0x02
#define IPSEC_PREF_UNIQUE 0x04
typedef struct ipsec_req {
uint_t ipsr_ah_req;
uint_t ipsr_esp_req;
uint_t ipsr_self_encap_req;
uint8_t ipsr_auth_alg;
uint8_t ipsr_esp_alg;
uint8_t ipsr_esp_auth_alg;
} ipsec_req_t;
#endif
#define IP_BOUND_IF 0x41
#define IP_UNSPEC_SRC 0x42
#define IP_BROADCAST_TTL 0x43
#define IP_DHCPINIT_IF 0x45
#ifndef IP_REUSEADDR
#define IP_REUSEADDR 0x104
#endif
#ifndef IP_DONTROUTE
#define IP_DONTROUTE 0x105
#endif
#ifndef IP_BROADCAST
#define IP_BROADCAST 0x106
#endif
#define IP_DEFAULT_MULTICAST_TTL 1
#define IP_DEFAULT_MULTICAST_LOOP 1
#if !defined(_XPG4_2) || defined(__EXTENSIONS__)
struct ip_mreq {
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
};
struct ip_mreq_source {
struct in_addr imr_multiaddr;
struct in_addr imr_sourceaddr;
struct in_addr imr_interface;
};
struct ipv6_mreq {
struct in6_addr ipv6mr_multiaddr;
unsigned int ipv6mr_interface;
};
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack(4)
#endif
struct group_req {
uint32_t gr_interface;
struct sockaddr_storage gr_group;
};
struct group_source_req {
uint32_t gsr_interface;
struct sockaddr_storage gsr_group;
struct sockaddr_storage gsr_source;
};
struct group_filter {
uint32_t gf_interface;
struct sockaddr_storage gf_group;
uint32_t gf_fmode;
uint32_t gf_numsrc;
struct sockaddr_storage gf_slist[1];
};
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack()
#endif
#define GROUP_FILTER_SIZE(numsrc) \
(sizeof (struct group_filter) - sizeof (struct sockaddr_storage) \
+ (numsrc) * sizeof (struct sockaddr_storage))
struct ip_msfilter {
struct in_addr imsf_multiaddr;
struct in_addr imsf_interface;
uint32_t imsf_fmode;
uint32_t imsf_numsrc;
struct in_addr imsf_slist[1];
};
#define IP_MSFILTER_SIZE(numsrc) \
(sizeof (struct ip_msfilter) - sizeof (struct in_addr) \
+ (numsrc) * sizeof (struct in_addr))
int setsourcefilter(int, uint32_t, struct sockaddr *, socklen_t, uint32_t,
uint_t, struct sockaddr_storage *);
int getsourcefilter(int, uint32_t, struct sockaddr *, socklen_t, uint32_t *,
uint_t *, struct sockaddr_storage *);
int setipv4sourcefilter(int, struct in_addr, struct in_addr, uint32_t,
uint32_t, struct in_addr *);
int getipv4sourcefilter(int, struct in_addr, struct in_addr, uint32_t *,
uint32_t *, struct in_addr *);
#define MCAST_INCLUDE 1
#define MCAST_EXCLUDE 2
typedef struct in_pktinfo {
unsigned int ipi_ifindex;
struct in_addr ipi_spec_dst;
struct in_addr ipi_addr;
} in_pktinfo_t;
struct in6_pktinfo {
struct in6_addr ipi6_addr;
unsigned int ipi6_ifindex;
};
struct ip6_mtuinfo {
struct sockaddr_in6 ip6m_addr;
uint32_t ip6m_mtu;
};
#define IPV6_RTHDR_TYPE_0 0
extern socklen_t inet6_rth_space(int type, int segments);
extern void *inet6_rth_init(void *bp, socklen_t bp_len, int type, int segments);
extern int inet6_rth_add(void *bp, const struct in6_addr *addr);
extern int inet6_rth_reverse(const void *in, void *out);
extern int inet6_rth_segments(const void *bp);
extern struct in6_addr *inet6_rth_getaddr(const void *bp, int index);
extern int inet6_opt_init(void *extbuf, socklen_t extlen);
extern int inet6_opt_append(void *extbuf, socklen_t extlen, int offset,
uint8_t type, socklen_t len, uint_t align, void **databufp);
extern int inet6_opt_finish(void *extbuf, socklen_t extlen, int offset);
extern int inet6_opt_set_val(void *databuf, int offset, void *val,
socklen_t vallen);
extern int inet6_opt_next(void *extbuf, socklen_t extlen, int offset,
uint8_t *typep, socklen_t *lenp, void **databufp);
extern int inet6_opt_find(void *extbufp, socklen_t extlen, int offset,
uint8_t type, socklen_t *lenp, void **databufp);
extern int inet6_opt_get_val(void *databuf, int offset, void *val,
socklen_t vallen);
#endif
typedef struct {
struct in_addr in_prefix_addr;
unsigned int in_prefix_len;
} in_prefix_t;
#if !defined(_XPG4_2) || defined(_XPG6) || defined(__EXTENSIONS__)
#define IPV6_UNICAST_HOPS 0x5
#define IPV6_MULTICAST_IF 0x6
#define IPV6_MULTICAST_HOPS 0x7
#define IPV6_MULTICAST_LOOP 0x8
#define IPV6_JOIN_GROUP 0x9
#define IPV6_LEAVE_GROUP 0xa
#define INET_ADDRSTRLEN 16
#define INET6_ADDRSTRLEN 46
#endif
#if !defined(_XPG4_2) || defined(__EXTENSIONS__)
#define IPV6_ADD_MEMBERSHIP 0x9
#define IPV6_DROP_MEMBERSHIP 0xa
#define IPV6_PKTINFO 0xb
#define IPV6_HOPLIMIT 0xc
#define IPV6_NEXTHOP 0xd
#define IPV6_HOPOPTS 0xe
#define IPV6_DSTOPTS 0xf
#define IPV6_RTHDR 0x10
#define IPV6_RTHDRDSTOPTS 0x11
#define IPV6_RECVPKTINFO 0x12
#define IPV6_RECVHOPLIMIT 0x13
#define IPV6_RECVHOPOPTS 0x14
#define _OLD_IPV6_RECVDSTOPTS 0x15
#define IPV6_RECVRTHDR 0x16
#define IPV6_RECVRTHDRDSTOPTS 0x17
#define IPV6_CHECKSUM 0x18
#define IPV6_RECVTCLASS 0x19
#define IPV6_USE_MIN_MTU 0x20
#define IPV6_DONTFRAG 0x21
#define IPV6_SEC_OPT 0x22
#define IPV6_SRC_PREFERENCES 0x23
#define IPV6_RECVPATHMTU 0x24
#define IPV6_PATHMTU 0x25
#define IPV6_TCLASS 0x26
#define IPV6_V6ONLY 0x27
#define IPV6_RECVDSTOPTS 0x28
#define MCAST_JOIN_GROUP 0x29
#define MCAST_LEAVE_GROUP 0x2a
#define MCAST_BLOCK_SOURCE 0x2b
#define MCAST_UNBLOCK_SOURCE 0x2c
#define MCAST_JOIN_SOURCE_GROUP 0x2d
#define MCAST_LEAVE_SOURCE_GROUP 0x2e
#define IPV6_PREFER_SRC_HOME 0x00000001
#define IPV6_PREFER_SRC_COA 0x00000002
#define IPV6_PREFER_SRC_PUBLIC 0x00000004
#define IPV6_PREFER_SRC_TMP 0x00000008
#define IPV6_PREFER_SRC_NONCGA 0x00000010
#define IPV6_PREFER_SRC_CGA 0x00000020
#define IPV6_PREFER_SRC_MIPMASK (IPV6_PREFER_SRC_HOME | IPV6_PREFER_SRC_COA)
#define IPV6_PREFER_SRC_MIPDEFAULT IPV6_PREFER_SRC_HOME
#define IPV6_PREFER_SRC_TMPMASK (IPV6_PREFER_SRC_PUBLIC | IPV6_PREFER_SRC_TMP)
#define IPV6_PREFER_SRC_TMPDEFAULT IPV6_PREFER_SRC_PUBLIC
#define IPV6_PREFER_SRC_CGAMASK (IPV6_PREFER_SRC_NONCGA | IPV6_PREFER_SRC_CGA)
#define IPV6_PREFER_SRC_CGADEFAULT IPV6_PREFER_SRC_NONCGA
#define IPV6_PREFER_SRC_MASK (IPV6_PREFER_SRC_MIPMASK |\
IPV6_PREFER_SRC_TMPMASK | IPV6_PREFER_SRC_CGAMASK)
#define IPV6_PREFER_SRC_DEFAULT (IPV6_PREFER_SRC_MIPDEFAULT |\
IPV6_PREFER_SRC_TMPDEFAULT | IPV6_PREFER_SRC_CGADEFAULT)
#define IPV6_MINHOPCOUNT 0x2f
#define IPV6_BOUND_IF 0x41
#define IPV6_UNSPEC_SRC 0x42
#define IPV6_PAD1_OPT 0
#endif
#if !defined(_XPG4_2) || defined(_XPG6) || defined(__EXTENSIONS__)
#ifndef _KERNEL
#ifdef __STDC__
extern const struct in6_addr in6addr_any;
extern const struct in6_addr in6addr_loopback;
#else
extern struct in6_addr in6addr_any;
extern struct in6_addr in6addr_loopback;
#endif
#endif
#endif
#ifdef __cplusplus
}
#endif
#endif