]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/sys/socket.h
xnu-2050.18.24.tar.gz
[apple/xnu.git] / bsd / sys / socket.h
index 026ec3bb2f5e1bab74bc8766f566d9c08e25d9a4..204f5363b867122df7743ab90fffc0f56a11844e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2012 Apple Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
 #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.
  */
@@ -130,6 +138,26 @@ struct iovec {
        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 */
+#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;
+       int32_t         so_tcdbg_tclass;
+       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 */
  
 /*
  * Types
@@ -161,14 +189,16 @@ struct iovec {
 #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_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 */
-#endif
+
+#endif  /* (!__APPLE__) */
 #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
 
 /*
@@ -184,6 +214,8 @@ struct iovec {
 #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 */
@@ -203,11 +235,112 @@ struct iovec {
 #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 */
+/*
+ * 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 */
+#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_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 */
+#endif /* PRIVATE */
 #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
 
 /*
@@ -241,7 +374,8 @@ 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)
+#endif /* KERNEL_PRIVATE */
 
 #endif
 #endif
@@ -317,7 +451,10 @@ struct so_np_extensions {
 #define        AF_NETGRAPH     32              /* Netgraph sockets */
 #endif
 #define AF_IEEE80211    37              /* IEEE 802.11 protocol */
-#define        AF_MAX          38
+#ifdef __APPLE__
+#define AF_UTUN                38
+#endif
+#define        AF_MAX          39
 #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
 
 /*
@@ -417,6 +554,9 @@ struct sockaddr_storage {
 #define        PF_NETGRAPH     AF_NETGRAPH
 #endif
 
+#ifdef __APPLE__
+#define PF_UTUN                AF_UTUN
+#endif
 #define        PF_MAX          AF_MAX
 
 /*
@@ -424,6 +564,9 @@ struct sockaddr_storage {
  */
 #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.
@@ -487,14 +630,18 @@ struct sockaddr_storage {
  *     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
@@ -507,6 +654,8 @@ struct sockaddr_storage {
        { "trash", CTLTYPE_INT }, \
        { "iflist2", CTLTYPE_STRUCT }, \
         { "dump2", CTLTYPE_STRUCT }, \
+        { "dumpx", CTLTYPE_STRUCT }, \
+        { "dumpx_flags", CTLTYPE_STRUCT }, \
 }
 
 #endif /* KERNEL_PRIVATE */
@@ -590,7 +739,13 @@ struct user32_msghdr {
 #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 */
@@ -675,7 +830,7 @@ struct cmsgcred {
            ((unsigned char *)(mhdr)->msg_control +                     \
             (mhdr)->msg_controllen)) ?                                 \
          (struct cmsghdr *)0L /* NULL */ :                             \
-         (struct cmsghdr *)((unsigned char *)(cmsg) +                  \
+         (struct cmsghdr *)(void *)((unsigned char *)(cmsg) +          \
                            __DARWIN_ALIGN32((__uint32_t)(cmsg)->cmsg_len))))
 
 #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
@@ -689,10 +844,11 @@ struct cmsgcred {
 #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
 /*
@@ -714,6 +870,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) */
 
@@ -787,7 +945,7 @@ ssize_t     sendto(int, const void *, size_t,
                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);
 
@@ -799,7 +957,6 @@ int sendfile(int, int, off_t, off_t *, struct sf_hdtr *, int);
 void   pfctlinput(int, struct sockaddr *);
 #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
 __END_DECLS
-
 #endif /* !KERNEL */
 
 #ifdef KERNEL