1 /* 2 * Copyright 2006-2010, Haiku Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 #ifndef _NETINET6_IN6_H_ 6 #define _NETINET6_IN6_H_ 7 8 9 #include <sys/types.h> 10 #include <stdint.h> 11 12 13 struct in6_addr { 14 uint8_t s6_addr[16]; 15 }; 16 17 /* IP Version 6 socket address. */ 18 struct sockaddr_in6 { 19 uint8_t sin6_len; 20 uint8_t sin6_family; 21 uint16_t sin6_port; 22 uint32_t sin6_flowinfo; 23 struct in6_addr sin6_addr; 24 uint32_t sin6_scope_id; 25 }; 26 27 28 #define IN6ADDR_ANY_INIT {{ \ 29 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 30 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }} 31 #define IN6ADDR_LOOPBACK_INIT {{ \ 32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 33 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }} 34 35 extern const struct in6_addr in6addr_any; 36 extern const struct in6_addr in6addr_loopback; 37 38 39 struct ipv6_mreq { 40 struct in6_addr ipv6mr_multiaddr; 41 unsigned ipv6mr_interface; 42 }; 43 44 45 /* Non-standard helper defines (same as in FreeBSD, though) */ 46 #define __IPV6_ADDR_SCOPE_NODELOCAL 0x01 47 #define __IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 48 #define __IPV6_ADDR_SCOPE_LINKLOCAL 0x02 49 #define __IPV6_ADDR_SCOPE_SITELOCAL 0x05 50 #define __IPV6_ADDR_SCOPE_ORGLOCAL 0x08 51 #define __IPV6_ADDR_SCOPE_GLOBAL 0x0e 52 53 #define __IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) 54 55 56 #define IN6_IS_ADDR_UNSPECIFIED(a) \ 57 (!memcmp((a)->s6_addr, in6addr_any.s6_addr, sizeof(struct in6_addr))) 58 59 #define IN6_IS_ADDR_LOOPBACK(a) \ 60 (!memcmp((a)->s6_addr, in6addr_loopback.s6_addr, sizeof(struct in6_addr))) 61 62 #define IN6_IS_ADDR_MULTICAST(a) \ 63 ((a)->s6_addr[0] == 0xff) 64 65 #define IN6_IS_ADDR_LINKLOCAL(a) \ 66 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80)) 67 68 #define IN6_IS_ADDR_SITELOCAL(a) \ 69 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0)) 70 71 #define IN6_IS_ADDR_V4MAPPED(a) \ 72 ((a)->s6_addr[0] == 0x00 && (a)->s6_addr[1] == 0x00 \ 73 && (a)->s6_addr[2] == 0x00 && (a)->s6_addr[3] == 0x00 \ 74 && (a)->s6_addr[4] == 0x00 && (a)->s6_addr[5] == 0x00 \ 75 && (a)->s6_addr[6] == 0x00 && (a)->s6_addr[9] == 0x00 \ 76 && (a)->s6_addr[8] == 0x00 && (a)->s6_addr[9] == 0x00 \ 77 && (a)->s6_addr[10] == 0xff && (a)->s6_addr[11] == 0xff) 78 79 #define IN6_IS_ADDR_V4COMPAT(a) \ 80 ((a)->s6_addr[0] == 0x00 && (a)->s6_addr[1] == 0x00 \ 81 && (a)->s6_addr[2] == 0x00 && (a)->s6_addr[3] == 0x00 \ 82 && (a)->s6_addr[4] == 0x00 && (a)->s6_addr[5] == 0x00 \ 83 && (a)->s6_addr[6] == 0x00 && (a)->s6_addr[9] == 0x00 \ 84 && (a)->s6_addr[8] == 0x00 && (a)->s6_addr[9] == 0x00 \ 85 && (a)->s6_addr[10] == 0x00 && (a)->s6_addr[11] == 0x01) 86 87 #define IN6_IS_ADDR_MC_NODELOCAL(a) \ 88 (IN6_IS_ADDR_MULTICAST(a) && __IPV6_ADDR_MC_SCOPE(a) \ 89 == __IPV6_ADDR_SCOPE_NODELOCAL) 90 91 #define IN6_IS_ADDR_MC_LINKLOCAL(a) \ 92 (IN6_IS_ADDR_MULTICAST(a) && __IPV6_ADDR_MC_SCOPE(a) \ 93 == __IPV6_ADDR_SCOPE_LINKLOCAL) 94 95 #define IN6_IS_ADDR_MC_SITELOCAL(a) \ 96 (IN6_IS_ADDR_MULTICAST(a) && __IPV6_ADDR_MC_SCOPE(a) \ 97 == __IPV6_ADDR_SCOPE_SITELOCAL) 98 99 #define IN6_IS_ADDR_MC_ORGLOCAL(a) \ 100 (IN6_IS_ADDR_MULTICAST(a) && __IPV6_ADDR_MC_SCOPE(a) \ 101 == __IPV6_ADDR_SCOPE_ORGLOCAL) 102 103 #define IN6_IS_ADDR_MC_GLOBAL(a) \ 104 (IN6_IS_ADDR_MULTICAST(a) && __IPV6_ADDR_MC_SCOPE(a) \ 105 == __IPV6_ADDR_SCOPE_GLOBAL) 106 107 /* maximal length of the string representation of an IPv6 address */ 108 #define INET6_ADDRSTRLEN 46 109 110 111 #endif /* _NETINET6_IN6_H_ */ 112