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
/*
 * Copyright (c) 2000-2018 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_PRIVATE_H_
#define _NETINET_TCP_PRIVATE_H_

#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>

#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)

#define TCP_INFO                        0x200   /* retrieve tcp_info structure */
#define TCP_MEASURE_SND_BW              0x202   /* Measure sender's bandwidth for this connection */

#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 */
#define TCP_OPTION_UNUSED_0             0x206   /* UNUSED */
#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 */
/* UNUSED 0x214 */

#define MPTCP_SVCTYPE_HANDOVER          0 /* Default 0 */
#define MPTCP_SVCTYPE_INTERACTIVE       1
#define MPTCP_SVCTYPE_AGGREGATE         2
#define MPTCP_SVCTYPE_TARGET_BASED      3
#define MPTCP_SVCTYPE_PURE_HANDOVER     4
#define MPTCP_SVCTYPE_MAX               5

/*
 * 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
#define MPTCP_FORCE_ENABLE              0x217
#define TCP_FASTOPEN_FORCE_ENABLE       0x218
#define MPTCP_EXPECTED_PROGRESS_TARGET  0x219
#define MPTCP_FORCE_VERSION             0x21a
#define TCP_ENABLE_L4S                  0x21b   /* Enable or disable L4S */

/* When adding new socket-options, you need to make sure MPTCP supports these as well! */

/*
 * 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 - remove when uTCP stops using it */

struct tcp_conn_status {
	union {
		struct {
			unsigned int    probe_activated : 1;
			unsigned int    write_probe_failed : 1;
			unsigned int    read_probe_failed : 1;
			unsigned int    conn_probe_failed : 1;
		};
		uint32_t        pad_field;
	};
};

#define TCPINFO_HAS_L4S_ 1
typedef enum {
	tcp_connection_client_accurate_ecn_invalid                                    = 0,
	tcp_connection_client_accurate_ecn_feature_disabled                           = 1,
	tcp_connection_client_accurate_ecn_feature_enabled                            = 2,
	tcp_connection_client_classic_ecn_available                                   = 3,
	tcp_connection_client_ecn_not_available                                       = 4,
	tcp_connection_client_accurate_ecn_negotiation_blackholed                     = 5,
	tcp_connection_client_accurate_ecn_ace_bleaching_detected                     = 6,
	tcp_connection_client_accurate_ecn_negotiation_success                        = 7,
	tcp_connection_client_accurate_ecn_negotiation_success_ect_mangling_detected  = 8,
	tcp_connection_client_accurate_ecn_negotiation_success_ect_bleaching_detected = 9,
} tcp_connection_client_accurate_ecn_state_t;

typedef enum {
	tcp_connection_server_accurate_ecn_invalid                                    = 0,
	tcp_connection_server_accurate_ecn_feature_disabled                           = 1,
	tcp_connection_server_accurate_ecn_feature_enabled                            = 2,
	tcp_connection_server_no_ecn_requested                                        = 3,
	tcp_connection_server_classic_ecn_requested                                   = 4,
	tcp_connection_server_accurate_ecn_requested                                  = 5,
	tcp_connection_server_accurate_ecn_negotiation_blackholed                     = 6,
	tcp_connection_server_accurate_ecn_ace_bleaching_detected                     = 7,
	tcp_connection_server_accurate_ecn_negotiation_success                        = 8,
	tcp_connection_server_accurate_ecn_negotiation_success_ect_mangling_detected  = 9,
	tcp_connection_server_accurate_ecn_negotiation_success_ect_bleaching_detected = 10,
} tcp_connection_server_accurate_ecn_state_t;

/*
 * 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;          /* Sender's 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 */

#define TCPINFO_HAS_L4S_STATE 1
	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 */
	    tcpi_l4s_enabled:1;             /* Whether L4S is enabled or not */

	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)));

	uint32_t       tcpi_rcv_srtt;       /* Receiver's Smoothed RTT */
	uint32_t       tcpi_client_accecn_state;   /* Client's Accurate ECN state */
	uint32_t       tcpi_server_accecn_state;   /* Server's Accurate ECN state as seen by clent */
	uint64_t       tcpi_ecn_capable_packets_sent;   /* Packets sent with ECT */
	uint64_t       tcpi_ecn_capable_packets_acked;  /* Packets sent with ECT that were ACKed */
	uint64_t       tcpi_ecn_capable_packets_marked; /* Packets sent with ECT that were marked, same as delivered_ce_packets */
	uint64_t       tcpi_ecn_capable_packets_lost;   /* Packets sent with ECT that were lost */

#define TCPINFO_HAS_L4S 1
	uint64_t       tcpi_received_ce_packets;
	uint64_t       tcpi_received_ect0_bytes;
	uint64_t       tcpi_received_ect1_bytes;
	uint64_t       tcpi_received_ce_bytes;
	uint64_t       tcpi_delivered_ect0_bytes;
	uint64_t       tcpi_delivered_ect1_bytes;
	uint64_t       tcpi_delivered_ce_bytes;

#define TCPINFO_HAS_LIMITED_TIME 1
	uint64_t       tcpi_flow_control_total_time;
	uint64_t       tcpi_rcvwnd_limited_total_time;

#define TCPINFO_HAS_PACING_RATE 1
	uint64_t       tcpi_pacing_rate;
	uint64_t       tcpi_max_pacing_rate;
};

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 {
#if !__has_ptrcheck
		struct sockaddr                 _itpl_sa;
#endif
		struct __sockaddr_header        _itpl_sah;
		struct sockaddr_in              _itpl_sin;
		struct sockaddr_in6             _itpl_sin6;
	} itpl_localaddr;
	union {
#if !__has_ptrcheck
		struct sockaddr                 _itpl_sa;
#endif
		struct __sockaddr_header        _itpl_sah;
		struct sockaddr_in              _itpl_sin;
		struct sockaddr_in6             _itpl_sin6;
	} itpl_remoteaddr;
};

#if !__has_ptrcheck
#define itpl_local_sa           itpl_localaddr._itpl_sa
#define itpl_remote_sa          itpl_remoteaddr._itpl_sa
#endif

#define itpl_local_sah          itpl_localaddr._itpl_sah
#define itpl_local_sin          itpl_localaddr._itpl_sin
#define itpl_local_sin6         itpl_localaddr._itpl_sin6
#define itpl_remote_sah         itpl_remoteaddr._itpl_sah
#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 {
	struct tcp_info         tcpci_tcp_info;/* TCP info */
} conninfo_tcp_t;

/*
 * Entitlement for the syctl "net.inet.tcp.info"
 */
#define NET_INET_TCP_INFO_ENTITLEMENT "com.apple.private.network.tcp.info"

#pragma pack()

struct mptcp_itf_stats {
	u_short  ifindex;
	uint16_t switches;
	uint32_t is_expensive:1;
	uint64_t mpis_txbytes __attribute__((aligned(8)));
	uint64_t mpis_rxbytes __attribute__((aligned(8)));
	uint64_t mpis_wifi_txbytes __attribute__((aligned(8)));
	uint64_t mpis_wifi_rxbytes __attribute__((aligned(8)));
	uint64_t mpis_wired_txbytes __attribute__((aligned(8)));
	uint64_t mpis_wired_rxbytes __attribute__((aligned(8)));
	uint64_t mpis_cell_txbytes __attribute__((aligned(8)));
	uint64_t mpis_cell_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 /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */

#endif /* _NETINET_TCP_PRIVATE_H_ */