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 /* Non-standard helper defines (same as in FreeBSD, though) */ 40 #define __IPV6_ADDR_SCOPE_NODELOCAL 0x01 41 #define __IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 42 #define __IPV6_ADDR_SCOPE_LINKLOCAL 0x02 43 #define __IPV6_ADDR_SCOPE_SITELOCAL 0x05 44 #define __IPV6_ADDR_SCOPE_ORGLOCAL 0x08 45 #define __IPV6_ADDR_SCOPE_GLOBAL 0x0e 46 47 #define __IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) 48 49 50 #define IN6_IS_ADDR_UNSPECIFIED(a) \ 51 (!memcmp((a)->s6_addr, in6addr_any.s6_addr, sizeof(struct in6_addr))) 52 53 #define IN6_IS_ADDR_LOOPBACK(a) \ 54 (!memcmp((a)->s6_addr, in6addr_loopback.s6_addr, sizeof(struct in6_addr))) 55 56 #define IN6_IS_ADDR_MULTICAST(a) \ 57 ((a)->s6_addr[0] == 0xff) 58 59 #define IN6_IS_ADDR_LINKLOCAL(a) \ 60 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80)) 61 62 #define IN6_IS_ADDR_SITELOCAL(a) \ 63 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0)) 64 65 #define IN6_IS_ADDR_V4MAPPED(a) \ 66 ((a)->s6_addr[0] == 0x00 && (a)->s6_addr[1] == 0x00 \ 67 && (a)->s6_addr[2] == 0x00 && (a)->s6_addr[3] == 0x00 \ 68 && (a)->s6_addr[4] == 0x00 && (a)->s6_addr[5] == 0x00 \ 69 && (a)->s6_addr[6] == 0x00 && (a)->s6_addr[9] == 0x00 \ 70 && (a)->s6_addr[8] == 0x00 && (a)->s6_addr[9] == 0x00 \ 71 && (a)->s6_addr[10] == 0xff && (a)->s6_addr[11] == 0xff) 72 73 #define IN6_IS_ADDR_V4COMPAT(a) \ 74 ((a)->s6_addr[0] == 0x00 && (a)->s6_addr[1] == 0x00 \ 75 && (a)->s6_addr[2] == 0x00 && (a)->s6_addr[3] == 0x00 \ 76 && (a)->s6_addr[4] == 0x00 && (a)->s6_addr[5] == 0x00 \ 77 && (a)->s6_addr[6] == 0x00 && (a)->s6_addr[9] == 0x00 \ 78 && (a)->s6_addr[8] == 0x00 && (a)->s6_addr[9] == 0x00 \ 79 && (a)->s6_addr[10] == 0x00 && (a)->s6_addr[11] == 0x01) 80 81 #define IN6_IS_ADDR_MC_NODELOCAL(a) \ 82 (IN6_IS_ADDR_MULTICAST(a) && __IPV6_ADDR_MC_SCOPE(a) \ 83 == __IPV6_ADDR_SCOPE_NODELOCAL) 84 85 #define IN6_IS_ADDR_MC_LINKLOCAL(a) \ 86 (IN6_IS_ADDR_MULTICAST(a) && __IPV6_ADDR_MC_SCOPE(a) \ 87 == __IPV6_ADDR_SCOPE_LINKLOCAL) 88 89 #define IN6_IS_ADDR_MC_SITELOCAL(a) \ 90 (IN6_IS_ADDR_MULTICAST(a) && __IPV6_ADDR_MC_SCOPE(a) \ 91 == __IPV6_ADDR_SCOPE_SITELOCAL) 92 93 #define IN6_IS_ADDR_MC_ORGLOCAL(a) \ 94 (IN6_IS_ADDR_MULTICAST(a) && __IPV6_ADDR_MC_SCOPE(a) \ 95 == __IPV6_ADDR_SCOPE_ORGLOCAL) 96 97 #define IN6_IS_ADDR_MC_GLOBAL(a) \ 98 (IN6_IS_ADDR_MULTICAST(a) && __IPV6_ADDR_MC_SCOPE(a) \ 99 == __IPV6_ADDR_SCOPE_GLOBAL) 100 101 /* maximal length of the string representation of an IPv6 address */ 102 #define INET6_ADDRSTRLEN 46 103 104 105 #endif /* _NETINET6_IN6_H_ */ 106