From 86daf673f3ae49bbd7b215ce19492ce4585d861c Mon Sep 17 00:00:00 2001 From: Havard Eidnes Date: Thu, 19 Feb 2015 14:23:01 +0100 Subject: [PATCH] Add support for NetBSD systems which have TCP_INFO implemented. --- src/iperf.h | 5 +++-- src/iperf_locale.c | 4 ++++ src/tcp_info.c | 34 +++++++++++++++++++++------------- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/iperf.h b/src/iperf.h index ede93b5..447eaad 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -66,8 +66,9 @@ struct iperf_interval_results int cnt_error; int omitted; -#if defined(linux) || defined(__FreeBSD__) - struct tcp_info tcpInfo; /* getsockopt(TCP_INFO) for Linux and FreeBSD */ +#if (defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)) && \ + defined(TCP_INFO) + struct tcp_info tcpInfo; /* getsockopt(TCP_INFO) for Linux, {Free,Net}BSD */ #else /* Just placeholders, never accessed. */ char *tcpInfo; diff --git a/src/iperf_locale.c b/src/iperf_locale.c index b127858..6286069 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -369,6 +369,10 @@ const char report_tcpInfo[] = const char report_tcpInfo[] = "event=TCP_Info CWND=%u RCV_WIND=%u SND_SSTHRESH=%u RTT=%u\n"; #endif +#if defined(__NetBSD__) +const char report_tcpInfo[] = +"event=TCP_Info CWND=%u RCV_WIND=%u SND_SSTHRESH=%u RTT=%u\n"; +#endif #ifdef HAVE_QUAD_SUPPORT diff --git a/src/tcp_info.c b/src/tcp_info.c index ebf44e9..57ce240 100644 --- a/src/tcp_info.c +++ b/src/tcp_info.c @@ -61,7 +61,8 @@ int has_tcpinfo(void) { -#if defined(linux) || defined(__FreeBSD__) +#if (defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)) \ + && defined(TCP_INFO) return 1; #else return 0; @@ -81,8 +82,9 @@ has_tcpinfo_retransmits(void) return 1; #else #if defined(__FreeBSD__) && __FreeBSD_version >= 600000 - /* return 1; */ - return 0; /* FreeBSD retransmit reporting doesn't actually work yet */ + return 1; /* Should work now */ +#elif defined(__NetBSD__) && defined(TCP_INFO) + return 1; #else return 0; #endif @@ -93,7 +95,8 @@ has_tcpinfo_retransmits(void) void save_tcpinfo(struct iperf_stream *sp, struct iperf_interval_results *irp) { -#if defined(linux) || defined(__FreeBSD__) +#if (defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)) && \ + defined(TCP_INFO) socklen_t tcp_info_length = sizeof(struct tcp_info); if (getsockopt(sp->socket, IPPROTO_TCP, TCP_INFO, (void *)&irp->tcpInfo, &tcp_info_length) < 0) @@ -114,13 +117,13 @@ get_total_retransmits(struct iperf_interval_results *irp) { #if defined(linux) && defined(TCP_MD5SIG) return irp->tcpInfo.tcpi_total_retrans; -#else -#if defined(__FreeBSD__) && __FreeBSD_version >= 600000 - return irp->tcpInfo.__tcpi_retransmits; +#elif defined(__FreeBSD__) && __FreeBSD_version >= 600000 + return irp->tcpInfo.tcpi_snd_rexmitpack; +#elif defined(__NetBSD__) && defined(TCP_INFO) + return irp->tcpInfo.tcpi_snd_rexmitpack; #else return -1; #endif -#endif } /*************************************************************/ @@ -132,13 +135,13 @@ get_snd_cwnd(struct iperf_interval_results *irp) { #if defined(linux) && defined(TCP_MD5SIG) return irp->tcpInfo.tcpi_snd_cwnd * irp->tcpInfo.tcpi_snd_mss; -#else -#if defined(__FreeBSD__) && __FreeBSD_version >= 600000 +#elif defined(__FreeBSD__) && __FreeBSD_version >= 600000 + return irp->tcpInfo.tcpi_snd_cwnd * irp->tcpInfo.tcpi_snd_mss; +#elif defined(__NetBSD__) && defined(TCP_INFO) return irp->tcpInfo.tcpi_snd_cwnd * irp->tcpInfo.tcpi_snd_mss; #else return -1; #endif -#endif } /*************************************************************/ @@ -150,8 +153,9 @@ get_rtt(struct iperf_interval_results *irp) { #if defined(linux) && defined(TCP_MD5SIG) return irp->tcpInfo.tcpi_rtt; -#else -#if defined(__FreeBSD__) && __FreeBSD_version >= 600000 +#elif defined(__FreeBSD__) && __FreeBSD_version >= 600000 + return irp->tcpInfo.tcpi_rtt; +#elif defined(__NetBSD__) && defined(TCP_INFO) return irp->tcpInfo.tcpi_rtt; #else return -1; @@ -173,4 +177,8 @@ build_tcpinfo_message(struct iperf_interval_results *r, char *message) sprintf(message, report_tcpInfo, r->tcpInfo.tcpi_snd_cwnd, r->tcpInfo.tcpi_rcv_space, r->tcpInfo.tcpi_snd_ssthresh, r->tcpInfo.tcpi_rtt); #endif +#if defined(__NetBSD__) && defined(TCP_INFO) + sprintf(message, report_tcpInfo, r->tcpInfo.tcpi_snd_cwnd, + r->tcpInfo.tcpi_rcv_space, r->tcpInfo.tcpi_snd_ssthresh, r->tcpInfo.tcpi_rtt); +#endif }