| 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 |  | 
|---|
| 371 | struct so_mark_cellfallback_uuid_args { | 
|---|
| 372 | uuid_t flow_uuid; | 
|---|
| 373 | int flow_cellfallback; | 
|---|
| 374 | }; | 
|---|
| 375 |  | 
|---|
| 376 | typedef 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 |  | 
|---|
| 487 | extern 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 |  | 
|---|
| 506 | typedef __uint32_t sae_associd_t; | 
|---|
| 507 | #define SAE_ASSOCID_ANY 0 | 
|---|
| 508 | #define SAE_ASSOCID_ALL ((sae_associd_t)(-1ULL)) | 
|---|
| 509 |  | 
|---|
| 510 | typedef __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 */ | 
|---|
| 520 | typedef 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 | */ | 
|---|
| 532 | struct  linger { | 
|---|
| 533 | int     l_onoff;                /* option on/off */ | 
|---|
| 534 | int     l_linger;               /* linger time */ | 
|---|
| 535 | }; | 
|---|
| 536 |  | 
|---|
| 537 | #ifndef __APPLE__ | 
|---|
| 538 | struct  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 | */ | 
|---|
| 550 | struct 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 | */ | 
|---|
| 637 | struct 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 | */ | 
|---|
| 649 | struct  { | 
|---|
| 650 | __uint8_t           ; | 
|---|
| 651 | sa_family_t         ; | 
|---|
| 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 | */ | 
|---|
| 661 | struct 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 | */ | 
|---|
| 681 | struct 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 | */ | 
|---|
| 867 | struct 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 | */ | 
|---|
| 887 | struct 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 |  | 
|---|
| 906 | struct 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 |  | 
|---|
| 922 | struct 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 |  | 
|---|
| 938 | struct 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 |  | 
|---|
| 955 | struct 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 |  | 
|---|
| 973 | struct 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 |  | 
|---|
| 990 | struct 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 |  | 
|---|
| 1008 | struct 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 |  | 
|---|
| 1021 | struct 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 |  | 
|---|
| 1034 | struct 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 | */ | 
|---|
| 1094 | struct 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 | */ | 
|---|
| 1117 | struct 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 | */ | 
|---|
| 1184 | struct 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 | */ | 
|---|
| 1192 | struct 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 | */ | 
|---|
| 1216 | struct sf_hdtr { | 
|---|
| 1217 | struct iovec *;  /* 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 */ | 
|---|
| 1226 | struct user_sf_hdtr { | 
|---|
| 1227 | user_addr_t ;    /* 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 */ | 
|---|
| 1234 | struct user64_sf_hdtr { | 
|---|
| 1235 | user64_addr_t ;  /* 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 */ | 
|---|
| 1242 | struct user32_sf_hdtr { | 
|---|
| 1243 | user32_addr_t ;  /* 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 | */ | 
|---|
| 1259 | struct 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 | 
|---|
| 1265 | struct so_aidreq32 { | 
|---|
| 1266 | __uint32_t      sar_cnt; | 
|---|
| 1267 | user32_addr_t   sar_aidp; | 
|---|
| 1268 | }; | 
|---|
| 1269 |  | 
|---|
| 1270 | struct 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 | */ | 
|---|
| 1279 | struct 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 | 
|---|
| 1286 | struct so_cidreq32 { | 
|---|
| 1287 | sae_associd_t   scr_aid; | 
|---|
| 1288 | __uint32_t      scr_cnt; | 
|---|
| 1289 | user32_addr_t   scr_cidp; | 
|---|
| 1290 | }; | 
|---|
| 1291 |  | 
|---|
| 1292 | struct 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 | */ | 
|---|
| 1302 | struct 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 | 
|---|
| 1317 | struct 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 |  | 
|---|
| 1331 | struct 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 | */ | 
|---|
| 1368 | struct 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 | */ | 
|---|
| 1376 | struct 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 | */ | 
|---|
| 1385 | struct 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 | */ | 
|---|
| 1393 | struct 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 | */ | 
|---|
| 1401 | struct 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 | */ | 
|---|
| 1409 | struct so_mpkl_send_info { | 
|---|
| 1410 | uuid_t          mpkl_uuid; | 
|---|
| 1411 | __uint8_t       mpkl_proto;     /* see net/multi_layer_pkt_log.h */ | 
|---|
| 1412 | }; | 
|---|
| 1413 |  | 
|---|
| 1414 | struct 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 |  | 
|---|
| 1422 | extern int peeloff(int s, sae_associd_t); | 
|---|
| 1423 | extern 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 | */ | 
|---|
| 1455 | ssize_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 | */ | 
|---|
| 1487 | ssize_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 |  | 
|---|
| 1496 | int     accept(int, struct sockaddr * __restrict, socklen_t * __restrict) | 
|---|
| 1497 | __DARWIN_ALIAS_C(accept); | 
|---|
| 1498 | int     bind(int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS(bind); | 
|---|
| 1499 | int     connect(int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS_C(connect); | 
|---|
| 1500 | int     getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict) | 
|---|
| 1501 | __DARWIN_ALIAS(getpeername); | 
|---|
| 1502 | int     getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict) | 
|---|
| 1503 | __DARWIN_ALIAS(getsockname); | 
|---|
| 1504 | int     getsockopt(int, int, int, void * __restrict, socklen_t * __restrict); | 
|---|
| 1505 | int     listen(int, int) __DARWIN_ALIAS(listen); | 
|---|
| 1506 | ssize_t recv(int, void *, size_t, int) __DARWIN_ALIAS_C(recv); | 
|---|
| 1507 | ssize_t recvfrom(int, void *, size_t, int, struct sockaddr * __restrict, | 
|---|
| 1508 | socklen_t * __restrict) __DARWIN_ALIAS_C(recvfrom); | 
|---|
| 1509 | ssize_t recvmsg(int, struct msghdr *, int) __DARWIN_ALIAS_C(recvmsg); | 
|---|
| 1510 | ssize_t send(int, const void *, size_t, int) __DARWIN_ALIAS_C(send); | 
|---|
| 1511 | ssize_t sendmsg(int, const struct msghdr *, int) __DARWIN_ALIAS_C(sendmsg); | 
|---|
| 1512 | ssize_t sendto(int, const void *, size_t, | 
|---|
| 1513 | int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS_C(sendto); | 
|---|
| 1514 | int     setsockopt(int, int, int, const void *, socklen_t); | 
|---|
| 1515 | int     shutdown(int, int); | 
|---|
| 1516 | int     sockatmark(int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); | 
|---|
| 1517 | int     socket(int, int, int); | 
|---|
| 1518 | int     socketpair(int, int, int, int *) __DARWIN_ALIAS(socketpair); | 
|---|
| 1519 |  | 
|---|
| 1520 | #if !defined(_POSIX_C_SOURCE) | 
|---|
| 1521 | int     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) | 
|---|
| 1525 | void    pfctlinput(int, struct sockaddr *); | 
|---|
| 1526 |  | 
|---|
| 1527 | __API_AVAILABLE(macosx(10.11), ios(9.0), tvos(9.0), watchos(2.0)) | 
|---|
| 1528 | int 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)) | 
|---|
| 1532 | int 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 |  | 
|---|