1 | /*- |
---|
2 | * SPDX-License-Identifier: BSD-3-Clause |
---|
3 | * |
---|
4 | * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. |
---|
5 | * All rights reserved. |
---|
6 | * |
---|
7 | * Redistribution and use in source and binary forms, with or without |
---|
8 | * modification, are permitted provided that the following conditions |
---|
9 | * are met: |
---|
10 | * 1. Redistributions of source code must retain the above copyright |
---|
11 | * notice, this list of conditions and the following disclaimer. |
---|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
---|
13 | * notice, this list of conditions and the following disclaimer in the |
---|
14 | * documentation and/or other materials provided with the distribution. |
---|
15 | * 3. Neither the name of the project nor the names of its contributors |
---|
16 | * may be used to endorse or promote products derived from this software |
---|
17 | * without specific prior written permission. |
---|
18 | * |
---|
19 | * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND |
---|
20 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
---|
21 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
---|
22 | * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE |
---|
23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
---|
24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
---|
25 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
---|
26 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
---|
27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
---|
28 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
---|
29 | * SUCH DAMAGE. |
---|
30 | * |
---|
31 | * $KAME: in6.h,v 1.89 2001/05/27 13:28:35 itojun Exp $ |
---|
32 | */ |
---|
33 | |
---|
34 | /** |
---|
35 | * @file |
---|
36 | * |
---|
37 | * @brief This header file provides IPv6 definitions for the kernel space |
---|
38 | * (_KERNEL is defined before including <netinet6/in6.h>). |
---|
39 | */ |
---|
40 | |
---|
41 | #if !defined(_NETINET6_IN6_H_) || !defined(_KERNEL) |
---|
42 | #error "must be included via <netinet6/in6.h> in kernel space" |
---|
43 | #endif |
---|
44 | |
---|
45 | /* XXX nonstandard */ |
---|
46 | #define s6_addr8 __u6_addr.__u6_addr8 |
---|
47 | #define s6_addr16 __u6_addr.__u6_addr16 |
---|
48 | #define s6_addr32 __u6_addr.__u6_addr32 |
---|
49 | |
---|
50 | /* |
---|
51 | * Local definition for masks |
---|
52 | */ |
---|
53 | /* XXX nonstandard */ |
---|
54 | #define IN6MASK0 {{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}} |
---|
55 | #define IN6MASK32 {{{ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, \ |
---|
56 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} |
---|
57 | #define IN6MASK64 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ |
---|
58 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} |
---|
59 | #define IN6MASK96 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ |
---|
60 | 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }}} |
---|
61 | #define IN6MASK128 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ |
---|
62 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }}} |
---|
63 | |
---|
64 | extern const struct sockaddr_in6 sa6_any; |
---|
65 | |
---|
66 | extern const struct in6_addr in6mask0; |
---|
67 | extern const struct in6_addr in6mask32; |
---|
68 | extern const struct in6_addr in6mask64; |
---|
69 | extern const struct in6_addr in6mask96; |
---|
70 | extern const struct in6_addr in6mask128; |
---|
71 | |
---|
72 | /* |
---|
73 | * Macros started with IPV6_ADDR is KAME local |
---|
74 | */ |
---|
75 | /* XXX nonstandard */ |
---|
76 | #if _BYTE_ORDER == _BIG_ENDIAN |
---|
77 | #define IPV6_ADDR_INT32_ONE 1 |
---|
78 | #define IPV6_ADDR_INT32_TWO 2 |
---|
79 | #define IPV6_ADDR_INT32_MNL 0xff010000 |
---|
80 | #define IPV6_ADDR_INT32_MLL 0xff020000 |
---|
81 | #define IPV6_ADDR_INT32_SMP 0x0000ffff |
---|
82 | #define IPV6_ADDR_INT16_ULL 0xfe80 |
---|
83 | #define IPV6_ADDR_INT16_USL 0xfec0 |
---|
84 | #define IPV6_ADDR_INT16_MLL 0xff02 |
---|
85 | #elif _BYTE_ORDER == _LITTLE_ENDIAN |
---|
86 | #define IPV6_ADDR_INT32_ONE 0x01000000 |
---|
87 | #define IPV6_ADDR_INT32_TWO 0x02000000 |
---|
88 | #define IPV6_ADDR_INT32_MNL 0x000001ff |
---|
89 | #define IPV6_ADDR_INT32_MLL 0x000002ff |
---|
90 | #define IPV6_ADDR_INT32_SMP 0xffff0000 |
---|
91 | #define IPV6_ADDR_INT16_ULL 0x80fe |
---|
92 | #define IPV6_ADDR_INT16_USL 0xc0fe |
---|
93 | #define IPV6_ADDR_INT16_MLL 0x02ff |
---|
94 | #endif |
---|
95 | |
---|
96 | /* XXX nonstandard */ |
---|
97 | #define IPV6_ADDR_SCOPE_NODELOCAL 0x01 |
---|
98 | #define IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 |
---|
99 | #define IPV6_ADDR_SCOPE_LINKLOCAL 0x02 |
---|
100 | #define IPV6_ADDR_SCOPE_SITELOCAL 0x05 |
---|
101 | #define IPV6_ADDR_SCOPE_ORGLOCAL 0x08 /* just used in this file */ |
---|
102 | #define IPV6_ADDR_SCOPE_GLOBAL 0x0e |
---|
103 | |
---|
104 | #define IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) |
---|
105 | |
---|
106 | /* refers nonstandard items */ |
---|
107 | #define IN6_IS_ADDR_MC_NODELOCAL(a) \ |
---|
108 | (IN6_IS_ADDR_MULTICAST(a) && \ |
---|
109 | (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_NODELOCAL)) |
---|
110 | #define IN6_IS_ADDR_MC_INTFACELOCAL(a) \ |
---|
111 | (IN6_IS_ADDR_MULTICAST(a) && \ |
---|
112 | (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_INTFACELOCAL)) |
---|
113 | #define IN6_IS_ADDR_MC_LINKLOCAL(a) \ |
---|
114 | (IN6_IS_ADDR_MULTICAST(a) && \ |
---|
115 | (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_LINKLOCAL)) |
---|
116 | #define IN6_IS_ADDR_MC_SITELOCAL(a) \ |
---|
117 | (IN6_IS_ADDR_MULTICAST(a) && \ |
---|
118 | (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_SITELOCAL)) |
---|
119 | #define IN6_IS_ADDR_MC_ORGLOCAL(a) \ |
---|
120 | (IN6_IS_ADDR_MULTICAST(a) && \ |
---|
121 | (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_ORGLOCAL)) |
---|
122 | #define IN6_IS_ADDR_MC_GLOBAL(a) \ |
---|
123 | (IN6_IS_ADDR_MULTICAST(a) && \ |
---|
124 | (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_GLOBAL)) |
---|
125 | |
---|
126 | /* nonstandard */ |
---|
127 | /* |
---|
128 | * KAME Scope |
---|
129 | */ |
---|
130 | #define IN6_IS_SCOPE_LINKLOCAL(a) \ |
---|
131 | ((IN6_IS_ADDR_LINKLOCAL(a)) || \ |
---|
132 | (IN6_IS_ADDR_MC_LINKLOCAL(a))) |
---|
133 | #define IN6_IS_SCOPE_EMBED(a) \ |
---|
134 | ((IN6_IS_ADDR_LINKLOCAL(a)) || \ |
---|
135 | (IN6_IS_ADDR_MC_LINKLOCAL(a)) || \ |
---|
136 | (IN6_IS_ADDR_MC_INTFACELOCAL(a))) |
---|
137 | |
---|
138 | #define IFA6_IS_DEPRECATED(a) \ |
---|
139 | ((a)->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME && \ |
---|
140 | (u_int32_t)((time_uptime - (a)->ia6_updatetime)) > \ |
---|
141 | (a)->ia6_lifetime.ia6t_pltime) |
---|
142 | #define IFA6_IS_INVALID(a) \ |
---|
143 | ((a)->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME && \ |
---|
144 | (u_int32_t)((time_uptime - (a)->ia6_updatetime)) > \ |
---|
145 | (a)->ia6_lifetime.ia6t_vltime) |
---|
146 | |
---|
147 | #define MTAG_ABI_IPV6 1444287380 /* IPv6 ABI */ |
---|
148 | #define IPV6_TAG_DIRECT 0 /* direct-dispatch IPv6 */ |
---|
149 | |
---|
150 | /* RFC2292 options */ |
---|
151 | #define IPV6_2292PKTINFO 19 /* bool; send/recv if, src/dst addr */ |
---|
152 | #define IPV6_2292HOPLIMIT 20 /* bool; hop limit */ |
---|
153 | #define IPV6_2292NEXTHOP 21 /* bool; next hop addr */ |
---|
154 | #define IPV6_2292HOPOPTS 22 /* bool; hop-by-hop option */ |
---|
155 | #define IPV6_2292DSTOPTS 23 /* bool; destinaion option */ |
---|
156 | #define IPV6_2292RTHDR 24 /* bool; routing header */ |
---|
157 | #define IPV6_2292PKTOPTIONS 25 /* buf/cmsghdr; set/get IPv6 options */ |
---|
158 | |
---|
159 | #define IPV6_RECVRTHDRDSTOPTS 41 /* bool; recv dst option before rthdr */ |
---|
160 | |
---|
161 | struct cmsghdr; |
---|
162 | struct ip6_hdr; |
---|
163 | |
---|
164 | int in6_cksum_pseudo(struct ip6_hdr *, uint32_t, uint8_t, uint16_t); |
---|
165 | int in6_cksum(struct mbuf *, u_int8_t, u_int32_t, u_int32_t); |
---|
166 | int in6_cksum_partial(struct mbuf *, u_int8_t, u_int32_t, u_int32_t, |
---|
167 | u_int32_t); |
---|
168 | int in6_localaddr(struct in6_addr *); |
---|
169 | int in6_localip(struct in6_addr *); |
---|
170 | bool in6_localip_fib(struct in6_addr *, uint16_t); |
---|
171 | int in6_ifhasaddr(struct ifnet *, struct in6_addr *); |
---|
172 | int in6_addrscope(const struct in6_addr *); |
---|
173 | char *ip6_sprintf(char *, const struct in6_addr *); |
---|
174 | struct in6_ifaddr *in6_ifawithifp(struct ifnet *, struct in6_addr *); |
---|
175 | extern void in6_if_up(struct ifnet *); |
---|
176 | struct sockaddr; |
---|
177 | extern u_char ip6_protox[]; |
---|
178 | |
---|
179 | void in6_sin6_2_sin(struct sockaddr_in *sin, |
---|
180 | struct sockaddr_in6 *sin6); |
---|
181 | void in6_sin_2_v4mapsin6(struct sockaddr_in *sin, |
---|
182 | struct sockaddr_in6 *sin6); |
---|
183 | void in6_sin6_2_sin_in_sock(struct sockaddr *nam); |
---|
184 | void in6_sin_2_v4mapsin6_in_sock(struct sockaddr **nam); |
---|
185 | extern void addrsel_policy_init(void); |
---|
186 | |
---|
187 | #define satosin6(sa) ((struct sockaddr_in6 *)(sa)) |
---|
188 | #define sin6tosa(sin6) ((struct sockaddr *)(sin6)) |
---|
189 | #define ifatoia6(ifa) ((struct in6_ifaddr *)(ifa)) |
---|