/*
- * Copyright (c) 2000-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2011 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
#ifndef _SYS_SOCKET_H_
#define _SYS_SOCKET_H_
-#include <sys/_types.h>
+#include <sys/types.h>
#include <sys/cdefs.h>
#include <machine/_param.h>
+#ifdef PRIVATE
+#include <sys/param.h>
+#endif /* PRIVATE */
+
+#ifndef KERNEL
+#include <Availability.h>
+#endif
+
/*
* Definitions related to sockets: types, address families, options.
*/
size_t iov_len; /* [XSI] Size of region iov_base points to */
};
#endif
+
+#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 */
+
+struct so_tcdbg {
+ u_int32_t so_tcdbg_cmd;
+ int32_t so_tcdbg_tclass;
+ u_int32_t so_tcdbg_count;
+ pid_t so_tcdbg_pid;
+ char so_tcdbg_pname[MAXCOMLEN + 1];
+};
+#endif /* PRIVATE */
/*
* Types
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */
#define SO_TIMESTAMP 0x0400 /* timestamp received dgram traffic */
+#define SO_TIMESTAMP_MONOTONIC 0x0800 /* Monotonically increasing timestamp on rcvd dgram */
#ifndef __APPLE__
#define SO_ACCEPTFILTER 0x1000 /* there is an accept filter */
#else
#define SO_TYPE 0x1008 /* get socket type */
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
/*efine SO_PRIVSTATE 0x1009 get/deny privileged state */
+#define SO_LABEL 0x1010 /* socket's MAC label */
+#define SO_PEERLABEL 0x1011 /* socket's peer MAC label */
#ifdef __APPLE__
#define SO_NREAD 0x1020 /* APPLE: get 1st-packet byte count */
#define SO_NKE 0x1021 /* APPLE: Install socket-level NKE */
#define SO_REUSESHAREUID 0x1025 /* APPLE: Allow reuse of port/socket by different userids */
#ifdef __APPLE_API_PRIVATE
#define SO_NOTIFYCONFLICT 0x1026 /* APPLE: send notification if there is a bind on a port which is already in use */
+#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 */
+#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 */
-#endif
-#define SO_LABEL 0x1010 /* socket's MAC label */
-#define SO_PEERLABEL 0x1011 /* socket's peer MAC label */
+#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 */
+
+/* Background socket configuration flags */
+#define TRAFFIC_MGT_SO_BACKGROUND 0x0001 /* background socket */
+#define TRAFFIC_MGT_TCP_RECVBG 0x0002 /* Only TCP sockets, receiver throttling */
+
+#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_DEFUNCTOK 0x1100 /* can be defunct'd */
+#define SO_ISDEFUNCT 0x1101 /* get defunct status */
+#endif /* PRIVATE */
#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
/*
};
#endif
+#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
+#ifdef __APPLE__
+
+/*
+ * Structure to control non-portable Sockets extension to POSIX
+ */
+struct so_np_extensions {
+ u_int32_t npx_flags;
+ u_int32_t npx_mask;
+};
+
+#define SONPX_SETOPTSHUT 0x000000001 /* flag for allowing setsockopt after shutdown */
+
+
+#ifdef KERNEL_PRIVATE
+#define SONPX_MASK_VALID (SONPX_SETOPTSHUT)
+#endif
+
+#endif
+#endif
+
/*
* Level number for (get/set)sockopt() to apply to socket itself.
*/
#ifndef __APPLE__
#define AF_NETGRAPH 32 /* Netgraph sockets */
#endif
-#define AF_MAX 37
+#define AF_IEEE80211 37 /* IEEE 802.11 protocol */
+#define AF_MAX 38
#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
/*
*/
#define PF_VLAN ((uint32_t)0x766c616e) /* 'vlan' */
#define PF_BOND ((uint32_t)0x626f6e64) /* 'bond' */
+#ifdef KERNEL_PRIVATE
+#define PF_BRIDGE ((uint32_t)0x62726467) /* 'brdg' */
+#endif /* KERNEL_PRIVATE */
/*
* Definitions for network related sysctl, CTL_NET.
* Fifth: type of info, defined below
* Sixth: flag(s) to mask with for NET_RT_FLAGS
*/
-#define NET_RT_DUMP 1 /* dump; may limit to a.f. */
-#define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */
-#define NET_RT_IFLIST 3 /* survey interface list */
-#define NET_RT_STAT 4 /* routing statistics */
-#define NET_RT_TRASH 5 /* routes not in table but not freed */
-#define NET_RT_IFLIST2 6 /* interface list with addresses */
-#define NET_RT_DUMP2 7 /* dump; may limit to a.f. */
-#define NET_RT_MAXID 8
+#define NET_RT_DUMP 1 /* dump; may limit to a.f. */
+#define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */
+#define NET_RT_IFLIST 3 /* survey interface list */
+#define NET_RT_STAT 4 /* routing statistics */
+#define NET_RT_TRASH 5 /* routes not in table but not freed */
+#define NET_RT_IFLIST2 6 /* interface list with addresses */
+#define NET_RT_DUMP2 7 /* dump; may limit to a.f. */
+#ifdef PRIVATE
+#define NET_RT_DUMPX 8 /* private */
+#define NET_RT_DUMPX_FLAGS 9 /* private */
+#endif /* PRIVATE */
+#define NET_RT_MAXID 10
#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
#ifdef KERNEL_PRIVATE
{ "trash", CTLTYPE_INT }, \
{ "iflist2", CTLTYPE_STRUCT }, \
{ "dump2", CTLTYPE_STRUCT }, \
+ { "dumpx", CTLTYPE_STRUCT }, \
+ { "dumpx_flags", CTLTYPE_STRUCT }, \
}
#endif /* KERNEL_PRIVATE */
};
#ifdef KERNEL
-/* LP64 version of struct msghdr. all pointers
- * grow when we're dealing with a 64-bit process.
- * WARNING - keep in sync with struct msghdr
+/*
+ * In-kernel representation of "struct msghdr" from
+ * userspace. Has enough precision for 32-bit or
+ * 64-bit clients, but does not need to be packed.
*/
struct user_msghdr {
user_addr_t msg_name; /* optional address */
socklen_t msg_namelen; /* size of address */
- user_addr_t msg_iov __attribute((aligned(8))); /* scatter/gather array */
+ user_addr_t msg_iov; /* scatter/gather array */
int msg_iovlen; /* # elements in msg_iov */
- user_addr_t msg_control __attribute((aligned(8))); /* ancillary data, see below */
+ user_addr_t msg_control; /* ancillary data, see below */
socklen_t msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */
};
+/*
+ * LP64 user version of struct msghdr.
+ * WARNING - keep in sync with struct msghdr
+ */
+
+struct user64_msghdr {
+ 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 */
+};
+
+/*
+ * ILP32 user version of struct msghdr.
+ * WARNING - keep in sync with struct msghdr
+ */
+
+struct user32_msghdr {
+ 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 */
+};
+
#endif // KERNEL
#define MSG_OOB 0x1 /* process out-of-band data */
#define MSG_DONTWAIT 0x80 /* this message should be nonblocking */
#define MSG_EOF 0x100 /* data completes connection */
#ifdef __APPLE__
+#ifndef PRIVATE
+#ifdef __APPLE_API_OBSOLETE
+#define MSG_WAITSTREAM 0x200 /* wait up to full request.. may return partial */
+#endif
+#else
#define MSG_WAITSTREAM 0x200 /* wait up to full request.. may return partial */
+#endif
#define MSG_FLUSH 0x400 /* Start of 'hold' seq; dump so_temp */
#define MSG_HOLD 0x800 /* Hold frag in so_temp */
#define MSG_SEND 0x1000 /* Send the packet in so_temp */
/* given pointer to struct cmsghdr, return pointer to data */
#define CMSG_DATA(cmsg) ((unsigned char *)(cmsg) + \
- __DARWIN_ALIGN(sizeof(struct cmsghdr)))
+ __DARWIN_ALIGN32(sizeof(struct cmsghdr)))
+
+/*
+ * RFC 2292 requires to check msg_controllen, in case that the kernel returns
+ * an empty list for some reasons.
+ */
+#define CMSG_FIRSTHDR(mhdr) \
+ ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
+ (struct cmsghdr *)(mhdr)->msg_control : \
+ (struct cmsghdr *)0L)
-/* given pointer to struct cmsghdr, return pointer to next cmsghdr */
-#define CMSG_NXTHDR(mhdr, cmsg) \
- (((unsigned char *)(cmsg) + __DARWIN_ALIGN((__darwin_intptr_t)(cmsg)->cmsg_len) + \
- __DARWIN_ALIGN(sizeof(struct cmsghdr)) > \
- (unsigned char *)(mhdr)->msg_control + (mhdr)->msg_controllen) ? \
- (struct cmsghdr *)0L /* NULL */ : \
- (struct cmsghdr *)((unsigned char *)(cmsg) + __DARWIN_ALIGN((__darwin_intptr_t)(cmsg)->cmsg_len)))
-#define CMSG_FIRSTHDR(mhdr) ((struct cmsghdr *)(mhdr)->msg_control)
+/*
+ * Given pointer to struct cmsghdr, return pointer to next cmsghdr
+ * RFC 2292 says that CMSG_NXTHDR(mhdr, NULL) is equivalent to CMSG_FIRSTHDR(mhdr)
+ */
+#define CMSG_NXTHDR(mhdr, cmsg) \
+ ((char *)(cmsg) == (char *)0L ? CMSG_FIRSTHDR(mhdr) : \
+ ((((unsigned char *)(cmsg) + \
+ __DARWIN_ALIGN32((__uint32_t)(cmsg)->cmsg_len) + \
+ __DARWIN_ALIGN32(sizeof(struct cmsghdr))) > \
+ ((unsigned char *)(mhdr)->msg_control + \
+ (mhdr)->msg_controllen)) ? \
+ (struct cmsghdr *)0L /* NULL */ : \
+ (struct cmsghdr *)(void *)((unsigned char *)(cmsg) + \
+ __DARWIN_ALIGN32((__uint32_t)(cmsg)->cmsg_len))))
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
/* RFC 2292 additions */
-#define CMSG_SPACE(l) (__DARWIN_ALIGN(sizeof(struct cmsghdr)) + __DARWIN_ALIGN(l))
-#define CMSG_LEN(l) (__DARWIN_ALIGN(sizeof(struct cmsghdr)) + (l))
+#define CMSG_SPACE(l) (__DARWIN_ALIGN32(sizeof(struct cmsghdr)) + __DARWIN_ALIGN32(l))
+#define CMSG_LEN(l) (__DARWIN_ALIGN32(sizeof(struct cmsghdr)) + (l))
#ifdef KERNEL
-#define CMSG_ALIGN(n) __DARWIN_ALIGN(n)
+#define CMSG_ALIGN(n) __DARWIN_ALIGN32(n)
#endif
#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
/* "Socket"-level control message types: */
-#define SCM_RIGHTS 0x01 /* access rights (array of int) */
+#define SCM_RIGHTS 0x01 /* access rights (array of int) */
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
-#define SCM_TIMESTAMP 0x02 /* timestamp (struct timeval) */
-#define SCM_CREDS 0x03 /* process creds (struct cmsgcred) */
+#define SCM_TIMESTAMP 0x02 /* timestamp (struct timeval) */
+#define SCM_CREDS 0x03 /* process creds (struct cmsgcred) */
+#define SCM_TIMESTAMP_MONOTONIC 0x04 /* timestamp (uint64_t) */
#ifdef KERNEL_PRIVATE
/*
#ifdef KERNEL
+/* In-kernel representation */
struct user_sf_hdtr {
- user_addr_t headers __attribute((aligned(8))); /* pointer to an array of header struct iovec's */
+ user_addr_t headers; /* pointer to an array of header struct iovec's */
int hdr_cnt; /* number of header iovec's */
- user_addr_t trailers __attribute((aligned(8))); /* pointer to an array of trailer struct iovec's */
+ user_addr_t trailers; /* pointer to an array of trailer struct iovec's */
int trl_cnt; /* number of trailer iovec's */
};
+/* LP64 user version of struct sf_hdtr */
+struct user64_sf_hdtr {
+ user64_addr_t headers; /* pointer to an array of header struct iovec's */
+ int hdr_cnt; /* number of header iovec's */
+ user64_addr_t trailers; /* pointer to an array of trailer struct iovec's */
+ int trl_cnt; /* number of trailer iovec's */
+};
+
+/* ILP32 user version of struct sf_hdtr */
+struct user32_sf_hdtr {
+ user32_addr_t headers; /* pointer to an array of header struct iovec's */
+ int hdr_cnt; /* number of header iovec's */
+ user32_addr_t trailers; /* pointer to an array of trailer struct iovec's */
+ int trl_cnt; /* number of trailer iovec's */
+};
#endif /* KERNEL */
int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS_C(sendto);
int setsockopt(int, int, int, const void *, socklen_t);
int shutdown(int, int);
-int sockatmark(int);
+int sockatmark(int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
int socket(int, int, int);
int socketpair(int, int, int, int *) __DARWIN_ALIAS(socketpair);
void pfctlinput(int, struct sockaddr *);
#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
__END_DECLS
-
#endif /* !KERNEL */
#ifdef KERNEL