xref: /xnu-8796.101.5/bsd/netinet/tcp_private.h (revision aca3beaa3dfbd42498b42c5e5ce20a938e6554e5)
1 /*
2  * Copyright (c) 2000-2018 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 /*
29  * Copyright (c) 1982, 1986, 1993
30  *    The Regents of the University of California.  All rights reserved.
31  *
32  * Redistribution and use in source and binary forms, with or without
33  * modification, are permitted provided that the following conditions
34  * are met:
35  * 1. Redistributions of source code must retain the above copyright
36  *    notice, this list of conditions and the following disclaimer.
37  * 2. Redistributions in binary form must reproduce the above copyright
38  *    notice, this list of conditions and the following disclaimer in the
39  *    documentation and/or other materials provided with the distribution.
40  * 3. All advertising materials mentioning features or use of this software
41  *    must display the following acknowledgement:
42  *    This product includes software developed by the University of
43  *    California, Berkeley and its contributors.
44  * 4. Neither the name of the University nor the names of its contributors
45  *    may be used to endorse or promote products derived from this software
46  *    without specific prior written permission.
47  *
48  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58  * SUCH DAMAGE.
59  *
60  *    @(#)tcp.h    8.1 (Berkeley) 6/10/93
61  * $FreeBSD: src/sys/netinet/tcp.h,v 1.13.2.3 2001/03/01 22:08:42 jlemon Exp $
62  */
63 
64 #ifndef _NETINET_TCP_PRIVATE_H_
65 #define _NETINET_TCP_PRIVATE_H_
66 
67 #include <netinet/in.h>
68 #include <sys/socket.h>
69 #include <sys/types.h>
70 
71 #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
72 
73 #define TCP_INFO                        0x200   /* retrieve tcp_info structure */
74 #define TCP_MEASURE_SND_BW              0x202   /* Measure sender's bandwidth for this connection */
75 
76 #define TCP_MEASURE_BW_BURST    0x203   /* Burst size to use for bandwidth measurement */
77 #define TCP_PEER_PID            0x204   /* Lookup pid of the process we're connected to */
78 #define TCP_ADAPTIVE_READ_TIMEOUT       0x205   /* Read timeout used as a multiple of RTT */
79 #define TCP_OPTION_UNUSED_0             0x206   /* UNUSED */
80 #define TCP_ADAPTIVE_WRITE_TIMEOUT      0x207   /* Write timeout used as a multiple of RTT */
81 #define TCP_NOTIMEWAIT                  0x208   /* Avoid going into time-wait */
82 #define TCP_DISABLE_BLACKHOLE_DETECTION 0x209   /* disable PMTU blackhole detection */
83 #define TCP_ECN_MODE                    0x210   /* fine grain control for A/B testing */
84 #define TCP_KEEPALIVE_OFFLOAD           0x211   /* offload keep alive processing to firmware */
85 
86 /*
87  * TCP_ECN_MODE values
88  */
89 #define ECN_MODE_DEFAULT                0x0     /* per interface or system wide default */
90 #define ECN_MODE_ENABLE                 0x1     /* force enable ECN on connection */
91 #define ECN_MODE_DISABLE                0x2     /* force disable ECN on connection */
92 
93 /*
94  * TCP_NOTIFY_ACKNOWLEDGEMENT
95  *
96  * Application can use this socket option to get a notification when
97  * data that is currently written to the socket is acknowledged. The input
98  * argument given to this socket option is a marker_id that will be used for
99  * returning the notification. The application can continue to write
100  * data after setting the marker. There can be multiple of these events
101  * outstanding on a socket at any time up to a max of TCP_MAX_NOTIFY_ACK.
102  *
103  * To get the completed notifications, getsockopt should be called with the
104  * TCP_NOTIFY_ACKNOWLEDGEMENT with the following tcp_notify_ack_complete
105  * structure as an out argument. At most TCP_MAX_NOTIFY_ACK ids will be
106  * returned if they have been successfully acknowledged in each call.
107  */
108 
109 #define TCP_MAX_NOTIFY_ACK      10
110 
111 typedef u_int32_t       tcp_notify_ack_id_t;
112 
113 struct tcp_notify_ack_complete {
114 	u_int32_t       notify_pending;/* still pending */
115 	u_int32_t       notify_complete_count;
116 	tcp_notify_ack_id_t notify_complete_id[TCP_MAX_NOTIFY_ACK];
117 };
118 
119 #define TCP_NOTIFY_ACKNOWLEDGEMENT      0x212   /* Notify when data is acknowledged */
120 #define MPTCP_SERVICE_TYPE              0x213   /* MPTCP Service type */
121 #define TCP_FASTOPEN_FORCE_HEURISTICS   0x214   /* Make sure TFO-heuristics never get disabled */
122 
123 #define MPTCP_SVCTYPE_HANDOVER          0 /* Default 0 */
124 #define MPTCP_SVCTYPE_INTERACTIVE       1
125 #define MPTCP_SVCTYPE_AGGREGATE         2
126 #define MPTCP_SVCTYPE_TARGET_BASED      3
127 #define MPTCP_SVCTYPE_PURE_HANDOVER     4
128 #define MPTCP_SVCTYPE_MAX               5
129 
130 /*
131  * Specify minimum time in seconds before which an established
132  * TCP connection will not be dropped when there is no response from the
133  * peer
134  */
135 #define TCP_RXT_MINIMUM_TIMEOUT         0x215
136 
137 #define TCP_RXT_MINIMUM_TIMEOUT_LIMIT   (5 * 60) /* Limit is 5 minutes */
138 
139 #define MPTCP_ALTERNATE_PORT            0x216
140 #define MPTCP_FORCE_ENABLE              0x217
141 #define TCP_FASTOPEN_FORCE_ENABLE       0x218
142 #define MPTCP_EXPECTED_PROGRESS_TARGET  0x219
143 #define MPTCP_FORCE_VERSION             0x21a
144 
145 /* When adding new socket-options, you need to make sure MPTCP supports these as well! */
146 
147 /*
148  * The TCP_INFO socket option is a private API and is subject to change
149  */
150 #pragma pack(4)
151 
152 #define TCPI_OPT_TIMESTAMPS     0x01
153 #define TCPI_OPT_SACK           0x02
154 #define TCPI_OPT_WSCALE         0x04
155 #define TCPI_OPT_ECN            0x08
156 
157 #define TCPI_FLAG_LOSSRECOVERY  0x01    /* Currently in loss recovery */
158 #define TCPI_FLAG_STREAMING_ON  0x02    /* Streaming detection on */
159 
160 struct tcp_conn_status {
161 	union {
162 		struct {
163 			unsigned int    probe_activated : 1;
164 			unsigned int    write_probe_failed : 1;
165 			unsigned int    read_probe_failed : 1;
166 			unsigned int    conn_probe_failed : 1;
167 		};
168 		uint32_t        pad_field;
169 	};
170 };
171 
172 /*
173  * Add new fields to this structure at the end only. This will preserve
174  * binary compatibility.
175  */
176 struct tcp_info {
177 	u_int8_t        tcpi_state;                 /* TCP FSM state. */
178 	u_int8_t        tcpi_options;       /* Options enabled on conn. */
179 	u_int8_t        tcpi_snd_wscale;    /* RFC1323 send shift value. */
180 	u_int8_t        tcpi_rcv_wscale;    /* RFC1323 recv shift value. */
181 
182 	u_int32_t       tcpi_flags;                 /* extra flags (TCPI_FLAG_xxx) */
183 
184 	u_int32_t       tcpi_rto;                   /* Retransmission timeout in milliseconds */
185 	u_int32_t       tcpi_snd_mss;       /* Max segment size for send. */
186 	u_int32_t       tcpi_rcv_mss;       /* Max segment size for receive. */
187 
188 	u_int32_t       tcpi_rttcur;        /* Most recent value of RTT */
189 	u_int32_t       tcpi_srtt;          /* Sender's Smoothed RTT */
190 	u_int32_t       tcpi_rttvar;        /* RTT variance */
191 	u_int32_t       tcpi_rttbest;       /* Best RTT we've seen */
192 
193 	u_int32_t       tcpi_snd_ssthresh;  /* Slow start threshold. */
194 	u_int32_t       tcpi_snd_cwnd;      /* Send congestion window. */
195 
196 	u_int32_t       tcpi_rcv_space;     /* Advertised recv window. */
197 
198 	u_int32_t       tcpi_snd_wnd;       /* Advertised send window. */
199 	u_int32_t       tcpi_snd_nxt;       /* Next egress seqno */
200 	u_int32_t       tcpi_rcv_nxt;       /* Next ingress seqno */
201 
202 	int32_t         tcpi_last_outif;    /* if_index of interface used to send last */
203 	u_int32_t       tcpi_snd_sbbytes;   /* bytes in snd buffer including data inflight */
204 
205 	u_int64_t       tcpi_txpackets __attribute__((aligned(8))); /* total packets sent */
206 	u_int64_t       tcpi_txbytes __attribute__((aligned(8)));
207 	/* total bytes sent */
208 	u_int64_t       tcpi_txretransmitbytes __attribute__((aligned(8)));
209 	/* total bytes retransmitted */
210 	u_int64_t       tcpi_txunacked __attribute__((aligned(8)));
211 	/* current number of bytes not acknowledged */
212 	u_int64_t       tcpi_rxpackets __attribute__((aligned(8))); /* total packets received */
213 	u_int64_t       tcpi_rxbytes __attribute__((aligned(8)));
214 	/* total bytes received */
215 	u_int64_t       tcpi_rxduplicatebytes __attribute__((aligned(8)));
216 	/* total duplicate bytes received */
217 	u_int64_t       tcpi_rxoutoforderbytes __attribute__((aligned(8)));
218 	/* total out of order bytes received */
219 	u_int64_t       tcpi_snd_bw __attribute__((aligned(8)));    /* measured send bandwidth in bits/sec */
220 	u_int8_t        tcpi_synrexmits;    /* Number of syn retransmits before connect */
221 	u_int8_t        tcpi_unused1;
222 	u_int16_t       tcpi_unused2;
223 	u_int64_t       tcpi_cell_rxpackets __attribute((aligned(8)));/* packets received over cellular */
224 	u_int64_t       tcpi_cell_rxbytes __attribute((aligned(8)));/* bytes received over cellular */
225 	u_int64_t       tcpi_cell_txpackets __attribute((aligned(8)));/* packets transmitted over cellular */
226 	u_int64_t       tcpi_cell_txbytes __attribute((aligned(8)));/* bytes transmitted over cellular */
227 	u_int64_t       tcpi_wifi_rxpackets __attribute((aligned(8)));/* packets received over Wi-Fi */
228 	u_int64_t       tcpi_wifi_rxbytes __attribute((aligned(8)));/* bytes received over Wi-Fi */
229 	u_int64_t       tcpi_wifi_txpackets __attribute((aligned(8)));/* packets transmitted over Wi-Fi */
230 	u_int64_t       tcpi_wifi_txbytes __attribute((aligned(8)));/* bytes transmitted over Wi-Fi */
231 	u_int64_t       tcpi_wired_rxpackets __attribute((aligned(8)));/* packets received over Wired */
232 	u_int64_t       tcpi_wired_rxbytes __attribute((aligned(8)));/* bytes received over Wired */
233 	u_int64_t       tcpi_wired_txpackets __attribute((aligned(8)));/* packets transmitted over Wired */
234 	u_int64_t       tcpi_wired_txbytes __attribute((aligned(8)));/* bytes transmitted over Wired */
235 	struct tcp_conn_status  tcpi_connstatus;/* status of connection probes */
236 
237 	u_int16_t
238 	    tcpi_tfo_cookie_req:1, /* Cookie requested? */
239 	    tcpi_tfo_cookie_rcv:1, /* Cookie received? */
240 	    tcpi_tfo_syn_loss:1,   /* Fallback to reg. TCP after SYN-loss */
241 	    tcpi_tfo_syn_data_sent:1, /* SYN+data has been sent out */
242 	    tcpi_tfo_syn_data_acked:1, /* SYN+data has been fully acknowledged */
243 	    tcpi_tfo_syn_data_rcv:1, /* Server received SYN+data with a valid cookie */
244 	    tcpi_tfo_cookie_req_rcv:1, /* Server received cookie-request */
245 	    tcpi_tfo_cookie_sent:1, /* Server announced cookie */
246 	    tcpi_tfo_cookie_invalid:1, /* Server received an invalid cookie */
247 	    tcpi_tfo_cookie_wrong:1, /* Our sent cookie was wrong */
248 	    tcpi_tfo_no_cookie_rcv:1, /* We did not receive a cookie upon our request */
249 	    tcpi_tfo_heuristics_disable:1, /* TFO-heuristics disabled it */
250 	    tcpi_tfo_send_blackhole:1, /* A sending-blackhole got detected */
251 	    tcpi_tfo_recv_blackhole:1, /* A receiver-blackhole got detected */
252 	    tcpi_tfo_onebyte_proxy:1; /* A proxy acknowledges all but one byte of the SYN */
253 
254 	u_int16_t       tcpi_ecn_client_setup:1,    /* Attempted ECN setup from client side */
255 	    tcpi_ecn_server_setup:1,                /* Attempted ECN setup from server side */
256 	    tcpi_ecn_success:1,                     /* peer negotiated ECN */
257 	    tcpi_ecn_lost_syn:1,                    /* Lost SYN with ECN setup */
258 	    tcpi_ecn_lost_synack:1,                 /* Lost SYN-ACK with ECN setup */
259 	    tcpi_local_peer:1,                      /* Local to the host or the subnet */
260 	    tcpi_if_cell:1,                 /* Interface is cellular */
261 	    tcpi_if_wifi:1,                 /* Interface is WiFi */
262 	    tcpi_if_wired:1,                /* Interface is wired - ethernet , thunderbolt etc,. */
263 	    tcpi_if_wifi_infra:1,           /* Interface is wifi infrastructure */
264 	    tcpi_if_wifi_awdl:1,            /* Interface is wifi AWDL */
265 	    tcpi_snd_background:1,          /* Using delay based algorithm on sender side */
266 	    tcpi_rcv_background:1;          /* Using delay based algorithm on receive side */
267 
268 	u_int32_t       tcpi_ecn_recv_ce;   /* Packets received with CE */
269 	u_int32_t       tcpi_ecn_recv_cwr;  /* Packets received with CWR */
270 
271 	u_int32_t       tcpi_rcvoopack;     /* out-of-order packets received */
272 	u_int32_t       tcpi_pawsdrop;      /* segments dropped due to PAWS */
273 	u_int32_t       tcpi_sack_recovery_episode;/* SACK recovery episodes */
274 	u_int32_t       tcpi_reordered_pkts;/* packets reorderd */
275 	u_int32_t       tcpi_dsack_sent;    /* Sent DSACK notification */
276 	u_int32_t       tcpi_dsack_recvd;   /* Received a valid DSACK option */
277 	u_int32_t       tcpi_flowhash;      /* Unique id for the connection */
278 
279 	u_int64_t       tcpi_txretransmitpackets __attribute__((aligned(8)));
280 
281 #define TCPINFO_HAS_RCV_RTT 1
282 	u_int32_t       tcpi_rcv_srtt;      /* Receiver's Smoothed RTT */
283 };
284 
285 struct tcp_measure_bw_burst {
286 	u_int32_t       min_burst_size;/* Minimum number of packets to use */
287 	u_int32_t       max_burst_size;/* Maximum number of packets to use */
288 };
289 
290 /*
291  * Note that IPv6 link local addresses should have the appropriate scope ID
292  */
293 
294 struct info_tuple {
295 	u_int8_t        itpl_proto;
296 	union {
297 #if !__has_ptrcheck
298 		struct sockaddr                 _itpl_sa;
299 #endif
300 		struct __sockaddr_header        _itpl_sah;
301 		struct sockaddr_in              _itpl_sin;
302 		struct sockaddr_in6             _itpl_sin6;
303 	} itpl_localaddr;
304 	union {
305 #if !__has_ptrcheck
306 		struct sockaddr                 _itpl_sa;
307 #endif
308 		struct __sockaddr_header        _itpl_sah;
309 		struct sockaddr_in              _itpl_sin;
310 		struct sockaddr_in6             _itpl_sin6;
311 	} itpl_remoteaddr;
312 };
313 
314 #if !__has_ptrcheck
315 #define itpl_local_sa           itpl_localaddr._itpl_sa
316 #define itpl_remote_sa          itpl_remoteaddr._itpl_sa
317 #endif
318 
319 #define itpl_local_sah          itpl_localaddr._itpl_sah
320 #define itpl_local_sin          itpl_localaddr._itpl_sin
321 #define itpl_local_sin6         itpl_localaddr._itpl_sin6
322 #define itpl_remote_sah         itpl_remoteaddr._itpl_sah
323 #define itpl_remote_sin         itpl_remoteaddr._itpl_sin
324 #define itpl_remote_sin6        itpl_remoteaddr._itpl_sin6
325 
326 /*
327  * TCP connection info auxiliary data (CIAUX_TCP)
328  *
329  * Do not add new fields to this structure, just add them to tcp_info
330  * structure towards the end. This will preserve binary compatibility.
331  */
332 typedef struct conninfo_tcp {
333 	struct tcp_info         tcpci_tcp_info;/* TCP info */
334 } conninfo_tcp_t;
335 
336 #pragma pack()
337 
338 struct mptcp_itf_stats {
339 	u_short  ifindex;
340 	uint16_t switches;
341 	uint32_t is_expensive:1;
342 	uint64_t mpis_txbytes __attribute__((aligned(8)));
343 	uint64_t mpis_rxbytes __attribute__((aligned(8)));
344 	uint64_t mpis_wifi_txbytes __attribute__((aligned(8)));
345 	uint64_t mpis_wifi_rxbytes __attribute__((aligned(8)));
346 	uint64_t mpis_wired_txbytes __attribute__((aligned(8)));
347 	uint64_t mpis_wired_rxbytes __attribute__((aligned(8)));
348 	uint64_t mpis_cell_txbytes __attribute__((aligned(8)));
349 	uint64_t mpis_cell_rxbytes __attribute__((aligned(8)));
350 };
351 
352 /* Version solely used to let libnetcore survive */
353 #define CONNINFO_MPTCP_VERSION  3
354 typedef struct conninfo_multipathtcp {
355 	uint32_t        mptcpci_subflow_count;
356 	uint32_t        mptcpci_switch_count;
357 	sae_connid_t    mptcpci_subflow_connids[4];
358 
359 	uint64_t        mptcpci_init_rxbytes;
360 	uint64_t        mptcpci_init_txbytes;
361 
362 #define MPTCP_ITFSTATS_SIZE     4
363 	struct mptcp_itf_stats mptcpci_itfstats[MPTCP_ITFSTATS_SIZE];
364 
365 	uint32_t        mptcpci_flags;
366 #define MPTCPCI_FIRSTPARTY      0x01
367 } conninfo_multipathtcp_t;
368 #endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
369 
370 #endif /* _NETINET_TCP_PRIVATE_H_ */
371