X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/7e41aa883dd258f888d0470250eead40a53ef1f5..3903760236c30e3b5ace7a4eefac3a269d68957c:/bsd/sys/socketvar.h diff --git a/bsd/sys/socketvar.h b/bsd/sys/socketvar.h index f83ffc529..e3d1dfdf3 100644 --- a/bsd/sys/socketvar.h +++ b/bsd/sys/socketvar.h @@ -2,7 +2,7 @@ * Copyright (c) 2000-2016 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -11,10 +11,10 @@ * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. - * + * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -22,12 +22,12 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* Copyright (c) 1998, 1999 Apple Computer, Inc. All Rights Reserved */ /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ -/*- +/* * Copyright (c) 1982, 1986, 1990, 1993 * The Regents of the University of California. All rights reserved. * @@ -102,23 +102,23 @@ extern char netio[], netcon[], netcls[]; #endif /* KERNEL_PRIVATE */ #ifdef PRIVATE -#define SO_TC_STATS_MAX 4 +#define SO_TC_STATS_MAX 4 struct data_stats { - u_int64_t rxpackets; - u_int64_t rxbytes; - u_int64_t txpackets; - u_int64_t txbytes; + u_int64_t rxpackets; + u_int64_t rxbytes; + u_int64_t txpackets; + u_int64_t txbytes; }; -#define MSG_PRI_0 0 /* TCP message priority, lowest */ -#define MSG_PRI_1 1 -#define MSG_PRI_2 2 -#define MSG_PRI_3 3 /* TCP message priority, highest */ -#define MSG_PRI_MAX MSG_PRI_3 -#define MSG_PRI_MIN MSG_PRI_0 -#define MSG_PRI_COUNT 4 -#define MSG_PRI_DEFAULT MSG_PRI_1 +#define MSG_PRI_0 0 /* TCP message priority, lowest */ +#define MSG_PRI_1 1 +#define MSG_PRI_2 2 +#define MSG_PRI_3 3 /* TCP message priority, highest */ +#define MSG_PRI_MAX MSG_PRI_3 +#define MSG_PRI_MIN MSG_PRI_0 +#define MSG_PRI_COUNT 4 +#define MSG_PRI_DEFAULT MSG_PRI_1 #endif /* PRIVATE */ #ifdef KERNEL_PRIVATE @@ -128,7 +128,7 @@ struct msg_priq { struct mbuf *msgq_tail; /* last mbuf in the queue */ struct mbuf *msgq_lastmsg; /* last message in the queue */ u_int32_t msgq_flags; /* flags per priority queue */ -#define MSGQ_MSG_NOTDONE 0x1 /* set when EOR of a msg is not seen */ +#define MSGQ_MSG_NOTDONE 0x1 /* set when EOR of a msg is not seen */ u_int32_t msgq_bytes; /* data bytes in this queue */ }; @@ -139,7 +139,7 @@ struct msg_state { }; /* mbuf flag used to indicate out of order data received */ -#define M_UNORDERED_DATA M_PROTO1 +#define M_UNORDERED_DATA M_PROTO1 /* * Kernel structure per socket. @@ -173,7 +173,7 @@ struct socket { TAILQ_ENTRY(socket) so_list; /* list of unaccepted connections */ short so_qlen; /* number of unaccepted connections */ short so_incqlen; /* number of unaccepted incomplete - connections */ + connections */ short so_qlimit; /* max number queued connections */ short so_timeo; /* connection timeout */ pid_t so_pgid; /* pgid for signals */ @@ -196,18 +196,18 @@ struct socket { struct timeval sb_timeo; /* timeout for read/write */ u_int32_t sb_flags; /* flags, see below */ u_int32_t sb_idealsize; /* Ideal size for the sb based - on bandwidth and delay */ + on bandwidth and delay */ void (*sb_upcall)(struct socket *, void *arg, int waitf); void *sb_upcallarg; /* Arg for above */ u_int32_t sb_wantlock; /* # of SB_LOCK waiters */ u_int32_t sb_waiters; /* # of data/space waiters */ thread_t sb_cfil_thread; /* content filter thread */ u_int32_t sb_cfil_refs; /* # of nested calls */ - u_int32_t sb_preconn_hiwat;/* preconnect hiwat mark */ + u_int32_t sb_preconn_hiwat; /* preconnect hiwat mark */ } so_rcv, so_snd; #define SB_MAX (8192*1024) /* default for max chars in sockbuf */ -#define LOW_SB_MAX (2*9*1024) /* lower limit on max socket buffer - size, 2 max datagrams */ +#define LOW_SB_MAX (2*9*1024) /* lower limit on max socket buffer + size, 2 max datagrams */ #define SB_LOCK 0x1 /* lock on data queue */ #define SB_NOINTR 0x2 /* operations not interruptible */ #define SB_RECV 0x4 /* this is rcv sb */ @@ -217,12 +217,13 @@ struct socket { #define SB_KNOTE 0x40 /* kernel note attached */ #define SB_DROP 0x80 /* does not accept any more data */ #define SB_UNIX 0x100 /* UNIX domain socket buffer */ -#define SB_USRSIZE 0x200 /* user specified sbreserve */ +#define SB_USRSIZE 0x200 /* user specified sbreserve */ #define SB_AUTOSIZE 0x400 /* automatically size socket buffer */ #define SB_TRIM 0x800 /* Trim the socket buffer */ #define SB_NOCOMPRESS 0x1000 /* do not compress socket buffer */ +#define SB_SNDBYTE_CNT 0x2000 /* keep track of snd bytes per interface */ caddr_t so_tpcb; /* Misc. protocol control block, used - by some kexts */ + by some kexts */ void (*so_event)(struct socket *, void *, u_int32_t); void *so_eventarg; /* Arg for above */ @@ -231,7 +232,7 @@ struct socket { so_gen_t so_gencnt; /* generation count */ TAILQ_HEAD(, eventqelt) so_evlist; STAILQ_ENTRY(socket) so_cache_ent; /* socache entry */ - caddr_t so_saved_pcb; /* Saved pcb when cacheing */ + caddr_t so_saved_pcb; /* Saved pcb when cacheing */ u_int32_t cache_timestamp; /* time socket was cached */ pid_t last_pid; /* pid of most recent accessor */ @@ -241,43 +242,43 @@ struct socket { /* Plug-in support - make the socket interface overridable */ struct mbuf *so_tail; struct socket_filter_entry *so_filt; /* NKE hook */ - u_int32_t so_flags; /* Flags */ + u_int32_t so_flags; /* Flags */ #define SOF_NOSIGPIPE 0x00000001 #define SOF_NOADDRAVAIL 0x00000002 /* EADDRNOTAVAIL if src addr is gone */ #define SOF_PCBCLEARING 0x00000004 /* pru_disconnect done; don't - call pru_detach */ + call pru_detach */ #define SOF_DEFUNCT 0x00000008 /* socket marked as inactive */ #define SOF_CLOSEWAIT 0x00000010 /* blocked in close awaiting some events */ -#define SOF_REUSESHAREUID 0x00000040 /* Allows SO_REUSEADDR/SO_REUSEPORT - for multiple so_uid */ +#define SOF_REUSESHAREUID 0x00000040 /* Allows SO_REUSEADDR/SO_REUSEPORT + for multiple so_uid */ #define SOF_MULTIPAGES 0x00000080 /* jumbo clusters may be used for sosend */ -#define SOF_ABORTED 0x00000100 /* soabort was already called once */ -#define SOF_OVERFLOW 0x00000200 /* socket was dropped as overflow of - listen q */ -#define SOF_NOTIFYCONFLICT 0x00000400 /* notify that a bind was done on a - port already in use */ +#define SOF_ABORTED 0x00000100 /* soabort was already called once */ +#define SOF_OVERFLOW 0x00000200 /* socket was dropped as overflow of + listen q */ +#define SOF_NOTIFYCONFLICT 0x00000400 /* notify that a bind was done on a + port already in use */ #define SOF_UPCALLCLOSEWAIT 0x00000800 /* block close until upcall returns */ -#define SOF_BINDRANDOMPORT 0x00001000 /* Randomized port number for bind */ -#define SOF_NPX_SETOPTSHUT 0x00002000 /* Non POSIX extension to allow - setsockopt(2) after shut down */ -#define SOF_RECV_TRAFFIC_CLASS 0x00004000 /* Receive TC as ancillary data */ +#define SOF_BINDRANDOMPORT 0x00001000 /* Randomized port number for bind */ +#define SOF_NPX_SETOPTSHUT 0x00002000 /* Non POSIX extension to allow + setsockopt(2) after shut down */ +#define SOF_RECV_TRAFFIC_CLASS 0x00004000 /* Receive TC as ancillary data */ #define SOF_NODEFUNCT 0x00008000 /* socket cannot be defunct'd */ #define SOF_PRIVILEGED_TRAFFIC_CLASS 0x00010000 /* traffic class is privileged */ -#define SOF_SUSPENDED 0x00020000 /* i/f output queue is suspended */ -#define SOF_INCOMP_INPROGRESS 0x00040000 /* incomp socket is being processed */ +#define SOF_SUSPENDED 0x00020000 /* i/f output queue is suspended */ +#define SOF_INCOMP_INPROGRESS 0x00040000 /* incomp socket is being processed */ #define SOF_NOTSENT_LOWAT 0x00080000 /* A different lowat on not sent - data has been set */ -#define SOF_KNOTE 0x00100000 /* socket is on the EV_SOCK klist */ -#define SOF_USELRO 0x00200000 /* TCP must use LRO on these sockets */ -#define SOF_ENABLE_MSGS 0x00400000 /* TCP must enable message delivery */ -#define SOF_FLOW_DIVERT 0x00800000 /* Flow Divert is enabled */ + data has been set */ +#define SOF_KNOTE 0x00100000 /* socket is on the EV_SOCK klist */ +#define SOF_USELRO 0x00200000 /* TCP must use LRO on these sockets */ +#define SOF_ENABLE_MSGS 0x00400000 /* TCP must enable message delivery */ +#define SOF_FLOW_DIVERT 0x00800000 /* Flow Divert is enabled */ #define SOF_MP_SUBFLOW 0x01000000 /* is a multipath subflow socket */ -#define SOF_MPTCP_TRUE 0x02000000 /* Established e2e MPTCP connection */ -#define SOF_MPTCP_CLIENT 0x04000000 /* Only client starts addtnal flows */ -#define SOF_MP_SEC_SUBFLOW 0x08000000 /* Set up secondary flow */ -#define SOF_MP_TRYFAILOVER 0x10000000 /* Failing subflow */ +#define SOF_MPTCP_TRUE 0x02000000 /* Established e2e MPTCP connection */ +#define SOF_MPTCP_CLIENT 0x04000000 /* Only client starts addtnal flows */ +#define SOF_MP_SEC_SUBFLOW 0x08000000 /* Set up secondary flow */ +#define SOF_MP_TRYFAILOVER 0x10000000 /* Failing subflow */ #define SOF_DELEGATED 0x20000000 /* on behalf of another process */ -#define SOF_MPTCP_FASTJOIN 0x40000000 /* fast join support */ +#define SOF_MPTCP_FASTJOIN 0x40000000 /* fast join support */ #define SOF_CONTENT_FILTER 0x80000000 /* Content filter enabled */ uint32_t so_upcallusecount; /* number of upcalls in progress */ @@ -285,7 +286,7 @@ struct socket { int so_retaincnt; u_int32_t so_filteruse; /* usecount for the socket filters */ u_int16_t so_traffic_class; - u_int8_t so_traffic_mgt_flags; /* traffic_mgt socket config */ + int8_t so_netsvctype; u_int8_t so_restrictions; thread_t so_send_filt_thread; @@ -303,7 +304,7 @@ struct socket { struct label *so_label; /* MAC label for socket */ struct label *so_peerlabel; /* cached MAC label for socket peer */ thread_t so_background_thread; /* thread that marked - this socket background */ + this socket background */ struct data_stats so_tc_stats[SO_TC_STATS_MAX]; struct klist so_klist; /* klist for EV_SOCK events */ @@ -324,37 +325,42 @@ struct socket { int32_t so_policy_gencnt; /* UUID policy gencnt */ u_int32_t so_flags1; -#define SOF1_POST_FALLBACK_SYNC 0x00000001 /* fallback to TCP */ -#define SOF1_AWDL_PRIVILEGED 0x00000002 -#define SOF1_IF_2KCL 0x00000004 /* interface prefers 2 KB clusters */ -#define SOF1_DEFUNCTINPROG 0x00000008 -#define SOF1_DATA_IDEMPOTENT 0x00000010 /* idempotent data for TFO */ -#define SOF1_PRECONNECT_DATA 0x00000020 /* request for preconnect data */ +#define SOF1_POST_FALLBACK_SYNC 0x00000001 /* fallback to TCP */ +#define SOF1_AWDL_PRIVILEGED 0x00000002 /* unused */ +#define SOF1_IF_2KCL 0x00000004 /* interface prefers 2 KB clusters */ +#define SOF1_DEFUNCTINPROG 0x00000008 +#define SOF1_DATA_IDEMPOTENT 0x00000010 /* idempotent data for TFO */ +#define SOF1_PRECONNECT_DATA 0x00000020 /* request for preconnect data */ #define SOF1_EXTEND_BK_IDLE_WANTED 0x00000040 /* option set */ #define SOF1_EXTEND_BK_IDLE_INPROG 0x00000080 /* socket */ #define SOF1_CACHED_IN_SOCK_LAYER 0x00000100 /* bundled with inpcb and tcpcb */ -#define SOF1_TFO_REWIND 0x00000200 /* rewind mptcp meta data */ -#define SOF1_CELLFALLBACK 0x00000400 /* Initiated by cell fallback */ +#define SOF1_TFO_REWIND 0x00000200 /* rewind mptcp meta data */ +#define SOF1_CELLFALLBACK 0x00000400 /* Initiated by cell fallback */ +#define SOF1_QOSMARKING_ALLOWED 0x00000800 /* policy allows DSCP map */ +#define SOF1_TC_NET_SERV_TYPE 0x00001000 /* traffic class set by SO_NETWORK_SERVICE_TYPE */ +#define SOF1_TRAFFIC_MGT_SO_BACKGROUND 0x00002000 /* background socket */ +#define SOF1_TRAFFIC_MGT_TCP_RECVBG 0x00004000 /* Only TCP sockets, receiver throttling */ +#define SOF1_QOSMARKING_POLICY_OVERRIDE 0x00008000 /* Opt-out of QoS marking NECP policy */ u_int64_t so_extended_bk_start; }; /* Control message accessor in mbufs */ -#define _MIN_NXT_CMSGHDR_PTR(cmsg) \ +#define _MIN_NXT_CMSGHDR_PTR(cmsg) \ ((char *)(cmsg) + \ __DARWIN_ALIGN32((__uint32_t)(cmsg)->cmsg_len) + \ __DARWIN_ALIGN32(sizeof(struct cmsghdr))) -#define M_FIRST_CMSGHDR(m) \ - ((char *)(m) != (char *)0L && \ +#define M_FIRST_CMSGHDR(m) \ + ((char *)(m) != (char *)0L && \ (size_t)(m)->m_len >= sizeof (struct cmsghdr) && \ (socklen_t)(m)->m_len >= \ __DARWIN_ALIGN32(((struct cmsghdr *)(void *)(m)->m_data)->cmsg_len) ? \ (struct cmsghdr *)(void *)(m)->m_data : (struct cmsghdr *)0L) -#define M_NXT_CMSGHDR(m, cmsg) \ - ((char *)(cmsg) == (char *)0L ? M_FIRST_CMSGHDR(m) : \ +#define M_NXT_CMSGHDR(m, cmsg) \ + ((char *)(cmsg) == (char *)0L ? M_FIRST_CMSGHDR(m) : \ _MIN_NXT_CMSGHDR_PTR(cmsg) > ((char *)(m)->m_data) + (m)->m_len || \ _MIN_NXT_CMSGHDR_PTR(cmsg) < (char *)(m)->m_data ? \ (struct cmsghdr *)0L /* NULL */ : \ @@ -380,7 +386,7 @@ struct socket { #define SS_COMP 0x1000 /* unaccepted, complete connection */ #define SS_ISDISCONNECTED 0x2000 /* socket disconnected from peer */ #define SS_DRAINING 0x4000 /* close waiting for blocked system - calls to drain */ + calls to drain */ #define SS_DEFUNCT 0x8000 /* has been fully defunct'd */ #endif /* KERNEL_PRIVATE */ @@ -392,8 +398,8 @@ struct socket { #ifdef PRIVATE /* Flags returned in data field for EVFILT_SOCK events. */ -#define SOCKEV_CONNECTED 0x00000001 /* connected */ -#define SOCKEV_DISCONNECTED 0x00000002 /* disconnected */ +#define SOCKEV_CONNECTED 0x00000001 /* connected */ +#define SOCKEV_DISCONNECTED 0x00000002 /* disconnected */ #endif /* PRIVATE */ #pragma pack(4) @@ -456,15 +462,15 @@ struct xsocket64 { }; #ifdef PRIVATE -#define XSO_SOCKET 0x001 -#define XSO_RCVBUF 0x002 -#define XSO_SNDBUF 0x004 -#define XSO_STATS 0x008 -#define XSO_INPCB 0x010 -#define XSO_TCPCB 0x020 -#define XSO_KCREG 0x040 -#define XSO_KCB 0x080 -#define XSO_EVT 0x100 +#define XSO_SOCKET 0x001 +#define XSO_RCVBUF 0x002 +#define XSO_SNDBUF 0x004 +#define XSO_STATS 0x008 +#define XSO_INPCB 0x010 +#define XSO_TCPCB 0x020 +#define XSO_KCREG 0x040 +#define XSO_KCB 0x080 +#define XSO_EVT 0x100 struct xsocket_n { u_int32_t xso_len; /* length of this structure */ @@ -572,44 +578,46 @@ struct kextcb { #define EXT_NULL 0x0 /* STATE: Not in use */ /* Hints for socket event processing */ -#define SO_FILT_HINT_LOCKED 0x00000001 /* socket is already locked */ -#define SO_FILT_HINT_CONNRESET 0x00000002 /* Reset is received */ -#define SO_FILT_HINT_CANTRCVMORE 0x00000004 /* No more data to read */ -#define SO_FILT_HINT_CANTSENDMORE 0x00000008 /* Can't write more data */ -#define SO_FILT_HINT_TIMEOUT 0x00000010 /* timeout */ -#define SO_FILT_HINT_NOSRCADDR 0x00000020 /* No src address available */ -#define SO_FILT_HINT_IFDENIED 0x00000040 /* interface denied access */ -#define SO_FILT_HINT_SUSPEND 0x00000080 /* output queue suspended */ -#define SO_FILT_HINT_RESUME 0x00000100 /* output queue resumed */ -#define SO_FILT_HINT_KEEPALIVE 0x00000200 /* TCP Keepalive received */ -#define SO_FILT_HINT_ADAPTIVE_WTIMO 0x00000400 /* TCP adaptive write timeout */ -#define SO_FILT_HINT_ADAPTIVE_RTIMO 0x00000800 /* TCP adaptive read timeout */ -#define SO_FILT_HINT_CONNECTED 0x00001000 /* socket is connected */ -#define SO_FILT_HINT_DISCONNECTED 0x00002000 /* socket is disconnected */ -#define SO_FILT_HINT_CONNINFO_UPDATED 0x00004000 /* updated conninfo avail. */ +#define SO_FILT_HINT_LOCKED 0x00000001 /* socket is already locked */ +#define SO_FILT_HINT_CONNRESET 0x00000002 /* Reset is received */ +#define SO_FILT_HINT_CANTRCVMORE 0x00000004 /* No more data to read */ +#define SO_FILT_HINT_CANTSENDMORE 0x00000008 /* Can't write more data */ +#define SO_FILT_HINT_TIMEOUT 0x00000010 /* timeout */ +#define SO_FILT_HINT_NOSRCADDR 0x00000020 /* No src address available */ +#define SO_FILT_HINT_IFDENIED 0x00000040 /* interface denied access */ +#define SO_FILT_HINT_SUSPEND 0x00000080 /* output queue suspended */ +#define SO_FILT_HINT_RESUME 0x00000100 /* output queue resumed */ +#define SO_FILT_HINT_KEEPALIVE 0x00000200 /* TCP Keepalive received */ +#define SO_FILT_HINT_ADAPTIVE_WTIMO 0x00000400 /* TCP adaptive write timeout */ +#define SO_FILT_HINT_ADAPTIVE_RTIMO 0x00000800 /* TCP adaptive read timeout */ +#define SO_FILT_HINT_CONNECTED 0x00001000 /* socket is connected */ +#define SO_FILT_HINT_DISCONNECTED 0x00002000 /* socket is disconnected */ +#define SO_FILT_HINT_CONNINFO_UPDATED 0x00004000 /* updated conninfo avail. */ #define SO_FILT_HINT_MPFAILOVER 0x00008000 /* multipath failover */ #define SO_FILT_HINT_MPSTATUS 0x00010000 /* multipath status */ -#define SO_FILT_HINT_MUSTRST 0x00020000 /* must send RST and close */ -#define SO_FILT_HINT_MPFASTJ 0x00040000 /* can do MPTCP fast join */ -#define SO_FILT_HINT_DELETEOK 0x00100000 /* Ok to delete socket */ -#define SO_FILT_HINT_MPCANTRCVMORE 0x00200000 /* MPTCP DFIN Received */ +#define SO_FILT_HINT_MUSTRST 0x00020000 /* must send RST and close */ +#define SO_FILT_HINT_MPFASTJ 0x00040000 /* can do MPTCP fast join */ +#define SO_FILT_HINT_DELETEOK 0x00100000 /* Ok to delete socket */ +#define SO_FILT_HINT_MPCANTRCVMORE 0x00200000 /* MPTCP DFIN Received */ +#define SO_FILT_HINT_NOTIFY_ACK 0x00400000 /* Notify Acknowledgement */ #define SO_FILT_HINT_BITS \ "\020\1LOCKED\2CONNRESET\3CANTRCVMORE\4CANTSENDMORE\5TIMEOUT" \ "\6NOSRCADDR\7IFDENIED\10SUSPEND\11RESUME\12KEEPALIVE\13AWTIMO" \ "\14ARTIMO\15CONNECTED\16DISCONNECTED\17CONNINFO_UPDATED" \ "\20MPFAILOVER\21MPSTATUS\22MUSTRST\23MPFASTJ\25DELETEOK" \ - "\26MPCANTRCVMORE" + "\26MPCANTRCVMORE\27NOTIFYACK" /* Mask for hints that have corresponding kqueue events */ -#define SO_FILT_HINT_EV \ +#define SO_FILT_HINT_EV \ (SO_FILT_HINT_CONNRESET | SO_FILT_HINT_CANTRCVMORE | \ SO_FILT_HINT_CANTSENDMORE | SO_FILT_HINT_TIMEOUT | \ SO_FILT_HINT_NOSRCADDR | SO_FILT_HINT_IFDENIED | \ SO_FILT_HINT_SUSPEND | SO_FILT_HINT_RESUME | \ SO_FILT_HINT_KEEPALIVE | SO_FILT_HINT_ADAPTIVE_WTIMO | \ SO_FILT_HINT_ADAPTIVE_RTIMO | SO_FILT_HINT_CONNECTED | \ - SO_FILT_HINT_DISCONNECTED | SO_FILT_HINT_CONNINFO_UPDATED) + SO_FILT_HINT_DISCONNECTED | SO_FILT_HINT_CONNINFO_UPDATED | \ + SO_FILT_HINT_NOTIFY_ACK) #if SENDFILE struct sf_buf { @@ -633,26 +641,33 @@ struct sf_buf { } \ } -#define SB_MB_CHECK(sb) do { \ +#define SB_MB_CHECK(sb) do { \ if (((sb)->sb_mb != NULL && \ (sb)->sb_cc == 0) || \ ((sb)->sb_mb == NULL && (sb)->sb_cc > 0)) \ panic("corrupt so_rcv: sb_mb %p sb_cc %d\n", \ (sb)->sb_mb, (sb)->sb_cc); \ -} while(0) +} while (0) -#define SODEFUNCTLOG(x) do { if (sodefunctlog) printf x; } while (0) -#define SOTHROTTLELOG(x) do { if (sothrottlelog) printf x; } while (0) +#define SODEFUNCTLOG(fmt, ...) do { \ + if (sodefunctlog) \ + printf(fmt, __VA_ARGS__); \ +} while (0) + +#define SOTHROTTLELOG(fmt, ...) do { \ + if (sothrottlelog) \ + printf(fmt, __VA_ARGS__); \ +} while (0) /* * For debugging traffic class behaviors */ -#define SOTCDB_NO_DSCP 0x01 /* Do not set DSCP code in IP header */ -#define SOTCDB_NO_MTC 0x02 /* Do not set the mbuf traffic class */ -#define SOTCDB_NO_SENDTCPBG 0x04 /* Do not use background TCP CC algorithm for sender */ -#define SOTCDB_NO_LCLTST 0x08 /* Do not test for local destination for setting DSCP */ -#define SOTCDB_NO_DSCPTST 0x10 /* Overwritte any existing DSCP code */ -#define SOTCDB_NO_RECVTCPBG 0x20 /* Do not use throttling on receiver-side of TCP */ +#define SOTCDB_RESERVED 0x01 +#define SOTCDB_NO_MTC 0x02 /* Do not set the mbuf traffic class */ +#define SOTCDB_NO_SENDTCPBG 0x04 /* Do not use background TCP CC algorithm for sender */ +#define SOTCDB_NO_LCLTST 0x08 /* Do not test for local destination for setting DSCP */ +#define SOTCDB_NO_DSCPTST 0x10 /* Overwritte any existing DSCP code */ +#define SOTCDB_NO_RECVTCPBG 0x20 /* Do not use throttling on receiver-side of TCP */ #define SOTCDB_NO_PRIVILEGED 0x40 /* Do not set privileged traffic flag */ #define SOCK_DOM(so) ((so)->so_proto->pr_domain->dom_family) @@ -695,6 +710,11 @@ extern u_int32_t net_io_policy_uuid; extern struct soextbkidlestat soextbkidlestat; +struct net_qos_dscp_map { + u_int8_t sotc_to_dscp[SO_TC_MAX]; + u_int8_t netsvctype_to_dscp[_NET_SERVICE_TYPE_COUNT]; +}; + #endif /* BSD_KERNEL_PRIVATE */ struct mbuf; @@ -748,9 +768,10 @@ extern void soreserve_preconnect(struct socket *so, unsigned int pre_cc); extern void sorwakeup(struct socket *so); extern int sosend(struct socket *so, struct sockaddr *addr, struct uio *uio, struct mbuf *top, struct mbuf *control, int flags); -extern int sosend_list(struct socket *so, struct uio **uio, u_int uiocnt, int flags); -extern int soreceive_list(struct socket *so, struct recv_msg_elem *msgarray, u_int msgcnt, - int *flags); +extern int sosend_list(struct socket *so, struct uio **uio, u_int uiocnt, + int flags); +extern int soreceive_list(struct socket *so, struct recv_msg_elem *msgarray, + u_int msgcnt, int *flags); extern void sonullevent(struct socket *so, void *arg, uint32_t hint); __END_DECLS @@ -787,7 +808,7 @@ extern void sblastmbufchk(struct sockbuf *, const char *); extern void sblastrecordchk(struct sockbuf *, const char *); extern struct mbuf *sbcreatecontrol(caddr_t p, int size, int type, int level); extern struct mbuf **sbcreatecontrol_mbuf(caddr_t p, int size, int type, - int level, struct mbuf** m); + int level, struct mbuf **m); extern void sbdrop(struct sockbuf *sb, int len); extern void sbdroprecord(struct sockbuf *sb); extern int sbinsertoob(struct sockbuf *sb, struct mbuf *m0); @@ -825,7 +846,7 @@ extern int soconnectlock(struct socket *so, struct sockaddr *nam, int dolock); extern int soconnect2(struct socket *so1, struct socket *so2); extern int soconnectxlocked(struct socket *so, struct sockaddr_list **src_sl, struct sockaddr_list **dst_sl, struct proc *, uint32_t, sae_associd_t, - sae_connid_t *, uint32_t, void *, u_int32_t, uio_t, user_ssize_t*); + sae_connid_t *, uint32_t, void *, u_int32_t, uio_t, user_ssize_t *); extern int sodisconnectx(struct socket *so, sae_associd_t, sae_connid_t); extern int sodisconnectxlocked(struct socket *so, sae_associd_t, sae_connid_t); extern int sopeelofflocked(struct socket *so, sae_associd_t, struct socket **); @@ -836,7 +857,8 @@ extern void soevupcall(struct socket *, u_int32_t); extern int socreate_internal(int dom, struct socket **aso, int type, int proto, struct proc *, uint32_t, struct proc *); extern int socreate(int dom, struct socket **aso, int type, int proto); -extern int socreate_delegate(int dom, struct socket **aso, int type, int proto, pid_t epid); +extern int socreate_delegate(int dom, struct socket **aso, int type, int proto, + pid_t epid); extern void sodealloc(struct socket *so); extern int sodisconnectlocked(struct socket *so); extern void soreference(struct socket *so); @@ -900,22 +922,23 @@ extern struct sockaddr_list *sockaddrlist_dup(const struct sockaddr_list *, int); /* Service class flags used for setting service class on a packet */ -#define PKT_SCF_IPV6 0x00000001 /* IPv6 packet */ -#define PKT_SCF_TCP_ACK 0x00000002 /* Pure TCP ACK */ +#define PKT_SCF_IPV6 0x00000001 /* IPv6 packet */ +#define PKT_SCF_TCP_ACK 0x00000002 /* Pure TCP ACK */ +#define PKT_SCF_TCP_SYN 0x00000004 /* TCP SYN */ /* * Flags for connectx(2) user-protocol request routine. */ #define CONNREQF_MPTCP 0x1 /* called internally by MPTCP */ -#define CONNREQF_UIO 0x2 /* there's data */ -#define CONNREQF_IDEM 0x4 /* data is idempotent */ +#define CONNREQF_UIO 0x2 /* there's data */ +#define CONNREQF_IDEM 0x4 /* data is idempotent */ extern void set_packet_service_class(struct mbuf *, struct socket *, mbuf_svc_class_t, u_int32_t); extern void so_tc_update_stats(struct mbuf *, struct socket *, mbuf_svc_class_t); -extern mbuf_svc_class_t mbuf_service_class_from_control(struct mbuf *); +extern int so_tc_from_control(struct mbuf *, int *); extern mbuf_svc_class_t so_tc2msc(int); extern int so_svc2tc(mbuf_svc_class_t); @@ -923,6 +946,7 @@ extern u_int8_t tcp_cansbgrow(struct sockbuf *sb); extern int tcp_get_msg_priority(struct mbuf *, uint32_t *); extern void set_tcp_stream_priority(struct socket *so); +extern int so_set_net_service_type(struct socket *, int); extern int so_set_traffic_class(struct socket *, int); extern void so_set_default_traffic_class(struct socket *); extern int so_set_opportunistic(struct socket *, int); @@ -934,9 +958,11 @@ extern int so_set_effective_uuid(struct socket *, uuid_t, struct proc *); extern int so_set_restrictions(struct socket *, uint32_t); extern uint32_t so_get_restrictions(struct socket *); extern void socket_tclass_init(void); +#if (DEVELOPMENT || DEBUG) extern int so_set_tcdbg(struct socket *, struct so_tcdbg *); extern int sogetopt_tcdbg(struct socket *, struct sockopt *); -extern void so_set_lro(struct socket*, int); +#endif /* (DEVELOPMENT || DEBUG) */ +extern void so_set_lro(struct socket *, int); extern int so_isdstlocal(struct socket *); extern void so_recv_data_stat(struct socket *, struct mbuf *, size_t); @@ -958,7 +984,7 @@ extern void netpolicy_post_msg(uint32_t, struct netpolicy_event_data *, extern void socket_post_kev_msg(uint32_t, struct kev_socket_event_data *, uint32_t); extern void socket_post_kev_msg_closed(struct socket *); -/* +/* * Socket operation routines. * These routines are called by the routines in * sys_socket.c or from a system process, and