1/* 2 * Copyright (c) 2000-2014 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 <machine/_param.h> 78 79#ifdef PRIVATE 80#include <sys/param.h> 81#include <uuid/uuid.h> 82#endif /* PRIVATE */ 83 84#ifndef KERNEL 85#include <Availability.h> 86#endif 87 88/* 89 * Definitions related to sockets: types, address families, options. 90 */ 91 92/* 93 * Data types. 94 */ 95 96#include <sys/_types/_gid_t.h> 97#include <sys/_types/_off_t.h> 98#include <sys/_types/_pid_t.h> 99#include <sys/_types/_sa_family_t.h> 100#include <sys/_types/_socklen_t.h> 101 102/* XXX Not explicitly defined by POSIX, but function return types are */ 103#include <sys/_types/_size_t.h> 104 105/* XXX Not explicitly defined by POSIX, but function return types are */ 106#include <sys/_types/_ssize_t.h> 107 108/* 109 * [XSI] The iovec structure shall be defined as described in <sys/uio.h>. 110 */ 111#include <sys/_types/_iovec_t.h> 112 113#ifdef PRIVATE 114#define SO_TCDBG_PID 0x01 /* Set/get traffic class for PID */ 115#define SO_TCDBG_PNAME 0x02 /* Set/get traffic class for processes of that name */ 116#define SO_TCDBG_PURGE 0x04 /* Purge entries for unused PIDs */ 117#define SO_TCDBG_FLUSH 0x08 /* Flush all entries */ 118#define SO_TCDBG_COUNT 0x10 /* Get count of entries */ 119#define SO_TCDBG_LIST 0x20 /* List entries */ 120#define SO_TCDBG_DELETE 0x40 /* Delete a process entry */ 121#define SO_TCDBG_TCFLUSH_PID 0x80 /* Flush traffic class for PID */ 122 123struct so_tcdbg { 124 u_int32_t so_tcdbg_cmd; 125 int32_t so_tcdbg_tclass; 126 u_int32_t so_tcdbg_count; 127 pid_t so_tcdbg_pid; 128 char so_tcdbg_pname[MAXCOMLEN + 1]; 129 int32_t so_tcdbg_opportunistic; /* -1: unspecified, 0: off, 1: on, other: errors */ 130}; 131#endif /* PRIVATE */ 132 133/* 134 * Types 135 */ 136#define SOCK_STREAM 1 /* stream socket */ 137#define SOCK_DGRAM 2 /* datagram socket */ 138#define SOCK_RAW 3 /* raw-protocol interface */ 139#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 140#define SOCK_RDM 4 /* reliably-delivered message */ 141#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 142#define SOCK_SEQPACKET 5 /* sequenced packet stream */ 143 144/* 145 * Option flags per-socket. 146 */ 147#define SO_DEBUG 0x0001 /* turn on debugging info recording */ 148#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ 149#define SO_REUSEADDR 0x0004 /* allow local address reuse */ 150#define SO_KEEPALIVE 0x0008 /* keep connections alive */ 151#define SO_DONTROUTE 0x0010 /* just use interface addresses */ 152#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */ 153#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 154#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ 155#define SO_LINGER 0x0080 /* linger on close if data present (in ticks) */ 156#else 157#define SO_LINGER 0x1080 /* linger on close if data present (in seconds) */ 158#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 159#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */ 160#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 161#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */ 162#define SO_TIMESTAMP 0x0400 /* timestamp received dgram traffic */ 163#define SO_TIMESTAMP_MONOTONIC 0x0800 /* Monotonically increasing timestamp on rcvd dgram */ 164#ifndef __APPLE__ 165#define SO_ACCEPTFILTER 0x1000 /* there is an accept filter */ 166#else 167#define SO_DONTTRUNC 0x2000 /* APPLE: Retain unread data */ 168 /* (ATOMIC proto) */ 169#define SO_WANTMORE 0x4000 /* APPLE: Give hint when more data ready */ 170#define SO_WANTOOBFLAG 0x8000 /* APPLE: Want OOB in MSG_FLAG on receive */ 171 172#ifdef PRIVATE 173#define SO_NOWAKEFROMSLEEP 0x10000 /* Don't wake for traffic to this socket */ 174#endif 175 176#endif /* (!__APPLE__) */ 177#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 178 179/* 180 * Additional options, not kept in so_options. 181 */ 182#define SO_SNDBUF 0x1001 /* send buffer size */ 183#define SO_RCVBUF 0x1002 /* receive buffer size */ 184#define SO_SNDLOWAT 0x1003 /* send low-water mark */ 185#define SO_RCVLOWAT 0x1004 /* receive low-water mark */ 186#define SO_SNDTIMEO 0x1005 /* send timeout */ 187#define SO_RCVTIMEO 0x1006 /* receive timeout */ 188#define SO_ERROR 0x1007 /* get error status and clear */ 189#define SO_TYPE 0x1008 /* get socket type */ 190#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 191/*efine SO_PRIVSTATE 0x1009 get/deny privileged state */ 192#define SO_LABEL 0x1010 /* socket's MAC label */ 193#define SO_PEERLABEL 0x1011 /* socket's peer MAC label */ 194#ifdef __APPLE__ 195#define SO_NREAD 0x1020 /* APPLE: get 1st-packet byte count */ 196#define SO_NKE 0x1021 /* APPLE: Install socket-level NKE */ 197#define SO_NOSIGPIPE 0x1022 /* APPLE: No SIGPIPE on EPIPE */ 198#define SO_NOADDRERR 0x1023 /* APPLE: Returns EADDRNOTAVAIL when src is not available anymore */ 199#define SO_NWRITE 0x1024 /* APPLE: Get number of bytes currently in send socket buffer */ 200#define SO_REUSESHAREUID 0x1025 /* APPLE: Allow reuse of port/socket by different userids */ 201#ifdef __APPLE_API_PRIVATE 202#define SO_NOTIFYCONFLICT 0x1026 /* APPLE: send notification if there is a bind on a port which is already in use */ 203#define SO_UPCALLCLOSEWAIT 0x1027 /* APPLE: block on close until an upcall returns */ 204#endif 205#define SO_LINGER_SEC 0x1080 /* linger on close if data present (in seconds) */ 206#ifdef PRIVATE 207#define SO_RESTRICTIONS 0x1081 /* APPLE: deny flag set */ 208#define SO_RESTRICT_DENY_IN 0x1 /* deny inbound (trapdoor) */ 209#define SO_RESTRICT_DENY_OUT 0x2 /* deny outbound (trapdoor) */ 210#define SO_RESTRICT_DENY_CELLULAR 0x4 /* deny use of cellular (trapdoor) */ 211#define SO_RESTRICT_DENY_EXPENSIVE 0x8 /* deny use of expensive if (trapdoor)*/ 212#endif /* PRIVATE */ 213#define SO_RANDOMPORT 0x1082 /* APPLE: request local port randomization */ 214#define SO_NP_EXTENSIONS 0x1083 /* To turn off some POSIX behavior */ 215#endif 216 217#ifdef PRIVATE 218#define SO_EXECPATH 0x1085 /* Application Firewall Socket option */ 219/* 220 * Traffic service class definitions (lowest to highest): 221 * 222 * SO_TC_BK_SYS 223 * "Background System-Initiated", high delay tolerant, high loss 224 * tolerant, elastic flow, variable size & long-lived. E.g: system- 225 * initiated iCloud synching or Time Capsule backup, for which there 226 * is no progress feedbacks. 227 * 228 * SO_TC_BK 229 * "Background", user-initiated, high delay tolerant, high loss tolerant, 230 * elastic flow, variable size. E.g. user-initiated iCloud synching or 231 * Time Capsule backup; or traffics of background applications, for which 232 * there is some progress feedbacks. 233 * 234 * SO_TC_BE 235 * "Best Effort", unclassified/standard. This is the default service 236 * class; pretty much a mix of everything. 237 * 238 * SO_TC_RD 239 * "Responsive Data", a notch higher than "Best Effort", medium delay 240 * tolerant, elastic & inelastic flow, bursty, long-lived. E.g. email, 241 * instant messaging, for which there is a sense of interactivity and 242 * urgency (user waiting for output). 243 * 244 * SO_TC_OAM 245 * "Operations, Administration, and Management", medium delay tolerant, 246 * low-medium loss tolerant, elastic & inelastic flows, variable size. 247 * E.g. VPN tunnels. 248 * 249 * SO_TC_AV 250 * "Multimedia Audio/Video Streaming", medium delay tolerant, low-medium 251 * loss tolerant, elastic flow, constant packet interval, variable rate & 252 * size. E.g. AirPlay playback (both video and audio). 253 * 254 * SO_TC_RV 255 * "Responsive Multimedia Audio/Video", low delay tolerant, low-medium 256 * loss tolerant, elastic flow, variable packet interval, rate and size. 257 * E.g. AirPlay mirroring, screen sharing. 258 * 259 * SO_TC_VI 260 * "Interactive Video", low delay tolerant, low-medium loss tolerant, 261 * elastic flow, constant packet interval, variable rate & size. E.g. 262 * FaceTime video. 263 * 264 * SO_TC_VO 265 * "Interactive Voice", low delay tolerant, low loss tolerant, inelastic 266 * flow, constant packet rate, somewhat fixed size. E.g. VoIP including 267 * FaceTime audio. 268 * 269 * SO_TC_CTL 270 * "Network Control", low delay tolerant, low loss tolerant, inelastic 271 * flow, rate is bursty but short, variable size. E.g. DNS queries; 272 * certain types of locally-originated ICMP, ICMPv6; IGMP/MLD join/leave, 273 * ARP. 274 */ 275#define SO_TRAFFIC_CLASS 0x1086 /* Traffic service class (int) */ 276#define SO_TC_BK_SYS 100 /* lowest class */ 277#define SO_TC_BK 200 278#define SO_TC_BE 0 279#define SO_TC_RD 300 280#define SO_TC_OAM 400 281#define SO_TC_AV 500 282#define SO_TC_RV 600 283#define SO_TC_VI 700 284#define SO_TC_VO 800 285#define SO_TC_CTL 900 /* highest class */ 286#define SO_TC_MAX 10 /* Total # of traffic classes */ 287#ifdef XNU_KERNEL_PRIVATE 288#define _SO_TC_BK 1 /* deprecated */ 289#define _SO_TC_VI 2 /* deprecated */ 290#define _SO_TC_VO 3 /* deprecated */ 291#define _SO_TC_MAX 4 /* deprecated */ 292 293#define SO_VALID_TC(c) \ 294 (c == SO_TC_BK_SYS || c == SO_TC_BK || c == SO_TC_BE || \ 295 c == SO_TC_RD || c == SO_TC_OAM || c == SO_TC_AV || \ 296 c == SO_TC_RV || c == SO_TC_VI || c == SO_TC_VO || c == SO_TC_CTL) 297#endif /* XNU_KERNEL_PRIVATE */ 298 299/* Background socket configuration flags */ 300#define TRAFFIC_MGT_SO_BACKGROUND 0x0001 /* background socket */ 301#define TRAFFIC_MGT_TCP_RECVBG 0x0002 /* Only TCP sockets, receiver throttling */ 302 303#define SO_RECV_TRAFFIC_CLASS 0x1087 /* Receive traffic class (bool)*/ 304#define SO_TRAFFIC_CLASS_DBG 0x1088 /* Debug traffic class (struct so_tcdbg) */ 305#define SO_TRAFFIC_CLASS_STATS 0x1089 /* Traffic class statistics */ 306#define SO_PRIVILEGED_TRAFFIC_CLASS 0x1090 /* Privileged traffic class (bool) */ 307#define SO_DEFUNCTOK 0x1100 /* can be defunct'd */ 308#define SO_ISDEFUNCT 0x1101 /* get defunct status */ 309 310#define SO_OPPORTUNISTIC 0x1102 /* deprecated; use SO_TRAFFIC_CLASS */ 311 312/* 313 * SO_FLUSH flushes any unsent data generated by a given socket. It takes 314 * an integer parameter, which can be any of the SO_TC traffic class values, 315 * or the special SO_TC_ALL value. 316 */ 317#define SO_FLUSH 0x1103 /* flush unsent data (int) */ 318#define SO_TC_ALL (-1) 319 320#define SO_RECV_ANYIF 0x1104 /* unrestricted inbound processing */ 321#define SO_TRAFFIC_MGT_BACKGROUND 0x1105 /* Background traffic management */ 322 323#define SO_FLOW_DIVERT_TOKEN 0x1106 /* flow divert token */ 324 325#define SO_DELEGATED 0x1107 /* set socket as delegate (pid_t) */ 326#define SO_DELEGATED_UUID 0x1108 /* set socket as delegate (uuid_t) */ 327#define SO_NECP_ATTRIBUTES 0x1109 /* NECP socket attributes (domain, account, etc.) */ 328#define SO_CFIL_SOCK_ID 0x1110 /* get content filter socket ID (cfil_sock_id_t) */ 329#if MPTCP 330#define SO_MPTCP_FASTJOIN 0x1111 /* fast join MPTCP */ 331#endif /* MPTCP */ 332 333#define SO_AWDL_UNRESTRICTED 0x1113 /* try to use AWDL in restricted mode */ 334#endif /* PRIVATE */ 335 336#define SO_NUMRCVPKT 0x1112 /* number of datagrams in receive socket buffer */ 337 338#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 339 340/* 341 * Structure used for manipulating linger option. 342 */ 343struct linger { 344 int l_onoff; /* option on/off */ 345 int l_linger; /* linger time */ 346}; 347 348#ifndef __APPLE__ 349struct accept_filter_arg { 350 char af_name[16]; 351 char af_arg[256-16]; 352}; 353#endif 354 355#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 356#ifdef __APPLE__ 357 358/* 359 * Structure to control non-portable Sockets extension to POSIX 360 */ 361struct so_np_extensions { 362 u_int32_t npx_flags; 363 u_int32_t npx_mask; 364}; 365 366#define SONPX_SETOPTSHUT 0x000000001 /* flag for allowing setsockopt after shutdown */ 367 368 369#ifdef KERNEL_PRIVATE 370#define SONPX_MASK_VALID (SONPX_SETOPTSHUT) 371#define IS_SO_TC_BACKGROUND(_tc_) ((_tc_) == SO_TC_BK || (_tc_) == SO_TC_BK_SYS) 372#endif /* KERNEL_PRIVATE */ 373 374#endif 375#endif 376 377/* 378 * Level number for (get/set)sockopt() to apply to socket itself. 379 */ 380#define SOL_SOCKET 0xffff /* options for socket level */ 381 382 383/* 384 * Address families. 385 */ 386#define AF_UNSPEC 0 /* unspecified */ 387#define AF_UNIX 1 /* local to host (pipes) */ 388#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 389#define AF_LOCAL AF_UNIX /* backward compatibility */ 390#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 391#define AF_INET 2 /* internetwork: UDP, TCP, etc. */ 392#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 393#define AF_IMPLINK 3 /* arpanet imp addresses */ 394#define AF_PUP 4 /* pup protocols: e.g. BSP */ 395#define AF_CHAOS 5 /* mit CHAOS protocols */ 396#define AF_NS 6 /* XEROX NS protocols */ 397#define AF_ISO 7 /* ISO protocols */ 398#define AF_OSI AF_ISO 399#define AF_ECMA 8 /* European computer manufacturers */ 400#define AF_DATAKIT 9 /* datakit protocols */ 401#define AF_CCITT 10 /* CCITT protocols, X.25 etc */ 402#define AF_SNA 11 /* IBM SNA */ 403#define AF_DECnet 12 /* DECnet */ 404#define AF_DLI 13 /* DEC Direct data link interface */ 405#define AF_LAT 14 /* LAT */ 406#define AF_HYLINK 15 /* NSC Hyperchannel */ 407#define AF_APPLETALK 16 /* Apple Talk */ 408#define AF_ROUTE 17 /* Internal Routing Protocol */ 409#define AF_LINK 18 /* Link layer interface */ 410#define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */ 411#define AF_COIP 20 /* connection-oriented IP, aka ST II */ 412#define AF_CNT 21 /* Computer Network Technology */ 413#define pseudo_AF_RTIP 22 /* Help Identify RTIP packets */ 414#define AF_IPX 23 /* Novell Internet Protocol */ 415#define AF_SIP 24 /* Simple Internet Protocol */ 416#define pseudo_AF_PIP 25 /* Help Identify PIP packets */ 417/*define pseudo_AF_BLUE 26 Identify packets for Blue Box - Not used */ 418#define AF_NDRV 27 /* Network Driver 'raw' access */ 419#define AF_ISDN 28 /* Integrated Services Digital Network*/ 420#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */ 421#define pseudo_AF_KEY 29 /* Internal key-management function */ 422#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 423#define AF_INET6 30 /* IPv6 */ 424#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 425#define AF_NATM 31 /* native ATM access */ 426#define AF_SYSTEM 32 /* Kernel event messages */ 427#define AF_NETBIOS 33 /* NetBIOS */ 428#define AF_PPP 34 /* PPP communication protocol */ 429#define pseudo_AF_HDRCMPLT 35 /* Used by BPF to not rewrite headers 430 * in interface output routine */ 431#ifdef PRIVATE 432#define AF_AFP 36 /* Used by AFP */ 433#else 434#define AF_RESERVED_36 36 /* Reserved for internal usage */ 435#endif 436#define AF_IEEE80211 37 /* IEEE 802.11 protocol */ 437#define AF_UTUN 38 438#ifdef PRIVATE 439#define AF_MULTIPATH 39 440#endif /* PRIVATE */ 441#define AF_MAX 40 442#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 443 444/* 445 * [XSI] Structure used by kernel to store most addresses. 446 */ 447struct sockaddr { 448 __uint8_t sa_len; /* total length */ 449 sa_family_t sa_family; /* [XSI] address family */ 450 char sa_data[14]; /* [XSI] addr value (actually larger) */ 451}; 452 453#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 454#define SOCK_MAXADDRLEN 255 /* longest possible addresses */ 455 456/* 457 * Structure used by kernel to pass protocol 458 * information in raw sockets. 459 */ 460struct sockproto { 461 __uint16_t sp_family; /* address family */ 462 __uint16_t sp_protocol; /* protocol */ 463}; 464#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE)*/ 465 466/* 467 * RFC 2553: protocol-independent placeholder for socket addresses 468 */ 469#define _SS_MAXSIZE 128 470#define _SS_ALIGNSIZE (sizeof(__int64_t)) 471#define _SS_PAD1SIZE \ 472 (_SS_ALIGNSIZE - sizeof(__uint8_t) - sizeof(sa_family_t)) 473#define _SS_PAD2SIZE \ 474 (_SS_MAXSIZE - sizeof(__uint8_t) - sizeof(sa_family_t) - \ 475 _SS_PAD1SIZE - _SS_ALIGNSIZE) 476 477/* 478 * [XSI] sockaddr_storage 479 */ 480struct sockaddr_storage { 481 __uint8_t ss_len; /* address length */ 482 sa_family_t ss_family; /* [XSI] address family */ 483 char __ss_pad1[_SS_PAD1SIZE]; 484 __int64_t __ss_align; /* force structure storage alignment */ 485 char __ss_pad2[_SS_PAD2SIZE]; 486}; 487 488#ifdef BSD_KERNEL_PRIVATE 489#include <sys/queue.h> 490 491struct sockaddr_entry { 492 TAILQ_ENTRY(sockaddr_entry) se_link; 493 struct sockaddr *se_addr; 494 uint32_t se_flags; 495}; 496 497#define SEF_ATTACHED 1 /* attached to sockaddr_list */ 498 499struct sockaddr_list { 500 TAILQ_HEAD(, sockaddr_entry) sl_head; 501 uint32_t sl_cnt; 502 503}; 504#endif /* BSD_KERNEL_PRIVATE */ 505 506/* 507 * Protocol families, same as address families for now. 508 */ 509#define PF_UNSPEC AF_UNSPEC 510#define PF_LOCAL AF_LOCAL 511#define PF_UNIX PF_LOCAL /* backward compatibility */ 512#define PF_INET AF_INET 513#define PF_IMPLINK AF_IMPLINK 514#define PF_PUP AF_PUP 515#define PF_CHAOS AF_CHAOS 516#define PF_NS AF_NS 517#define PF_ISO AF_ISO 518#define PF_OSI AF_ISO 519#define PF_ECMA AF_ECMA 520#define PF_DATAKIT AF_DATAKIT 521#define PF_CCITT AF_CCITT 522#define PF_SNA AF_SNA 523#define PF_DECnet AF_DECnet 524#define PF_DLI AF_DLI 525#define PF_LAT AF_LAT 526#define PF_HYLINK AF_HYLINK 527#define PF_APPLETALK AF_APPLETALK 528#define PF_ROUTE AF_ROUTE 529#define PF_LINK AF_LINK 530#define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */ 531#define PF_COIP AF_COIP 532#define PF_CNT AF_CNT 533#define PF_SIP AF_SIP 534#define PF_IPX AF_IPX /* same format as AF_NS */ 535#define PF_RTIP pseudo_AF_RTIP /* same format as AF_INET */ 536#define PF_PIP pseudo_AF_PIP 537#define PF_NDRV AF_NDRV 538#define PF_ISDN AF_ISDN 539#define PF_KEY pseudo_AF_KEY 540#define PF_INET6 AF_INET6 541#define PF_NATM AF_NATM 542#define PF_SYSTEM AF_SYSTEM 543#define PF_NETBIOS AF_NETBIOS 544#define PF_PPP AF_PPP 545#ifdef PRIVATE 546#define PF_AFP AF_AFP 547#else 548#define PF_RESERVED_36 AF_RESERVED_36 549#endif 550#define PF_UTUN AF_UTUN 551#ifdef PRIVATE 552#define PF_MULTIPATH AF_MULTIPATH 553#endif /* PRIVATE */ 554#define PF_MAX AF_MAX 555 556/* 557 * These do not have socket-layer support: 558 */ 559#define PF_VLAN ((uint32_t)0x766c616e) /* 'vlan' */ 560#define PF_BOND ((uint32_t)0x626f6e64) /* 'bond' */ 561#ifdef KERNEL_PRIVATE 562#define PF_BRIDGE ((uint32_t)0x62726467) /* 'brdg' */ 563#endif /* KERNEL_PRIVATE */ 564 565/* 566 * Definitions for network related sysctl, CTL_NET. 567 * 568 * Second level is protocol family. 569 * Third level is protocol number. 570 * 571 * Further levels are defined by the individual families below. 572 */ 573#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 574#define NET_MAXID AF_MAX 575#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 576 577#ifdef KERNEL_PRIVATE 578#define CTL_NET_NAMES { \ 579 { 0, 0 }, \ 580 { "local", CTLTYPE_NODE }, \ 581 { "inet", CTLTYPE_NODE }, \ 582 { "implink", CTLTYPE_NODE }, \ 583 { "pup", CTLTYPE_NODE }, \ 584 { "chaos", CTLTYPE_NODE }, \ 585 { "xerox_ns", CTLTYPE_NODE }, \ 586 { "iso", CTLTYPE_NODE }, \ 587 { "emca", CTLTYPE_NODE }, \ 588 { "datakit", CTLTYPE_NODE }, \ 589 { "ccitt", CTLTYPE_NODE }, \ 590 { "ibm_sna", CTLTYPE_NODE }, \ 591 { "decnet", CTLTYPE_NODE }, \ 592 { "dec_dli", CTLTYPE_NODE }, \ 593 { "lat", CTLTYPE_NODE }, \ 594 { "hylink", CTLTYPE_NODE }, \ 595 { "appletalk", CTLTYPE_NODE }, \ 596 { "route", CTLTYPE_NODE }, \ 597 { "link_layer", CTLTYPE_NODE }, \ 598 { "xtp", CTLTYPE_NODE }, \ 599 { "coip", CTLTYPE_NODE }, \ 600 { "cnt", CTLTYPE_NODE }, \ 601 { "rtip", CTLTYPE_NODE }, \ 602 { "ipx", CTLTYPE_NODE }, \ 603 { "sip", CTLTYPE_NODE }, \ 604 { "pip", CTLTYPE_NODE }, \ 605 { 0, 0 }, \ 606 { "ndrv", CTLTYPE_NODE }, \ 607 { "isdn", CTLTYPE_NODE }, \ 608 { "key", CTLTYPE_NODE }, \ 609 { "inet6", CTLTYPE_NODE }, \ 610 { "natm", CTLTYPE_NODE }, \ 611 { "sys", CTLTYPE_NODE }, \ 612 { "netbios", CTLTYPE_NODE }, \ 613 { "ppp", CTLTYPE_NODE }, \ 614 { "hdrcomplete", CTLTYPE_NODE }, \ 615} 616#endif /* KERNEL_PRIVATE */ 617 618#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 619/* 620 * PF_ROUTE - Routing table 621 * 622 * Three additional levels are defined: 623 * Fourth: address family, 0 is wildcard 624 * Fifth: type of info, defined below 625 * Sixth: flag(s) to mask with for NET_RT_FLAGS 626 */ 627#define NET_RT_DUMP 1 /* dump; may limit to a.f. */ 628#define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */ 629#define NET_RT_IFLIST 3 /* survey interface list */ 630#define NET_RT_STAT 4 /* routing statistics */ 631#define NET_RT_TRASH 5 /* routes not in table but not freed */ 632#define NET_RT_IFLIST2 6 /* interface list with addresses */ 633#define NET_RT_DUMP2 7 /* dump; may limit to a.f. */ 634#ifdef PRIVATE 635#define NET_RT_DUMPX 8 /* private */ 636#define NET_RT_DUMPX_FLAGS 9 /* private */ 637#endif /* PRIVATE */ 638#define NET_RT_MAXID 10 639#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 640 641#ifdef KERNEL_PRIVATE 642#define CTL_NET_RT_NAMES { \ 643 { 0, 0 }, \ 644 { "dump", CTLTYPE_STRUCT }, \ 645 { "flags", CTLTYPE_STRUCT }, \ 646 { "iflist", CTLTYPE_STRUCT }, \ 647 { "stat", CTLTYPE_STRUCT }, \ 648 { "trash", CTLTYPE_INT }, \ 649 { "iflist2", CTLTYPE_STRUCT }, \ 650 { "dump2", CTLTYPE_STRUCT }, \ 651 { "dumpx", CTLTYPE_STRUCT }, \ 652 { "dumpx_flags", CTLTYPE_STRUCT }, \ 653} 654 655#endif /* KERNEL_PRIVATE */ 656 657/* 658 * Maximum queue length specifiable by listen. 659 */ 660#define SOMAXCONN 128 661 662/* 663 * [XSI] Message header for recvmsg and sendmsg calls. 664 * Used value-result for recvmsg, value only for sendmsg. 665 */ 666struct msghdr { 667 void *msg_name; /* [XSI] optional address */ 668 socklen_t msg_namelen; /* [XSI] size of address */ 669 struct iovec *msg_iov; /* [XSI] scatter/gather array */ 670 int msg_iovlen; /* [XSI] # elements in msg_iov */ 671 void *msg_control; /* [XSI] ancillary data, see below */ 672 socklen_t msg_controllen; /* [XSI] ancillary data buffer len */ 673 int msg_flags; /* [XSI] flags on received message */ 674}; 675 676#ifdef PRIVATE 677/* 678 * Extended version for sendmsg_x() and recvmsg_x() calls 679 * 680 * For recvmsg_x(), the size of the data received is given by the field 681 * msg_datalen. 682 * 683 * For sendmsg_x(), the size of the data to send is given by the length of 684 * the iovec array -- like sendmsg(). The field msg_datalen is ignored. 685 */ 686struct msghdr_x { 687 void *msg_name; /* optional address */ 688 socklen_t msg_namelen; /* size of address */ 689 struct iovec *msg_iov; /* scatter/gather array */ 690 int msg_iovlen; /* # elements in msg_iov */ 691 void *msg_control; /* ancillary data, see below */ 692 socklen_t msg_controllen; /* ancillary data buffer len */ 693 int msg_flags; /* flags on received message */ 694 size_t msg_datalen; /* byte length of buffer in msg_iov */ 695}; 696#endif /* PRIVATE */ 697 698#ifdef XNU_KERNEL_PRIVATE 699/* 700 * In-kernel representation of "struct msghdr" from 701 * userspace. Has enough precision for 32-bit or 702 * 64-bit clients, but does not need to be packed. 703 */ 704 705struct user_msghdr { 706 user_addr_t msg_name; /* optional address */ 707 socklen_t msg_namelen; /* size of address */ 708 user_addr_t msg_iov; /* scatter/gather array */ 709 int msg_iovlen; /* # elements in msg_iov */ 710 user_addr_t msg_control; /* ancillary data, see below */ 711 socklen_t msg_controllen; /* ancillary data buffer len */ 712 int msg_flags; /* flags on received message */ 713}; 714 715/* 716 * LP64 user version of struct msghdr. 717 * WARNING - keep in sync with struct msghdr 718 */ 719 720struct user64_msghdr { 721 user64_addr_t msg_name; /* optional address */ 722 socklen_t msg_namelen; /* size of address */ 723 user64_addr_t msg_iov; /* scatter/gather array */ 724 int msg_iovlen; /* # elements in msg_iov */ 725 user64_addr_t msg_control; /* ancillary data, see below */ 726 socklen_t msg_controllen; /* ancillary data buffer len */ 727 int msg_flags; /* flags on received message */ 728}; 729 730/* 731 * ILP32 user version of struct msghdr. 732 * WARNING - keep in sync with struct msghdr 733 */ 734 735struct user32_msghdr { 736 user32_addr_t msg_name; /* optional address */ 737 socklen_t msg_namelen; /* size of address */ 738 user32_addr_t msg_iov; /* scatter/gather array */ 739 int msg_iovlen; /* # elements in msg_iov */ 740 user32_addr_t msg_control; /* ancillary data, see below */ 741 socklen_t msg_controllen; /* ancillary data buffer len */ 742 int msg_flags; /* flags on received message */ 743}; 744 745/* 746 * In-kernel representation of "struct msghdr_x" from 747 * userspace. Has enough precision for 32-bit or 748 * 64-bit clients, but does not need to be packed. 749 */ 750 751struct user_msghdr_x { 752 user_addr_t msg_name; /* optional address */ 753 socklen_t msg_namelen; /* size of address */ 754 user_addr_t msg_iov; /* scatter/gather array */ 755 int msg_iovlen; /* # elements in msg_iov */ 756 user_addr_t msg_control; /* ancillary data, see below */ 757 socklen_t msg_controllen; /* ancillary data buffer len */ 758 int msg_flags; /* flags on received message */ 759 size_t msg_datalen; /* byte length of buffer in msg_iov */ 760}; 761 762/* 763 * LP64 user version of struct msghdr_x 764 * WARNING - keep in sync with struct msghdr_x 765 */ 766 767struct user64_msghdr_x { 768 user64_addr_t msg_name; /* optional address */ 769 socklen_t msg_namelen; /* size of address */ 770 user64_addr_t msg_iov; /* scatter/gather array */ 771 int msg_iovlen; /* # elements in msg_iov */ 772 user64_addr_t msg_control; /* ancillary data, see below */ 773 socklen_t msg_controllen; /* ancillary data buffer len */ 774 int msg_flags; /* flags on received message */ 775 user64_size_t msg_datalen; /* byte length of buffer in msg_iov */ 776}; 777 778/* 779 * ILP32 user version of struct msghdr_x 780 * WARNING - keep in sync with struct msghdr_x 781 */ 782 783struct user32_msghdr_x { 784 user32_addr_t msg_name; /* optional address */ 785 socklen_t msg_namelen; /* size of address */ 786 user32_addr_t msg_iov; /* scatter/gather array */ 787 int msg_iovlen; /* # elements in msg_iov */ 788 user32_addr_t msg_control; /* ancillary data, see below */ 789 socklen_t msg_controllen; /* ancillary data buffer len */ 790 int msg_flags; /* flags on received message */ 791 user32_size_t msg_datalen; /* byte length of buffer in msg_iov */ 792}; 793 794#endif /* XNU_KERNEL_PRIVATE */ 795 796#define MSG_OOB 0x1 /* process out-of-band data */ 797#define MSG_PEEK 0x2 /* peek at incoming message */ 798#define MSG_DONTROUTE 0x4 /* send without using routing tables */ 799#define MSG_EOR 0x8 /* data completes record */ 800#define MSG_TRUNC 0x10 /* data discarded before delivery */ 801#define MSG_CTRUNC 0x20 /* control data lost before delivery */ 802#define MSG_WAITALL 0x40 /* wait for full request or error */ 803#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 804#define MSG_DONTWAIT 0x80 /* this message should be nonblocking */ 805#define MSG_EOF 0x100 /* data completes connection */ 806#ifdef __APPLE__ 807#ifndef PRIVATE 808#ifdef __APPLE_API_OBSOLETE 809#define MSG_WAITSTREAM 0x200 /* wait up to full request.. may return partial */ 810#endif 811#else 812#define MSG_WAITSTREAM 0x200 /* wait up to full request.. may return partial */ 813#endif 814#define MSG_FLUSH 0x400 /* Start of 'hold' seq; dump so_temp */ 815#define MSG_HOLD 0x800 /* Hold frag in so_temp */ 816#define MSG_SEND 0x1000 /* Send the packet in so_temp */ 817#define MSG_HAVEMORE 0x2000 /* Data ready to be read */ 818#define MSG_RCVMORE 0x4000 /* Data remains in current pkt */ 819#endif 820#ifdef KERNEL_PRIVATE 821#define MSG_COMPAT 0x8000 /* deprecated */ 822#endif /* KERNEL_PRIVATE */ 823#define MSG_NEEDSA 0x10000 /* Fail receive if socket address cannot be allocated */ 824#ifdef KERNEL_PRIVATE 825#define MSG_NBIO 0x20000 /* FIONBIO mode, used by fifofs */ 826#define MSG_SKIPCFIL 0x40000 /* skip pass content filter */ 827#endif 828#ifdef KERNEL 829#define MSG_USEUPCALL 0x80000000 /* Inherit upcall in sock_accept */ 830#endif 831#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 832 833/* 834 * Header for ancillary data objects in msg_control buffer. 835 * Used for additional information with/about a datagram 836 * not expressible by flags. The format is a sequence 837 * of message elements headed by cmsghdr structures. 838 */ 839struct cmsghdr { 840 socklen_t cmsg_len; /* [XSI] data byte count, including hdr */ 841 int cmsg_level; /* [XSI] originating protocol */ 842 int cmsg_type; /* [XSI] protocol-specific type */ 843/* followed by unsigned char cmsg_data[]; */ 844}; 845 846#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 847#ifndef __APPLE__ 848/* 849 * While we may have more groups than this, the cmsgcred struct must 850 * be able to fit in an mbuf, and NGROUPS_MAX is too large to allow 851 * this. 852*/ 853#define CMGROUP_MAX 16 854 855/* 856 * Credentials structure, used to verify the identity of a peer 857 * process that has sent us a message. This is allocated by the 858 * peer process but filled in by the kernel. This prevents the 859 * peer from lying about its identity. (Note that cmcred_groups[0] 860 * is the effective GID.) 861 */ 862struct cmsgcred { 863 pid_t cmcred_pid; /* PID of sending process */ 864 uid_t cmcred_uid; /* real UID of sending process */ 865 uid_t cmcred_euid; /* effective UID of sending process */ 866 gid_t cmcred_gid; /* real GID of sending process */ 867 short cmcred_ngroups; /* number or groups */ 868 gid_t cmcred_groups[CMGROUP_MAX]; /* groups */ 869}; 870#endif 871#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 872 873/* given pointer to struct cmsghdr, return pointer to data */ 874#define CMSG_DATA(cmsg) ((unsigned char *)(cmsg) + \ 875 __DARWIN_ALIGN32(sizeof(struct cmsghdr))) 876 877/* 878 * RFC 2292 requires to check msg_controllen, in case that the kernel returns 879 * an empty list for some reasons. 880 */ 881#define CMSG_FIRSTHDR(mhdr) \ 882 ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \ 883 (struct cmsghdr *)(mhdr)->msg_control : \ 884 (struct cmsghdr *)0L) 885 886 887/* 888 * Given pointer to struct cmsghdr, return pointer to next cmsghdr 889 * RFC 2292 says that CMSG_NXTHDR(mhdr, NULL) is equivalent to CMSG_FIRSTHDR(mhdr) 890 */ 891#define CMSG_NXTHDR(mhdr, cmsg) \ 892 ((char *)(cmsg) == (char *)0L ? CMSG_FIRSTHDR(mhdr) : \ 893 ((((unsigned char *)(cmsg) + \ 894 __DARWIN_ALIGN32((__uint32_t)(cmsg)->cmsg_len) + \ 895 __DARWIN_ALIGN32(sizeof(struct cmsghdr))) > \ 896 ((unsigned char *)(mhdr)->msg_control + \ 897 (mhdr)->msg_controllen)) ? \ 898 (struct cmsghdr *)0L /* NULL */ : \ 899 (struct cmsghdr *)(void *)((unsigned char *)(cmsg) + \ 900 __DARWIN_ALIGN32((__uint32_t)(cmsg)->cmsg_len)))) 901 902#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 903/* RFC 2292 additions */ 904#define CMSG_SPACE(l) (__DARWIN_ALIGN32(sizeof(struct cmsghdr)) + __DARWIN_ALIGN32(l)) 905#define CMSG_LEN(l) (__DARWIN_ALIGN32(sizeof(struct cmsghdr)) + (l)) 906 907#ifdef KERNEL 908#define CMSG_ALIGN(n) __DARWIN_ALIGN32(n) 909#endif 910#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 911 912/* "Socket"-level control message types: */ 913#define SCM_RIGHTS 0x01 /* access rights (array of int) */ 914#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 915#define SCM_TIMESTAMP 0x02 /* timestamp (struct timeval) */ 916#define SCM_CREDS 0x03 /* process creds (struct cmsgcred) */ 917#define SCM_TIMESTAMP_MONOTONIC 0x04 /* timestamp (uint64_t) */ 918 919#ifdef PRIVATE 920#define SCM_SEQNUM 0x05 /* TCP unordered recv seq no */ 921#define SCM_MSG_PRIORITY 0x06 /* TCP unordered snd priority */ 922#endif /* PRIVATE */ 923 924#ifdef KERNEL_PRIVATE 925/* 926 * 4.3 compat sockaddr (deprecated) 927 */ 928struct osockaddr { 929 __uint16_t sa_family; /* address family */ 930 char sa_data[14]; /* up to 14 bytes of direct address */ 931}; 932 933/* 934 * 4.3-compat message header (deprecated) 935 */ 936struct omsghdr { 937 void *msg_name; /* optional address */ 938 socklen_t msg_namelen; /* size of address */ 939 struct iovec *msg_iov; /* scatter/gather array */ 940 int msg_iovlen; /* # elements in msg_iov */ 941 void *msg_accrights; /* access rights sent/rcvd */ 942 int msg_accrightslen; 943}; 944 945#define SA(s) ((struct sockaddr *)(void *)(s)) 946#endif /* KERNEL_PRIVATE */ 947#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 948 949/* 950 * howto arguments for shutdown(2), specified by Posix.1g. 951 */ 952#define SHUT_RD 0 /* shut down the reading side */ 953#define SHUT_WR 1 /* shut down the writing side */ 954#define SHUT_RDWR 2 /* shut down both sides */ 955 956#if !defined(_POSIX_C_SOURCE) 957/* 958 * sendfile(2) header/trailer struct 959 */ 960struct sf_hdtr { 961 struct iovec *headers; /* pointer to an array of header struct iovec's */ 962 int hdr_cnt; /* number of header iovec's */ 963 struct iovec *trailers; /* pointer to an array of trailer struct iovec's */ 964 int trl_cnt; /* number of trailer iovec's */ 965}; 966 967#ifdef KERNEL 968 969/* In-kernel representation */ 970struct user_sf_hdtr { 971 user_addr_t headers; /* pointer to an array of header struct iovec's */ 972 int hdr_cnt; /* number of header iovec's */ 973 user_addr_t trailers; /* pointer to an array of trailer struct iovec's */ 974 int trl_cnt; /* number of trailer iovec's */ 975}; 976 977/* LP64 user version of struct sf_hdtr */ 978struct user64_sf_hdtr { 979 user64_addr_t headers; /* pointer to an array of header struct iovec's */ 980 int hdr_cnt; /* number of header iovec's */ 981 user64_addr_t trailers; /* pointer to an array of trailer struct iovec's */ 982 int trl_cnt; /* number of trailer iovec's */ 983}; 984 985/* ILP32 user version of struct sf_hdtr */ 986struct user32_sf_hdtr { 987 user32_addr_t headers; /* pointer to an array of header struct iovec's */ 988 int hdr_cnt; /* number of header iovec's */ 989 user32_addr_t trailers; /* pointer to an array of trailer struct iovec's */ 990 int trl_cnt; /* number of trailer iovec's */ 991}; 992 993#endif /* KERNEL */ 994 995#endif /* !_POSIX_C_SOURCE */ 996 997#ifdef PRIVATE 998#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 999typedef __uint32_t associd_t; 1000#define ASSOCID_ANY 0 1001#define ASSOCID_ALL ((associd_t)(-1ULL)) 1002 1003typedef __uint32_t connid_t; 1004#define CONNID_ANY 0 1005#define CONNID_ALL ((connid_t)(-1ULL)) 1006 1007/* 1008 * Structure for SIOCGASSOCIDS 1009 */ 1010struct so_aidreq { 1011 __uint32_t sar_cnt; /* number of associations */ 1012 associd_t *sar_aidp; /* array of association IDs */ 1013}; 1014 1015#ifdef BSD_KERNEL_PRIVATE 1016struct so_aidreq32 { 1017 __uint32_t sar_cnt; 1018 user32_addr_t sar_aidp; 1019}; 1020 1021struct so_aidreq64 { 1022 __uint32_t sar_cnt; 1023 user64_addr_t sar_aidp __attribute__((aligned(8))); 1024}; 1025#endif /* BSD_KERNEL_PRIVATE */ 1026 1027/* 1028 * Structure for SIOCGCONNIDS 1029 */ 1030struct so_cidreq { 1031 associd_t scr_aid; /* association ID */ 1032 __uint32_t scr_cnt; /* number of connections */ 1033 connid_t *scr_cidp; /* array of connection IDs */ 1034}; 1035 1036#ifdef BSD_KERNEL_PRIVATE 1037struct so_cidreq32 { 1038 associd_t scr_aid; 1039 __uint32_t scr_cnt; 1040 user32_addr_t scr_cidp; 1041}; 1042 1043struct so_cidreq64 { 1044 associd_t scr_aid; 1045 __uint32_t scr_cnt; 1046 user64_addr_t scr_cidp __attribute__((aligned(8))); 1047}; 1048#endif /* BSD_KERNEL_PRIVATE */ 1049 1050/* 1051 * Structure for SIOCGCONNINFO 1052 */ 1053struct so_cinforeq { 1054 connid_t scir_cid; /* connection ID */ 1055 __uint32_t scir_flags; /* see flags below */ 1056 __uint32_t scir_ifindex; /* (last) outbound interface */ 1057 __int32_t scir_error; /* most recent error */ 1058 struct sockaddr *scir_src; /* source address */ 1059 socklen_t scir_src_len; /* source address len */ 1060 struct sockaddr *scir_dst; /* destination address */ 1061 socklen_t scir_dst_len; /* destination address len */ 1062 __uint32_t scir_aux_type; /* aux data type (CIAUX) */ 1063 void *scir_aux_data; /* aux data */ 1064 __uint32_t scir_aux_len; /* aux data len */ 1065}; 1066 1067#ifdef BSD_KERNEL_PRIVATE 1068struct so_cinforeq32 { 1069 connid_t scir_cid; 1070 __uint32_t scir_flags; 1071 __uint32_t scir_ifindex; 1072 __int32_t scir_error; 1073 user32_addr_t scir_src; 1074 socklen_t scir_src_len; 1075 user32_addr_t scir_dst; 1076 socklen_t scir_dst_len; 1077 __uint32_t scir_aux_type; 1078 user32_addr_t scir_aux_data; 1079 __uint32_t scir_aux_len; 1080}; 1081 1082struct so_cinforeq64 { 1083 connid_t scir_cid; 1084 __uint32_t scir_flags; 1085 __uint32_t scir_ifindex; 1086 __int32_t scir_error; 1087 user64_addr_t scir_src __attribute__((aligned(8))); 1088 socklen_t scir_src_len; 1089 user64_addr_t scir_dst __attribute__((aligned(8))); 1090 socklen_t scir_dst_len; 1091 __uint32_t scir_aux_type; 1092 user64_addr_t scir_aux_data __attribute__((aligned(8))); 1093 __uint32_t scir_aux_len; 1094}; 1095#endif /* BSD_KERNEL_PRIVATE */ 1096 1097/* valid connection info flags */ 1098#define CIF_CONNECTING 0x1 /* connection was attempted */ 1099#define CIF_CONNECTED 0x2 /* connection is established */ 1100#define CIF_DISCONNECTING 0x4 /* disconnection was attempted */ 1101#define CIF_DISCONNECTED 0x8 /* has been disconnected */ 1102#define CIF_BOUND_IF 0x10 /* bound to an interface */ 1103#define CIF_BOUND_IP 0x20 /* bound to a src address */ 1104#define CIF_BOUND_PORT 0x40 /* bound to a src port */ 1105#define CIF_PREFERRED 0x80 /* connection is primary/preferred */ 1106#define CIF_MP_CAPABLE 0x100 /* supports multipath protocol */ 1107#define CIF_MP_READY 0x200 /* multipath protocol confirmed */ 1108#define CIF_MP_DEGRADED 0x400 /* has lost its multipath capability */ 1109#define CIF_MP_ACTIVE 0x800 /* this is the active subflow */ 1110 1111/* valid connection info auxiliary data types */ 1112#define CIAUX_TCP 0x1 /* TCP auxiliary data (conninfo_tcp_t) */ 1113 1114/* 1115 * Structure for SIOC{S,G}CONNORDER 1116 */ 1117struct so_cordreq { 1118 connid_t sco_cid; /* connection ID */ 1119 __uint32_t sco_rank; /* rank (0 means unspecified) */ 1120}; 1121 1122/* 1123 * Network policy subclass (of KEV_NETWORK_CLASS) 1124 */ 1125#define KEV_NETPOLICY_SUBCLASS 3 1126 1127#define KEV_NETPOLICY_IFDENIED 1 /* denied access to interface */ 1128 1129/* 1130 * Common structure for KEV_NETPOLICY_SUBCLASS 1131 */ 1132struct netpolicy_event_data { 1133 __uint64_t eupid; /* effective unique PID */ 1134 pid_t epid; /* effective PID */ 1135#if !defined(__LP64__) 1136 __uint32_t pad; 1137#endif /* __LP64__ */ 1138 uuid_t euuid; /* effective UUID */ 1139}; 1140 1141/* 1142 * NETPOLICY_IFDENIED event structure 1143 */ 1144struct kev_netpolicy_ifdenied { 1145 struct netpolicy_event_data ev_data; 1146}; 1147 1148/* 1149 * Socket subclass (of KEV_NETWORK_CLASS) 1150 */ 1151#define KEV_SOCKET_SUBCLASS 4 1152 1153/* 1154 * Events for KEV_SOCKET_SUBCLASS of KEV_NETWORK_CLASS 1155 */ 1156#define KEV_SOCKET_CLOSED 1 /* completely closed by protocol */ 1157 1158/* 1159 * Common structure for KEV_SOCKET_SUBCLASS 1160 */ 1161struct kev_socket_event_data { 1162 struct sockaddr_storage kev_sockname; 1163 struct sockaddr_storage kev_peername; 1164}; 1165 1166struct kev_socket_closed { 1167 struct kev_socket_event_data ev_data; 1168}; 1169 1170#ifndef KERNEL 1171__BEGIN_DECLS 1172extern int connectx(int s, struct sockaddr *, socklen_t, struct sockaddr *, 1173 socklen_t, __uint32_t, associd_t, connid_t *); 1174extern int disconnectx(int s, associd_t, connid_t); 1175extern int peeloff(int s, associd_t); 1176extern int socket_delegate(int, int, int, pid_t); 1177 1178/* 1179 * recvmsg_x() is a system call similar to recvmsg(2) to receive 1180 * several datagrams at once in the array of message headers "msgp". 1181 * 1182 * recvmsg_x() can be used only with protocols handlers that have been specially 1183 * modified to handle sending and receiving several datagrams at once. 1184 * 1185 * The size of the array "msgp" is given by the argument "cnt". 1186 * 1187 * The "flags" arguments supports only the value MSG_DONTWAIT. 1188 * 1189 * Each member of "msgp" array is of type "struct msghdr_x". 1190 * 1191 * The "msg_iov" and "msg_iovlen" are input parameters that describe where to 1192 * store a datagram in a scatter gather locations of buffers -- see recvmsg(2). 1193 * On output the field "msg_datalen" gives the length of the received datagram. 1194 * 1195 * The field "msg_flags" must be set to zero on input. On output, "msg_flags" 1196 * may have MSG_TRUNC set to indicate the trailing portion of the datagram was 1197 * discarded because the datagram was larger than the buffer supplied. 1198 * recvmsg_x() returns as soon as a datagram is truncated. 1199 * 1200 * recvmsg_x() may return with less than "cnt" datagrams received based on 1201 * the low water mark and the amount of data pending in the socket buffer. 1202 * 1203 * Address and ancillary data are not supported so the following fields 1204 * must be set to zero on input: 1205 * "msg_name", "msg_namelen", "msg_control" and "msg_controllen". 1206 * 1207 * recvmsg_x() returns the number of datagrams that have been received , 1208 * or -1 if an error occurred. 1209 * 1210 * NOTE: This a private system call, the API is subject to change. 1211 */ 1212ssize_t recvmsg_x(int s, const struct msghdr_x *msgp, u_int cnt, int flags); 1213 1214/* 1215 * sendmsg_x() is a system call similar to send(2) to send 1216 * several datagrams at once in the array of message headers "msgp". 1217 * 1218 * sendmsg_x() can be used only with protocols handlers that have been specially 1219 * modified to support to handle sending and receiving several datagrams at once. 1220 * 1221 * The size of the array "msgp" is given by the argument "cnt". 1222 * 1223 * The "flags" arguments supports only the value MSG_DONTWAIT. 1224 * 1225 * Each member of "msgp" array is of type "struct msghdr_x". 1226 * 1227 * The "msg_iov" and "msg_iovlen" are input parameters that specify the 1228 * data to be sent in a scatter gather locations of buffers -- see sendmsg(2). 1229 * 1230 * sendmsg_x() fails with EMSGSIZE if the sum of the length of the datagrams 1231 * is greater than the high water mark. 1232 * 1233 * Address and ancillary data are not supported so the following fields 1234 * must be set to zero on input: 1235 * "msg_name", "msg_namelen", "msg_control" and "msg_controllen". 1236 * 1237 * The field "msg_flags" and "msg_datalen" must be set to zero on input. 1238 * 1239 * sendmsg_x() returns the number of datagrams that have been sent, 1240 * or -1 if an error occurred. 1241 * 1242 * NOTE: This a private system call, the API is subject to change. 1243 */ 1244ssize_t sendmsg_x(int s, const struct msghdr_x *msgp, u_int cnt, int flags); 1245__END_DECLS 1246#endif /* !KERNEL */ 1247#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 1248#endif /* PRIVATE */ 1249 1250#ifndef KERNEL 1251__BEGIN_DECLS 1252int accept(int, struct sockaddr * __restrict, socklen_t * __restrict) 1253 __DARWIN_ALIAS_C(accept); 1254int bind(int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS(bind); 1255int connect(int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS_C( connect); 1256int getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict) 1257 __DARWIN_ALIAS(getpeername); 1258int getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict) 1259 __DARWIN_ALIAS(getsockname); 1260int getsockopt(int, int, int, void * __restrict, socklen_t * __restrict); 1261int listen(int, int) __DARWIN_ALIAS(listen); 1262ssize_t recv(int, void *, size_t, int) __DARWIN_ALIAS_C(recv); 1263ssize_t recvfrom(int, void *, size_t, int, struct sockaddr * __restrict, 1264 socklen_t * __restrict) __DARWIN_ALIAS_C(recvfrom); 1265ssize_t recvmsg(int, struct msghdr *, int) __DARWIN_ALIAS_C(recvmsg); 1266ssize_t send(int, const void *, size_t, int) __DARWIN_ALIAS_C(send); 1267ssize_t sendmsg(int, const struct msghdr *, int) __DARWIN_ALIAS_C(sendmsg); 1268ssize_t sendto(int, const void *, size_t, 1269 int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS_C(sendto); 1270int setsockopt(int, int, int, const void *, socklen_t); 1271int shutdown(int, int); 1272int sockatmark(int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); 1273int socket(int, int, int); 1274int socketpair(int, int, int, int *) __DARWIN_ALIAS(socketpair); 1275 1276#if !defined(_POSIX_C_SOURCE) 1277int sendfile(int, int, off_t, off_t *, struct sf_hdtr *, int); 1278#endif /* !_POSIX_C_SOURCE */ 1279 1280#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 1281void pfctlinput(int, struct sockaddr *); 1282#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 1283__END_DECLS 1284#endif /* !KERNEL */ 1285 1286#ifdef KERNEL 1287#include <sys/kpi_socket.h> 1288#endif 1289 1290#endif /* !_SYS_SOCKET_H_ */ 1291