| 1 | /* |
| 2 | * Copyright (c) 2000-2016 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_H_ |
| 65 | #define _NETINET_TCP_H_ |
| 66 | #include <sys/types.h> |
| 67 | #include <sys/appleapiopts.h> |
| 68 | #include <machine/endian.h> |
| 69 | |
| 70 | #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) |
| 71 | typedef __uint32_t tcp_seq; |
| 72 | typedef __uint32_t tcp_cc; /* connection count per rfc1644 */ |
| 73 | |
| 74 | #define tcp6_seq tcp_seq /* for KAME src sync over BSD*'s */ |
| 75 | #define tcp6hdr tcphdr /* for KAME src sync over BSD*'s */ |
| 76 | |
| 77 | /* |
| 78 | * TCP header. |
| 79 | * Per RFC 793, September, 1981. |
| 80 | */ |
| 81 | struct tcphdr { |
| 82 | unsigned short th_sport; /* source port */ |
| 83 | unsigned short th_dport; /* destination port */ |
| 84 | tcp_seq th_seq; /* sequence number */ |
| 85 | tcp_seq th_ack; /* acknowledgement number */ |
| 86 | #if __DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN |
| 87 | unsigned int th_x2:4, /* (unused) */ |
| 88 | th_off:4; /* data offset */ |
| 89 | #endif |
| 90 | #if __DARWIN_BYTE_ORDER == __DARWIN_BIG_ENDIAN |
| 91 | unsigned int th_off:4, /* data offset */ |
| 92 | th_x2:4; /* (unused) */ |
| 93 | #endif |
| 94 | unsigned char th_flags; |
| 95 | #define TH_FIN 0x01 |
| 96 | #define TH_SYN 0x02 |
| 97 | #define TH_RST 0x04 |
| 98 | #define TH_PUSH 0x08 |
| 99 | #define TH_ACK 0x10 |
| 100 | #define TH_URG 0x20 |
| 101 | #define TH_ECE 0x40 |
| 102 | #define TH_CWR 0x80 |
| 103 | #define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR) |
| 104 | |
| 105 | unsigned short th_win; /* window */ |
| 106 | unsigned short th_sum; /* checksum */ |
| 107 | unsigned short th_urp; /* urgent pointer */ |
| 108 | }; |
| 109 | |
| 110 | #define TCPOPT_EOL 0 |
| 111 | #define TCPOPT_NOP 1 |
| 112 | #define TCPOPT_MAXSEG 2 |
| 113 | #define TCPOLEN_MAXSEG 4 |
| 114 | #define TCPOPT_WINDOW 3 |
| 115 | #define TCPOLEN_WINDOW 3 |
| 116 | #define TCPOPT_SACK_PERMITTED 4 /* Experimental */ |
| 117 | #define TCPOLEN_SACK_PERMITTED 2 |
| 118 | #define TCPOPT_SACK 5 /* Experimental */ |
| 119 | #define TCPOLEN_SACK 8 /* len of sack block */ |
| 120 | #define TCPOPT_TIMESTAMP 8 |
| 121 | #define TCPOLEN_TIMESTAMP 10 |
| 122 | #define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */ |
| 123 | #define TCPOPT_TSTAMP_HDR \ |
| 124 | (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP) |
| 125 | |
| 126 | #define MAX_TCPOPTLEN 40 /* Absolute maximum TCP options len */ |
| 127 | |
| 128 | #define TCPOPT_CC 11 /* CC options: RFC-1644 */ |
| 129 | #define TCPOPT_CCNEW 12 |
| 130 | #define TCPOPT_CCECHO 13 |
| 131 | #define TCPOLEN_CC 6 |
| 132 | #define TCPOLEN_CC_APPA (TCPOLEN_CC+2) |
| 133 | #define TCPOPT_CC_HDR(ccopt) \ |
| 134 | (TCPOPT_NOP<<24|TCPOPT_NOP<<16|(ccopt)<<8|TCPOLEN_CC) |
| 135 | #define TCPOPT_SIGNATURE 19 /* Keyed MD5: RFC 2385 */ |
| 136 | #define TCPOLEN_SIGNATURE 18 |
| 137 | #if MPTCP |
| 138 | #define TCPOPT_MULTIPATH 30 |
| 139 | #endif |
| 140 | |
| 141 | #define TCPOPT_FASTOPEN 34 |
| 142 | #define TCPOLEN_FASTOPEN_REQ 2 |
| 143 | |
| 144 | /* Option definitions */ |
| 145 | #define TCPOPT_SACK_PERMIT_HDR \ |
| 146 | (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_SACK_PERMITTED<<8|TCPOLEN_SACK_PERMITTED) |
| 147 | #define TCPOPT_SACK_HDR (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_SACK<<8) |
| 148 | /* Miscellaneous constants */ |
| 149 | #define MAX_SACK_BLKS 6 /* Max # SACK blocks stored at sender side */ |
| 150 | |
| 151 | /* |
| 152 | * A SACK option that specifies n blocks will have a length of (8*n + 2) |
| 153 | * bytes, so the 40 bytes available for TCP options can specify a |
| 154 | * maximum of 4 blocks. |
| 155 | */ |
| 156 | |
| 157 | #define TCP_MAX_SACK 4 /* MAX # SACKs sent in any segment */ |
| 158 | |
| 159 | |
| 160 | /* |
| 161 | * Default maximum segment size for TCP. |
| 162 | * With an IP MTU of 576, this is 536, |
| 163 | * but 512 is probably more convenient. |
| 164 | * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)). |
| 165 | */ |
| 166 | #define TCP_MSS 512 |
| 167 | |
| 168 | /* |
| 169 | * TCP_MINMSS is defined to be 216 which is fine for the smallest |
| 170 | * link MTU (256 bytes, SLIP interface) in the Internet. |
| 171 | * However it is very unlikely to come across such low MTU interfaces |
| 172 | * these days (anno dato 2004). |
| 173 | * Probably it can be set to 512 without ill effects. But we play safe. |
| 174 | * See tcp_subr.c tcp_minmss SYSCTL declaration for more comments. |
| 175 | * Setting this to "0" disables the minmss check. |
| 176 | */ |
| 177 | #define TCP_MINMSS 216 |
| 178 | |
| 179 | /* |
| 180 | * Default maximum segment size for TCP6. |
| 181 | * With an IP6 MSS of 1280, this is 1220, |
| 182 | * but 1024 is probably more convenient. (xxx kazu in doubt) |
| 183 | * This should be defined as MIN(1024, IP6_MSS - sizeof (struct tcpip6hdr)) |
| 184 | */ |
| 185 | #define TCP6_MSS 1024 |
| 186 | |
| 187 | #define TCP_MAXWIN 65535 /* largest value for (unscaled) window */ |
| 188 | #define TTCP_CLIENT_SND_WND 4096 /* dflt send window for T/TCP client */ |
| 189 | |
| 190 | #define TCP_MAX_WINSHIFT 14 /* maximum window shift */ |
| 191 | |
| 192 | #define TCP_MAXHLEN (0xf<<2) /* max length of header in bytes */ |
| 193 | #define TCP_MAXOLEN (TCP_MAXHLEN - sizeof(struct tcphdr)) |
| 194 | /* max space left for options */ |
| 195 | #endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ |
| 196 | |
| 197 | /* |
| 198 | * User-settable options (used with setsockopt). |
| 199 | */ |
| 200 | #define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ |
| 201 | #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) |
| 202 | #define TCP_MAXSEG 0x02 /* set maximum segment size */ |
| 203 | #define TCP_NOPUSH 0x04 /* don't push last block of write */ |
| 204 | #define TCP_NOOPT 0x08 /* don't use TCP options */ |
| 205 | #define TCP_KEEPALIVE 0x10 /* idle time used when SO_KEEPALIVE is enabled */ |
| 206 | #define TCP_CONNECTIONTIMEOUT 0x20 /* connection timeout */ |
| 207 | #define PERSIST_TIMEOUT 0x40 /* time after which a connection in |
| 208 | * persist timeout will terminate. |
| 209 | * see draft-ananth-tcpm-persist-02.txt |
| 210 | */ |
| 211 | #define TCP_RXT_CONNDROPTIME 0x80 /* time after which tcp retransmissions will be |
| 212 | * stopped and the connection will be dropped |
| 213 | */ |
| 214 | #define TCP_RXT_FINDROP 0x100 /* when this option is set, drop a connection |
| 215 | * after retransmitting the FIN 3 times. It will |
| 216 | * prevent holding too many mbufs in socket |
| 217 | * buffer queues. |
| 218 | */ |
| 219 | #define TCP_KEEPINTVL 0x101 /* interval between keepalives */ |
| 220 | #define TCP_KEEPCNT 0x102 /* number of keepalives before close */ |
| 221 | #define TCP_SENDMOREACKS 0x103 /* always ack every other packet */ |
| 222 | #define TCP_ENABLE_ECN 0x104 /* Enable ECN on a connection */ |
| 223 | #define TCP_FASTOPEN 0x105 /* Enable/Disable TCP Fastopen on this socket */ |
| 224 | #define TCP_CONNECTION_INFO 0x106 /* State of TCP connection */ |
| 225 | |
| 226 | #ifdef PRIVATE |
| 227 | #define TCP_INFO 0x200 /* retrieve tcp_info structure */ |
| 228 | #define TCP_MEASURE_SND_BW 0x202 /* Measure sender's bandwidth for this connection */ |
| 229 | #endif /* PRIVATE */ |
| 230 | |
| 231 | |
| 232 | #define TCP_NOTSENT_LOWAT 0x201 /* Low water mark for TCP unsent data */ |
| 233 | |
| 234 | #ifdef PRIVATE |
| 235 | #define TCP_MEASURE_BW_BURST 0x203 /* Burst size to use for bandwidth measurement */ |
| 236 | #define TCP_PEER_PID 0x204 /* Lookup pid of the process we're connected to */ |
| 237 | #define TCP_ADAPTIVE_READ_TIMEOUT 0x205 /* Read timeout used as a multiple of RTT */ |
| 238 | /* |
| 239 | * Enable message delivery on a socket, this feature is currently unsupported and |
| 240 | * is subjected to change in future. |
| 241 | */ |
| 242 | #define TCP_ENABLE_MSGS 0x206 |
| 243 | #define TCP_ADAPTIVE_WRITE_TIMEOUT 0x207 /* Write timeout used as a multiple of RTT */ |
| 244 | #define TCP_NOTIMEWAIT 0x208 /* Avoid going into time-wait */ |
| 245 | #define TCP_DISABLE_BLACKHOLE_DETECTION 0x209 /* disable PMTU blackhole detection */ |
| 246 | #define TCP_ECN_MODE 0x210 /* fine grain control for A/B testing */ |
| 247 | #define TCP_KEEPALIVE_OFFLOAD 0x211 /* offload keep alive processing to firmware */ |
| 248 | |
| 249 | /* |
| 250 | * TCP_ECN_MODE values |
| 251 | */ |
| 252 | #define ECN_MODE_DEFAULT 0x0 /* per interface or system wide default */ |
| 253 | #define ECN_MODE_ENABLE 0x1 /* force enable ECN on connection */ |
| 254 | #define ECN_MODE_DISABLE 0x2 /* force disable ECN on connection */ |
| 255 | |
| 256 | /* |
| 257 | * TCP_NOTIFY_ACKNOWLEDGEMENT |
| 258 | * |
| 259 | * Application can use this socket option to get a notification when |
| 260 | * data that is currently written to the socket is acknowledged. The input |
| 261 | * argument given to this socket option is a marker_id that will be used for |
| 262 | * returning the notification. The application can continue to write |
| 263 | * data after setting the marker. There can be multiple of these events |
| 264 | * outstanding on a socket at any time up to a max of TCP_MAX_NOTIFY_ACK. |
| 265 | * |
| 266 | * To get the completed notifications, getsockopt should be called with the |
| 267 | * TCP_NOTIFY_ACKNOWLEDGEMENT with the following tcp_notify_ack_complete |
| 268 | * structure as an out argument. At most TCP_MAX_NOTIFY_ACK ids will be |
| 269 | * returned if they have been successfully acknowledged in each call. |
| 270 | */ |
| 271 | |
| 272 | #define TCP_MAX_NOTIFY_ACK 10 |
| 273 | |
| 274 | typedef u_int32_t tcp_notify_ack_id_t; |
| 275 | |
| 276 | struct tcp_notify_ack_complete { |
| 277 | u_int32_t notify_pending; /* still pending */ |
| 278 | u_int32_t notify_complete_count; |
| 279 | tcp_notify_ack_id_t notify_complete_id[TCP_MAX_NOTIFY_ACK]; |
| 280 | }; |
| 281 | |
| 282 | #define TCP_NOTIFY_ACKNOWLEDGEMENT 0x212 /* Notify when data is acknowledged */ |
| 283 | |
| 284 | /* |
| 285 | * The TCP_INFO socket option is a private API and is subject to change |
| 286 | */ |
| 287 | #pragma pack(4) |
| 288 | |
| 289 | #define TCPI_OPT_TIMESTAMPS 0x01 |
| 290 | #define TCPI_OPT_SACK 0x02 |
| 291 | #define TCPI_OPT_WSCALE 0x04 |
| 292 | #define TCPI_OPT_ECN 0x08 |
| 293 | |
| 294 | #define TCPI_FLAG_LOSSRECOVERY 0x01 /* Currently in loss recovery */ |
| 295 | #define TCPI_FLAG_STREAMING_ON 0x02 /* Streaming detection on */ |
| 296 | |
| 297 | struct tcp_conn_status { |
| 298 | unsigned int probe_activated : 1; |
| 299 | unsigned int write_probe_failed : 1; |
| 300 | unsigned int read_probe_failed : 1; |
| 301 | unsigned int conn_probe_failed : 1; |
| 302 | }; |
| 303 | |
| 304 | /* |
| 305 | * Add new fields to this structure at the end only. This will preserve |
| 306 | * binary compatibility. |
| 307 | */ |
| 308 | struct tcp_info { |
| 309 | u_int8_t tcpi_state; /* TCP FSM state. */ |
| 310 | u_int8_t tcpi_options; /* Options enabled on conn. */ |
| 311 | u_int8_t tcpi_snd_wscale; /* RFC1323 send shift value. */ |
| 312 | u_int8_t tcpi_rcv_wscale; /* RFC1323 recv shift value. */ |
| 313 | |
| 314 | u_int32_t tcpi_flags; /* extra flags (TCPI_FLAG_xxx) */ |
| 315 | |
| 316 | u_int32_t tcpi_rto; /* Retransmission timeout in milliseconds */ |
| 317 | u_int32_t tcpi_snd_mss; /* Max segment size for send. */ |
| 318 | u_int32_t tcpi_rcv_mss; /* Max segment size for receive. */ |
| 319 | |
| 320 | u_int32_t tcpi_rttcur; /* Most recent value of RTT */ |
| 321 | u_int32_t tcpi_srtt; /* Smoothed RTT */ |
| 322 | u_int32_t tcpi_rttvar; /* RTT variance */ |
| 323 | u_int32_t tcpi_rttbest; /* Best RTT we've seen */ |
| 324 | |
| 325 | u_int32_t tcpi_snd_ssthresh; /* Slow start threshold. */ |
| 326 | u_int32_t tcpi_snd_cwnd; /* Send congestion window. */ |
| 327 | |
| 328 | u_int32_t tcpi_rcv_space; /* Advertised recv window. */ |
| 329 | |
| 330 | u_int32_t tcpi_snd_wnd; /* Advertised send window. */ |
| 331 | u_int32_t tcpi_snd_nxt; /* Next egress seqno */ |
| 332 | u_int32_t tcpi_rcv_nxt; /* Next ingress seqno */ |
| 333 | |
| 334 | int32_t tcpi_last_outif; /* if_index of interface used to send last */ |
| 335 | u_int32_t tcpi_snd_sbbytes; /* bytes in snd buffer including data inflight */ |
| 336 | |
| 337 | u_int64_t tcpi_txpackets __attribute__((aligned(8))); /* total packets sent */ |
| 338 | u_int64_t tcpi_txbytes __attribute__((aligned(8))); |
| 339 | /* total bytes sent */ |
| 340 | u_int64_t tcpi_txretransmitbytes __attribute__((aligned(8))); |
| 341 | /* total bytes retransmitted */ |
| 342 | u_int64_t tcpi_txunacked __attribute__((aligned(8))); |
| 343 | /* current number of bytes not acknowledged */ |
| 344 | u_int64_t tcpi_rxpackets __attribute__((aligned(8))); /* total packets received */ |
| 345 | u_int64_t tcpi_rxbytes __attribute__((aligned(8))); |
| 346 | /* total bytes received */ |
| 347 | u_int64_t tcpi_rxduplicatebytes __attribute__((aligned(8))); |
| 348 | /* total duplicate bytes received */ |
| 349 | u_int64_t tcpi_rxoutoforderbytes __attribute__((aligned(8))); |
| 350 | /* total out of order bytes received */ |
| 351 | u_int64_t tcpi_snd_bw __attribute__((aligned(8))); /* measured send bandwidth in bits/sec */ |
| 352 | u_int8_t tcpi_synrexmits; /* Number of syn retransmits before connect */ |
| 353 | u_int8_t tcpi_unused1; |
| 354 | u_int16_t tcpi_unused2; |
| 355 | u_int64_t tcpi_cell_rxpackets __attribute((aligned(8))); /* packets received over cellular */ |
| 356 | u_int64_t tcpi_cell_rxbytes __attribute((aligned(8))); /* bytes received over cellular */ |
| 357 | u_int64_t tcpi_cell_txpackets __attribute((aligned(8))); /* packets transmitted over cellular */ |
| 358 | u_int64_t tcpi_cell_txbytes __attribute((aligned(8))); /* bytes transmitted over cellular */ |
| 359 | u_int64_t tcpi_wifi_rxpackets __attribute((aligned(8))); /* packets received over Wi-Fi */ |
| 360 | u_int64_t tcpi_wifi_rxbytes __attribute((aligned(8))); /* bytes received over Wi-Fi */ |
| 361 | u_int64_t tcpi_wifi_txpackets __attribute((aligned(8))); /* packets transmitted over Wi-Fi */ |
| 362 | u_int64_t tcpi_wifi_txbytes __attribute((aligned(8))); /* bytes transmitted over Wi-Fi */ |
| 363 | u_int64_t tcpi_wired_rxpackets __attribute((aligned(8))); /* packets received over Wired */ |
| 364 | u_int64_t tcpi_wired_rxbytes __attribute((aligned(8))); /* bytes received over Wired */ |
| 365 | u_int64_t tcpi_wired_txpackets __attribute((aligned(8))); /* packets transmitted over Wired */ |
| 366 | u_int64_t tcpi_wired_txbytes __attribute((aligned(8))); /* bytes transmitted over Wired */ |
| 367 | struct tcp_conn_status tcpi_connstatus; /* status of connection probes */ |
| 368 | |
| 369 | u_int16_t |
| 370 | tcpi_tfo_cookie_req:1, /* Cookie requested? */ |
| 371 | tcpi_tfo_cookie_rcv:1, /* Cookie received? */ |
| 372 | tcpi_tfo_syn_loss:1, /* Fallback to reg. TCP after SYN-loss */ |
| 373 | tcpi_tfo_syn_data_sent:1, /* SYN+data has been sent out */ |
| 374 | tcpi_tfo_syn_data_acked:1, /* SYN+data has been fully acknowledged */ |
| 375 | tcpi_tfo_syn_data_rcv:1, /* Server received SYN+data with a valid cookie */ |
| 376 | tcpi_tfo_cookie_req_rcv:1, /* Server received cookie-request */ |
| 377 | tcpi_tfo_cookie_sent:1, /* Server announced cookie */ |
| 378 | tcpi_tfo_cookie_invalid:1, /* Server received an invalid cookie */ |
| 379 | tcpi_tfo_cookie_wrong:1, /* Our sent cookie was wrong */ |
| 380 | tcpi_tfo_no_cookie_rcv:1, /* We did not receive a cookie upon our request */ |
| 381 | tcpi_tfo_heuristics_disable:1, /* TFO-heuristics disabled it */ |
| 382 | tcpi_tfo_send_blackhole:1, /* A sending-blackhole got detected */ |
| 383 | tcpi_tfo_recv_blackhole:1; /* A receiver-blackhole got detected */ |
| 384 | |
| 385 | u_int16_t tcpi_ecn_client_setup:1, /* Attempted ECN setup from client side */ |
| 386 | tcpi_ecn_server_setup:1, /* Attempted ECN setup from server side */ |
| 387 | tcpi_ecn_success:1, /* peer negotiated ECN */ |
| 388 | tcpi_ecn_lost_syn:1, /* Lost SYN with ECN setup */ |
| 389 | tcpi_ecn_lost_synack:1, /* Lost SYN-ACK with ECN setup */ |
| 390 | tcpi_local_peer:1, /* Local to the host or the subnet */ |
| 391 | tcpi_if_cell:1, /* Interface is cellular */ |
| 392 | tcpi_if_wifi:1; /* Interface is WiFi */ |
| 393 | |
| 394 | u_int32_t tcpi_ecn_recv_ce; /* Packets received with CE */ |
| 395 | u_int32_t tcpi_ecn_recv_cwr; /* Packets received with CWR */ |
| 396 | |
| 397 | u_int32_t tcpi_rcvoopack; /* out-of-order packets received */ |
| 398 | u_int32_t tcpi_pawsdrop; /* segments dropped due to PAWS */ |
| 399 | u_int32_t tcpi_sack_recovery_episode; /* SACK recovery episodes */ |
| 400 | u_int32_t tcpi_reordered_pkts; /* packets reorderd */ |
| 401 | u_int32_t tcpi_dsack_sent; /* Sent DSACK notification */ |
| 402 | u_int32_t tcpi_dsack_recvd; /* Received a valid DSACK option */ |
| 403 | u_int32_t tcpi_flowhash; /* Unique id for the connection */ |
| 404 | }; |
| 405 | |
| 406 | struct tcp_measure_bw_burst { |
| 407 | u_int32_t min_burst_size; /* Minimum number of packets to use */ |
| 408 | u_int32_t max_burst_size; /* Maximum number of packets to use */ |
| 409 | }; |
| 410 | |
| 411 | /* |
| 412 | * Note that IPv6 link local addresses should have the appropriate scope ID |
| 413 | */ |
| 414 | |
| 415 | struct info_tuple { |
| 416 | u_int8_t itpl_proto; |
| 417 | union { |
| 418 | struct sockaddr _itpl_sa; |
| 419 | struct sockaddr_in _itpl_sin; |
| 420 | struct sockaddr_in6 _itpl_sin6; |
| 421 | } itpl_localaddr; |
| 422 | union { |
| 423 | struct sockaddr _itpl_sa; |
| 424 | struct sockaddr_in _itpl_sin; |
| 425 | struct sockaddr_in6 _itpl_sin6; |
| 426 | } itpl_remoteaddr; |
| 427 | }; |
| 428 | |
| 429 | #define itpl_local_sa itpl_localaddr._itpl_sa |
| 430 | #define itpl_local_sin itpl_localaddr._itpl_sin |
| 431 | #define itpl_local_sin6 itpl_localaddr._itpl_sin6 |
| 432 | #define itpl_remote_sa itpl_remoteaddr._itpl_sa |
| 433 | #define itpl_remote_sin itpl_remoteaddr._itpl_sin |
| 434 | #define itpl_remote_sin6 itpl_remoteaddr._itpl_sin6 |
| 435 | |
| 436 | /* |
| 437 | * TCP connection info auxiliary data (CIAUX_TCP) |
| 438 | * |
| 439 | * Do not add new fields to this structure, just add them to tcp_info |
| 440 | * structure towards the end. This will preserve binary compatibility. |
| 441 | */ |
| 442 | typedef struct conninfo_tcp { |
| 443 | pid_t tcpci_peer_pid; /* loopback peer PID if > 0 */ |
| 444 | struct tcp_info tcpci_tcp_info; /* TCP info */ |
| 445 | } conninfo_tcp_t; |
| 446 | |
| 447 | #pragma pack() |
| 448 | |
| 449 | #endif /* PRIVATE */ |
| 450 | |
| 451 | struct tcp_connection_info { |
| 452 | u_int8_t tcpi_state; /* connection state */ |
| 453 | u_int8_t tcpi_snd_wscale; /* Window scale for send window */ |
| 454 | u_int8_t tcpi_rcv_wscale; /* Window scale for receive window */ |
| 455 | u_int8_t __pad1; |
| 456 | u_int32_t tcpi_options; /* TCP options supported */ |
| 457 | #define TCPCI_OPT_TIMESTAMPS 0x00000001 /* Timestamps enabled */ |
| 458 | #define TCPCI_OPT_SACK 0x00000002 /* SACK enabled */ |
| 459 | #define TCPCI_OPT_WSCALE 0x00000004 /* Window scaling enabled */ |
| 460 | #define TCPCI_OPT_ECN 0x00000008 /* ECN enabled */ |
| 461 | u_int32_t tcpi_flags; /* flags */ |
| 462 | #define TCPCI_FLAG_LOSSRECOVERY 0x00000001 |
| 463 | #define TCPCI_FLAG_REORDERING_DETECTED 0x00000002 |
| 464 | u_int32_t tcpi_rto; /* retransmit timeout in ms */ |
| 465 | u_int32_t tcpi_maxseg; /* maximum segment size supported */ |
| 466 | u_int32_t tcpi_snd_ssthresh; /* slow start threshold in bytes */ |
| 467 | u_int32_t tcpi_snd_cwnd; /* send congestion window in bytes */ |
| 468 | u_int32_t tcpi_snd_wnd; /* send widnow in bytes */ |
| 469 | u_int32_t tcpi_snd_sbbytes; /* bytes in send socket buffer, including in-flight data */ |
| 470 | u_int32_t tcpi_rcv_wnd; /* receive window in bytes*/ |
| 471 | u_int32_t tcpi_rttcur; /* most recent RTT in ms */ |
| 472 | u_int32_t tcpi_srtt; /* average RTT in ms */ |
| 473 | u_int32_t tcpi_rttvar; /* RTT variance */ |
| 474 | u_int32_t |
| 475 | tcpi_tfo_cookie_req:1, /* Cookie requested? */ |
| 476 | tcpi_tfo_cookie_rcv:1, /* Cookie received? */ |
| 477 | tcpi_tfo_syn_loss:1, /* Fallback to reg. TCP after SYN-loss */ |
| 478 | tcpi_tfo_syn_data_sent:1, /* SYN+data has been sent out */ |
| 479 | tcpi_tfo_syn_data_acked:1, /* SYN+data has been fully acknowledged */ |
| 480 | tcpi_tfo_syn_data_rcv:1, /* Server received SYN+data with a valid cookie */ |
| 481 | tcpi_tfo_cookie_req_rcv:1, /* Server received cookie-request */ |
| 482 | tcpi_tfo_cookie_sent:1, /* Server announced cookie */ |
| 483 | tcpi_tfo_cookie_invalid:1, /* Server received an invalid cookie */ |
| 484 | tcpi_tfo_cookie_wrong:1, /* Our sent cookie was wrong */ |
| 485 | tcpi_tfo_no_cookie_rcv:1, /* We did not receive a cookie upon our request */ |
| 486 | tcpi_tfo_heuristics_disable:1, /* TFO-heuristics disabled it */ |
| 487 | tcpi_tfo_send_blackhole:1, /* A sending-blackhole got detected */ |
| 488 | tcpi_tfo_recv_blackhole:1, /* A receiver-blackhole got detected */ |
| 489 | __pad2:18; |
| 490 | u_int64_t tcpi_txpackets __attribute__((aligned(8))); |
| 491 | u_int64_t tcpi_txbytes __attribute__((aligned(8))); |
| 492 | u_int64_t tcpi_txretransmitbytes __attribute__((aligned(8))); |
| 493 | u_int64_t tcpi_rxpackets __attribute__((aligned(8))); |
| 494 | u_int64_t tcpi_rxbytes __attribute__((aligned(8))); |
| 495 | u_int64_t tcpi_rxoutoforderbytes __attribute__((aligned(8))); |
| 496 | }; |
| 497 | #endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ |
| 498 | |
| 499 | #endif |