Restore the "GPL licensing not permitted" in GLUT license headers.
[haiku.git] / headers / posix / netinet6 / in6.h
blob362b248ed34b26739d5490de26f079e1e02138fe
1 /*
2 * Copyright 2006-2012 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_
9 #include <sys/types.h>
10 #include <stdint.h>
13 struct in6_addr {
14 uint8_t s6_addr[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;
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 #define IN6ADDR_NODELOCAL_ALLNODES_INIT {{ \
35 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
36 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}
37 #define IN6ADDR_LINKLOCAL_ALLNODES_INIT {{ \
38 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
39 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}
40 #define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT {{ \
41 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
42 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}
44 extern const struct in6_addr in6addr_any;
45 extern const struct in6_addr in6addr_loopback;
48 struct ipv6_mreq {
49 struct in6_addr ipv6mr_multiaddr;
50 unsigned ipv6mr_interface;
54 struct in6_pktinfo {
55 struct in6_addr ipi6_addr; /* src/dst IPv6 address */
56 unsigned int ipi6_ifindex; /* send/recv interface index */
60 /* Non-standard helper defines (same as in FreeBSD, though) */
61 #define __IPV6_ADDR_SCOPE_NODELOCAL 0x01
62 #define __IPV6_ADDR_SCOPE_INTFACELOCAL 0x01
63 #define __IPV6_ADDR_SCOPE_LINKLOCAL 0x02
64 #define __IPV6_ADDR_SCOPE_SITELOCAL 0x05
65 #define __IPV6_ADDR_SCOPE_ORGLOCAL 0x08
66 #define __IPV6_ADDR_SCOPE_GLOBAL 0x0e
68 #define __IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f)
71 #define IN6_IS_ADDR_UNSPECIFIED(a) \
72 (!memcmp((a)->s6_addr, in6addr_any.s6_addr, sizeof(struct in6_addr)))
74 #define IN6_IS_ADDR_LOOPBACK(a) \
75 (!memcmp((a)->s6_addr, in6addr_loopback.s6_addr, sizeof(struct in6_addr)))
77 #define IN6_IS_ADDR_MULTICAST(a) \
78 ((a)->s6_addr[0] == 0xff)
80 #define IN6_IS_ADDR_LINKLOCAL(a) \
81 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
83 #define IN6_IS_ADDR_SITELOCAL(a) \
84 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
86 #define IN6_IS_ADDR_V4MAPPED(a) \
87 ((a)->s6_addr[0] == 0x00 && (a)->s6_addr[1] == 0x00 \
88 && (a)->s6_addr[2] == 0x00 && (a)->s6_addr[3] == 0x00 \
89 && (a)->s6_addr[4] == 0x00 && (a)->s6_addr[5] == 0x00 \
90 && (a)->s6_addr[6] == 0x00 && (a)->s6_addr[9] == 0x00 \
91 && (a)->s6_addr[8] == 0x00 && (a)->s6_addr[9] == 0x00 \
92 && (a)->s6_addr[10] == 0xff && (a)->s6_addr[11] == 0xff)
94 #define IN6_IS_ADDR_V4COMPAT(a) \
95 ((a)->s6_addr[0] == 0x00 && (a)->s6_addr[1] == 0x00 \
96 && (a)->s6_addr[2] == 0x00 && (a)->s6_addr[3] == 0x00 \
97 && (a)->s6_addr[4] == 0x00 && (a)->s6_addr[5] == 0x00 \
98 && (a)->s6_addr[6] == 0x00 && (a)->s6_addr[9] == 0x00 \
99 && (a)->s6_addr[8] == 0x00 && (a)->s6_addr[9] == 0x00 \
100 && (a)->s6_addr[10] == 0x00 && (a)->s6_addr[11] == 0x01)
102 #define IN6_IS_ADDR_MC_NODELOCAL(a) \
103 (IN6_IS_ADDR_MULTICAST(a) && __IPV6_ADDR_MC_SCOPE(a) \
104 == __IPV6_ADDR_SCOPE_NODELOCAL)
106 #define IN6_IS_ADDR_MC_LINKLOCAL(a) \
107 (IN6_IS_ADDR_MULTICAST(a) && __IPV6_ADDR_MC_SCOPE(a) \
108 == __IPV6_ADDR_SCOPE_LINKLOCAL)
110 #define IN6_IS_ADDR_MC_SITELOCAL(a) \
111 (IN6_IS_ADDR_MULTICAST(a) && __IPV6_ADDR_MC_SCOPE(a) \
112 == __IPV6_ADDR_SCOPE_SITELOCAL)
114 #define IN6_IS_ADDR_MC_ORGLOCAL(a) \
115 (IN6_IS_ADDR_MULTICAST(a) && __IPV6_ADDR_MC_SCOPE(a) \
116 == __IPV6_ADDR_SCOPE_ORGLOCAL)
118 #define IN6_IS_ADDR_MC_GLOBAL(a) \
119 (IN6_IS_ADDR_MULTICAST(a) && __IPV6_ADDR_MC_SCOPE(a) \
120 == __IPV6_ADDR_SCOPE_GLOBAL)
122 /* From RFC 2292 (Advanced Sockets API for IPv6) */
123 #define IN6_ARE_ADDR_EQUAL(a, b) \
124 (!memcmp((a)->s6_addr, (b)->s6_addr, sizeof(struct in6_addr)))
126 /* maximal length of the string representation of an IPv6 address */
127 #define INET6_ADDRSTRLEN 46
130 #endif /* _NETINET6_IN6_H_ */