1/*
2 * Copyright (c) 2008-2020 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28
29/*
30 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
31 * All rights reserved.
32 *
33 * Redistribution and use in source and binary forms, with or without
34 * modification, are permitted provided that the following conditions
35 * are met:
36 * 1. Redistributions of source code must retain the above copyright
37 * notice, this list of conditions and the following disclaimer.
38 * 2. Redistributions in binary form must reproduce the above copyright
39 * notice, this list of conditions and the following disclaimer in the
40 * documentation and/or other materials provided with the distribution.
41 * 3. Neither the name of the project nor the names of its contributors
42 * may be used to endorse or promote products derived from this software
43 * without specific prior written permission.
44 *
45 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
46 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
49 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
55 * SUCH DAMAGE.
56 */
57
58/*
59 * Copyright (c) 1982, 1986, 1990, 1993
60 * The Regents of the University of California. All rights reserved.
61 *
62 * Redistribution and use in source and binary forms, with or without
63 * modification, are permitted provided that the following conditions
64 * are met:
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 * 2. Redistributions in binary form must reproduce the above copyright
68 * notice, this list of conditions and the following disclaimer in the
69 * documentation and/or other materials provided with the distribution.
70 * 3. All advertising materials mentioning features or use of this software
71 * must display the following acknowledgement:
72 * This product includes software developed by the University of
73 * California, Berkeley and its contributors.
74 * 4. Neither the name of the University nor the names of its contributors
75 * may be used to endorse or promote products derived from this software
76 * without specific prior written permission.
77 *
78 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
79 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
80 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
81 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
82 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
83 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
84 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
85 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
86 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
87 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
88 * SUCH DAMAGE.
89 *
90 * @(#)in.h 8.3 (Berkeley) 1/3/94
91 */
92
93#ifndef DRIVERKIT
94#ifndef __KAME_NETINET_IN_PRIVATE_H_INCLUDED_
95#error "do not include netinet6/in6_private.h directly, include netinet/in_private.h. " \
96 " see RFC2553"
97#endif
98#endif /* DRIVERKIT */
99
100#ifndef _NETINET6_IN6_PRIVATE_H_
101#define _NETINET6_IN6_PRIVATE_H_
102
103#include <netinet/in.h>
104#include <stdint.h>
105#ifdef BSD_KERNEL_PRIVATE
106#include <sys/eventhandler.h>
107#endif
108#include <sys/types.h>
109#include <uuid/uuid.h>
110
111#ifndef XNU_PLATFORM_DriverKit
112
113#ifdef KERNEL_PRIVATE
114extern const struct sockaddr_in6 sa6_any;
115
116extern const struct in6_addr in6mask0;
117extern const struct in6_addr in6mask7;
118extern const struct in6_addr in6mask16;
119extern const struct in6_addr in6mask32;
120extern const struct in6_addr in6mask64;
121extern const struct in6_addr in6mask96;
122extern const struct in6_addr in6mask128;
123
124#define SIN6(s) ((struct sockaddr_in6 *)(void *)s)
125#define satosin6(sa) SIN6(sa)
126#define sin6tosa(sin6) ((struct sockaddr *)(void *)(sin6))
127#define SIN6IFSCOPE(s) SIN6(s)
128#endif /* KERNEL_PRIVATE */
129
130struct route_in6_old {
131 void *ro_rt;
132 uint32_t ro_flags;
133 struct sockaddr_in6 ro_dst;
134};
135
136#ifdef BSD_KERNEL_PRIVATE
137#include <sys/eventhandler.h>
138
139/*
140 * IP6 route structure
141 *
142 * A route consists of a destination address and a reference
143 * to a routing entry. These are often held by protocols
144 * in their control blocks, e.g. inpcb.
145 */
146struct route_in6 {
147 /*
148 * N.B: struct route_in6 must begin with ro_{rt,srcia,flags}
149 * because the code does some casts of a 'struct route_in6 *'
150 * to a 'struct route *'.
151 */
152 struct rtentry *ro_rt;
153
154 struct ifaddr *ro_srcia;
155 uint32_t ro_flags; /* route flags */
156 struct sockaddr_in6 ro_dst;
157};
158#endif /* BSD_KERNEL_PRIVATE */
159
160#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
161
162/*
163 * Options for use with [gs]etsockopt at the IPV6 level.
164 * First word of comment is data type; bool is stored in int.
165 */
166#define IPV6_NO_IFT_CELLULAR 6969 /* for internal use only */
167#define IPV6_OUT_IF 9696 /* for internal use only */
168
169#ifdef BSD_KERNEL_PRIVATE
170#define CTL_IPV6PROTO_NAMES { \
171 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
172 { 0, 0 }, \
173 { "tcp6", CTLTYPE_NODE }, \
174 { 0, 0 }, \
175 { 0, 0 }, \
176 { 0, 0 }, \
177 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
178 { 0, 0 }, \
179 { 0, 0 }, \
180 { "udp6", CTLTYPE_NODE }, \
181 { 0, 0 }, \
182 { 0, 0 }, \
183 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
184 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
185 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
186 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
187 { 0, 0 }, \
188 { "ip6", CTLTYPE_NODE }, \
189 { 0, 0 }, \
190 { 0, 0 }, \
191 { 0, 0 }, \
192 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
193 { 0, 0 }, \
194 { "ipsec6", CTLTYPE_NODE }, \
195 { 0, 0 }, \
196 { 0, 0 }, \
197 { 0, 0 }, \
198 { 0, 0 }, \
199 { 0, 0 }, \
200 { 0, 0 }, \
201 { "icmp6", CTLTYPE_NODE }, \
202 { 0, 0 }, \
203 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
204 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
205 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
206 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
207 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
208 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
209 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
210 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
211 { 0, 0 }, \
212 { 0, 0 }, \
213 { 0, 0 }, \
214 { 0, 0 }, \
215}
216/*
217 * Redefinition of mbuf flags
218 */
219#define M_AUTHIPHDR M_PROTO2
220#define M_DECRYPTED M_PROTO3
221#define M_AUTHIPDGM M_PROTO5
222
223struct cmsghdr;
224struct mbuf;
225struct ifnet;
226struct in6_aliasreq;
227struct lltable;
228
229extern struct lltable * in6_lltattach(struct ifnet *ifp);
230extern uint16_t in6_pseudo(const struct in6_addr *, const struct in6_addr *,
231 uint32_t);
232extern u_int16_t inet6_cksum(struct mbuf *, uint32_t, uint32_t, uint32_t);
233extern u_int16_t inet6_cksum_buffer(const uint8_t *, uint32_t, uint32_t,
234 uint32_t);
235
236#define in6_cksum(_m, _n, _o, _l) \
237 inet6_cksum(_m, _n, _o, _l)
238#define in6_cksum_buffer(_b, _n, _o, _l) \
239 inet6_cksum_buffer(_b, _n, _o, _l)
240
241extern int in6_addrscope(struct in6_addr *);
242extern struct in6_ifaddr *in6_ifawithscope(struct ifnet *, struct in6_addr *);
243extern struct in6_ifaddr *in6_ifawithifp(struct ifnet *, struct in6_addr *);
244
245struct sockaddr;
246
247extern void in6_sin6_2_sin(struct sockaddr_in *sin, struct sockaddr_in6 *sin6);
248extern void in6_sin_2_v4mapsin6(struct sockaddr_in *sin,
249 struct sockaddr_in6 *sin6);
250extern void in6_sin6_2_sin_in_sock(struct sockaddr *nam);
251extern int in6_sin_2_v4mapsin6_in_sock(struct sockaddr **nam);
252
253extern uint32_t in6_finalize_cksum(struct mbuf *, uint32_t, int32_t,
254 int32_t, uint32_t);
255
256#define in6_delayed_cksum(_m) \
257 ((void) in6_finalize_cksum(_m, 0, 0, -1, CSUM_DELAY_IPV6_DATA))
258#define in6_delayed_cksum_offset(_m, _o, _s, _p) \
259 ((void) in6_finalize_cksum(_m, _o, _s, _p, CSUM_DELAY_IPV6_DATA))
260
261/* IPv6 protocol events */
262extern struct eventhandler_lists_ctxt in6_evhdlr_ctxt;
263/*
264 * XXX Avoid reordering the enum values below.
265 * If the order is changed, please make sure
266 * in6_event2kev_array is also changed to reflect the
267 * change in order of the enums
268 */
269typedef enum {
270 /* Address events */
271 /*
272 * XXX To avoid duplicacy and also for correctness
273 * only report these for link local and stable addresses
274 * NOTE: Link local address can never be marked detached
275 * or duplicated.
276 */
277 IN6_ADDR_MARKED_DUPLICATED,
278 IN6_ADDR_MARKED_DETACHED,
279 IN6_ADDR_MARKED_DEPRECATED,
280
281 /* Expiry events */
282 IN6_NDP_RTR_EXPIRY,
283 IN6_NDP_PFX_EXPIRY,
284 IN6_NDP_ADDR_EXPIRY,
285
286 /* XXX DNS expiry needs to be handled by user-space */
287 /* MAX */
288 IN6_EVENT_MAX,
289} in6_evhdlr_code_t;
290
291struct in6_event2kev {
292 in6_evhdlr_code_t in6_event_code;
293 uint32_t in6_event_kev_subclass;
294 uint32_t in6_event_kev_code;
295 const char *in6_event_str;
296};
297extern struct in6_event2kev in6_event2kev_array[];
298extern void in6_eventhdlr_callback(struct eventhandler_entry_arg, in6_evhdlr_code_t,
299 struct ifnet *, struct in6_addr *, uint32_t);
300extern void in6_event_enqueue_nwk_wq_entry(in6_evhdlr_code_t,
301 struct ifnet *, struct in6_addr *, uint32_t);
302
303typedef void (*in6_event_fn) (struct eventhandler_entry_arg, in6_evhdlr_code_t,
304 struct ifnet *, struct in6_addr *, uint32_t);
305EVENTHANDLER_DECLARE(in6_event, in6_event_fn);
306#endif /* BSD_KERNEL_PRIVATE */
307
308/* CLAT46 events */
309typedef enum in6_clat46_evhdlr_code_t {
310 IN6_CLAT46_EVENT_V4_FLOW,
311 IN6_CLAT46_EVENT_V6_ADDR_CONFFAIL,
312} in6_clat46_evhdlr_code_t;
313
314struct kev_netevent_clat46_data {
315 in6_clat46_evhdlr_code_t clat46_event_code;
316 pid_t epid;
317 uuid_t euuid;
318};
319
320#ifdef BSD_KERNEL_PRIVATE
321/* CLAT46 events */
322extern struct eventhandler_lists_ctxt in6_clat46_evhdlr_ctxt;
323extern void in6_clat46_eventhdlr_callback(struct eventhandler_entry_arg,
324 in6_clat46_evhdlr_code_t, pid_t, uuid_t);
325extern void in6_clat46_event_enqueue_nwk_wq_entry(in6_clat46_evhdlr_code_t,
326 pid_t, uuid_t);
327
328typedef void (*in6_clat46_event_fn) (struct eventhandler_entry_arg, in6_clat46_evhdlr_code_t,
329 pid_t, uuid_t);
330EVENTHANDLER_DECLARE(in6_clat46_event, in6_clat46_event_fn);
331#endif /* BSD_KERNEL_PRIVATE */
332
333#ifdef KERNEL_PRIVATE
334/* exporte for ApplicationFirewall */
335extern int in6_localaddr(struct in6_addr *);
336extern int in6addr_local(struct in6_addr *);
337#endif /* KERNEL_PRIVATE */
338
339#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
340#endif /* XNU_PLATFORM_DriverKit */
341
342#endif /* !_NETINET6_IN6_PRIVATE_H_ */
343