diff options
Diffstat (limited to '')
-rw-r--r-- | compat/gettcpinfo.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/compat/gettcpinfo.c b/compat/gettcpinfo.c index 11f92fe..f7067e9 100644 --- a/compat/gettcpinfo.c +++ b/compat/gettcpinfo.c @@ -42,6 +42,16 @@ * gettcpinfo.c * Suppport for tcp info in a portable way * + * Hi Bob, + * + * I would suggest that the most interesting metrics from tcp_info would be: + * + * double ecn_mark_rate = (double)tcpi_delivered_ce / (double)tcpi_delivered + * double retransmit_rate = (double)(tcpi_total_retrans - tcpi_dsack_dups) / (double)tcpi_data_segs_out + * double smoothed_rtt = tcpi_rtt + * + * neal + * * by Robert J. McMahon (rjmcmahon@rjmcmahon.com, bob.mcmahon@broadcom.com) * ------------------------------------------------------------------- */ @@ -59,11 +69,29 @@ inline void gettcpinfo (int sock, struct iperf_tcpstats *stats) { struct tcp_info tcp_info_buf; socklen_t tcp_info_length = sizeof(struct tcp_info); if ((sock > 0) && !(getsockopt(sock, IPPROTO_TCP, TCP_INFO, &tcp_info_buf, &tcp_info_length) < 0)) { +#if HAVE_STRUCT_TCP_INFO_TCPI_SND_CWND + stats->cwnd_packets = tcp_info_buf.tcpi_snd_cwnd; +#else + stats->cwnd_packets = -1; +#endif +#if HAVE_STRUCT_TCP_INFO_TCPI_SND_CWND && HAVE_STRUCT_TCP_INFO_TCPI_SND_MSS stats->cwnd = tcp_info_buf.tcpi_snd_cwnd * tcp_info_buf.tcpi_snd_mss / 1024; +#else + stats->cwnd = -1; +#endif stats->rtt = tcp_info_buf.tcpi_rtt; stats->rttvar = tcp_info_buf.tcpi_rttvar; stats->retry_tot = tcp_info_buf.tcpi_total_retrans; +#if HAVE_STRUCT_TCP_INFO_TCPI_SND_MSS stats->mss_negotiated = tcp_info_buf.tcpi_snd_mss; +#else + stats->mss_negotiated = -1; +#endif +#if HAVE_TCP_INFLIGHT + stats->packets_in_flight = (tcp_info_buf.tcpi_unacked - tcp_info_buf.tcpi_sacked - \ + tcp_info_buf.tcpi_lost + tcp_info_buf.tcpi_retrans); + stats->bytes_in_flight = stats->packets_in_flight * tcp_info_buf.tcpi_snd_mss / 1024; +#endif stats->isValid = true; #elif HAVE_DECL_TCP_CONNECTION_INFO struct tcp_connection_info tcp_info_buf; @@ -71,8 +99,10 @@ inline void gettcpinfo (int sock, struct iperf_tcpstats *stats) { if ((sock > 0) && !(getsockopt(sock, IPPROTO_TCP, TCP_CONNECTION_INFO, &tcp_info_buf, &tcp_info_length) < 0)) { #ifdef __APPLE__ stats->cwnd = tcp_info_buf.tcpi_snd_cwnd / 1024; + stats->cwnd_packets = -1; #else stats->cwnd = tcp_info_buf.tcpi_snd_cwnd * tcp_info_buf.tcpi_maxseg / 1024; + stats->cwnd_packets = tcp_info_buf.tcpi_snd_cwnd; #endif stats->rtt = tcp_info_buf.tcpi_rttcur * 1000; // OS X units is ms stats->rttvar = tcp_info_buf.tcpi_rttvar; @@ -87,12 +117,18 @@ inline void gettcpinfo (int sock, struct iperf_tcpstats *stats) { } inline void tcpstats_copy (struct iperf_tcpstats *stats_dst, struct iperf_tcpstats *stats_src) { stats_dst->cwnd = stats_src->cwnd; + stats_dst->cwnd_packets = stats_src->cwnd_packets; stats_dst->rtt = stats_src->rtt; stats_dst->rttvar = stats_src->rttvar; stats_dst->mss_negotiated = stats_src->mss_negotiated; stats_dst->retry_tot = stats_src->retry_tot; stats_dst->connecttime = stats_src->connecttime; stats_dst->isValid = stats_src->isValid; +#if HAVE_TCP_INFLIGHT + stats_dst->packets_in_flight = stats_src->packets_in_flight; + stats_dst->bytes_in_flight = stats_src->bytes_in_flight; +#endif + } #else #if WIN32 |