Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 | /* * 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 * compliance with the License. The rights granted to you under the License * may not be used to create, or enable the creation or redistribution of, * 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, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * 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) 1982, 1986, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)tcp.h 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netinet/tcp.h,v 1.13.2.3 2001/03/01 22:08:42 jlemon Exp $ */ #ifndef _NETINET_TCP_H_ #define _NETINET_TCP_H_ #include <sys/types.h> #include <sys/appleapiopts.h> #include <machine/endian.h> #include <machine/types.h> /* __uint32_t */ #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) typedef __uint32_t tcp_seq; typedef __uint32_t tcp_cc; /* connection count per rfc1644 */ #define tcp6_seq tcp_seq /* for KAME src sync over BSD*'s */ #define tcp6hdr tcphdr /* for KAME src sync over BSD*'s */ /* * TCP header. * Per RFC 793, September, 1981. */ struct tcphdr { unsigned short th_sport; /* source port */ unsigned short th_dport; /* destination port */ tcp_seq th_seq; /* sequence number */ tcp_seq th_ack; /* acknowledgement number */ #if __DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN unsigned int th_x2:4, /* (unused) */ th_off:4; /* data offset */ #endif #if __DARWIN_BYTE_ORDER == __DARWIN_BIG_ENDIAN unsigned int th_off:4, /* data offset */ th_x2:4; /* (unused) */ #endif unsigned char th_flags; #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 #define TH_PUSH 0x08 #define TH_ACK 0x10 #define TH_URG 0x20 #define TH_ECE 0x40 #define TH_CWR 0x80 #define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR) unsigned short th_win; /* window */ unsigned short th_sum; /* checksum */ unsigned short th_urp; /* urgent pointer */ }; #define TCPOPT_EOL 0 #define TCPOPT_NOP 1 #define TCPOPT_MAXSEG 2 #define TCPOLEN_MAXSEG 4 #define TCPOPT_WINDOW 3 #define TCPOLEN_WINDOW 3 #define TCPOPT_SACK_PERMITTED 4 /* Experimental */ #define TCPOLEN_SACK_PERMITTED 2 #define TCPOPT_SACK 5 /* Experimental */ #define TCPOLEN_SACK 8 /* len of sack block */ #define TCPOPT_TIMESTAMP 8 #define TCPOLEN_TIMESTAMP 10 #define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */ #define TCPOPT_TSTAMP_HDR \ (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP) #define MAX_TCPOPTLEN 40 /* Absolute maximum TCP options len */ #define TCPOPT_CC 11 /* CC options: RFC-1644 */ #define TCPOPT_CCNEW 12 #define TCPOPT_CCECHO 13 #define TCPOLEN_CC 6 #define TCPOLEN_CC_APPA (TCPOLEN_CC+2) #define TCPOPT_CC_HDR(ccopt) \ (TCPOPT_NOP<<24|TCPOPT_NOP<<16|(ccopt)<<8|TCPOLEN_CC) #define TCPOPT_SIGNATURE 19 /* Keyed MD5: RFC 2385 */ #define TCPOLEN_SIGNATURE 18 #if MPTCP #define TCPOPT_MULTIPATH 30 #endif #define TCPOPT_FASTOPEN 34 #define TCPOLEN_FASTOPEN_REQ 2 /* Option definitions */ #define TCPOPT_SACK_PERMIT_HDR \ (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_SACK_PERMITTED<<8|TCPOLEN_SACK_PERMITTED) #define TCPOPT_SACK_HDR (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_SACK<<8) /* Miscellaneous constants */ #define MAX_SACK_BLKS 6 /* Max # SACK blocks stored at sender side */ /* * A SACK option that specifies n blocks will have a length of (8*n + 2) * bytes, so the 40 bytes available for TCP options can specify a * maximum of 4 blocks. */ #define TCP_MAX_SACK 4 /* MAX # SACKs sent in any segment */ /* * Default maximum segment size for TCP. * With an IP MTU of 576, this is 536, * but 512 is probably more convenient. * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)). */ #define TCP_MSS 512 /* * TCP_MINMSS is defined to be 216 which is fine for the smallest * link MTU (256 bytes, SLIP interface) in the Internet. * However it is very unlikely to come across such low MTU interfaces * these days (anno dato 2004). * Probably it can be set to 512 without ill effects. But we play safe. * See tcp_subr.c tcp_minmss SYSCTL declaration for more comments. * Setting this to "0" disables the minmss check. */ #define TCP_MINMSS 216 /* * Default maximum segment size for TCP6. * With an IP6 MSS of 1280, this is 1220, * but 1024 is probably more convenient. (xxx kazu in doubt) * This should be defined as MIN(1024, IP6_MSS - sizeof (struct tcpip6hdr)) */ #define TCP6_MSS 1024 #define TCP_MAXWIN 65535 /* largest value for (unscaled) window */ #define TTCP_CLIENT_SND_WND 4096 /* dflt send window for T/TCP client */ #define TCP_MAX_WINSHIFT 14 /* maximum window shift */ #define TCP_MAXHLEN (0xf<<2) /* max length of header in bytes */ #define TCP_MAXOLEN (TCP_MAXHLEN - sizeof(struct tcphdr)) /* max space left for options */ #endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ /* * User-settable options (used with setsockopt). */ #define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) #define TCP_MAXSEG 0x02 /* set maximum segment size */ #define TCP_NOPUSH 0x04 /* don't push last block of write */ #define TCP_NOOPT 0x08 /* don't use TCP options */ #define TCP_KEEPALIVE 0x10 /* idle time used when SO_KEEPALIVE is enabled */ #define TCP_CONNECTIONTIMEOUT 0x20 /* connection timeout */ #define PERSIST_TIMEOUT 0x40 /* time after which a connection in * persist timeout will terminate. * see draft-ananth-tcpm-persist-02.txt */ #define TCP_RXT_CONNDROPTIME 0x80 /* time after which tcp retransmissions will be * stopped and the connection will be dropped */ #define TCP_RXT_FINDROP 0x100 /* when this option is set, drop a connection * after retransmitting the FIN 3 times. It will * prevent holding too many mbufs in socket * buffer queues. */ #define TCP_KEEPINTVL 0x101 /* interval between keepalives */ #define TCP_KEEPCNT 0x102 /* number of keepalives before close */ #define TCP_SENDMOREACKS 0x103 /* always ack every other packet */ #define TCP_ENABLE_ECN 0x104 /* Enable ECN on a connection */ #define TCP_FASTOPEN 0x105 /* Enable/Disable TCP Fastopen on this socket */ #define TCP_CONNECTION_INFO 0x106 /* State of TCP connection */ #ifdef PRIVATE #define TCP_INFO 0x200 /* retrieve tcp_info structure */ #define TCP_MEASURE_SND_BW 0x202 /* Measure sender's bandwidth for this connection */ #endif /* PRIVATE */ #define TCP_NOTSENT_LOWAT 0x201 /* Low water mark for TCP unsent data */ #ifdef PRIVATE #define TCP_MEASURE_BW_BURST 0x203 /* Burst size to use for bandwidth measurement */ #define TCP_PEER_PID 0x204 /* Lookup pid of the process we're connected to */ #define TCP_ADAPTIVE_READ_TIMEOUT 0x205 /* Read timeout used as a multiple of RTT */ /* * Enable message delivery on a socket, this feature is currently unsupported and * is subjected to change in future. */ #define TCP_ENABLE_MSGS 0x206 #define TCP_ADAPTIVE_WRITE_TIMEOUT 0x207 /* Write timeout used as a multiple of RTT */ #define TCP_NOTIMEWAIT 0x208 /* Avoid going into time-wait */ #define TCP_DISABLE_BLACKHOLE_DETECTION 0x209 /* disable PMTU blackhole detection */ #define TCP_ECN_MODE 0x210 /* fine grain control for A/B testing */ #define TCP_KEEPALIVE_OFFLOAD 0x211 /* offload keep alive processing to firmware */ /* * TCP_ECN_MODE values */ #define ECN_MODE_DEFAULT 0x0 /* per interface or system wide default */ #define ECN_MODE_ENABLE 0x1 /* force enable ECN on connection */ #define ECN_MODE_DISABLE 0x2 /* force disable ECN on connection */ /* * TCP_NOTIFY_ACKNOWLEDGEMENT * * Application can use this socket option to get a notification when * data that is currently written to the socket is acknowledged. The input * argument given to this socket option is a marker_id that will be used for * returning the notification. The application can continue to write * data after setting the marker. There can be multiple of these events * outstanding on a socket at any time up to a max of TCP_MAX_NOTIFY_ACK. * * To get the completed notifications, getsockopt should be called with the * TCP_NOTIFY_ACKNOWLEDGEMENT with the following tcp_notify_ack_complete * structure as an out argument. At most TCP_MAX_NOTIFY_ACK ids will be * returned if they have been successfully acknowledged in each call. */ #define TCP_MAX_NOTIFY_ACK 10 typedef u_int32_t tcp_notify_ack_id_t; struct tcp_notify_ack_complete { u_int32_t notify_pending; /* still pending */ u_int32_t notify_complete_count; tcp_notify_ack_id_t notify_complete_id[TCP_MAX_NOTIFY_ACK]; }; #define TCP_NOTIFY_ACKNOWLEDGEMENT 0x212 /* Notify when data is acknowledged */ #define MPTCP_SERVICE_TYPE 0x213 /* MPTCP Service type */ #define TCP_FASTOPEN_FORCE_HEURISTICS 0x214 /* Make sure TFO-heuristics never get disabled */ #define MPTCP_SVCTYPE_HANDOVER 0 /* Default 0 */ #define MPTCP_SVCTYPE_INTERACTIVE 1 #define MPTCP_SVCTYPE_AGGREGATE 2 #define MPTCP_SVCTYPE_MAX 3 /* * Specify minimum time in seconds before which an established * TCP connection will not be dropped when there is no response from the * peer */ #define TCP_RXT_MINIMUM_TIMEOUT 0x215 #define TCP_RXT_MINIMUM_TIMEOUT_LIMIT (5 * 60) /* Limit is 5 minutes */ #define MPTCP_ALTERNATE_PORT 0x216 /* * The TCP_INFO socket option is a private API and is subject to change */ #pragma pack(4) #define TCPI_OPT_TIMESTAMPS 0x01 #define TCPI_OPT_SACK 0x02 #define TCPI_OPT_WSCALE 0x04 #define TCPI_OPT_ECN 0x08 #define TCPI_FLAG_LOSSRECOVERY 0x01 /* Currently in loss recovery */ #define TCPI_FLAG_STREAMING_ON 0x02 /* Streaming detection on */ struct tcp_conn_status { unsigned int probe_activated : 1; unsigned int write_probe_failed : 1; unsigned int read_probe_failed : 1; unsigned int conn_probe_failed : 1; }; /* * Add new fields to this structure at the end only. This will preserve * binary compatibility. */ struct tcp_info { u_int8_t tcpi_state; /* TCP FSM state. */ u_int8_t tcpi_options; /* Options enabled on conn. */ u_int8_t tcpi_snd_wscale; /* RFC1323 send shift value. */ u_int8_t tcpi_rcv_wscale; /* RFC1323 recv shift value. */ u_int32_t tcpi_flags; /* extra flags (TCPI_FLAG_xxx) */ u_int32_t tcpi_rto; /* Retransmission timeout in milliseconds */ u_int32_t tcpi_snd_mss; /* Max segment size for send. */ u_int32_t tcpi_rcv_mss; /* Max segment size for receive. */ u_int32_t tcpi_rttcur; /* Most recent value of RTT */ u_int32_t tcpi_srtt; /* Smoothed RTT */ u_int32_t tcpi_rttvar; /* RTT variance */ u_int32_t tcpi_rttbest; /* Best RTT we've seen */ u_int32_t tcpi_snd_ssthresh; /* Slow start threshold. */ u_int32_t tcpi_snd_cwnd; /* Send congestion window. */ u_int32_t tcpi_rcv_space; /* Advertised recv window. */ u_int32_t tcpi_snd_wnd; /* Advertised send window. */ u_int32_t tcpi_snd_nxt; /* Next egress seqno */ u_int32_t tcpi_rcv_nxt; /* Next ingress seqno */ int32_t tcpi_last_outif; /* if_index of interface used to send last */ u_int32_t tcpi_snd_sbbytes; /* bytes in snd buffer including data inflight */ u_int64_t tcpi_txpackets __attribute__((aligned(8))); /* total packets sent */ u_int64_t tcpi_txbytes __attribute__((aligned(8))); /* total bytes sent */ u_int64_t tcpi_txretransmitbytes __attribute__((aligned(8))); /* total bytes retransmitted */ u_int64_t tcpi_txunacked __attribute__((aligned(8))); /* current number of bytes not acknowledged */ u_int64_t tcpi_rxpackets __attribute__((aligned(8))); /* total packets received */ u_int64_t tcpi_rxbytes __attribute__((aligned(8))); /* total bytes received */ u_int64_t tcpi_rxduplicatebytes __attribute__((aligned(8))); /* total duplicate bytes received */ u_int64_t tcpi_rxoutoforderbytes __attribute__((aligned(8))); /* total out of order bytes received */ u_int64_t tcpi_snd_bw __attribute__((aligned(8))); /* measured send bandwidth in bits/sec */ u_int8_t tcpi_synrexmits; /* Number of syn retransmits before connect */ u_int8_t tcpi_unused1; u_int16_t tcpi_unused2; u_int64_t tcpi_cell_rxpackets __attribute((aligned(8))); /* packets received over cellular */ u_int64_t tcpi_cell_rxbytes __attribute((aligned(8))); /* bytes received over cellular */ u_int64_t tcpi_cell_txpackets __attribute((aligned(8))); /* packets transmitted over cellular */ u_int64_t tcpi_cell_txbytes __attribute((aligned(8))); /* bytes transmitted over cellular */ u_int64_t tcpi_wifi_rxpackets __attribute((aligned(8))); /* packets received over Wi-Fi */ u_int64_t tcpi_wifi_rxbytes __attribute((aligned(8))); /* bytes received over Wi-Fi */ u_int64_t tcpi_wifi_txpackets __attribute((aligned(8))); /* packets transmitted over Wi-Fi */ u_int64_t tcpi_wifi_txbytes __attribute((aligned(8))); /* bytes transmitted over Wi-Fi */ u_int64_t tcpi_wired_rxpackets __attribute((aligned(8))); /* packets received over Wired */ u_int64_t tcpi_wired_rxbytes __attribute((aligned(8))); /* bytes received over Wired */ u_int64_t tcpi_wired_txpackets __attribute((aligned(8))); /* packets transmitted over Wired */ u_int64_t tcpi_wired_txbytes __attribute((aligned(8))); /* bytes transmitted over Wired */ struct tcp_conn_status tcpi_connstatus; /* status of connection probes */ u_int16_t tcpi_tfo_cookie_req:1, /* Cookie requested? */ tcpi_tfo_cookie_rcv:1, /* Cookie received? */ tcpi_tfo_syn_loss:1, /* Fallback to reg. TCP after SYN-loss */ tcpi_tfo_syn_data_sent:1, /* SYN+data has been sent out */ tcpi_tfo_syn_data_acked:1, /* SYN+data has been fully acknowledged */ tcpi_tfo_syn_data_rcv:1, /* Server received SYN+data with a valid cookie */ tcpi_tfo_cookie_req_rcv:1, /* Server received cookie-request */ tcpi_tfo_cookie_sent:1, /* Server announced cookie */ tcpi_tfo_cookie_invalid:1, /* Server received an invalid cookie */ tcpi_tfo_cookie_wrong:1, /* Our sent cookie was wrong */ tcpi_tfo_no_cookie_rcv:1, /* We did not receive a cookie upon our request */ tcpi_tfo_heuristics_disable:1, /* TFO-heuristics disabled it */ tcpi_tfo_send_blackhole:1, /* A sending-blackhole got detected */ tcpi_tfo_recv_blackhole:1, /* A receiver-blackhole got detected */ tcpi_tfo_onebyte_proxy:1; /* A proxy acknowledges all but one byte of the SYN */ u_int16_t tcpi_ecn_client_setup:1, /* Attempted ECN setup from client side */ tcpi_ecn_server_setup:1, /* Attempted ECN setup from server side */ tcpi_ecn_success:1, /* peer negotiated ECN */ tcpi_ecn_lost_syn:1, /* Lost SYN with ECN setup */ tcpi_ecn_lost_synack:1, /* Lost SYN-ACK with ECN setup */ tcpi_local_peer:1, /* Local to the host or the subnet */ tcpi_if_cell:1, /* Interface is cellular */ tcpi_if_wifi:1, /* Interface is WiFi */ tcpi_if_wired:1, /* Interface is wired - ethernet , thunderbolt etc,. */ tcpi_if_wifi_infra:1, /* Interface is wifi infrastructure */ tcpi_if_wifi_awdl:1, /* Interface is wifi AWDL */ tcpi_snd_background:1, /* Using delay based algorithm on sender side */ tcpi_rcv_background:1; /* Using delay based algorithm on receive side */ u_int32_t tcpi_ecn_recv_ce; /* Packets received with CE */ u_int32_t tcpi_ecn_recv_cwr; /* Packets received with CWR */ u_int32_t tcpi_rcvoopack; /* out-of-order packets received */ u_int32_t tcpi_pawsdrop; /* segments dropped due to PAWS */ u_int32_t tcpi_sack_recovery_episode; /* SACK recovery episodes */ u_int32_t tcpi_reordered_pkts; /* packets reorderd */ u_int32_t tcpi_dsack_sent; /* Sent DSACK notification */ u_int32_t tcpi_dsack_recvd; /* Received a valid DSACK option */ u_int32_t tcpi_flowhash; /* Unique id for the connection */ u_int64_t tcpi_txretransmitpackets __attribute__((aligned(8))); }; struct tcp_measure_bw_burst { u_int32_t min_burst_size; /* Minimum number of packets to use */ u_int32_t max_burst_size; /* Maximum number of packets to use */ }; /* * Note that IPv6 link local addresses should have the appropriate scope ID */ struct info_tuple { u_int8_t itpl_proto; union { struct sockaddr _itpl_sa; struct sockaddr_in _itpl_sin; struct sockaddr_in6 _itpl_sin6; } itpl_localaddr; union { struct sockaddr _itpl_sa; struct sockaddr_in _itpl_sin; struct sockaddr_in6 _itpl_sin6; } itpl_remoteaddr; }; #define itpl_local_sa itpl_localaddr._itpl_sa #define itpl_local_sin itpl_localaddr._itpl_sin #define itpl_local_sin6 itpl_localaddr._itpl_sin6 #define itpl_remote_sa itpl_remoteaddr._itpl_sa #define itpl_remote_sin itpl_remoteaddr._itpl_sin #define itpl_remote_sin6 itpl_remoteaddr._itpl_sin6 /* * TCP connection info auxiliary data (CIAUX_TCP) * * Do not add new fields to this structure, just add them to tcp_info * structure towards the end. This will preserve binary compatibility. */ typedef struct conninfo_tcp { pid_t tcpci_peer_pid; /* loopback peer PID if > 0 */ struct tcp_info tcpci_tcp_info; /* TCP info */ } conninfo_tcp_t; #pragma pack() struct mptcp_itf_stats { uint16_t ifindex; uint16_t switches; uint32_t is_expensive:1; uint64_t mpis_txbytes __attribute__((aligned(8))); uint64_t mpis_rxbytes __attribute__((aligned(8))); }; /* Version solely used to let libnetcore survive */ #define CONNINFO_MPTCP_VERSION 3 typedef struct conninfo_multipathtcp { uint32_t mptcpci_subflow_count; uint32_t mptcpci_switch_count; sae_connid_t mptcpci_subflow_connids[4]; uint64_t mptcpci_init_rxbytes; uint64_t mptcpci_init_txbytes; #define MPTCP_ITFSTATS_SIZE 4 struct mptcp_itf_stats mptcpci_itfstats[MPTCP_ITFSTATS_SIZE]; uint32_t mptcpci_flags; #define MPTCPCI_FIRSTPARTY 0x01 } conninfo_multipathtcp_t; #endif /* PRIVATE */ struct tcp_connection_info { u_int8_t tcpi_state; /* connection state */ u_int8_t tcpi_snd_wscale; /* Window scale for send window */ u_int8_t tcpi_rcv_wscale; /* Window scale for receive window */ u_int8_t __pad1; u_int32_t tcpi_options; /* TCP options supported */ #define TCPCI_OPT_TIMESTAMPS 0x00000001 /* Timestamps enabled */ #define TCPCI_OPT_SACK 0x00000002 /* SACK enabled */ #define TCPCI_OPT_WSCALE 0x00000004 /* Window scaling enabled */ #define TCPCI_OPT_ECN 0x00000008 /* ECN enabled */ u_int32_t tcpi_flags; /* flags */ #define TCPCI_FLAG_LOSSRECOVERY 0x00000001 #define TCPCI_FLAG_REORDERING_DETECTED 0x00000002 u_int32_t tcpi_rto; /* retransmit timeout in ms */ u_int32_t tcpi_maxseg; /* maximum segment size supported */ u_int32_t tcpi_snd_ssthresh; /* slow start threshold in bytes */ u_int32_t tcpi_snd_cwnd; /* send congestion window in bytes */ u_int32_t tcpi_snd_wnd; /* send widnow in bytes */ u_int32_t tcpi_snd_sbbytes; /* bytes in send socket buffer, including in-flight data */ u_int32_t tcpi_rcv_wnd; /* receive window in bytes*/ u_int32_t tcpi_rttcur; /* most recent RTT in ms */ u_int32_t tcpi_srtt; /* average RTT in ms */ u_int32_t tcpi_rttvar; /* RTT variance */ u_int32_t tcpi_tfo_cookie_req:1, /* Cookie requested? */ tcpi_tfo_cookie_rcv:1, /* Cookie received? */ tcpi_tfo_syn_loss:1, /* Fallback to reg. TCP after SYN-loss */ tcpi_tfo_syn_data_sent:1, /* SYN+data has been sent out */ tcpi_tfo_syn_data_acked:1, /* SYN+data has been fully acknowledged */ tcpi_tfo_syn_data_rcv:1, /* Server received SYN+data with a valid cookie */ tcpi_tfo_cookie_req_rcv:1, /* Server received cookie-request */ tcpi_tfo_cookie_sent:1, /* Server announced cookie */ tcpi_tfo_cookie_invalid:1, /* Server received an invalid cookie */ tcpi_tfo_cookie_wrong:1, /* Our sent cookie was wrong */ tcpi_tfo_no_cookie_rcv:1, /* We did not receive a cookie upon our request */ tcpi_tfo_heuristics_disable:1, /* TFO-heuristics disabled it */ tcpi_tfo_send_blackhole:1, /* A sending-blackhole got detected */ tcpi_tfo_recv_blackhole:1, /* A receiver-blackhole got detected */ tcpi_tfo_onebyte_proxy:1, /* A proxy acknowledges all but one byte of the SYN */ __pad2:17; u_int64_t tcpi_txpackets __attribute__((aligned(8))); u_int64_t tcpi_txbytes __attribute__((aligned(8))); u_int64_t tcpi_txretransmitbytes __attribute__((aligned(8))); u_int64_t tcpi_rxpackets __attribute__((aligned(8))); u_int64_t tcpi_rxbytes __attribute__((aligned(8))); u_int64_t tcpi_rxoutoforderbytes __attribute__((aligned(8))); u_int64_t tcpi_txretransmitpackets __attribute__((aligned(8))); }; #endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ #endif |