@@ -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