diff options
Diffstat (limited to 'test/packetdrill/tcp.h')
-rw-r--r-- | test/packetdrill/tcp.h | 339 |
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__ */ |