xref: /xnu-10002.61.3/bsd/netinet/tcp_private.h (revision 0f4c859e951fba394238ab619495c4e1d54d0f34)
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 #define TCP_ENABLE_L4S                  0x21b   /* Enable or disable L4S */
145 
146 /* When adding new socket-options, you need to make sure MPTCP supports these as well! */
147 
148 /*
149  * The TCP_INFO socket option is a private API and is subject to change
150  */
151 #pragma pack(4)
152 
153 #define TCPI_OPT_TIMESTAMPS     0x01
154 #define TCPI_OPT_SACK           0x02
155 #define TCPI_OPT_WSCALE         0x04
156 #define TCPI_OPT_ECN            0x08
157 
158 #define TCPI_FLAG_LOSSRECOVERY  0x01    /* Currently in loss recovery */
159 #define TCPI_FLAG_STREAMING_ON  0x02    /* Streaming detection on */
160 
161 struct tcp_conn_status {
162 	union {
163 		struct {
164 			unsigned int    probe_activated : 1;
165 			unsigned int    write_probe_failed : 1;
166 			unsigned int    read_probe_failed : 1;
167 			unsigned int    conn_probe_failed : 1;
168 		};
169 		uint32_t        pad_field;
170 	};
171 };
172 
173 #define TCPINFO_HAS_L4S_ 1
174 typedef enum {
175 	tcp_connection_client_accurate_ecn_invalid                                    = 0,
176 	tcp_connection_client_accurate_ecn_feature_disabled                           = 1,
177 	tcp_connection_client_accurate_ecn_feature_enabled                            = 2,
178 	tcp_connection_client_classic_ecn_available                                   = 3,
179 	tcp_connection_client_ecn_not_available                                       = 4,
180 	tcp_connection_client_accurate_ecn_negotiation_blackholed                     = 5,
181 	tcp_connection_client_accurate_ecn_ace_bleaching_detected                     = 6,
182 	tcp_connection_client_accurate_ecn_negotiation_success                        = 7,
183 	tcp_connection_client_accurate_ecn_negotiation_success_ect_mangling_detected  = 8,
184 	tcp_connection_client_accurate_ecn_negotiation_success_ect_bleaching_detected = 9,
185 } tcp_connection_client_accurate_ecn_state_t;
186 
187 typedef enum {
188 	tcp_connection_server_accurate_ecn_invalid                                    = 0,
189 	tcp_connection_server_accurate_ecn_feature_disabled                           = 1,
190 	tcp_connection_server_accurate_ecn_feature_enabled                            = 2,
191 	tcp_connection_server_no_ecn_requested                                        = 3,
192 	tcp_connection_server_classic_ecn_requested                                   = 4,
193 	tcp_connection_server_accurate_ecn_requested                                  = 5,
194 	tcp_connection_server_accurate_ecn_negotiation_blackholed                     = 6,
195 	tcp_connection_server_accurate_ecn_ace_bleaching_detected                     = 7,
196 	tcp_connection_server_accurate_ecn_negotiation_success                        = 8,
197 	tcp_connection_server_accurate_ecn_negotiation_success_ect_mangling_detected  = 9,
198 	tcp_connection_server_accurate_ecn_negotiation_success_ect_bleaching_detected = 10,
199 } tcp_connection_server_accurate_ecn_state_t;
200 
201 /*
202  * Add new fields to this structure at the end only. This will preserve
203  * binary compatibility.
204  */
205 struct tcp_info {
206 	u_int8_t        tcpi_state;                 /* TCP FSM state. */
207 	u_int8_t        tcpi_options;       /* Options enabled on conn. */
208 	u_int8_t        tcpi_snd_wscale;    /* RFC1323 send shift value. */
209 	u_int8_t        tcpi_rcv_wscale;    /* RFC1323 recv shift value. */
210 
211 	u_int32_t       tcpi_flags;                 /* extra flags (TCPI_FLAG_xxx) */
212 
213 	u_int32_t       tcpi_rto;                   /* Retransmission timeout in milliseconds */
214 	u_int32_t       tcpi_snd_mss;       /* Max segment size for send. */
215 	u_int32_t       tcpi_rcv_mss;       /* Max segment size for receive. */
216 
217 	u_int32_t       tcpi_rttcur;        /* Most recent value of RTT */
218 	u_int32_t       tcpi_srtt;          /* Sender's Smoothed RTT */
219 	u_int32_t       tcpi_rttvar;        /* RTT variance */
220 	u_int32_t       tcpi_rttbest;       /* Best RTT we've seen */
221 
222 	u_int32_t       tcpi_snd_ssthresh;  /* Slow start threshold. */
223 	u_int32_t       tcpi_snd_cwnd;      /* Send congestion window. */
224 
225 	u_int32_t       tcpi_rcv_space;     /* Advertised recv window. */
226 
227 	u_int32_t       tcpi_snd_wnd;       /* Advertised send window. */
228 	u_int32_t       tcpi_snd_nxt;       /* Next egress seqno */
229 	u_int32_t       tcpi_rcv_nxt;       /* Next ingress seqno */
230 
231 	int32_t         tcpi_last_outif;    /* if_index of interface used to send last */
232 	u_int32_t       tcpi_snd_sbbytes;   /* bytes in snd buffer including data inflight */
233 
234 	u_int64_t       tcpi_txpackets __attribute__((aligned(8))); /* total packets sent */
235 	u_int64_t       tcpi_txbytes __attribute__((aligned(8)));
236 	/* total bytes sent */
237 	u_int64_t       tcpi_txretransmitbytes __attribute__((aligned(8)));
238 	/* total bytes retransmitted */
239 	u_int64_t       tcpi_txunacked __attribute__((aligned(8)));
240 	/* current number of bytes not acknowledged */
241 	u_int64_t       tcpi_rxpackets __attribute__((aligned(8))); /* total packets received */
242 	u_int64_t       tcpi_rxbytes __attribute__((aligned(8)));
243 	/* total bytes received */
244 	u_int64_t       tcpi_rxduplicatebytes __attribute__((aligned(8)));
245 	/* total duplicate bytes received */
246 	u_int64_t       tcpi_rxoutoforderbytes __attribute__((aligned(8)));
247 	/* total out of order bytes received */
248 	u_int64_t       tcpi_snd_bw __attribute__((aligned(8)));    /* measured send bandwidth in bits/sec */
249 	u_int8_t        tcpi_synrexmits;    /* Number of syn retransmits before connect */
250 	u_int8_t        tcpi_unused1;
251 	u_int16_t       tcpi_unused2;
252 	u_int64_t       tcpi_cell_rxpackets __attribute((aligned(8)));/* packets received over cellular */
253 	u_int64_t       tcpi_cell_rxbytes __attribute((aligned(8)));/* bytes received over cellular */
254 	u_int64_t       tcpi_cell_txpackets __attribute((aligned(8)));/* packets transmitted over cellular */
255 	u_int64_t       tcpi_cell_txbytes __attribute((aligned(8)));/* bytes transmitted over cellular */
256 	u_int64_t       tcpi_wifi_rxpackets __attribute((aligned(8)));/* packets received over Wi-Fi */
257 	u_int64_t       tcpi_wifi_rxbytes __attribute((aligned(8)));/* bytes received over Wi-Fi */
258 	u_int64_t       tcpi_wifi_txpackets __attribute((aligned(8)));/* packets transmitted over Wi-Fi */
259 	u_int64_t       tcpi_wifi_txbytes __attribute((aligned(8)));/* bytes transmitted over Wi-Fi */
260 	u_int64_t       tcpi_wired_rxpackets __attribute((aligned(8)));/* packets received over Wired */
261 	u_int64_t       tcpi_wired_rxbytes __attribute((aligned(8)));/* bytes received over Wired */
262 	u_int64_t       tcpi_wired_txpackets __attribute((aligned(8)));/* packets transmitted over Wired */
263 	u_int64_t       tcpi_wired_txbytes __attribute((aligned(8)));/* bytes transmitted over Wired */
264 	struct tcp_conn_status  tcpi_connstatus;/* status of connection probes */
265 
266 	u_int16_t
267 	    tcpi_tfo_cookie_req:1, /* Cookie requested? */
268 	    tcpi_tfo_cookie_rcv:1, /* Cookie received? */
269 	    tcpi_tfo_syn_loss:1,   /* Fallback to reg. TCP after SYN-loss */
270 	    tcpi_tfo_syn_data_sent:1, /* SYN+data has been sent out */
271 	    tcpi_tfo_syn_data_acked:1, /* SYN+data has been fully acknowledged */
272 	    tcpi_tfo_syn_data_rcv:1, /* Server received SYN+data with a valid cookie */
273 	    tcpi_tfo_cookie_req_rcv:1, /* Server received cookie-request */
274 	    tcpi_tfo_cookie_sent:1, /* Server announced cookie */
275 	    tcpi_tfo_cookie_invalid:1, /* Server received an invalid cookie */
276 	    tcpi_tfo_cookie_wrong:1, /* Our sent cookie was wrong */
277 	    tcpi_tfo_no_cookie_rcv:1, /* We did not receive a cookie upon our request */
278 	    tcpi_tfo_heuristics_disable:1, /* TFO-heuristics disabled it */
279 	    tcpi_tfo_send_blackhole:1, /* A sending-blackhole got detected */
280 	    tcpi_tfo_recv_blackhole:1, /* A receiver-blackhole got detected */
281 	    tcpi_tfo_onebyte_proxy:1; /* A proxy acknowledges all but one byte of the SYN */
282 
283 	u_int16_t       tcpi_ecn_client_setup:1,    /* Attempted ECN setup from client side */
284 	    tcpi_ecn_server_setup:1,                /* Attempted ECN setup from server side */
285 	    tcpi_ecn_success:1,                     /* peer negotiated ECN */
286 	    tcpi_ecn_lost_syn:1,                    /* Lost SYN with ECN setup */
287 	    tcpi_ecn_lost_synack:1,                 /* Lost SYN-ACK with ECN setup */
288 	    tcpi_local_peer:1,                      /* Local to the host or the subnet */
289 	    tcpi_if_cell:1,                 /* Interface is cellular */
290 	    tcpi_if_wifi:1,                 /* Interface is WiFi */
291 	    tcpi_if_wired:1,                /* Interface is wired - ethernet , thunderbolt etc,. */
292 	    tcpi_if_wifi_infra:1,           /* Interface is wifi infrastructure */
293 	    tcpi_if_wifi_awdl:1,            /* Interface is wifi AWDL */
294 	    tcpi_snd_background:1,          /* Using delay based algorithm on sender side */
295 	    tcpi_rcv_background:1;          /* Using delay based algorithm on receive side */
296 
297 	u_int32_t       tcpi_ecn_recv_ce;   /* Packets received with CE */
298 	u_int32_t       tcpi_ecn_recv_cwr;  /* Packets received with CWR */
299 
300 	u_int32_t       tcpi_rcvoopack;     /* out-of-order packets received */
301 	u_int32_t       tcpi_pawsdrop;      /* segments dropped due to PAWS */
302 	u_int32_t       tcpi_sack_recovery_episode;/* SACK recovery episodes */
303 	u_int32_t       tcpi_reordered_pkts;/* packets reorderd */
304 	u_int32_t       tcpi_dsack_sent;    /* Sent DSACK notification */
305 	u_int32_t       tcpi_dsack_recvd;   /* Received a valid DSACK option */
306 	u_int32_t       tcpi_flowhash;      /* Unique id for the connection */
307 
308 	u_int64_t       tcpi_txretransmitpackets __attribute__((aligned(8)));
309 
310 #define TCPINFO_HAS_RCV_RTT 1
311 	uint32_t       tcpi_rcv_srtt;       /* Receiver's Smoothed RTT */
312 	uint32_t       tcpi_client_accecn_state;   /* Client's Accurate ECN state */
313 	uint32_t       tcpi_server_accecn_state;   /* Server's Accurate ECN state as seen by clent */
314 	uint64_t       tcpi_ecn_capable_packets_sent;   /* Packets sent with ECT */
315 	uint64_t       tcpi_ecn_capable_packets_acked;  /* Packets sent with ECT that were ACKed */
316 	uint64_t       tcpi_ecn_capable_packets_marked; /* Packets sent with ECT that were marked */
317 	uint64_t       tcpi_ecn_capable_packets_lost;   /* Packets sent with ECT that were lost */
318 
319 #define TCPINFO_HAS_LIMITED_TIME 1
320 	uint64_t       tcpi_flow_control_total_time;
321 	uint64_t       tcpi_rcvwnd_limited_total_time;
322 };
323 
324 struct tcp_measure_bw_burst {
325 	u_int32_t       min_burst_size;/* Minimum number of packets to use */
326 	u_int32_t       max_burst_size;/* Maximum number of packets to use */
327 };
328 
329 /*
330  * Note that IPv6 link local addresses should have the appropriate scope ID
331  */
332 
333 struct info_tuple {
334 	u_int8_t        itpl_proto;
335 	union {
336 #if !__has_ptrcheck
337 		struct sockaddr                 _itpl_sa;
338 #endif
339 		struct __sockaddr_header        _itpl_sah;
340 		struct sockaddr_in              _itpl_sin;
341 		struct sockaddr_in6             _itpl_sin6;
342 	} itpl_localaddr;
343 	union {
344 #if !__has_ptrcheck
345 		struct sockaddr                 _itpl_sa;
346 #endif
347 		struct __sockaddr_header        _itpl_sah;
348 		struct sockaddr_in              _itpl_sin;
349 		struct sockaddr_in6             _itpl_sin6;
350 	} itpl_remoteaddr;
351 };
352 
353 #if !__has_ptrcheck
354 #define itpl_local_sa           itpl_localaddr._itpl_sa
355 #define itpl_remote_sa          itpl_remoteaddr._itpl_sa
356 #endif
357 
358 #define itpl_local_sah          itpl_localaddr._itpl_sah
359 #define itpl_local_sin          itpl_localaddr._itpl_sin
360 #define itpl_local_sin6         itpl_localaddr._itpl_sin6
361 #define itpl_remote_sah         itpl_remoteaddr._itpl_sah
362 #define itpl_remote_sin         itpl_remoteaddr._itpl_sin
363 #define itpl_remote_sin6        itpl_remoteaddr._itpl_sin6
364 
365 /*
366  * TCP connection info auxiliary data (CIAUX_TCP)
367  *
368  * Do not add new fields to this structure, just add them to tcp_info
369  * structure towards the end. This will preserve binary compatibility.
370  */
371 typedef struct conninfo_tcp {
372 	struct tcp_info         tcpci_tcp_info;/* TCP info */
373 } conninfo_tcp_t;
374 
375 #pragma pack()
376 
377 struct mptcp_itf_stats {
378 	u_short  ifindex;
379 	uint16_t switches;
380 	uint32_t is_expensive:1;
381 	uint64_t mpis_txbytes __attribute__((aligned(8)));
382 	uint64_t mpis_rxbytes __attribute__((aligned(8)));
383 	uint64_t mpis_wifi_txbytes __attribute__((aligned(8)));
384 	uint64_t mpis_wifi_rxbytes __attribute__((aligned(8)));
385 	uint64_t mpis_wired_txbytes __attribute__((aligned(8)));
386 	uint64_t mpis_wired_rxbytes __attribute__((aligned(8)));
387 	uint64_t mpis_cell_txbytes __attribute__((aligned(8)));
388 	uint64_t mpis_cell_rxbytes __attribute__((aligned(8)));
389 };
390 
391 /* Version solely used to let libnetcore survive */
392 #define CONNINFO_MPTCP_VERSION  3
393 typedef struct conninfo_multipathtcp {
394 	uint32_t        mptcpci_subflow_count;
395 	uint32_t        mptcpci_switch_count;
396 	sae_connid_t    mptcpci_subflow_connids[4];
397 
398 	uint64_t        mptcpci_init_rxbytes;
399 	uint64_t        mptcpci_init_txbytes;
400 
401 #define MPTCP_ITFSTATS_SIZE     4
402 	struct mptcp_itf_stats mptcpci_itfstats[MPTCP_ITFSTATS_SIZE];
403 
404 	uint32_t        mptcpci_flags;
405 #define MPTCPCI_FIRSTPARTY      0x01
406 } conninfo_multipathtcp_t;
407 #endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
408 
409 #endif /* _NETINET_TCP_PRIVATE_H_ */
410