]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/sys/socket.h
xnu-3247.1.106.tar.gz
[apple/xnu.git] / bsd / sys / socket.h
index 3fc35997c342d4950b9f5a2015c3c7684958303c..8afe6c4daa073bcb7c698b965d6045a28289372d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2011 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2015 Apple Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
 
 #ifdef PRIVATE
 #include <sys/param.h>
+#include <uuid/uuid.h>
 #endif /* PRIVATE */
 
-#ifndef KERNEL 
+#ifndef KERNEL
 #include <Availability.h>
 #endif
 
 /*
  * Data types.
  */
-#ifndef _GID_T
-typedef __darwin_gid_t         gid_t;
-#define _GID_T
-#endif
-
-#ifndef _OFF_T
-typedef __darwin_off_t         off_t;
-#define _OFF_T
-#endif
-
-#ifndef _PID_T
-typedef __darwin_pid_t         pid_t;
-#define _PID_T
-#endif
-
-#ifndef _SA_FAMILY_T
-#define _SA_FAMILY_T
-typedef __uint8_t              sa_family_t;
-#endif
 
-#ifndef _SOCKLEN_T
-#define _SOCKLEN_T
-typedef        __darwin_socklen_t      socklen_t;
-#endif
+#include <sys/_types/_gid_t.h>
+#include <sys/_types/_off_t.h>
+#include <sys/_types/_pid_t.h>
+#include <sys/_types/_sa_family_t.h>
+#include <sys/_types/_socklen_t.h>
 
 /* XXX Not explicitly defined by POSIX, but function return types are */
-#ifndef _SIZE_T
-#define _SIZE_T
-typedef __darwin_size_t                size_t;
-#endif
+#include <sys/_types/_size_t.h>
  
 /* XXX Not explicitly defined by POSIX, but function return types are */
-#ifndef        _SSIZE_T
-#define        _SSIZE_T
-typedef        __darwin_ssize_t        ssize_t;
-#endif
+#include <sys/_types/_ssize_t.h>
 
 /*
  * [XSI] The iovec structure shall be defined as described in <sys/uio.h>.
  */
-#ifndef _STRUCT_IOVEC
-#define        _STRUCT_IOVEC
-struct iovec {
-       void *   iov_base;      /* [XSI] Base address of I/O memory region */
-       size_t   iov_len;       /* [XSI] Size of region iov_base points to */
-};
-#endif
+#include <sys/_types/_iovec_t.h>
 
 #ifdef PRIVATE
