1/*
2 * Copyright (c) 2000-2022 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/* Copyright (c) 1998, 1999 Apple Computer, Inc. All Rights Reserved */
29/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
30/*
31 * Copyright (c) 1982, 1985, 1986, 1988, 1993, 1994
32 * The Regents of the University of California. All rights reserved.
33 *
34 * Redistribution and use in source and binary forms, with or without
35 * modification, are permitted provided that the following conditions
36 * are met:
37 * 1. Redistributions of source code must retain the above copyright
38 * notice, this list of conditions and the following disclaimer.
39 * 2. Redistributions in binary form must reproduce the above copyright
40 * notice, this list of conditions and the following disclaimer in the
41 * documentation and/or other materials provided with the distribution.
42 * 3. All advertising materials mentioning features or use of this software
43 * must display the following acknowledgement:
44 * This product includes software developed by the University of
45 * California, Berkeley and its contributors.
46 * 4. Neither the name of the University nor the names of its contributors
47 * may be used to endorse or promote products derived from this software
48 * without specific prior written permission.
49 *
50 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
51 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
52 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
53 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
54 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
55 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
56 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
57 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
58 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
59 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
60 * SUCH DAMAGE.
61 *
62 * @(#)socket.h 8.4 (Berkeley) 2/21/94
63 * $FreeBSD: src/sys/sys/socket.h,v 1.39.2.7 2001/07/03 11:02:01 ume Exp $
64 */
65/*
66 * NOTICE: This file was modified by SPARTA, Inc. in 2005 to introduce
67 * support for mandatory and extensible security protections. This notice
68 * is included in support of clause 2.2 (b) of the Apple Public License,
69 * Version 2.0.
70 */
71
72#ifndef _SYS_SOCKET_H_
73#define _SYS_SOCKET_H_
74
75#include <sys/types.h>
76#include <sys/cdefs.h>
77#include <sys/constrained_ctypes.h>
78#include <machine/_param.h>
79#include <net/net_kev.h>
80
81#ifdef PRIVATE
82#include <sys/param.h>
83#include <uuid/uuid.h>
84#endif /* PRIVATE */
85
86#ifdef XNU_KERNEL_PRIVATE
87#include <kern/assert.h>
88#include <kern/kalloc.h>
89#endif /* XNU_KERNEL_PRIVATE */
90
91#ifndef KERNEL
92#include <Availability.h>
93#endif
94
95/*
96 * Definitions related to sockets: types, address families, options.
97 */
98
99/*
100 * Data types.
101 */
102
103#include <sys/_types/_gid_t.h>
104#include <sys/_types/_off_t.h>
105#include <sys/_types/_pid_t.h>
106#include <sys/_types/_sa_family_t.h>
107#include <sys/_types/_socklen_t.h>
108
109/* XXX Not explicitly defined by POSIX, but function return types are */
110#include <sys/_types/_size_t.h>
111
112/* XXX Not explicitly defined by POSIX, but function return types are */
113#include <sys/_types/_ssize_t.h>
114
115/*
116 * [XSI] The iovec structure shall be defined as described in <sys/uio.h>.
117 */
118#include <sys/_types/_iovec_t.h>
119
120/*
121 * Types
122 */
123#define SOCK_STREAM 1 /* stream socket */
124#define SOCK_DGRAM 2 /* datagram socket */
125#define SOCK_RAW 3 /* raw-protocol interface */
126#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
127#define SOCK_RDM 4 /* reliably-delivered message */
128#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
129#define SOCK_SEQPACKET 5 /* sequenced packet stream */
130
131/*
132 * Option flags per-socket.
133 */
134#define SO_DEBUG 0x0001 /* turn on debugging info recording */
135#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */
136#define SO_REUSEADDR 0x0004 /* allow local address reuse */
137#define SO_KEEPALIVE 0x0008 /* keep connections alive */
138#define SO_DONTROUTE 0x0010 /* just use interface addresses */
139#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */
140#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
141#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */
142#define SO_LINGER 0x0080 /* linger on close if data present (in ticks) */
143#define SO_LINGER_SEC 0x1080 /* linger on close if data present (in seconds) */
144#else
145#define SO_LINGER 0x1080 /* linger on close if data present (in seconds) */
146#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
147#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */
148#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
149#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */
150#define SO_TIMESTAMP 0x0400 /* timestamp received dgram traffic */
151#define SO_TIMESTAMP_MONOTONIC 0x0800 /* Monotonically increasing timestamp on rcvd dgram */
152#ifndef __APPLE__
153#define SO_ACCEPTFILTER 0x1000 /* there is an accept filter */
154#else
155#define SO_DONTTRUNC 0x2000 /* APPLE: Retain unread data */
156 /* (ATOMIC proto) */
157#define SO_WANTMORE 0x4000 /* APPLE: Give hint when more data ready */
158#define SO_WANTOOBFLAG 0x8000 /* APPLE: Want OOB in MSG_FLAG on receive */
159
160#ifdef PRIVATE
161#define SO_NOWAKEFROMSLEEP 0x10000 /* Don't wake for traffic to this socket */
162#define SO_NOAPNFALLBK 0x20000 /* Don't attempt APN fallback for the socket */
163#define SO_TIMESTAMP_CONTINUOUS 0x40000 /* Continuous monotonic timestamp on rcvd dgram */
164#endif
165
166#endif /* (!__APPLE__) */
167#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
168
169/*
170 * Additional options, not kept in so_options.
171 */
172#define SO_SNDBUF 0x1001 /* send buffer size */
173#define SO_RCVBUF 0x1002 /* receive buffer size */
174#define SO_SNDLOWAT 0x1003 /* send low-water mark */
175#define SO_RCVLOWAT 0x1004 /* receive low-water mark */
176#define SO_SNDTIMEO 0x1005 /* send timeout */
177#define SO_RCVTIMEO 0x1006 /* receive timeout */
178#define SO_ERROR 0x1007 /* get error status and clear */
179#define SO_TYPE 0x1008 /* get socket type */
180#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
181#define SO_LABEL 0x1010 /* deprecated */
182#define SO_PEERLABEL 0x1011 /* deprecated */
183#ifdef __APPLE__
184#define SO_NREAD 0x1020 /* APPLE: get 1st-packet byte count */
185#define SO_NKE 0x1021 /* APPLE: Install socket-level NKE */
186#define SO_NOSIGPIPE 0x1022 /* APPLE: No SIGPIPE on EPIPE */
187#define SO_NOADDRERR 0x1023 /* APPLE: Returns EADDRNOTAVAIL when src is not available anymore */
188#define SO_NWRITE 0x1024 /* APPLE: Get number of bytes currently in send socket buffer */
189#define SO_REUSESHAREUID 0x1025 /* APPLE: Allow reuse of port/socket by different userids */
190#ifdef __APPLE_API_PRIVATE
191#define SO_NOTIFYCONFLICT 0x1026 /* APPLE: send notification if there is a bind on a port which is already in use */
192#define SO_UPCALLCLOSEWAIT 0x1027 /* APPLE: block on close until an upcall returns */
193#endif
194#ifdef PRIVATE
195#define SO_RESTRICTIONS 0x1081 /* APPLE: deny flag set */
196#define SO_RESTRICT_DENY_IN 0x1 /* deny inbound (trapdoor) */
197#define SO_RESTRICT_DENY_OUT 0x2 /* deny outbound (trapdoor) */
198#define SO_RESTRICT_DENY_CELLULAR 0x4 /* deny use of cellular (trapdoor) */
199#define SO_RESTRICT_DENY_EXPENSIVE 0x8 /* deny use of expensive if (trapdoor) */
200#define SO_RESTRICT_DENY_CONSTRAINED 0x10 /* deny use of expensive if (trapdoor) */
201#endif /* PRIVATE */
202#define SO_RANDOMPORT 0x1082 /* APPLE: request local port randomization */
203#define SO_NP_EXTENSIONS 0x1083 /* To turn off some POSIX behavior */
204#endif
205
206#ifdef PRIVATE
207#define SO_EXECPATH 0x1085 /* Application Firewall Socket option */
208
209/*
210 * Traffic service class definitions (lowest to highest):
211 *
212 * SO_TC_BK_SYS
213 * "Background System-Initiated", high delay tolerant, high loss
214 * tolerant, elastic flow, variable size & long-lived. E.g: system-
215 * initiated iCloud synching or Time Capsule backup, for which there
216 * is no progress feedbacks.
217 *
218 * SO_TC_BK
219 * "Background", user-initiated, high delay tolerant, high loss tolerant,
220 * elastic flow, variable size. E.g. user-initiated iCloud synching or
221 * Time Capsule backup; or traffics of background applications, for which
222 * there is some progress feedbacks.
223 *
224 * SO_TC_BE
225 * "Best Effort", unclassified/standard. This is the default service
226 * class; pretty much a mix of everything.
227 *
228 * SO_TC_RD
229 * "Responsive Data", a notch higher than "Best Effort", medium delay
230 * tolerant, elastic & inelastic flow, bursty, long-lived. E.g. email,
231 * instant messaging, for which there is a sense of interactivity and
232 * urgency (user waiting for output).
233 *
234 * SO_TC_OAM
235 * "Operations, Administration, and Management", medium delay tolerant,
236 * low-medium loss tolerant, elastic & inelastic flows, variable size.
237 * E.g. VPN tunnels.
238 *
239 * SO_TC_AV
240 * "Multimedia Audio/Video Streaming", medium delay tolerant, low-medium
241 * loss tolerant, elastic flow, constant packet interval, variable rate &
242 * size. E.g. AirPlay playback (both video and audio).
243 *
244 * SO_TC_RV
245 * "Responsive Multimedia Audio/Video", low delay tolerant, low-medium
246 * loss tolerant, elastic flow, variable packet interval, rate and size.
247 * E.g. AirPlay mirroring, screen sharing.
248 *
249 * SO_TC_VI
250 * "Interactive Video", low delay tolerant, low-medium loss tolerant,
251 * elastic flow, constant packet interval, variable rate & size. E.g.
252 * FaceTime video.
253 *
254 * SO_TC_VO
255 * "Interactive Voice", low delay tolerant, low loss tolerant, inelastic
256 * flow, constant packet rate, somewhat fixed size. E.g. VoIP including
257 * FaceTime audio.
258 *
259 * SO_TC_CTL
260 * "Network Control", low delay tolerant, low loss tolerant, inelastic
261 * flow, rate is bursty but short, variable size. E.g. DNS queries;
262 * certain types of locally-originated ICMP, ICMPv6; IGMP/MLD join/leave,
263 * ARP.
264 */
265#define SO_TRAFFIC_CLASS 0x1086 /* Traffic service class (int) */
266#define SO_TC_BK_SYS 100 /* lowest class */
267#define SO_TC_BK 200
268#define SO_TC_BE 0
269#define SO_TC_RD 300
270#define SO_TC_OAM 400
271#define SO_TC_AV 500
272#define SO_TC_RV 600
273#define SO_TC_VI 700
274#define SO_TC_VO 800
275#define SO_TC_CTL 900 /* highest class */
276#define SO_TC_MAX 10 /* Total # of traffic classes */
277#ifdef XNU_KERNEL_PRIVATE
278#define _SO_TC_BK 1 /* deprecated */
279#define _SO_TC_VI 2 /* deprecated */
280#define _SO_TC_VO 3 /* deprecated */
281#define _SO_TC_MAX 4 /* deprecated */
282
283#define SO_VALID_TC(c) \
284 (c == SO_TC_BK_SYS || c == SO_TC_BK || c == SO_TC_BE || \
285 c == SO_TC_RD || c == SO_TC_OAM || c == SO_TC_AV || \
286 c == SO_TC_RV || c == SO_TC_VI || c == SO_TC_VO || \
287 c == SO_TC_CTL || c == SO_TC_NETSVC_SIG)
288
289#define SO_TC_UNSPEC ((int)-1) /* Traffic class not specified */
290
291#define SO_TC_SIG SO_TC_VI /* to be removed XXX */
292
293#define SOTCIX_BK_SYS 0
294#define SOTCIX_BK 1
295#define SOTCIX_BE 2
296#define SOTCIX_RD 3
297#define SOTCIX_OAM 4
298#define SOTCIX_AV 5
299#define SOTCIX_RV 6
300#define SOTCIX_VI 7
301#define SOTCIX_VO 8
302#define SOTCIX_CTL 9
303#endif /* XNU_KERNEL_PRIVATE */
304
305/* Background socket configuration flags */
306#define TRAFFIC_MGT_SO_BACKGROUND 0x0001 /* background socket */
307#define TRAFFIC_MGT_TCP_RECVBG 0x0002 /* Only TCP sockets, receiver throttling */
308
309#define SO_RECV_TRAFFIC_CLASS 0x1087 /* Receive traffic class (bool) */
310#define SO_TRAFFIC_CLASS_DBG 0x1088 /* Debug traffic class (struct so_tcdbg) */
311#define SO_OPTION_UNUSED_0 0x1089 /* Traffic class statistics */
312#define SO_PRIVILEGED_TRAFFIC_CLASS 0x1090 /* Privileged traffic class (bool) */
313#define SO_DEFUNCTIT 0x1091 /* Defunct a socket (only in internal builds) */
314#define SO_DEFUNCTOK 0x1100 /* can be defunct'd */
315#define SO_ISDEFUNCT 0x1101 /* get defunct status */
316
317#define SO_OPPORTUNISTIC 0x1102 /* deprecated; use SO_TRAFFIC_CLASS */
318
319/*
320 * SO_FLUSH flushes any unsent data generated by a given socket. It takes
321 * an integer parameter, which can be any of the SO_TC traffic class values,
322 * or the special SO_TC_ALL value.
323 */
324#define SO_FLUSH 0x1103 /* flush unsent data (int) */
325#define SO_TC_ALL (-1)
326
327#define SO_RECV_ANYIF 0x1104 /* unrestricted inbound processing */
328#define SO_TRAFFIC_MGT_BACKGROUND 0x1105 /* Background traffic management */
329
330#define SO_FLOW_DIVERT_TOKEN 0x1106 /* flow divert token */
331
332#define SO_DELEGATED 0x1107 /* set socket as delegate (pid_t) */
333#define SO_DELEGATED_UUID 0x1108 /* set socket as delegate (uuid_t) */
334#define SO_NECP_ATTRIBUTES 0x1109 /* NECP socket attributes (domain, account, etc.) */
335#define SO_CFIL_SOCK_ID 0x1110 /* get content filter socket ID (cfil_sock_id_t) */
336#define SO_NECP_CLIENTUUID 0x1111 /* NECP Client uuid */
337#endif /* PRIVATE */
338#define SO_NUMRCVPKT 0x1112 /* number of datagrams in receive socket buffer */
339#ifdef PRIVATE
340#define SO_AWDL_UNRESTRICTED 0x1113 /* try to use AWDL in restricted mode */
341#define SO_EXTENDED_BK_IDLE 0x1114 /* extended time to keep socket idle after app is suspended (int) */
342#define SO_MARK_CELLFALLBACK 0x1115 /* Mark as initiated by cell fallback */
343#endif /* PRIVATE */
344#define SO_NET_SERVICE_TYPE 0x1116 /* Network service type */
345
346#ifdef PRIVATE
347#define SO_QOSMARKING_POLICY_OVERRIDE 0x1117 /* int */
348#define SO_INTCOPROC_ALLOW 0x1118 /* Try to use internal co-processor interfaces. */
349#endif /* PRIVATE */
350
351#define SO_NETSVC_MARKING_LEVEL 0x1119 /* Get QoS marking in effect for socket */
352
353#ifdef PRIVATE
354#define SO_NECP_LISTENUUID 0x1120 /* NECP client UUID for listener */
355#define SO_MPKL_SEND_INFO 0x1122 /* (struct so_mpkl_send_info) */
356#define SO_STATISTICS_EVENT 0x1123 /* int64 argument, an event in statistics collection */
357#define SO_WANT_KEV_SOCKET_CLOSED 0x1124 /* want delivery of KEV_SOCKET_CLOSED (int) */
358#define SO_MARK_KNOWN_TRACKER 0x1125 /* Mark as a connection to a known tracker */
359#define SO_MARK_KNOWN_TRACKER_NON_APP_INITIATED 0x1126 /* Mark tracker connection to be non-app initiated */
360#define SO_MARK_WAKE_PKT 0x1127 /* Mark next packet as a wake packet, one shot (int) */
361#define SO_RECV_WAKE_PKT 0x1128 /* Receive wake packet indication as ancillary data (int) */
362#define SO_MARK_APPROVED_APP_DOMAIN 0x1129 /* Mark connection as being for an approved associated app domain */
363#define SO_FALLBACK_MODE 0x1130 /* Indicates the mode of fallback used */
364#endif /* PRIVATE */
365
366#define SO_RESOLVER_SIGNATURE 0x1131 /* A signed data blob from the system resolver */
367#ifdef PRIVATE
368#define SO_MARK_CELLFALLBACK_UUID 0x1132 /* Mark as initiated by cell fallback using UUID of the connection */
369#define SO_APPLICATION_ID 0x1133 /* ID of attributing app - so_application_id_t */
370
371struct so_mark_cellfallback_uuid_args {
372 uuid_t flow_uuid;
373 int flow_cellfallback;
374};
375
376typedef struct {
377 uid_t uid;
378 uuid_t effective_uuid;
379 uid_t persona_id;
380} so_application_id_t;
381
382#endif
383
384
385/* When adding new socket-options, you need to make sure MPTCP supports these as well! */
386
387/*
388 * Network Service Type for option SO_NET_SERVICE_TYPE
389 *
390 * The vast majority of sockets should use Best Effort that is the default
391 * Network Service Type. Other Network Service Types have to be used only if
392 * the traffic actually matches the description of the Network Service Type.
393 *
394 * Network Service Types do not represent priorities but rather describe
395 * different categories of delay, jitter and loss parameters.
396 * Those parameters may influence protocols from layer 4 protocols like TCP
397 * to layer 2 protocols like Wi-Fi. The Network Service Type can determine
398 * how the traffic is queued and scheduled by the host networking stack and
399 * by other entities on the network like switches and routers. For example
400 * for Wi-Fi, the Network Service Type can select the marking of the
401 * layer 2 packet with the appropriate WMM Access Category.
402 *
403 * There is no point in attempting to game the system and use
404 * a Network Service Type that does not correspond to the actual
405 * traffic characteristic but one that seems to have a higher precedence.
406 * The reason is that for service classes that have lower tolerance
407 * for delay and jitter, the queues size is lower than for service
408 * classes that are more tolerant to delay and jitter.
409 *
410 * For example using a voice service type for bulk data transfer will lead
411 * to disastrous results as soon as congestion happens because the voice
412 * queue overflows and packets get dropped. This is not only bad for the bulk
413 * data transfer but it is also bad for VoIP apps that legitimately are using
414 * the voice service type.
415 *
416 * The characteristics of the Network Service Types are based on the service
417 * classes defined in RFC 4594 "Configuration Guidelines for DiffServ Service
418 * Classes"
419 *
420 * When system detects the outgoing interface belongs to a DiffServ domain
421 * that follows the recommendation of the IETF draft "Guidelines for DiffServ to
422 * IEEE 802.11 Mapping", the packet will marked at layer 3 with a DSCP value
423 * that corresponds to Network Service Type.
424 *
425 * NET_SERVICE_TYPE_BE
426 * "Best Effort", unclassified/standard. This is the default service
427 * class and cover the majority of the traffic.
428 *
429 * NET_SERVICE_TYPE_BK
430 * "Background", high delay tolerant, loss tolerant. elastic flow,
431 * variable size & long-lived. E.g: non-interactive network bulk transfer
432 * like synching or backup.
433 *
434 * NET_SERVICE_TYPE_RD
435 * "Responsive Data", a notch higher than "Best Effort", medium delay
436 * tolerant, elastic & inelastic flow, bursty, long-lived. E.g. email,
437 * instant messaging, for which there is a sense of interactivity and
438 * urgency (user waiting for output).
439 *
440 * NET_SERVICE_TYPE_OAM
441 * "Operations, Administration, and Management", medium delay tolerant,
442 * low-medium loss tolerant, elastic & inelastic flows, variable size.
443 * E.g. VPN tunnels.
444 *
445 * NET_SERVICE_TYPE_AV
446 * "Multimedia Audio/Video Streaming", medium delay tolerant, low-medium
447 * loss tolerant, elastic flow, constant packet interval, variable rate
448 * and size. E.g. video and audio playback with buffering.
449 *
450 * NET_SERVICE_TYPE_RV
451 * "Responsive Multimedia Audio/Video", low delay tolerant, low-medium
452 * loss tolerant, elastic flow, variable packet interval, rate and size.
453 * E.g. screen sharing.
454 *
455 * NET_SERVICE_TYPE_VI
456 * "Interactive Video", low delay tolerant, low-medium loss tolerant,
457 * elastic flow, constant packet interval, variable rate & size. E.g.
458 * video telephony.
459 *
460 * NET_SERVICE_TYPE_SIG
461 * "Signaling", low delay tolerant, low loss tolerant, inelastic flow,
462 * jitter tolerant, rate is bursty but short, variable size. E.g. SIP.
463 *
464 * NET_SERVICE_TYPE_VO
465 * "Interactive Voice", very low delay tolerant, very low loss tolerant,
466 * inelastic flow, constant packet rate, somewhat fixed size.
467 * E.g. VoIP.
468 */
469
470#define NET_SERVICE_TYPE_BE 0 /* Best effort */
471#define NET_SERVICE_TYPE_BK 1 /* Background system initiated */
472#define NET_SERVICE_TYPE_SIG 2 /* Signaling */
473#define NET_SERVICE_TYPE_VI 3 /* Interactive Video */
474#define NET_SERVICE_TYPE_VO 4 /* Interactive Voice */
475#define NET_SERVICE_TYPE_RV 5 /* Responsive Multimedia Audio/Video */
476#define NET_SERVICE_TYPE_AV 6 /* Multimedia Audio/Video Streaming */
477#define NET_SERVICE_TYPE_OAM 7 /* Operations, Administration, and Management */
478#define NET_SERVICE_TYPE_RD 8 /* Responsive Data */
479
480#if PRIVATE
481#define _NET_SERVICE_TYPE_COUNT 9
482#define _NET_SERVICE_TYPE_UNSPEC ((int)-1)
483
484#define IS_VALID_NET_SERVICE_TYPE(c) \
485 (c >= NET_SERVICE_TYPE_BE && c <= NET_SERVICE_TYPE_RD)
486
487extern const int sotc_by_netservicetype[_NET_SERVICE_TYPE_COUNT];
488
489/*
490 * Facility to pass Network Service Type values using SO_TRAFFIC_CLASS
491 * Mostly useful to simplify implementation of frameworks to adopt the new
492 * Network Service Type values for Signaling.
493 */
494#define SO_TC_NET_SERVICE_OFFSET 10000
495#define SO_TC_NETSVC_SIG (SO_TC_NET_SERVICE_OFFSET + NET_SERVICE_TYPE_SIG)
496#endif /* PRIVATE */
497
498/* These are supported values for SO_NETSVC_MARKING_LEVEL */
499#define NETSVC_MRKNG_UNKNOWN 0 /* The outgoing network interface is not known */
500#define NETSVC_MRKNG_LVL_L2 1 /* Default marking at layer 2 (for example Wi-Fi WMM) */
501#define NETSVC_MRKNG_LVL_L3L2_ALL 2 /* Layer 3 DSCP marking and layer 2 marking for all Network Service Types */
502#define NETSVC_MRKNG_LVL_L3L2_BK 3 /* The system policy limits layer 3 DSCP marking and layer 2 marking
503 * to background Network Service Types */
504
505
506typedef __uint32_t sae_associd_t;
507#define SAE_ASSOCID_ANY 0
508#define SAE_ASSOCID_ALL ((sae_associd_t)(-1ULL))
509
510typedef __uint32_t sae_connid_t;
511#define SAE_CONNID_ANY 0
512#define SAE_CONNID_ALL ((sae_connid_t)(-1ULL))
513
514/* connectx() flag parameters */
515#define CONNECT_RESUME_ON_READ_WRITE 0x1 /* resume connect() on read/write */
516#define CONNECT_DATA_IDEMPOTENT 0x2 /* data is idempotent */
517#define CONNECT_DATA_AUTHENTICATED 0x4 /* data includes security that replaces the TFO-cookie */
518
519/* sockaddr endpoints */
520typedef struct sa_endpoints {
521 unsigned int sae_srcif; /* optional source interface */
522 const struct sockaddr *sae_srcaddr; /* optional source address */
523 socklen_t sae_srcaddrlen; /* size of source address */
524 const struct sockaddr *sae_dstaddr; /* destination address */
525 socklen_t sae_dstaddrlen; /* size of destination address */
526} sa_endpoints_t;
527#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
528
529/*
530 * Structure used for manipulating linger option.
531 */
532struct linger {
533 int l_onoff; /* option on/off */
534 int l_linger; /* linger time */
535};
536
537#ifndef __APPLE__
538struct accept_filter_arg {
539 char af_name[16];
540 char af_arg[256 - 16];
541};
542#endif
543
544#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
545#ifdef __APPLE__
546
547/*
548 * Structure to control non-portable Sockets extension to POSIX
549 */
550struct so_np_extensions {
551 u_int32_t npx_flags;
552 u_int32_t npx_mask;
553};
554
555#define SONPX_SETOPTSHUT 0x000000001 /* flag for allowing setsockopt after shutdown */
556
557
558#ifdef KERNEL_PRIVATE
559#define SONPX_MASK_VALID (SONPX_SETOPTSHUT)
560#define IS_SO_TC_BACKGROUND(_tc_) ((_tc_) == SO_TC_BK || (_tc_) == SO_TC_BK_SYS)
561#define IS_SO_TC_BACKGROUNDSYSTEM(_tc_) ((_tc_) == SO_TC_BK_SYS)
562#endif /* KERNEL_PRIVATE */
563
564#endif
565#endif
566
567/*
568 * Level number for (get/set)sockopt() to apply to socket itself.
569 */
570#define SOL_SOCKET 0xffff /* options for socket level */
571
572
573/*
574 * Address families.
575 */
576#define AF_UNSPEC 0 /* unspecified */
577#define AF_UNIX 1 /* local to host (pipes) */
578#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
579#define AF_LOCAL AF_UNIX /* backward compatibility */
580#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
581#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
582#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
583#define AF_IMPLINK 3 /* arpanet imp addresses */
584#define AF_PUP 4 /* pup protocols: e.g. BSP */
585#define AF_CHAOS 5 /* mit CHAOS protocols */
586#define AF_NS 6 /* XEROX NS protocols */
587#define AF_ISO 7 /* ISO protocols */
588#define AF_OSI AF_ISO
589#define AF_ECMA 8 /* European computer manufacturers */
590#define AF_DATAKIT 9 /* datakit protocols */
591#define AF_CCITT 10 /* CCITT protocols, X.25 etc */
592#define AF_SNA 11 /* IBM SNA */
593#define AF_DECnet 12 /* DECnet */
594#define AF_DLI 13 /* DEC Direct data link interface */
595#define AF_LAT 14 /* LAT */
596#define AF_HYLINK 15 /* NSC Hyperchannel */
597#define AF_APPLETALK 16 /* Apple Talk */
598#define AF_ROUTE 17 /* Internal Routing Protocol */
599#define AF_LINK 18 /* Link layer interface */
600#define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */
601#define AF_COIP 20 /* connection-oriented IP, aka ST II */
602#define AF_CNT 21 /* Computer Network Technology */
603#define pseudo_AF_RTIP 22 /* Help Identify RTIP packets */
604#define AF_IPX 23 /* Novell Internet Protocol */
605#define AF_SIP 24 /* Simple Internet Protocol */
606#define pseudo_AF_PIP 25 /* Help Identify PIP packets */
607#define AF_NDRV 27 /* Network Driver 'raw' access */
608#define AF_ISDN 28 /* Integrated Services Digital Network */
609#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */
610#define pseudo_AF_KEY 29 /* Internal key-management function */
611#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
612#define AF_INET6 30 /* IPv6 */
613#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
614#define AF_NATM 31 /* native ATM access */
615#define AF_SYSTEM 32 /* Kernel event messages */
616#define AF_NETBIOS 33 /* NetBIOS */
617#define AF_PPP 34 /* PPP communication protocol */
618#define pseudo_AF_HDRCMPLT 35 /* Used by BPF to not rewrite headers
619 * in interface output routine */
620#ifdef PRIVATE
621#define AF_AFP 36 /* Used by AFP */
622#else
623#define AF_RESERVED_36 36 /* Reserved for internal usage */
624#endif
625#define AF_IEEE80211 37 /* IEEE 802.11 protocol */
626#define AF_UTUN 38
627#ifdef PRIVATE
628#define AF_MULTIPATH 39
629#endif /* PRIVATE */
630#define AF_VSOCK 40 /* VM Sockets */
631#define AF_MAX 41
632#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
633
634/*
635 * [XSI] Structure used by kernel to store most addresses.
636 */
637struct sockaddr {
638 __uint8_t sa_len; /* total length */
639 sa_family_t sa_family; /* [XSI] address family */
640 char sa_data[14]; /* [XSI] addr value */
641};
642__CCT_DECLARE_CONSTRAINED_PTR_TYPES(struct sockaddr, sockaddr);
643
644/*
645 * Least amount of information that a sockaddr requires.
646 * Sockaddr_header is a compatible prefix structure of
647 * all sockaddr objects.
648 */
649struct __sockaddr_header {
650 __uint8_t sa_len;
651 sa_family_t sa_family;
652};
653
654#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
655#define SOCK_MAXADDRLEN 255 /* longest possible addresses */
656
657/*
658 * Structure used by kernel to pass protocol
659 * information in raw sockets.
660 */
661struct sockproto {
662 __uint16_t sp_family; /* address family */
663 __uint16_t sp_protocol; /* protocol */
664};
665#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
666
667/*
668 * RFC 2553: protocol-independent placeholder for socket addresses
669 */
670#define _SS_MAXSIZE 128
671#define _SS_ALIGNSIZE (sizeof(__int64_t))
672#define _SS_PAD1SIZE \
673 (_SS_ALIGNSIZE - sizeof(__uint8_t) - sizeof(sa_family_t))
674#define _SS_PAD2SIZE \
675 (_SS_MAXSIZE - sizeof(__uint8_t) - sizeof(sa_family_t) - \
676 _SS_PAD1SIZE - _SS_ALIGNSIZE)
677
678/*
679 * [XSI] sockaddr_storage
680 */
681struct sockaddr_storage {
682 __uint8_t ss_len; /* address length */
683 sa_family_t ss_family; /* [XSI] address family */
684 char __ss_pad1[_SS_PAD1SIZE];
685 __int64_t __ss_align; /* force structure storage alignment */
686 char __ss_pad2[_SS_PAD2SIZE];
687};
688__CCT_DECLARE_CONSTRAINED_PTR_TYPES(struct sockaddr_storage, sockaddr_storage);
689
690/*
691 * Protocol families, same as address families for now.
692 */
693#define PF_UNSPEC AF_UNSPEC
694#define PF_LOCAL AF_LOCAL
695#define PF_UNIX PF_LOCAL /* backward compatibility */
696#define PF_INET AF_INET
697#define PF_IMPLINK AF_IMPLINK
698#define PF_PUP AF_PUP
699#define PF_CHAOS AF_CHAOS
700#define PF_NS AF_NS
701#define PF_ISO AF_ISO
702#define PF_OSI AF_ISO
703#define PF_ECMA AF_ECMA
704#define PF_DATAKIT AF_DATAKIT
705#define PF_CCITT AF_CCITT
706#define PF_SNA AF_SNA
707#define PF_DECnet AF_DECnet
708#define PF_DLI AF_DLI
709#define PF_LAT AF_LAT
710#define PF_HYLINK AF_HYLINK
711#define PF_APPLETALK AF_APPLETALK
712#define PF_ROUTE AF_ROUTE
713#define PF_LINK AF_LINK
714#define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */
715#define PF_COIP AF_COIP
716#define PF_CNT AF_CNT
717#define PF_SIP AF_SIP
718#define PF_IPX AF_IPX /* same format as AF_NS */
719#define PF_RTIP pseudo_AF_RTIP /* same format as AF_INET */
720#define PF_PIP pseudo_AF_PIP
721#define PF_NDRV AF_NDRV
722#define PF_ISDN AF_ISDN
723#define PF_KEY pseudo_AF_KEY
724#define PF_INET6 AF_INET6
725#define PF_NATM AF_NATM
726#define PF_SYSTEM AF_SYSTEM
727#define PF_NETBIOS AF_NETBIOS
728#define PF_PPP AF_PPP
729#ifdef PRIVATE
730#define PF_AFP AF_AFP
731#else
732#define PF_RESERVED_36 AF_RESERVED_36
733#endif
734#define PF_UTUN AF_UTUN
735#ifdef PRIVATE
736#define PF_MULTIPATH AF_MULTIPATH
737#endif /* PRIVATE */
738#define PF_VSOCK AF_VSOCK
739#define PF_MAX AF_MAX
740
741/*
742 * These do not have socket-layer support:
743 */
744#define PF_VLAN ((uint32_t)0x766c616e) /* 'vlan' */
745#define PF_BOND ((uint32_t)0x626f6e64) /* 'bond' */
746#ifdef KERNEL_PRIVATE
747#define PF_BRIDGE ((uint32_t)0x62726467) /* 'brdg' */
748#define PF_NULL ((uint32_t)0x6e756c6c) /* 'null' */
749#endif /* KERNEL_PRIVATE */
750
751/*
752 * Definitions for network related sysctl, CTL_NET.
753 *
754 * Second level is protocol family.
755 * Third level is protocol number.
756 *
757 * Further levels are defined by the individual families below.
758 */
759#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
760#define NET_MAXID AF_MAX
761#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
762
763#ifdef KERNEL_PRIVATE
764#define CTL_NET_NAMES { \
765 { 0, 0 }, \
766 { "local", CTLTYPE_NODE }, \
767 { "inet", CTLTYPE_NODE }, \
768 { "implink", CTLTYPE_NODE }, \
769 { "pup", CTLTYPE_NODE }, \
770 { "chaos", CTLTYPE_NODE }, \
771 { "xerox_ns", CTLTYPE_NODE }, \
772 { "iso", CTLTYPE_NODE }, \
773 { "emca", CTLTYPE_NODE }, \
774 { "datakit", CTLTYPE_NODE }, \
775 { "ccitt", CTLTYPE_NODE }, \
776 { "ibm_sna", CTLTYPE_NODE }, \
777 { "decnet", CTLTYPE_NODE }, \
778 { "dec_dli", CTLTYPE_NODE }, \
779 { "lat", CTLTYPE_NODE }, \
780 { "hylink", CTLTYPE_NODE }, \
781 { "appletalk", CTLTYPE_NODE }, \
782 { "route", CTLTYPE_NODE }, \
783 { "link_layer", CTLTYPE_NODE }, \
784 { "xtp", CTLTYPE_NODE }, \
785 { "coip", CTLTYPE_NODE }, \
786 { "cnt", CTLTYPE_NODE }, \
787 { "rtip", CTLTYPE_NODE }, \
788 { "ipx", CTLTYPE_NODE }, \
789 { "sip", CTLTYPE_NODE }, \
790 { "pip", CTLTYPE_NODE }, \
791 { 0, 0 }, \
792 { "ndrv", CTLTYPE_NODE }, \
793 { "isdn", CTLTYPE_NODE }, \
794 { "key", CTLTYPE_NODE }, \
795 { "inet6", CTLTYPE_NODE }, \
796 { "natm", CTLTYPE_NODE }, \
797 { "sys", CTLTYPE_NODE }, \
798 { "netbios", CTLTYPE_NODE }, \
799 { "ppp", CTLTYPE_NODE }, \
800 { "hdrcomplete", CTLTYPE_NODE }, \
801 { "vsock", CTLTYPE_NODE }, \
802}
803#endif /* KERNEL_PRIVATE */
804
805#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
806/*
807 * PF_ROUTE - Routing table
808 *
809 * Three additional levels are defined:
810 * Fourth: address family, 0 is wildcard
811 * Fifth: type of info, defined below
812 * Sixth: flag(s) to mask with for NET_RT_FLAGS
813 */
814#define NET_RT_DUMP 1 /* dump; may limit to a.f. */
815#define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */
816#define NET_RT_IFLIST 3 /* survey interface list */
817#define NET_RT_STAT 4 /* routing statistics */
818#define NET_RT_TRASH 5 /* routes not in table but not freed */
819#define NET_RT_IFLIST2 6 /* interface list with addresses */
820#define NET_RT_DUMP2 7 /* dump; may limit to a.f. */
821#ifdef PRIVATE
822#define NET_RT_DUMPX 8 /* private */
823#define NET_RT_DUMPX_FLAGS 9 /* private */
824#endif /* PRIVATE */
825/*
826 * Allows read access non-local host's MAC address
827 * if the process has neighbor cache entitlement.
828 */
829#define NET_RT_FLAGS_PRIV 10
830#define NET_RT_MAXID 11
831#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
832
833#ifdef PRIVATE
834/* These are supported values for SO_STATISTICS_EVENT */
835#define SO_STATISTICS_EVENT_ENTER_CELLFALLBACK (1 << 0)
836#define SO_STATISTICS_EVENT_EXIT_CELLFALLBACK (1 << 1)
837#define SO_STATISTICS_EVENT_ATTRIBUTION_CHANGE (1 << 2)
838#define SO_STATISTICS_EVENT_RESERVED_2 (1 << 3)
839#endif /* PRIVATE */
840
841
842#ifdef KERNEL_PRIVATE
843#define CTL_NET_RT_NAMES { \
844 { 0, 0 }, \
845 { "dump", CTLTYPE_STRUCT }, \
846 { "flags", CTLTYPE_STRUCT }, \
847 { "iflist", CTLTYPE_STRUCT }, \
848 { "stat", CTLTYPE_STRUCT }, \
849 { "trash", CTLTYPE_INT }, \
850 { "iflist2", CTLTYPE_STRUCT }, \
851 { "dump2", CTLTYPE_STRUCT }, \
852 { "dumpx", CTLTYPE_STRUCT }, \
853 { "dumpx_flags", CTLTYPE_STRUCT }, \
854}
855
856#endif /* KERNEL_PRIVATE */
857
858/*
859 * Maximum queue length specifiable by listen.
860 */
861#define SOMAXCONN 128
862
863/*
864 * [XSI] Message header for recvmsg and sendmsg calls.
865 * Used value-result for recvmsg, value only for sendmsg.
866 */
867struct msghdr {
868 void *msg_name; /* [XSI] optional address */
869 socklen_t msg_namelen; /* [XSI] size of address */
870 struct iovec *msg_iov; /* [XSI] scatter/gather array */
871 int msg_iovlen; /* [XSI] # elements in msg_iov */
872 void *msg_control; /* [XSI] ancillary data, see below */
873 socklen_t msg_controllen; /* [XSI] ancillary data buffer len */
874 int msg_flags; /* [XSI] flags on received message */
875};
876
877#ifdef PRIVATE
878/*
879 * Extended version for sendmsg_x() and recvmsg_x() calls
880 *
881 * For recvmsg_x(), the size of the data received is given by the field
882 * msg_datalen.
883 *
884 * For sendmsg_x(), the size of the data to send is given by the length of
885 * the iovec array -- like sendmsg(). The field msg_datalen is ignored.
886 */
887struct msghdr_x {
888 void *msg_name; /* optional address */
889 socklen_t msg_namelen; /* size of address */
890 struct iovec *msg_iov; /* scatter/gather array */
891 int msg_iovlen; /* # elements in msg_iov */
892 void *msg_control; /* ancillary data, see below */
893 socklen_t msg_controllen; /* ancillary data buffer len */
894 int msg_flags; /* flags on received message */
895 size_t msg_datalen; /* byte length of buffer in msg_iov */
896};
897#endif /* PRIVATE */
898
899#ifdef XNU_KERNEL_PRIVATE
900/*
901 * In-kernel representation of "struct msghdr" from
902 * userspace. Has enough precision for 32-bit or
903 * 64-bit clients, but does not need to be packed.
904 */
905
906struct user_msghdr {
907 user_addr_t msg_name; /* optional address */
908 socklen_t msg_namelen; /* size of address */
909 vm_address_t msg_iov; /* scatter/gather array */
910 int msg_iovlen; /* # elements in msg_iov */
911 user_addr_t msg_control; /* ancillary data, see below */
912 socklen_t msg_controllen; /* ancillary data buffer len */
913 int msg_flags; /* flags on received message */
914};
915__CCT_DECLARE_CONSTRAINED_PTR_TYPES(struct user_msghdr, user_msghdr);
916
917/*
918 * LP64 user version of struct msghdr.
919 * WARNING - keep in sync with struct msghdr
920 */
921
922struct user64_msghdr {
923 user64_addr_t msg_name; /* optional address */
924 socklen_t msg_namelen; /* size of address */
925 user64_addr_t msg_iov; /* scatter/gather array */
926 int msg_iovlen; /* # elements in msg_iov */
927 user64_addr_t msg_control; /* ancillary data, see below */
928 socklen_t msg_controllen; /* ancillary data buffer len */
929 int msg_flags; /* flags on received message */
930};
931__CCT_DECLARE_CONSTRAINED_PTR_TYPES(struct user64_msghdr, user64_msghdr);
932
933/*
934 * ILP32 user version of struct msghdr.
935 * WARNING - keep in sync with struct msghdr
936 */
937
938struct user32_msghdr {
939 user32_addr_t msg_name; /* optional address */
940 socklen_t msg_namelen; /* size of address */
941 user32_addr_t msg_iov; /* scatter/gather array */
942 int msg_iovlen; /* # elements in msg_iov */
943 user32_addr_t msg_control; /* ancillary data, see below */
944 socklen_t msg_controllen; /* ancillary data buffer len */
945 int msg_flags; /* flags on received message */
946};
947__CCT_DECLARE_CONSTRAINED_PTR_TYPES(struct user32_msghdr, user32_msghdr);
948
949/*
950 * In-kernel representation of "struct msghdr_x" from
951 * userspace. Has enough precision for 32-bit or
952 * 64-bit clients, but does not need to be packed.
953 */
954
955struct user_msghdr_x {
956 user_addr_t msg_name; /* optional address */
957 socklen_t msg_namelen; /* size of address */
958 vm_address_t msg_iov; /* scatter/gather array */
959 int msg_iovlen; /* # elements in msg_iov */
960 user_addr_t msg_control; /* ancillary data, see below */
961 socklen_t msg_controllen; /* ancillary data buffer len */
962 int msg_flags; /* flags on received message */
963 size_t msg_datalen; /* byte length of buffer in msg_iov */
964};
965__CCT_DECLARE_CONSTRAINED_PTR_TYPES(struct user_msghdr_x, user_msghdr_x);
966
967
968/*
969 * LP64 user version of struct msghdr_x
970 * WARNING - keep in sync with struct msghdr_x
971 */
972
973struct user64_msghdr_x {
974 user64_addr_t msg_name; /* optional address */
975 socklen_t msg_namelen; /* size of address */
976 user64_addr_t msg_iov; /* scatter/gather array */
977 int msg_iovlen; /* # elements in msg_iov */
978 user64_addr_t msg_control; /* ancillary data, see below */
979 socklen_t msg_controllen; /* ancillary data buffer len */
980 int msg_flags; /* flags on received message */
981 user64_size_t msg_datalen; /* byte length of buffer in msg_iov */
982};
983__CCT_DECLARE_CONSTRAINED_PTR_TYPES(struct user64_msghdr_x, user64_msghdr_x);
984
985/*
986 * ILP32 user version of struct msghdr_x
987 * WARNING - keep in sync with struct msghdr_x
988 */
989
990struct user32_msghdr_x {
991 user32_addr_t msg_name; /* optional address */
992 socklen_t msg_namelen; /* size of address */
993 user32_addr_t msg_iov; /* scatter/gather array */
994 int msg_iovlen; /* # elements in msg_iov */
995 user32_addr_t msg_control; /* ancillary data, see below */
996 socklen_t msg_controllen; /* ancillary data buffer len */
997 int msg_flags; /* flags on received message */
998 user32_size_t msg_datalen; /* byte length of buffer in msg_iov */
999};
1000__CCT_DECLARE_CONSTRAINED_PTR_TYPES(struct user32_msghdr_x, user32_msghdr_x);
1001
1002/*
1003 * In-kernel representation of "struct sa_endpoints" from
1004 * userspace. Has enough precision for 32-bit or
1005 * 64-bit clients, but does not need to be packed.
1006 */
1007
1008struct user_sa_endpoints {
1009 unsigned int sae_srcif; /* optional source interface */
1010 user_addr_t sae_srcaddr; /* optional source address */
1011 socklen_t sae_srcaddrlen; /* size of source address */
1012 user_addr_t sae_dstaddr; /* destination address */
1013 socklen_t sae_dstaddrlen; /* size of destination address */
1014};
1015
1016/*
1017 * LP64 user version of struct sa_endpoints
1018 * WARNING - keep in sync with struct sa_endpoints
1019 */
1020
1021struct user64_sa_endpoints {
1022 unsigned int sae_srcif; /* optional source interface */
1023 user64_addr_t sae_srcaddr; /* optional source address */
1024 socklen_t sae_srcaddrlen; /* size of source address */
1025 user64_addr_t sae_dstaddr; /* destination address */
1026 socklen_t sae_dstaddrlen; /* size of destination address */
1027};
1028
1029/*
1030 * ILP32 user version of struct sa_endpoints
1031 * WARNING - keep in sync with struct sa_endpoints
1032 */
1033
1034struct user32_sa_endpoints {
1035 unsigned int sae_srcif; /* optional source interface */
1036 user32_addr_t sae_srcaddr; /* optional source address */
1037 socklen_t sae_srcaddrlen; /* size of source address */
1038 user32_addr_t sae_dstaddr; /* destination address */
1039 socklen_t sae_dstaddrlen; /* size of destination address */
1040};
1041
1042#endif /* XNU_KERNEL_PRIVATE */
1043
1044#define MSG_OOB 0x1 /* process out-of-band data */
1045#define MSG_PEEK 0x2 /* peek at incoming message */
1046#define MSG_DONTROUTE 0x4 /* send without using routing tables */
1047#define MSG_EOR 0x8 /* data completes record */
1048#define MSG_TRUNC 0x10 /* data discarded before delivery */
1049#define MSG_CTRUNC 0x20 /* control data lost before delivery */
1050#define MSG_WAITALL 0x40 /* wait for full request or error */
1051#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
1052#define MSG_DONTWAIT 0x80 /* this message should be nonblocking */
1053#define MSG_EOF 0x100 /* data completes connection */
1054#ifdef __APPLE__
1055#ifndef PRIVATE
1056#ifdef __APPLE_API_OBSOLETE
1057#define MSG_WAITSTREAM 0x200 /* wait up to full request.. may return partial */
1058#endif
1059#else
1060#define MSG_WAITSTREAM 0x200 /* wait up to full request.. may return partial */
1061#endif
1062#define MSG_FLUSH 0x400 /* Start of 'hold' seq; dump so_temp, deprecated */
1063#define MSG_HOLD 0x800 /* Hold frag in so_temp, deprecated */
1064#define MSG_SEND 0x1000 /* Send the packet in so_temp, deprecated */
1065#define MSG_HAVEMORE 0x2000 /* Data ready to be read */
1066#define MSG_RCVMORE 0x4000 /* Data remains in current pkt */
1067#endif
1068#ifdef KERNEL_PRIVATE
1069#define MSG_COMPAT 0x8000 /* deprecated */
1070#endif /* KERNEL_PRIVATE */
1071#define MSG_NEEDSA 0x10000 /* Fail receive if socket address cannot be allocated */
1072#ifdef KERNEL_PRIVATE
1073#define MSG_NBIO 0x20000 /* FIONBIO mode, used by fifofs */
1074#define MSG_SKIPCFIL 0x40000 /* skip pass content filter */
1075#endif
1076#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
1077
1078#if __DARWIN_C_LEVEL >= 200809L
1079#define MSG_NOSIGNAL 0x80000 /* do not generate SIGPIPE on EOF */
1080#endif /* __DARWIN_C_LEVEL */
1081
1082#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
1083#ifdef KERNEL
1084#define MSG_USEUPCALL 0x80000000 /* Inherit upcall in sock_accept */
1085#endif
1086#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
1087
1088/*
1089 * Header for ancillary data objects in msg_control buffer.
1090 * Used for additional information with/about a datagram
1091 * not expressible by flags. The format is a sequence
1092 * of message elements headed by cmsghdr structures.
1093 */
1094struct cmsghdr {
1095 socklen_t cmsg_len; /* [XSI] data byte count, including hdr */
1096 int cmsg_level; /* [XSI] originating protocol */
1097 int cmsg_type; /* [XSI] protocol-specific type */
1098/* followed by unsigned char cmsg_data[]; */
1099};
1100
1101#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
1102#ifndef __APPLE__
1103/*
1104 * While we may have more groups than this, the cmsgcred struct must
1105 * be able to fit in an mbuf, and NGROUPS_MAX is too large to allow
1106 * this.
1107 */
1108#define CMGROUP_MAX 16
1109
1110/*
1111 * Credentials structure, used to verify the identity of a peer
1112 * process that has sent us a message. This is allocated by the
1113 * peer process but filled in by the kernel. This prevents the
1114 * peer from lying about its identity. (Note that cmcred_groups[0]
1115 * is the effective GID.)
1116 */
1117struct cmsgcred {
1118 pid_t cmcred_pid; /* PID of sending process */
1119 uid_t cmcred_uid; /* real UID of sending process */
1120 uid_t cmcred_euid; /* effective UID of sending process */
1121 gid_t cmcred_gid; /* real GID of sending process */
1122 short cmcred_ngroups; /* number or groups */
1123 gid_t cmcred_groups[CMGROUP_MAX]; /* groups */
1124};
1125#endif
1126#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
1127
1128/* given pointer to struct cmsghdr, return pointer to data */
1129#define CMSG_DATA(cmsg) ((unsigned char *)(cmsg) + \
1130 __DARWIN_ALIGN32(sizeof(struct cmsghdr)))
1131
1132/*
1133 * RFC 2292 requires to check msg_controllen, in case that the kernel returns
1134 * an empty list for some reasons.
1135 */
1136#define CMSG_FIRSTHDR(mhdr) \
1137 ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
1138 (struct cmsghdr *)(mhdr)->msg_control : \
1139 (struct cmsghdr *)0L)
1140
1141
1142/*
1143 * Given pointer to struct cmsghdr, return pointer to next cmsghdr
1144 * RFC 2292 says that CMSG_NXTHDR(mhdr, NULL) is equivalent to CMSG_FIRSTHDR(mhdr)
1145 */
1146#define CMSG_NXTHDR(mhdr, cmsg) \
1147 ((char *)(cmsg) == (char *)0L ? CMSG_FIRSTHDR(mhdr) : \
1148 ((((unsigned char *)(cmsg) + \
1149 __DARWIN_ALIGN32((__uint32_t)(cmsg)->cmsg_len) + \
1150 __DARWIN_ALIGN32(sizeof(struct cmsghdr))) > \
1151 ((unsigned char *)(mhdr)->msg_control + \
1152 (mhdr)->msg_controllen)) ? \
1153 (struct cmsghdr *)0L /* NULL */ : \
1154 (struct cmsghdr *)(void *)((unsigned char *)(cmsg) + \
1155 __DARWIN_ALIGN32((__uint32_t)(cmsg)->cmsg_len))))
1156
1157#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
1158/* RFC 2292 additions */
1159#define CMSG_SPACE(l) (__DARWIN_ALIGN32(sizeof(struct cmsghdr)) + __DARWIN_ALIGN32(l))
1160#define CMSG_LEN(l) (__DARWIN_ALIGN32(sizeof(struct cmsghdr)) + (l))
1161
1162#ifdef KERNEL
1163#define CMSG_ALIGN(n) ((typeof(n))__DARWIN_ALIGN32(n))
1164#endif
1165#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
1166
1167/* "Socket"-level control message types: */
1168#define SCM_RIGHTS 0x01 /* access rights (array of int) */
1169#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
1170#define SCM_TIMESTAMP 0x02 /* timestamp (struct timeval) */
1171#define SCM_CREDS 0x03 /* process creds (struct cmsgcred) */
1172#define SCM_TIMESTAMP_MONOTONIC 0x04 /* timestamp (uint64_t) */
1173
1174#ifdef PRIVATE
1175#define SCM_TIMESTAMP_CONTINUOUS 0x07 /* timestamp (uint64_t) */
1176#define SCM_MPKL_SEND_INFO 0x08 /* send info for multi-layer packet logging (struct so_mpkl_send_info) */
1177#define SCM_MPKL_RECV_INFO 0x09 /* receive info for multi-layer packet logging (struct so_mpkl_recv_info */
1178#endif /* PRIVATE */
1179
1180#ifdef KERNEL_PRIVATE
1181/*
1182 * 4.3 compat sockaddr (deprecated)
1183 */
1184struct osockaddr {
1185 __uint16_t sa_family; /* address family */
1186 char sa_data[14]; /* up to 14 bytes of direct address */
1187};
1188
1189/*
1190 * 4.3-compat message header (deprecated)
1191 */
1192struct omsghdr {
1193 void *msg_name; /* optional address */
1194 socklen_t msg_namelen; /* size of address */
1195 struct iovec *msg_iov; /* scatter/gather array */
1196 int msg_iovlen; /* # elements in msg_iov */
1197 void *msg_accrights; /* access rights sent/rcvd */
1198 int msg_accrightslen;
1199};
1200
1201#define SA(s) ((struct sockaddr *)(void *)(s))
1202#endif /* KERNEL_PRIVATE */
1203#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
1204
1205/*
1206 * howto arguments for shutdown(2), specified by Posix.1g.
1207 */
1208#define SHUT_RD 0 /* shut down the reading side */
1209#define SHUT_WR 1 /* shut down the writing side */
1210#define SHUT_RDWR 2 /* shut down both sides */
1211
1212#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
1213/*
1214 * sendfile(2) header/trailer struct
1215 */
1216struct sf_hdtr {
1217 struct iovec *headers; /* pointer to an array of header struct iovec's */
1218 int hdr_cnt; /* number of header iovec's */
1219 struct iovec *trailers; /* pointer to an array of trailer struct iovec's */
1220 int trl_cnt; /* number of trailer iovec's */
1221};
1222
1223#ifdef KERNEL
1224
1225/* In-kernel representation */
1226struct user_sf_hdtr {
1227 user_addr_t headers; /* pointer to an array of header struct iovec's */
1228 int hdr_cnt; /* number of header iovec's */
1229 user_addr_t trailers; /* pointer to an array of trailer struct iovec's */
1230 int trl_cnt; /* number of trailer iovec's */
1231};
1232
1233/* LP64 user version of struct sf_hdtr */
1234struct user64_sf_hdtr {
1235 user64_addr_t headers; /* pointer to an array of header struct iovec's */
1236 int hdr_cnt; /* number of header iovec's */
1237 user64_addr_t trailers; /* pointer to an array of trailer struct iovec's */
1238 int trl_cnt; /* number of trailer iovec's */
1239};
1240
1241/* ILP32 user version of struct sf_hdtr */
1242struct user32_sf_hdtr {
1243 user32_addr_t headers; /* pointer to an array of header struct iovec's */
1244 int hdr_cnt; /* number of header iovec's */
1245 user32_addr_t trailers; /* pointer to an array of trailer struct iovec's */
1246 int trl_cnt; /* number of trailer iovec's */
1247};
1248
1249#endif /* KERNEL */
1250
1251#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
1252
1253#ifdef PRIVATE
1254#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
1255
1256/*
1257 * Structure for SIOCGASSOCIDS
1258 */
1259struct so_aidreq {
1260 __uint32_t sar_cnt; /* number of associations */
1261 sae_associd_t *sar_aidp; /* array of association IDs */
1262};
1263
1264#ifdef BSD_KERNEL_PRIVATE
1265struct so_aidreq32 {
1266 __uint32_t sar_cnt;
1267 user32_addr_t sar_aidp;
1268};
1269
1270struct so_aidreq64 {
1271 __uint32_t sar_cnt;
1272 user64_addr_t sar_aidp __attribute__((aligned(8)));
1273};
1274#endif /* BSD_KERNEL_PRIVATE */
1275
1276/*
1277 * Structure for SIOCGCONNIDS
1278 */
1279struct so_cidreq {
1280 sae_associd_t scr_aid; /* association ID */
1281 __uint32_t scr_cnt; /* number of connections */
1282 sae_connid_t *scr_cidp; /* array of connection IDs */
1283};
1284
1285#ifdef BSD_KERNEL_PRIVATE
1286struct so_cidreq32 {
1287 sae_associd_t scr_aid;
1288 __uint32_t scr_cnt;
1289 user32_addr_t scr_cidp;
1290};
1291
1292struct so_cidreq64 {
1293 sae_associd_t scr_aid;
1294 __uint32_t scr_cnt;
1295 user64_addr_t scr_cidp __attribute__((aligned(8)));
1296};
1297#endif /* BSD_KERNEL_PRIVATE */
1298
1299/*
1300 * Structure for SIOCGCONNINFO
1301 */
1302struct so_cinforeq {
1303 sae_connid_t scir_cid; /* connection ID */
1304 __uint32_t scir_flags; /* see flags below */
1305 __uint32_t scir_ifindex; /* (last) outbound interface */
1306 __int32_t scir_error; /* most recent error */
1307 struct sockaddr *scir_src; /* source address */
1308 socklen_t scir_src_len; /* source address len */
1309 struct sockaddr *scir_dst; /* destination address */
1310 socklen_t scir_dst_len; /* destination address len */
1311 __uint32_t scir_aux_type; /* aux data type (CIAUX) */
1312 void *scir_aux_data; /* aux data */
1313 __uint32_t scir_aux_len; /* aux data len */
1314};
1315
1316#ifdef BSD_KERNEL_PRIVATE
1317struct so_cinforeq32 {
1318 sae_connid_t scir_cid;
1319 __uint32_t scir_flags;
1320 __uint32_t scir_ifindex;
1321 __int32_t scir_error;
1322 user32_addr_t scir_src;
1323 socklen_t scir_src_len;
1324 user32_addr_t scir_dst;
1325 socklen_t scir_dst_len;
1326 __uint32_t scir_aux_type;
1327 user32_addr_t scir_aux_data;
1328 __uint32_t scir_aux_len;
1329};
1330
1331struct so_cinforeq64 {
1332 sae_connid_t scir_cid;
1333 __uint32_t scir_flags;
1334 __uint32_t scir_ifindex;
1335 __int32_t scir_error;
1336 user64_addr_t scir_src __attribute__((aligned(8)));
1337 socklen_t scir_src_len;
1338 user64_addr_t scir_dst __attribute__((aligned(8)));
1339 socklen_t scir_dst_len;
1340 __uint32_t scir_aux_type;
1341 user64_addr_t scir_aux_data __attribute__((aligned(8)));
1342 __uint32_t scir_aux_len;
1343};
1344#endif /* BSD_KERNEL_PRIVATE */
1345
1346/* valid connection info flags */
1347#define CIF_CONNECTING 0x1 /* connection was attempted */
1348#define CIF_CONNECTED 0x2 /* connection is established */
1349#define CIF_DISCONNECTING 0x4 /* disconnection was attempted */
1350#define CIF_DISCONNECTED 0x8 /* has been disconnected */
1351#define CIF_BOUND_IF 0x10 /* bound to an interface */
1352#define CIF_BOUND_IP 0x20 /* bound to a src address */
1353#define CIF_BOUND_PORT 0x40 /* bound to a src port */
1354#define CIF_PREFERRED 0x80 /* connection is primary/preferred */
1355#define CIF_MP_CAPABLE 0x100 /* supports multipath protocol */
1356#define CIF_MP_READY 0x200 /* multipath protocol confirmed */
1357#define CIF_MP_DEGRADED 0x400 /* has lost its multipath capability */
1358#define CIF_MP_ACTIVE 0x800 /* this is the active subflow */
1359#define CIF_MP_V1 0x1000 /* MPTCP v1 is used */
1360
1361/* valid connection info auxiliary data types */
1362#define CIAUX_TCP 0x1 /* TCP auxiliary data (conninfo_tcp_t) */
1363#define CIAUX_MPTCP 0x2 /* MPTCP auxiliary data (conninfo_multipathtcp) */
1364
1365/*
1366 * Structure for SIOC{S,G}CONNORDER
1367 */
1368struct so_cordreq {
1369 sae_connid_t sco_cid; /* connection ID */
1370 __uint32_t sco_rank; /* rank (0 means unspecified) */
1371};
1372
1373/*
1374 * Common structure for KEV_NETPOLICY_SUBCLASS
1375 */
1376struct netpolicy_event_data {
1377 __uint64_t eupid; /* effective unique PID */
1378 __uint64_t epid; /* effective PID */
1379 uuid_t euuid; /* effective UUID */
1380};
1381
1382/*
1383 * NETPOLICY_IFDENIED event structure
1384 */
1385struct kev_netpolicy_ifdenied {
1386 struct netpolicy_event_data ev_data;
1387 __uint32_t ev_if_functional_type;
1388};
1389
1390/*
1391 * KEV_NETPOLICY_NETDENIED event structure
1392 */
1393struct kev_netpolicy_netdenied {
1394 struct netpolicy_event_data ev_data;
1395 __uint32_t ev_network_type;
1396};
1397
1398/*
1399 * Network Service Type to DiffServ Code Point mapping
1400 */
1401struct netsvctype_dscp_map {
1402 int netsvctype;
1403 u_int8_t dscp; /* 6 bits diffserv code point */
1404};
1405
1406/*
1407 * Multi-layer packet logging require SO_MPK_LOG to be set
1408 */
1409struct so_mpkl_send_info {
1410 uuid_t mpkl_uuid;
1411 __uint8_t mpkl_proto; /* see net/multi_layer_pkt_log.h */
1412};
1413
1414struct so_mpkl_recv_info {
1415 __uint32_t mpkl_seq;
1416 __uint8_t mpkl_proto; /* see net/multi_layer_pkt_log.h */
1417};
1418
1419#ifndef KERNEL
1420__BEGIN_DECLS
1421
1422extern int peeloff(int s, sae_associd_t);
1423extern int socket_delegate(int, int, int, pid_t);
1424
1425/*
1426 * recvmsg_x() is a system call similar to recvmsg(2) to receive
1427 * several datagrams at once in the array of message headers "msgp".
1428 *
1429 * recvmsg_x() can be used only with protocols handlers that have been specially
1430 * modified to support sending and receiving several datagrams at once.
1431 *
1432 * The size of the array "msgp" is given by the argument "cnt".
1433 *
1434 * The "flags" arguments supports only the value MSG_DONTWAIT.
1435 *
1436 * Each member of "msgp" array is of type "struct msghdr_x".
1437 *
1438 * The "msg_iov" and "msg_iovlen" are input parameters that describe where to
1439 * store a datagram in a scatter gather locations of buffers -- see recvmsg(2).
1440 * On output the field "msg_datalen" gives the length of the received datagram.
1441 *
1442 * The field "msg_flags" must be set to zero on input. On output, "msg_flags"
1443 * may have MSG_TRUNC set to indicate the trailing portion of the datagram was
1444 * discarded because the datagram was larger than the buffer supplied.
1445 * recvmsg_x() returns as soon as a datagram is truncated.
1446 *
1447 * recvmsg_x() may return with less than "cnt" datagrams received based on
1448 * the low water mark and the amount of data pending in the socket buffer.
1449 *
1450 * recvmsg_x() returns the number of datagrams that have been received,
1451 * or -1 if an error occurred.
1452 *
1453 * NOTE: This a private system call, the API is subject to change.
1454 */
1455ssize_t recvmsg_x(int s, const struct msghdr_x *msgp, u_int cnt, int flags);
1456
1457/*
1458 * sendmsg_x() is a system call similar to send(2) to send
1459 * several datagrams at once in the array of message headers "msgp".
1460 *
1461 * sendmsg_x() can be used only with protocols handlers that have been specially
1462 * modified to support sending and receiving several datagrams at once.
1463 *
1464 * The size of the array "msgp" is given by the argument "cnt".
1465 *
1466 * The "flags" arguments supports only the value MSG_DONTWAIT.
1467 *
1468 * Each member of "msgp" array is of type "struct msghdr_x".
1469 *
1470 * The "msg_iov" and "msg_iovlen" are input parameters that specify the
1471 * data to be sent in a scatter gather locations of buffers -- see sendmsg(2).
1472 *
1473 * sendmsg_x() fails with EMSGSIZE if the sum of the length of the datagrams
1474 * is greater than the high water mark.
1475 *
1476 * Address and ancillary data are not supported so the following fields
1477 * must be set to zero on input:
1478 * "msg_name", "msg_namelen", "msg_control" and "msg_controllen".
1479 *
1480 * The field "msg_flags" and "msg_datalen" must be set to zero on input.
1481 *
1482 * sendmsg_x() returns the number of datagrams that have been sent,
1483 * or -1 if an error occurred.
1484 *
1485 * NOTE: This a private system call, the API is subject to change.
1486 */
1487ssize_t sendmsg_x(int s, const struct msghdr_x *msgp, u_int cnt, int flags);
1488__END_DECLS
1489#endif /* !KERNEL */
1490#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
1491#endif /* PRIVATE */
1492
1493#ifndef KERNEL
1494__BEGIN_DECLS
1495
1496int accept(int, struct sockaddr * __restrict, socklen_t * __restrict)
1497__DARWIN_ALIAS_C(accept);
1498int bind(int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS(bind);
1499int connect(int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS_C(connect);
1500int getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict)
1501__DARWIN_ALIAS(getpeername);
1502int getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict)
1503__DARWIN_ALIAS(getsockname);
1504int getsockopt(int, int, int, void * __restrict, socklen_t * __restrict);
1505int listen(int, int) __DARWIN_ALIAS(listen);
1506ssize_t recv(int, void *, size_t, int) __DARWIN_ALIAS_C(recv);
1507ssize_t recvfrom(int, void *, size_t, int, struct sockaddr * __restrict,
1508 socklen_t * __restrict) __DARWIN_ALIAS_C(recvfrom);
1509ssize_t recvmsg(int, struct msghdr *, int) __DARWIN_ALIAS_C(recvmsg);
1510ssize_t send(int, const void *, size_t, int) __DARWIN_ALIAS_C(send);
1511ssize_t sendmsg(int, const struct msghdr *, int) __DARWIN_ALIAS_C(sendmsg);
1512ssize_t sendto(int, const void *, size_t,
1513 int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS_C(sendto);
1514int setsockopt(int, int, int, const void *, socklen_t);
1515int shutdown(int, int);
1516int sockatmark(int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
1517int socket(int, int, int);
1518int socketpair(int, int, int, int *) __DARWIN_ALIAS(socketpair);
1519
1520#if !defined(_POSIX_C_SOURCE)
1521int sendfile(int, int, off_t, off_t *, struct sf_hdtr *, int);
1522#endif /* !_POSIX_C_SOURCE */
1523
1524#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
1525void pfctlinput(int, struct sockaddr *);
1526
1527__API_AVAILABLE(macosx(10.11), ios(9.0), tvos(9.0), watchos(2.0))
1528int connectx(int, const sa_endpoints_t *, sae_associd_t, unsigned int,
1529 const struct iovec *, unsigned int, size_t *, sae_connid_t *);
1530
1531__API_AVAILABLE(macosx(10.11), ios(9.0), tvos(9.0), watchos(2.0))
1532int disconnectx(int, sae_associd_t, sae_connid_t);
1533#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
1534__END_DECLS
1535#endif /* !KERNEL */
1536
1537#ifdef KERNEL
1538#include <sys/kpi_socket.h>
1539#endif
1540
1541#endif /* !_SYS_SOCKET_H_ */
1542