Skip to content

Commit 14db56a

Browse files
authored
adding tcp_info support for MacOS (#2008)
* adding tcp_info support for MacOS * Update tcp_info.c cleanup spaces remove printf * Update iperf.h removed incorrect __APPLE__ and __MACH__ checks for tcp_info * fixed missing '('
1 parent c822613 commit 14db56a

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

src/iperf.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ struct iperf_interval_results
111111
#if (defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)) && \
112112
defined(TCP_INFO)
113113
struct tcp_info tcpInfo; /* getsockopt(TCP_INFO) for Linux, {Free,Net,Open}BSD */
114+
#elif (defined(__APPLE__) && defined(__MACH__)) && defined(TCP_CONNECTION_INFO)
115+
struct tcp_connection_info tcpConnInfo;
114116
#else
115117
/* Just placeholders, never accessed. */
116118
char *tcpInfo;

src/tcp_info.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ has_tcpinfo(void)
6363
#if (defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)) \
6464
&& defined(TCP_INFO)
6565
return 1;
66+
#elif (defined(__APPLE__) && defined(__MACH__)) && defined(TCP_CONNECTION_INFO)
67+
return 1;
6668
#else
6769
return 0;
6870
#endif
@@ -84,6 +86,8 @@ has_tcpinfo_retransmits(void)
8486
return 1; /* Should work now */
8587
#elif (defined(__NetBSD__) || defined(__OpenBSD__)) && defined(TCP_INFO)
8688
return 1;
89+
#elif (defined(__APPLE__) && defined(__MACH__)) && defined(TCP_CONNECTION_INFO)
90+
return 1;
8791
#else
8892
return 0;
8993
#endif
@@ -107,6 +111,19 @@ save_tcpinfo(struct iperf_stream *sp, struct iperf_interval_results *irp)
107111
irp->tcpInfo.tcpi_rtt);
108112
}
109113

114+
#elif (defined(__APPLE__) && defined(__MACH__)) && defined(TCP_CONNECTION_INFO)
115+
struct tcp_connection_info conn_info;
116+
socklen_t tcp_info_length = sizeof(conn_info );
117+
118+
if (getsockopt(sp->socket, IPPROTO_TCP, TCP_CONNECTION_INFO, (void *)&irp->tcpConnInfo, &tcp_info_length) < 0)
119+
iperf_err(sp->test, "getsockopt - %s", strerror(errno));
120+
121+
if (sp->test->debug) {
122+
printf("tcpi_snd_cwnd %u tcpi_snd_cwnd %u tcpi_srtt %u\n",
123+
irp->tcpConnInfo.tcpi_snd_cwnd, irp->tcpConnInfo.tcpi_snd_cwnd,
124+
irp->tcpConnInfo.tcpi_srtt);
125+
}
126+
110127
#endif
111128
}
112129

@@ -120,6 +137,8 @@ get_total_retransmits(struct iperf_interval_results *irp)
120137
return irp->tcpInfo.tcpi_snd_rexmitpack;
121138
#elif (defined(__NetBSD__) || defined(__OpenBSD__)) && defined(TCP_INFO)
122139
return irp->tcpInfo.tcpi_snd_rexmitpack;
140+
#elif (defined(__APPLE__) && defined(__MACH__)) && defined(TCP_CONNECTION_INFO)
141+
return irp->tcpConnInfo.tcpi_txretransmitpackets;
123142
#else
124143
return -1;
125144
#endif
@@ -140,6 +159,8 @@ get_snd_cwnd(struct iperf_interval_results *irp)
140159
return (long)irp->tcpInfo.tcpi_snd_cwnd * irp->tcpInfo.tcpi_snd_mss;
141160
#elif defined(__OpenBSD__) && defined(TCP_INFO)
142161
return irp->tcpInfo.tcpi_snd_cwnd;
162+
#elif (defined(__APPLE__) && defined(__MACH__)) && defined(TCP_CONNECTION_INFO)
163+
return irp->tcpConnInfo.tcpi_snd_cwnd;
143164
#else
144165
return -1;
145166
#endif
@@ -162,6 +183,8 @@ get_snd_wnd(struct iperf_interval_results *irp)
162183
return (long)irp->tcpInfo.tcpi_snd_wnd * irp->tcpInfo.tcpi_snd_mss;
163184
#elif defined(__OpenBSD__) && defined(TCP_INFO)
164185
return irp->tcpInfo.tcpi_snd_wnd;
186+
#elif (defined(__APPLE__) && defined(__MACH__)) && defined(TCP_CONNECTION_INFO)
187+
return irp->tcpConnInfo.tcpi_snd_wnd;
165188
#else
166189
return -1;
167190
#endif
@@ -180,6 +203,11 @@ get_rtt(struct iperf_interval_results *irp)
180203
return irp->tcpInfo.tcpi_rtt;
181204
#elif (defined(__NetBSD__) || defined(__OpenBSD__)) && defined(TCP_INFO)
182205
return irp->tcpInfo.tcpi_rtt;
206+
#elif (defined(__APPLE__) && defined(__MACH__)) && defined(TCP_CONNECTION_INFO)
207+
// Linux's tcpi_rtt is a smoothed average,
208+
// macOS's tcp_connection_info explicitly separates the smoothed average (tcpi_srtt)
209+
// from the most recently measured RTT (tcpi_rttcur).
210+
return irp->tcpConnInfo.tcpi_srtt;
183211
#else
184212
return -1;
185213
#endif
@@ -198,6 +226,8 @@ get_rttvar(struct iperf_interval_results *irp)
198226
return irp->tcpInfo.tcpi_rttvar;
199227
#elif (defined(__NetBSD__) || defined(__OpenBSD__)) && defined(TCP_INFO)
200228
return irp->tcpInfo.tcpi_rttvar;
229+
#elif (defined(__APPLE__) && defined(__MACH__)) && defined(TCP_CONNECTION_INFO)
230+
return irp->tcpConnInfo.tcpi_rttvar;
201231
#else
202232
return -1;
203233
#endif

0 commit comments

Comments
 (0)