-#define SO_TCDBG_PID   0x01    /* Set/get traffic class for PID */
-#define SO_TCDBG_PNAME 0x02    /* Set/get traffic class for processes of that name */
-#define SO_TCDBG_PURGE 0x04    /* Purge entries for unused PIDs */
-#define SO_TCDBG_FLUSH 0x08    /* Flush all entries */
-#define SO_TCDBG_COUNT 0x10    /* Get count of entries */
-#define SO_TCDBG_LIST  0x20    /* List entries */
+#define SO_TCDBG_PID           0x01    /* Set/get traffic class for PID */
+#define SO_TCDBG_PNAME         0x02    /* Set/get traffic class for processes of that name */
+#define SO_TCDBG_PURGE         0x04    /* Purge entries for unused PIDs */
+#define SO_TCDBG_FLUSH         0x08    /* Flush all entries */
+#define SO_TCDBG_COUNT         0x10    /* Get count of entries */
+#define SO_TCDBG_LIST          0x20    /* List entries */
+#define SO_TCDBG_DELETE                0x40    /* Delete a process entry */
+#define SO_TCDBG_TCFLUSH_PID   0x80    /* Flush traffic class for PID */
 
 struct so_tcdbg {
        u_int32_t       so_tcdbg_cmd;
@@ -153,6 +126,7 @@ struct so_tcdbg {
        u_int32_t       so_tcdbg_count;
        pid_t           so_tcdbg_pid;
        char            so_tcdbg_pname[MAXCOMLEN + 1];
+       int32_t         so_tcdbg_opportunistic; /* -1: unspecified, 0: off, 1: on, other: errors */
 };
 #endif /* PRIVATE */
  
@@ -192,9 +166,14 @@ struct so_tcdbg {
 #else
 #define SO_DONTTRUNC   0x2000          /* APPLE: Retain unread data */
                                        /*  (ATOMIC proto) */
-#define SO_WANTMORE            0x4000          /* APPLE: Give hint when more data ready */
+#define SO_WANTMORE    0x4000          /* APPLE: Give hint when more data ready */
 #define SO_WANTOOBFLAG 0x8000          /* APPLE: Want OOB in MSG_FLAG on receive */
+
+#ifdef PRIVATE
+#define        SO_NOWAKEFROMSLEEP      0x10000 /* Don't wake for traffic to this socket */
 #endif
+
+#endif  /* (!__APPLE__) */
 #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
 
 /*
@@ -224,22 +203,98 @@ struct so_tcdbg {
 #define        SO_UPCALLCLOSEWAIT      0x1027  /* APPLE: block on close until an upcall returns */
 #endif
 #define SO_LINGER_SEC  0x1080          /* linger on close if data present (in seconds) */
-#define SO_RESTRICTIONS        0x1081  /* APPLE: deny inbound/outbound/both/flag set */
-#define SO_RESTRICT_DENYIN             0x00000001      /* flag for SO_RESTRICTIONS - deny inbound */
-#define SO_RESTRICT_DENYOUT            0x00000002      /* flag for SO_RESTRICTIONS - deny outbound */
-#define SO_RESTRICT_DENYSET            0x80000000      /* flag for SO_RESTRICTIONS - deny has been set */
+#ifdef PRIVATE
+#define        SO_RESTRICTIONS 0x1081          /* APPLE: deny flag set */
+#define         SO_RESTRICT_DENY_IN    0x1     /* deny inbound (trapdoor) */
+#define         SO_RESTRICT_DENY_OUT   0x2     /* deny outbound (trapdoor) */
+#define         SO_RESTRICT_DENY_CELLULAR 0x4  /* deny use of cellular (trapdoor) */
+#define         SO_RESTRICT_DENY_EXPENSIVE 0x8 /* deny use of expensive if (trapdoor)*/
+#endif /* PRIVATE */
 #define SO_RANDOMPORT   0x1082  /* APPLE: request local port randomization */
 #define SO_NP_EXTENSIONS       0x1083  /* To turn off some POSIX behavior */
 #endif
 
 #ifdef PRIVATE
 #define        SO_EXECPATH     0x1085          /* Application Firewall Socket option */
-#define SO_TRAFFIC_CLASS               0x1086          /* Traffic class (int)*/
-#define  SO_TC_BE      0               /* Best effort, normal */
-#define  SO_TC_BK      1               /* Background, low priority or bulk traffic */
-#define  SO_TC_VI      2               /* Interactive video, constant bit rate, low latency */
-#define  SO_TC_VO      3               /* Interactive voice, constant bit rate, lowest latency */
-#define  SO_TC_MAX     4               /* Max traffic class value */
+/*
+ * Traffic service class definitions (lowest to highest):
+ *
+ * SO_TC_BK_SYS
+ *     "Background System-Initiated", high delay tolerant, high loss
+ *     tolerant, elastic flow, variable size & long-lived.  E.g: system-
+ *     initiated iCloud synching or Time Capsule backup, for which there
+ *     is no progress feedbacks.
+ *
+ * SO_TC_BK
+ *     "Background", user-initiated, high delay tolerant, high loss tolerant,
+ *     elastic flow, variable size.  E.g. user-initiated iCloud synching or
+ *     Time Capsule backup; or traffics of background applications, for which
+ *     there is some progress feedbacks.
+ *
+ * SO_TC_BE
+ *     "Best Effort", unclassified/standard.  This is the default service
+ *     class; pretty much a mix of everything.
+ *
+ * SO_TC_RD
+ *     "Responsive Data", a notch higher than "Best Effort", medium delay
+ *     tolerant, elastic & inelastic flow, bursty, long-lived.  E.g. email,
+ *     instant messaging, for which there is a sense of interactivity and
+ *     urgency (user waiting for output).
+ *
+ * SO_TC_OAM
+ *     "Operations, Administration, and Management", medium delay tolerant,
+ *     low-medium loss tolerant, elastic & inelastic flows, variable size.
+ *     E.g. VPN tunnels.
+ *
+ * SO_TC_AV
+ *     "Multimedia Audio/Video Streaming", medium delay tolerant, low-medium
+ *     loss tolerant, elastic flow, constant packet interval, variable rate &
+ *     size.  E.g. AirPlay playback (both video and audio).
+ *
+ * SO_TC_RV
+ *     "Responsive Multimedia Audio/Video", low delay tolerant, low-medium
+ *     loss tolerant, elastic flow, variable packet interval, rate and size.
+ *     E.g. AirPlay mirroring, screen sharing.
+ *
+ * SO_TC_VI
+ *     "Interactive Video", low delay tolerant, low-medium loss tolerant,
+ *     elastic flow, constant packet interval, variable rate & size.  E.g.
+ *     FaceTime video.
+ *
+ * SO_TC_VO
+ *     "Interactive Voice", low delay tolerant, low loss tolerant, inelastic
+ *     flow, constant packet rate, somewhat fixed size.  E.g. VoIP including
+ *     FaceTime audio.
+ *
+ * SO_TC_CTL
+ *     "Network Control", low delay tolerant, low loss tolerant, inelastic
+ *     flow, rate is bursty but short, variable size.  E.g. DNS queries;
+ *     certain types of locally-originated ICMP, ICMPv6; IGMP/MLD join/leave,
+ *     ARP.
+ */
+#define SO_TRAFFIC_CLASS       0x1086  /* Traffic service class (int) */
+#define         SO_TC_BK_SYS   100             /* lowest class */
+#define         SO_TC_BK       200
+#define  SO_TC_BE      0
+#define         SO_TC_RD       300
+#define         SO_TC_OAM      400
+#define         SO_TC_AV       500
+#define         SO_TC_RV       600
+#define         SO_TC_VI       700
+#define         SO_TC_VO       800
+#define         SO_TC_CTL      900             /* highest class */
+#define  SO_TC_MAX     10              /* Total # of traffic classes */
+#ifdef XNU_KERNEL_PRIVATE
+#define  _SO_TC_BK     1               /* deprecated */
+#define  _SO_TC_VI     2               /* deprecated */
+#define  _SO_TC_VO     3               /* deprecated */
+#define  _SO_TC_MAX    4               /* deprecated */
+
+#define        SO_VALID_TC(c)                                                  \
+       (c == SO_TC_BK_SYS || c == SO_TC_BK || c == SO_TC_BE ||         \
+       c == SO_TC_RD || c == SO_TC_OAM || c == SO_TC_AV ||             \
+       c == SO_TC_RV || c == SO_TC_VI || c == SO_TC_VO || c == SO_TC_CTL)
+#endif /* XNU_KERNEL_PRIVATE */
 
 /* Background socket configuration flags */
 #define TRAFFIC_MGT_SO_BACKGROUND       0x0001  /* background socket */
@@ -248,9 +303,59 @@ struct so_tcdbg {
 #define SO_RECV_TRAFFIC_CLASS  0x1087          /* Receive traffic class (bool)*/
 #define SO_TRAFFIC_CLASS_DBG   0x1088          /* Debug traffic class (struct so_tcdbg) */
 #define SO_TRAFFIC_CLASS_STATS 0x1089          /* Traffic class statistics */
+#define SO_PRIVILEGED_TRAFFIC_CLASS 0x1090     /* Privileged traffic class (bool) */
 #define        SO_DEFUNCTOK    0x1100          /* can be defunct'd */
 #define        SO_ISDEFUNCT    0x1101          /* get defunct status */
+
+#define        SO_OPPORTUNISTIC        0x1102  /* deprecated; use SO_TRAFFIC_CLASS */
+
+/*
+ * SO_FLUSH flushes any unsent data generated by a given socket.  It takes
+ * an integer parameter, which can be any of the SO_TC traffic class values,
+ * or the special SO_TC_ALL value.
+ */
+#define        SO_FLUSH        0x1103          /* flush unsent data (int) */
+#define         SO_TC_ALL      (-1)
+
+#define        SO_RECV_ANYIF   0x1104          /* unrestricted inbound processing */
+#define        SO_TRAFFIC_MGT_BACKGROUND       0x1105  /* Background traffic management */
+#define        SO_FLOW_DIVERT_TOKEN    0x1106  /* flow divert token */
+
+#define        SO_DELEGATED            0x1107  /* set socket as delegate (pid_t) */
+#define        SO_DELEGATED_UUID       0x1108  /* set socket as delegate (uuid_t) */
+#define        SO_NECP_ATTRIBUTES      0x1109  /* NECP socket attributes (domain, account, etc.) */
+#define        SO_CFIL_SOCK_ID         0x1110  /* get content filter socket ID (cfil_sock_id_t) */
+#if MPTCP
+#define SO_MPTCP_FASTJOIN      0x1111  /* fast join MPTCP */
+#endif /* MPTCP */
 #endif /* PRIVATE */
+#define SO_NUMRCVPKT           0x1112  /* number of datagrams in receive socket buffer */
+#ifdef PRIVATE
+#define        SO_AWDL_UNRESTRICTED    0x1113  /* try to use AWDL in restricted mode */
+#define SO_EXTENDED_BK_IDLE    0x1114  /* extended time to keep socket idle after app is suspended (int) */
+#endif /* PRIVATE */
+
+typedef __uint32_t sae_associd_t;
+#define        SAE_ASSOCID_ANY 0
+#define        SAE_ASSOCID_ALL ((sae_associd_t)(-1ULL))
+
+typedef __uint32_t sae_connid_t;
+#define        SAE_CONNID_ANY  0
+#define        SAE_CONNID_ALL  ((sae_connid_t)(-1ULL))
+
+/* connectx() flag parameters */
+#define CONNECT_RESUME_ON_READ_WRITE   0x1 /* resume connect() on read/write */
+#define CONNECT_DATA_IDEMPOTENT                0x2 /* data is idempotent */
+
+/* sockaddr endpoints */
+typedef struct sa_endpoints {
+       unsigned int    sae_srcif;      /* optional source interface */
+       struct sockaddr *sae_srcaddr;   /* optional source address */
+       socklen_t       sae_srcaddrlen; /* size of source address */
+       struct sockaddr *sae_dstaddr;   /* destination address */
+       socklen_t       sae_dstaddrlen; /* size of destination address */
+} sa_endpoints_t;
 #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
 
 /*
@@ -284,7 +389,9 @@ struct so_np_extensions {
 
 #ifdef KERNEL_PRIVATE
 #define SONPX_MASK_VALID               (SONPX_SETOPTSHUT)
-#endif
+#define IS_SO_TC_BACKGROUND(_tc_) ((_tc_) == SO_TC_BK || (_tc_) == SO_TC_BK_SYS)
+#define IS_SO_TC_BACKGROUNDSYSTEM(_tc_) ((_tc_) == SO_TC_BK_SYS)
+#endif /* KERNEL_PRIVATE */
 
 #endif
 #endif
@@ -329,10 +436,8 @@ struct so_np_extensions {
 #define        AF_IPX          23              /* Novell Internet Protocol */
 #define        AF_SIP          24              /* Simple Internet Protocol */
 #define pseudo_AF_PIP  25              /* Help Identify PIP packets */
-#ifdef __APPLE__
 /*define pseudo_AF_BLUE        26         Identify packets for Blue Box - Not used */
 #define AF_NDRV                27              /* Network Driver 'raw' access */
-#endif
 #define        AF_ISDN         28              /* Integrated Services Digital Network*/
 #define        AF_E164         AF_ISDN         /* CCITT E.164 recommendation */
 #define        pseudo_AF_KEY   29              /* Internal key-management function */
@@ -340,27 +445,22 @@ struct so_np_extensions {
 #define        AF_INET6        30              /* IPv6 */
 #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
 #define        AF_NATM         31              /* native ATM access */
-#ifdef __APPLE__
 #define AF_SYSTEM      32              /* Kernel event messages */
 #define AF_NETBIOS     33              /* NetBIOS */
 #define AF_PPP         34              /* PPP communication protocol */
-#else
-#define        AF_ATM          30              /* ATM */
-#endif
 #define pseudo_AF_HDRCMPLT 35          /* Used by BPF to not rewrite headers
-                                        * in interface output routine
-                                        */
+                                        * in interface output routine */
 #ifdef PRIVATE
 #define AF_AFP 36                      /* Used by AFP */
 #else
 #define AF_RESERVED_36 36              /* Reserved for internal usage */
 #endif
-
-#ifndef __APPLE__
-#define        AF_NETGRAPH     32              /* Netgraph sockets */
-#endif
 #define AF_IEEE80211    37              /* IEEE 802.11 protocol */
-#define        AF_MAX          38
+#define AF_UTUN                38
+#ifdef PRIVATE
+#define        AF_MULTIPATH    39
+#endif /* PRIVATE */
+#define        AF_MAX          40
 #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
 
 /*
@@ -407,6 +507,24 @@ struct sockaddr_storage {
        char                    __ss_pad2[_SS_PAD2SIZE];
 };
 
+#ifdef BSD_KERNEL_PRIVATE
+#include <sys/queue.h>
+
+struct sockaddr_entry {
+       TAILQ_ENTRY(sockaddr_entry)     se_link;
+       struct sockaddr                 *se_addr;
+       uint32_t                        se_flags;
+};
+
+#define        SEF_ATTACHED            1       /* attached to sockaddr_list */
+
+struct sockaddr_list {
+       TAILQ_HEAD(, sockaddr_entry)    sl_head;
+       uint32_t                        sl_cnt;
+
+};
+#endif /* BSD_KERNEL_PRIVATE */
+
 /*
  * Protocol families, same as address families for now.
  */
@@ -438,28 +556,23 @@ struct sockaddr_storage {
 #define        PF_IPX          AF_IPX          /* same format as AF_NS */
 #define PF_RTIP                pseudo_AF_RTIP  /* same format as AF_INET */
 #define PF_PIP         pseudo_AF_PIP
-#ifdef __APPLE__
 #define PF_NDRV                AF_NDRV
-#endif
 #define        PF_ISDN         AF_ISDN
 #define        PF_KEY          pseudo_AF_KEY
 #define        PF_INET6        AF_INET6
 #define        PF_NATM         AF_NATM
-#ifdef __APPLE__
 #define PF_SYSTEM      AF_SYSTEM
 #define PF_NETBIOS     AF_NETBIOS
 #define PF_PPP         AF_PPP
 #ifdef PRIVATE
-#define PF_AFP         AF_AFP
+#define PF_AFP         AF_AFP
 #else
 #define PF_RESERVED_36  AF_RESERVED_36
 #endif
-
-#else
-#define        PF_ATM          AF_ATM
-#define        PF_NETGRAPH     AF_NETGRAPH
-#endif
-
+#define PF_UTUN                AF_UTUN
+#ifdef PRIVATE
+#define        PF_MULTIPATH    AF_MULTIPATH
+#endif /* PRIVATE */
 #define        PF_MAX          AF_MAX
 
 /*
@@ -582,7 +695,29 @@ struct msghdr {
        int             msg_flags;      /* [XSI] flags on received message */
 };
 
-#ifdef KERNEL
+#ifdef PRIVATE
+/*
+ * Extended version for sendmsg_x() and recvmsg_x() calls
+ *
+ * For recvmsg_x(), the size of the data received is given by the field
+ * msg_datalen.
+ *
+ * For sendmsg_x(), the size of the data to send is given by the length of 
+ * the iovec array -- like sendmsg(). The field msg_datalen is ignored.
+ */
+struct msghdr_x {
+       void            *msg_name;      /* optional address */
+       socklen_t       msg_namelen;    /* size of address */
+       struct iovec    *msg_iov;       /* scatter/gather array */
+       int             msg_iovlen;     /* # elements in msg_iov */
+       void            *msg_control;   /* ancillary data, see below */
+       socklen_t       msg_controllen; /* ancillary data buffer len */
+       int             msg_flags;      /* flags on received message */
+       size_t          msg_datalen;    /* byte length of buffer in msg_iov */
+};
+#endif /* PRIVATE */
+
+#ifdef XNU_KERNEL_PRIVATE
 /*
  * In-kernel representation of "struct msghdr" from
  * userspace. Has enough precision for 32-bit or
@@ -629,7 +764,96 @@ struct user32_msghdr {
        int             msg_flags;      /* flags on received message */
 };
 
-#endif // KERNEL
+/*
+ * In-kernel representation of "struct msghdr_x" from
+ * userspace. Has enough precision for 32-bit or
+ * 64-bit clients, but does not need to be packed.
+ */
+
+struct user_msghdr_x {
+       user_addr_t     msg_name;       /* optional address */
+       socklen_t       msg_namelen;    /* size of address */
+       user_addr_t     msg_iov;        /* scatter/gather array */
+       int             msg_iovlen;     /* # elements in msg_iov */
+       user_addr_t     msg_control;    /* ancillary data, see below */
+       socklen_t       msg_controllen; /* ancillary data buffer len */
+       int             msg_flags;      /* flags on received message */
+       size_t          msg_datalen;    /* byte length of buffer in msg_iov */
+};
+
+/*
+ * LP64 user version of struct msghdr_x
+ * WARNING - keep in sync with struct msghdr_x
+ */
+
+struct user64_msghdr_x {
+       user64_addr_t   msg_name;       /* optional address */
+       socklen_t       msg_namelen;    /* size of address */
+       user64_addr_t   msg_iov;        /* scatter/gather array */
+       int             msg_iovlen;     /* # elements in msg_iov */
+       user64_addr_t   msg_control;    /* ancillary data, see below */
+       socklen_t       msg_controllen; /* ancillary data buffer len */
+       int             msg_flags;      /* flags on received message */
+       user64_size_t   msg_datalen;    /* byte length of buffer in msg_iov */
+};
+
+/*
+ * ILP32 user version of struct msghdr_x
+ * WARNING - keep in sync with struct msghdr_x
+ */
+
+struct user32_msghdr_x {
+       user32_addr_t   msg_name;       /* optional address */
+       socklen_t       msg_namelen;    /* size of address */
+       user32_addr_t   msg_iov;        /* scatter/gather array */
+       int             msg_iovlen;     /* # elements in msg_iov */
+       user32_addr_t   msg_control;    /* ancillary data, see below */
+       socklen_t       msg_controllen; /* ancillary data buffer len */
+       int             msg_flags;      /* flags on received message */
+       user32_size_t   msg_datalen;    /* byte length of buffer in msg_iov */
+};
+
+/*
+ * In-kernel representation of "struct sa_endpoints" from
+ * userspace. Has enough precision for 32-bit or
+ * 64-bit clients, but does not need to be packed.
+ */
+
+struct user_sa_endpoints {
+       unsigned int    sae_srcif;      /* optional source interface */
+       user_addr_t     sae_srcaddr;    /* optional source address */
+       socklen_t       sae_srcaddrlen; /* size of source address */
+       user_addr_t     sae_dstaddr;    /* destination address */
+       socklen_t       sae_dstaddrlen; /* size of destination address */
+};
+
+/*
+ * LP64 user version of struct sa_endpoints
+ * WARNING - keep in sync with struct sa_endpoints
+ */
+
+struct user64_sa_endpoints {
+       unsigned int    sae_srcif;      /* optional source interface */
+       user64_addr_t   sae_srcaddr;    /* optional source address */
+       socklen_t       sae_srcaddrlen; /* size of source address */
+       user64_addr_t   sae_dstaddr;    /* destination address */
+       socklen_t       sae_dstaddrlen; /* size of destination address */
+};
+
+/*
+ * ILP32 user version of struct sa_endpoints
+ * WARNING - keep in sync with struct sa_endpoints
+ */
+
+struct user32_sa_endpoints {
+       unsigned int    sae_srcif;      /* optional source interface */
+       user32_addr_t   sae_srcaddr;    /* optional source address */
+       socklen_t       sae_srcaddrlen; /* size of source address */
+       user32_addr_t   sae_dstaddr;    /* destination address */
+       socklen_t       sae_dstaddrlen; /* size of destination address */
+};
+
+#endif /* XNU_KERNEL_PRIVATE */
 
 #define        MSG_OOB         0x1             /* process out-of-band data */
 #define        MSG_PEEK        0x2             /* peek at incoming message */
@@ -661,6 +885,7 @@ struct user32_msghdr {
 #define MSG_NEEDSA     0x10000         /* Fail receive if socket address cannot be allocated */
 #ifdef KERNEL_PRIVATE
 #define MSG_NBIO       0x20000         /* FIONBIO mode, used by fifofs */
+#define MSG_SKIPCFIL   0x40000         /* skip pass content filter */
 #endif
 #ifdef KERNEL
 #define MSG_USEUPCALL  0x80000000 /* Inherit upcall in sock_accept */
@@ -753,6 +978,11 @@ struct cmsgcred {
 #define        SCM_CREDS                       0x03    /* process creds (struct cmsgcred) */
 #define        SCM_TIMESTAMP_MONOTONIC         0x04    /* timestamp (uint64_t) */ 
 
+#ifdef PRIVATE
+#define SCM_SEQNUM                     0x05    /* TCP unordered recv seq no */
+#define SCM_MSG_PRIORITY               0x06    /* TCP unordered snd priority */
+#endif /* PRIVATE */
+
 #ifdef KERNEL_PRIVATE
 /*
  * 4.3 compat sockaddr (deprecated)
@@ -773,6 +1003,8 @@ struct omsghdr {
        void            *msg_accrights;         /* access rights sent/rcvd */
        int             msg_accrightslen;
 };
+
+#define        SA(s)   ((struct sockaddr *)(void *)(s))
 #endif /* KERNEL_PRIVATE */
 #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
 
@@ -824,8 +1056,249 @@ struct user32_sf_hdtr {
 
 #endif /* !_POSIX_C_SOURCE */
 
+#ifdef PRIVATE
+#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
+
+/*
+ * Structure for SIOCGASSOCIDS
+ */
+struct so_aidreq {
+       __uint32_t      sar_cnt;        /* number of associations */
+       sae_associd_t   *sar_aidp;      /* array of association IDs */
+};
+
+#ifdef BSD_KERNEL_PRIVATE
+struct so_aidreq32 {
+       __uint32_t      sar_cnt;
+       user32_addr_t   sar_aidp;
+};
+
+struct so_aidreq64 {
+       __uint32_t      sar_cnt;
+       user64_addr_t   sar_aidp __attribute__((aligned(8)));
+};
+#endif /* BSD_KERNEL_PRIVATE */
+
+/*
+ * Structure for SIOCGCONNIDS
+ */
+struct so_cidreq {
+       sae_associd_t   scr_aid;        /* association ID */
+       __uint32_t      scr_cnt;        /* number of connections */
+       sae_connid_t    *scr_cidp;      /* array of connection IDs */
+};
+
+#ifdef BSD_KERNEL_PRIVATE
+struct so_cidreq32 {
+       sae_associd_t   scr_aid;
+       __uint32_t      scr_cnt;
+       user32_addr_t   scr_cidp;
+};
+
+struct so_cidreq64 {
+       sae_associd_t   scr_aid;
+       __uint32_t      scr_cnt;
+       user64_addr_t   scr_cidp __attribute__((aligned(8)));
+};
+#endif /* BSD_KERNEL_PRIVATE */
+
+/*
+ * Structure for SIOCGCONNINFO
+ */
+struct so_cinforeq {
+       sae_connid_t    scir_cid;               /* connection ID */
+       __uint32_t      scir_flags;             /* see flags below */
+       __uint32_t      scir_ifindex;           /* (last) outbound interface */
+       __int32_t       scir_error;             /* most recent error */
+       struct sockaddr *scir_src;              /* source address */
+       socklen_t       scir_src_len;           /* source address len */
+       struct sockaddr *scir_dst;              /* destination address */
+       socklen_t       scir_dst_len;           /* destination address len */
+       __uint32_t      scir_aux_type;          /* aux data type (CIAUX) */
+       void            *scir_aux_data;         /* aux data */
+       __uint32_t      scir_aux_len;           /* aux data len */
+};
+
+#ifdef BSD_KERNEL_PRIVATE
+struct so_cinforeq32 {
+       sae_connid_t    scir_cid;
+       __uint32_t      scir_flags;
+       __uint32_t      scir_ifindex;
+       __int32_t       scir_error;
+       user32_addr_t   scir_src;
+       socklen_t       scir_src_len;
+       user32_addr_t   scir_dst;
+       socklen_t       scir_dst_len;
+       __uint32_t      scir_aux_type;
+       user32_addr_t   scir_aux_data;
+       __uint32_t      scir_aux_len;
+};
+
+struct so_cinforeq64 {
+       sae_connid_t    scir_cid;
+       __uint32_t      scir_flags;
+       __uint32_t      scir_ifindex;
+       __int32_t       scir_error;
+       user64_addr_t   scir_src        __attribute__((aligned(8)));
+       socklen_t       scir_src_len;
+       user64_addr_t   scir_dst        __attribute__((aligned(8)));
+       socklen_t       scir_dst_len;
+       __uint32_t      scir_aux_type;
+       user64_addr_t   scir_aux_data   __attribute__((aligned(8)));
+       __uint32_t      scir_aux_len;
+};
+#endif /* BSD_KERNEL_PRIVATE */
+
+/* valid connection info flags */
+#define        CIF_CONNECTING          0x1     /* connection was attempted */
+#define        CIF_CONNECTED           0x2     /* connection is established */
+#define        CIF_DISCONNECTING       0x4     /* disconnection was attempted */
+#define        CIF_DISCONNECTED        0x8     /* has been disconnected */
+#define        CIF_BOUND_IF            0x10    /* bound to an interface */
+#define        CIF_BOUND_IP            0x20    /* bound to a src address */
+#define        CIF_BOUND_PORT          0x40    /* bound to a src port */
+#define        CIF_PREFERRED           0x80    /* connection is primary/preferred */
+#define        CIF_MP_CAPABLE          0x100   /* supports multipath protocol */
+#define        CIF_MP_READY            0x200   /* multipath protocol confirmed */
+#define        CIF_MP_DEGRADED         0x400   /* has lost its multipath capability */
+#define CIF_MP_ACTIVE          0x800   /* this is the active subflow */
+
+/* valid connection info auxiliary data types */
+#define        CIAUX_TCP       0x1     /* TCP auxiliary data (conninfo_tcp_t) */
+
+/*
+ * Structure for SIOC{S,G}CONNORDER
+ */
+struct so_cordreq {
+       sae_connid_t    sco_cid;                /* connection ID */
+       __uint32_t      sco_rank;               /* rank (0 means unspecified) */
+};
+
+/*
+ * Network policy subclass (of KEV_NETWORK_CLASS)
+ */
+#define        KEV_NETPOLICY_SUBCLASS  3
+
+#define        KEV_NETPOLICY_IFDENIED  1       /* denied access to interface */
+
+/*
+ * Common structure for KEV_NETPOLICY_SUBCLASS
+ */
+struct netpolicy_event_data {
+       __uint64_t      eupid;          /* effective unique PID */
+       pid_t           epid;           /* effective PID */
+#if !defined(__LP64__)
+       __uint32_t      pad;
+#endif /* __LP64__ */
+       uuid_t          euuid;          /* effective UUID */
+};
+
+/*
+ * NETPOLICY_IFDENIED event structure
+ */
+struct kev_netpolicy_ifdenied {
+       struct netpolicy_event_data     ev_data;
+};
+
+/*
+ * Socket subclass (of KEV_NETWORK_CLASS)
+ */
+#define        KEV_SOCKET_SUBCLASS     4
+
+/*
+ * Events for KEV_SOCKET_SUBCLASS of KEV_NETWORK_CLASS
+ */
+#define        KEV_SOCKET_CLOSED       1       /* completely closed by protocol */
+
+/*
+ * Common structure for KEV_SOCKET_SUBCLASS
+ */
+struct kev_socket_event_data {
+       struct sockaddr_storage kev_sockname;
+       struct sockaddr_storage kev_peername;
+};
+
+struct kev_socket_closed {
+       struct kev_socket_event_data ev_data;
+};
+
 #ifndef        KERNEL
 __BEGIN_DECLS
+
+extern int peeloff(int s, sae_associd_t);
+extern int socket_delegate(int, int, int, pid_t);
+
+/*
+ * recvmsg_x() is a system call similar to recvmsg(2) to receive
+ * several datagrams at once in the array of message headers "msgp".
+ *
+ * recvmsg_x() can be used only with protocols handlers that have been specially
+ * modified to support sending and receiving several datagrams at once.
+ * 
+ * The size of the array "msgp" is given by the argument "cnt".
+ *
+ * The "flags" arguments supports only the value MSG_DONTWAIT.
+ * 
+ * Each member of "msgp" array is of type "struct msghdr_x".
+ *
+ * The "msg_iov" and "msg_iovlen" are input parameters that describe where to
+ * store a datagram in a scatter gather locations of buffers -- see recvmsg(2).
+ * On output the field "msg_datalen" gives the length of the received datagram.
+ *
+ * The field "msg_flags" must be set to zero on input. On output, "msg_flags"
+ * may have MSG_TRUNC set to indicate the trailing portion of the datagram was
+ * discarded because the datagram was larger than the buffer supplied.
+ * recvmsg_x() returns as soon as a datagram is truncated.
+ *
+ * recvmsg_x() may return with less than "cnt" datagrams received based on
+ * the low water mark and the amount of data pending in the socket buffer.
+ *
+ * recvmsg_x() returns the number of datagrams that have been received,
+ * or -1 if an error occurred. 
+ *
+ * NOTE: This a private system call, the API is subject to change.
+ */
+ssize_t recvmsg_x(int s, const struct msghdr_x *msgp, u_int cnt, int flags);
+
+/*
+ * sendmsg_x() is a system call similar to send(2) to send
+ * several datagrams at once in the array of message headers "msgp".
+ *
+ * sendmsg_x() can be used only with protocols handlers that have been specially
+ * modified to support sending and receiving several datagrams at once.
+ * 
+ * The size of the array "msgp" is given by the argument "cnt".
+ *
+ * The "flags" arguments supports only the value MSG_DONTWAIT.
+ * 
+ * Each member of "msgp" array is of type "struct msghdr_x".
+ *
+ * The "msg_iov" and "msg_iovlen" are input parameters that specify the
+ * data to be sent in a scatter gather locations of buffers -- see sendmsg(2).
+ *
+ * sendmsg_x() fails with EMSGSIZE if the sum of the length of the datagrams
+ * is greater than the high water mark.
+ *
+ * Address and ancillary data are not supported so the following fields
+ * must be set to zero on input:
+ *   "msg_name", "msg_namelen", "msg_control" and "msg_controllen".
+ *
+ * The field "msg_flags" and "msg_datalen" must be set to zero on input. 
+ *
+ * sendmsg_x() returns the number of datagrams that have been sent,
+ * or -1 if an error occurred. 
+ *
+ * NOTE: This a private system call, the API is subject to change.
+ */
+ssize_t sendmsg_x(int s, const struct msghdr_x *msgp, u_int cnt, int flags);
+__END_DECLS
+#endif /* !KERNEL */
+#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
+#endif /* PRIVATE */
+
+#ifndef        KERNEL
+__BEGIN_DECLS
+
 int    accept(int, struct sockaddr * __restrict, socklen_t * __restrict)
                __DARWIN_ALIAS_C(accept);
 int    bind(int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS(bind);
@@ -856,6 +1329,9 @@ int        sendfile(int, int, off_t, off_t *, struct sf_hdtr *, int);
 
 #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
 void   pfctlinput(int, struct sockaddr *);
+int connectx(int , const sa_endpoints_t *, sae_associd_t, unsigned int,
+    const struct iovec *, unsigned int, size_t *, sae_connid_t *);
+int disconnectx(int , sae_associd_t, sae_connid_t);
 #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
 __END_DECLS
 #endif /* !KERNEL */