aboutsummaryrefslogtreecommitdiffstats
path: root/test/packetdrill/tcp.h
diff options
context:
space:
mode:
Diffstat (limited to 'test/packetdrill/tcp.h')
-rw-r--r--test/packetdrill/tcp.h339
1 files changed, 339 insertions, 0 deletions
diff --git a/test/packetdrill/tcp.h b/test/packetdrill/tcp.h
new file mode 100644
index 0000000..5a03f35
--- /dev/null
+++ b/test/packetdrill/tcp.h
@@ -0,0 +1,339 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+/*
+ * Author: ncardwell@google.com (Neal Cardwell)
+ *
+ * Our own TCP header declarations, so we have something that's
+ * portable and somewhat more readable than a typical system header
+ * file.
+ *
+ * We cannot include the kernel's linux/tcp.h because this tool tries
+ * to compile and work for basically any Linux/BSD kernel version. So
+ * we declare our own version of various TCP-related definitions here.
+ */
+
+#ifndef __TCP_HEADERS_H__
+#define __TCP_HEADERS_H__
+
+#include "types.h"
+
+#include <netinet/tcp.h>
+
+#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
+#define SOL_TCP IPPROTO_TCP
+#endif /* defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) */
+
+#ifdef linux
+
+/* TCP socket options used by Linux kernels under test but not in
+ * standard Linux header files.
+ */
+#define SO_REUSEPORT 15
+
+/* TCP socket options used by Linux kernels under test but not in
+ * standard Linux header files.
+ */
+#define TCP_COOKIE_TRANSACTIONS 15 /* TCP Cookie Transactions */
+#define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams */
+#define TCP_THIN_DUPACK 17 /* Fast retrans. after 1 dupack */
+#define TCP_USER_TIMEOUT 18 /* How long to retry losses */
+#define TCP_FASTOPEN 23 /* TCP Fast Open: data in SYN */
+#define TCP_TIMESTAMP 24
+#define TCP_NOTSENT_LOWAT 25 /* limit unsent bytes in write queue */
+#define TCP_CC_INFO 26 /* Get Congestion Control (optional) info */
+#define TCP_SAVE_SYN 27 /* Record SYN headers for new connections */
+#define TCP_SAVED_SYN 28 /* Get SYN headers recorded for connection */
+#define TCP_REPAIR_WINDOW 29 /* Get/set window parameters */
+#define TCP_FASTOPEN_CONNECT 30 /* Attempt FastOpen with connect */
+
+/* TODO: remove these when netinet/tcp.h has them */
+#ifndef TCPI_OPT_ECN_SEEN
+#define TCPI_OPT_ECN_SEEN 16 /* received at least one packet with ECT */
+#endif
+#ifndef TCPI_OPT_SYN_DATA
+#define TCPI_OPT_SYN_DATA 32 /* SYN-ACK acked data in SYN sent or rcvd */
+#endif
+
+#endif /* linux */
+
+/* New TCP flags for sendto(2)/sendmsg(2). */
+#ifndef MSG_FASTOPEN
+#define MSG_FASTOPEN 0x20000000 /* TCP Fast Open: data in SYN */
+#endif
+
+#ifndef MSG_ZEROCOPY
+#define MSG_ZEROCOPY 0x4000000
+#endif
+
+/* TCP option numbers and lengths. */
+#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
+#define TCPOLEN_SACK_PERMITTED 2
+#define TCPOPT_SACK 5
+#define TCPOPT_TIMESTAMP 8
+#define TCPOLEN_TIMESTAMP 10
+#define TCPOPT_MD5SIG 19 /* MD5 Signature (RFC2385) */
+#define TCPOLEN_MD5SIG 18
+#define TCPOLEN_MD5_BASE 2
+#define TCPOPT_FASTOPEN 34
+#define TCPOPT_EXP 254 /* Experimental */
+
+#define TCP_MD5_DIGEST_LEN 16 /* bytes in RFC2385 TCP MD5 digest */
+
+/* A portable TCP header definition (Linux and *BSD use different names). */
+struct tcp {
+ __be16 src_port;
+ __be16 dst_port;
+ __be32 seq;
+ __be32 ack_seq;
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+ __u16 res1:4,
+ doff:4,
+ fin:1,
+ syn:1,
+ rst:1,
+ psh:1,
+ ack:1,
+ urg:1,
+ ece:1,
+ cwr:1;
+# elif __BYTE_ORDER == __BIG_ENDIAN
+ __u16 doff:4,
+ res1:4,
+ cwr:1,
+ ece:1,
+ urg:1,
+ ack:1,
+ psh:1,
+ rst:1,
+ syn:1,
+ fin:1;
+# else
+# error "Adjust your defines"
+# endif
+ __be16 window;
+ __sum16 check;
+ __be16 urg_ptr;
+};
+
+#ifdef linux
+
+/* Data returned by the TCP_INFO socket option. */
+struct _tcp_info {
+ __u8 tcpi_state;
+ __u8 tcpi_ca_state;
+ __u8 tcpi_retransmits;
+ __u8 tcpi_probes;
+ __u8 tcpi_backoff;
+ __u8 tcpi_options;
+ __u8 tcpi_snd_wscale:4, tcpi_rcv_wscale:4;
+ __u8 tcpi_delivery_rate_app_limited:1;
+
+ __u32 tcpi_rto;
+ __u32 tcpi_ato;
+ __u32 tcpi_snd_mss;
+ __u32 tcpi_rcv_mss;
+
+ __u32 tcpi_unacked;
+ __u32 tcpi_sacked;
+ __u32 tcpi_lost;
+ __u32 tcpi_retrans;
+ __u32 tcpi_fackets;
+
+ /* Times. */
+ __u32 tcpi_last_data_sent;
+ __u32 tcpi_last_ack_sent; /* Not remembered, sorry. */
+ __u32 tcpi_last_data_recv;
+ __u32 tcpi_last_ack_recv;
+
+ /* Metrics. */
+ __u32 tcpi_pmtu;
+ __u32 tcpi_rcv_ssthresh;
+ __u32 tcpi_rtt;
+ __u32 tcpi_rttvar;
+ __u32 tcpi_snd_ssthresh;
+ __u32 tcpi_snd_cwnd;
+ __u32 tcpi_advmss;
+ __u32 tcpi_reordering;
+
+ __u32 tcpi_rcv_rtt;
+ __u32 tcpi_rcv_space;
+
+ __u32 tcpi_total_retrans;
+
+ __u64 tcpi_pacing_rate;
+ __u64 tcpi_max_pacing_rate;
+ __u64 tcpi_bytes_acked; /* RFC4898 tcpEStatsAppHCThruOctetsAcked */
+ __u64 tcpi_bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived */
+ __u32 tcpi_segs_out; /* RFC4898 tcpEStatsPerfSegsOut */
+ __u32 tcpi_segs_in; /* RFC4898 tcpEStatsPerfSegsIn */
+
+ __u32 tcpi_notsent_bytes;
+ __u32 tcpi_min_rtt;
+ __u32 tcpi_data_segs_in; /* RFC4898 tcpEStatsDataSegsIn */
+ __u32 tcpi_data_segs_out; /* RFC4898 tcpEStatsDataSegsOut */
+ __u64 tcpi_delivery_rate;
+
+ __u64 tcpi_busy_time; /* Time (usec) busy sending data */
+ __u64 tcpi_rwnd_limited; /* Time (usec) limited by receive window */
+ __u64 tcpi_sndbuf_limited; /* Time (usec) limited by send buffer */
+};
+
+/* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */
+enum {
+ _TCP_NLA_PAD,
+ _TCP_NLA_BUSY, /* Time (usec) busy sending data */
+ _TCP_NLA_RWND_LIMITED, /* Time (usec) limited by receive window */
+ _TCP_NLA_SNDBUF_LIMITED,/* Time (usec) limited by send buffer */
+ _TCP_NLA_DATA_SEGS_OUT, /* Data pkts sent including retransmission */
+ _TCP_NLA_TOTAL_RETRANS, /* Data pkts retransmitted */
+ _TCP_NLA_PACING_RATE, /* Pacing rate in bytes per second */
+ _TCP_NLA_DELIVERY_RATE, /* Delivery rate in bytes per second */
+ _TCP_NLA_SND_CWND, /* Sending congestion window */
+ _TCP_NLA_REORDERING, /* Reordering metric */
+ _TCP_NLA_MIN_RTT, /* minimum RTT */
+ _TCP_NLA_RECUR_RETRANS, /* Recurring retransmits for the current pkt */
+ _TCP_NLA_DELIVERY_RATE_APP_LMT, /* delivery rate application limited ? */
+ _TCP_NLA_SNDQ_SIZE, /* Data pending in send queue */
+ _TCP_NLA_CA_STATE, /* ca_state of socket */
+};
+
+/* TCP ca_state */
+enum {
+ _TCP_CA_Open,
+ _TCP_CA_Disorder,
+ _TCP_CA_CWR,
+ _TCP_CA_Recovery,
+ _TCP_CA_Loss,
+};
+
+enum {
+ _SK_MEMINFO_RMEM_ALLOC,
+ _SK_MEMINFO_RCVBUF,
+ _SK_MEMINFO_WMEM_ALLOC,
+ _SK_MEMINFO_SNDBUF,
+ _SK_MEMINFO_FWD_ALLOC,
+ _SK_MEMINFO_WMEM_QUEUED,
+ _SK_MEMINFO_OPTMEM,
+ _SK_MEMINFO_BACKLOG,
+ _SK_MEMINFO_DROPS,
+
+ _SK_MEMINFO_VARS,
+};
+
+/* INET_DIAG_VEGASINFO */
+
+struct _tcpvegas_info {
+ __u32 tcpv_enabled;
+ __u32 tcpv_rttcnt;
+ __u32 tcpv_rtt;
+ __u32 tcpv_minrtt;
+};
+
+/* INET_DIAG_DCTCPINFO */
+
+struct _tcp_dctcp_info {
+ __u16 dctcp_enabled;
+ __u16 dctcp_ce_state;
+ __u32 dctcp_alpha;
+ __u32 dctcp_ab_ecn;
+ __u32 dctcp_ab_tot;
+};
+
+/* INET_DIAG_BBRINFO */
+
+struct _tcp_bbr_info {
+ /* u64 bw: max-filtered BW (app throughput) estimate in Byte per sec: */
+ __u32 bbr_bw_lo; /* lower 32 bits of bw */
+ __u32 bbr_bw_hi; /* upper 32 bits of bw */
+ __u32 bbr_min_rtt; /* min-filtered RTT in uSec */
+ __u32 bbr_pacing_gain; /* pacing gain shifted left 8 bits */
+ __u32 bbr_cwnd_gain; /* cwnd gain shifted left 8 bits */
+};
+
+union _tcp_cc_info {
+ struct _tcpvegas_info vegas;
+ struct _tcp_dctcp_info dctcp;
+ struct _tcp_bbr_info bbr;
+};
+#endif /* linux */
+
+#if defined(__FreeBSD__)
+
+/* Data returned by the TCP_INFO socket option on FreeBSD. */
+struct _tcp_info {
+ u_int8_t tcpi_state;
+ u_int8_t __tcpi_ca_state;
+ u_int8_t __tcpi_retransmits;
+ u_int8_t __tcpi_probes;
+ u_int8_t __tcpi_backoff;
+ u_int8_t tcpi_options;
+ u_int8_t tcpi_snd_wscale:4,
+ tcpi_rcv_wscale:4;
+
+ u_int32_t tcpi_rto;
+ u_int32_t __tcpi_ato;
+ u_int32_t tcpi_snd_mss;
+ u_int32_t tcpi_rcv_mss;
+
+ u_int32_t __tcpi_unacked;
+ u_int32_t __tcpi_sacked;
+ u_int32_t __tcpi_lost;
+ u_int32_t __tcpi_retrans;
+ u_int32_t __tcpi_fackets;
+
+ u_int32_t __tcpi_last_data_sent;
+ u_int32_t __tcpi_last_ack_sent;
+ u_int32_t tcpi_last_data_recv;
+ u_int32_t __tcpi_last_ack_recv;
+
+ u_int32_t __tcpi_pmtu;
+ u_int32_t __tcpi_rcv_ssthresh;
+ u_int32_t tcpi_rtt;
+ u_int32_t tcpi_rttvar;
+ u_int32_t tcpi_snd_ssthresh;
+ u_int32_t tcpi_snd_cwnd;
+ u_int32_t __tcpi_advmss;
+ u_int32_t __tcpi_reordering;
+
+ u_int32_t __tcpi_rcv_rtt;
+ u_int32_t tcpi_rcv_space;
+
+ /* FreeBSD extensions to tcp_info. */
+ u_int32_t tcpi_snd_wnd;
+ u_int32_t tcpi_snd_bwnd;
+ u_int32_t tcpi_snd_nxt;
+ u_int32_t tcpi_rcv_nxt;
+ u_int32_t tcpi_toe_tid;
+ u_int32_t tcpi_snd_rexmitpack;
+ u_int32_t tcpi_rcv_ooopack;
+ u_int32_t tcpi_snd_zerowin;
+
+ /* Padding to grow without breaking ABI. */
+ u_int32_t __tcpi_pad[26]; /* Padding. */
+};
+
+#endif /* __FreeBSD__ */
+
+#endif /* __TCP_HEADERS_H__ */