Skip to content

Commit c11a596

Browse files
committed
Report number of reorder_seen
TCP can detect reordering by tracking SACKs and timestamps coming back to the sender. This is useful information for investigating performance issues and testing networks as good networks should generally not reorder packets.
1 parent 481cbd0 commit c11a596

4 files changed

Lines changed: 21 additions & 2 deletions

File tree

src/iperf.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ struct iperf_interval_results
110110
int rtt;
111111
int rttvar;
112112
int pmtu;
113+
int reorder;
113114
};
114115

115116
struct iperf_stream_result
@@ -121,6 +122,7 @@ struct iperf_stream_result
121122
iperf_size_t bytes_sent_omit;
122123
int stream_prev_total_retrans;
123124
int stream_retrans;
125+
int stream_reorder;
124126
int stream_prev_total_sacks;
125127
int stream_sacks;
126128
int stream_max_rtt;

src/iperf_api.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3185,6 +3185,8 @@ iperf_stats_callback(struct iperf_test *test)
31853185

31863186
temp.rttvar = get_rttvar(&temp);
31873187
temp.pmtu = get_pmtu(&temp);
3188+
temp.reorder = get_reorder(&temp);
3189+
rp->stream_reorder = temp.reorder;
31883190
}
31893191
}
31903192
} else {
@@ -3623,7 +3625,7 @@ iperf_print_results(struct iperf_test *test)
36233625
if (test->sender_has_retransmits) {
36243626
/* Sender summary, TCP and SCTP with retransmits. */
36253627
if (test->json_output)
3626-
cJSON_AddItemToObject(json_summary_stream, "sender", iperf_json_printf("socket: %d start: %f end: %f seconds: %f bytes: %d bits_per_second: %f retransmits: %d max_snd_cwnd: %d max_snd_wnd: %d max_rtt: %d min_rtt: %d mean_rtt: %d sender: %b", (int64_t) sp->socket, (double) start_time, (double) sender_time, (double) sender_time, (int64_t) bytes_sent, bandwidth * 8, (int64_t) sp->result->stream_retrans, (int64_t) sp->result->stream_max_snd_cwnd, (int64_t) sp->result->stream_max_snd_wnd, (int64_t) sp->result->stream_max_rtt, (int64_t) sp->result->stream_min_rtt, (int64_t) ((sp->result->stream_count_rtt == 0) ? 0 : sp->result->stream_sum_rtt / sp->result->stream_count_rtt), stream_must_be_sender));
3628+
cJSON_AddItemToObject(json_summary_stream, "sender", iperf_json_printf("socket: %d start: %f end: %f seconds: %f bytes: %d bits_per_second: %f retransmits: %d reorder: %d max_snd_cwnd: %d max_snd_wnd: %d max_rtt: %d min_rtt: %d mean_rtt: %d sender: %b", (int64_t) sp->socket, (double) start_time, (double) sender_time, (double) sender_time, (int64_t) bytes_sent, bandwidth * 8, (int64_t) sp->result->stream_retrans, (int64_t) sp->result->stream_reorder, (int64_t) sp->result->stream_max_snd_cwnd, (int64_t) sp->result->stream_max_snd_wnd, (int64_t) sp->result->stream_max_rtt, (int64_t) sp->result->stream_min_rtt, (int64_t) ((sp->result->stream_count_rtt == 0) ? 0 : sp->result->stream_sum_rtt / sp->result->stream_count_rtt), stream_must_be_sender));
36273629
else
36283630
if (test->role == 's' && !sp->sender) {
36293631
if (test->verbose)
@@ -4070,7 +4072,7 @@ print_interval_results(struct iperf_test *test, struct iperf_stream *sp, cJSON *
40704072
if (test->sender_has_retransmits == 1 && sp->sender) {
40714073
/* Interval, TCP with retransmits. */
40724074
if (test->json_output)
4073-
cJSON_AddItemToArray(json_interval_streams, iperf_json_printf("socket: %d start: %f end: %f seconds: %f bytes: %d bits_per_second: %f retransmits: %d snd_cwnd: %d snd_wnd: %d rtt: %d rttvar: %d pmtu: %d omitted: %b sender: %b", (int64_t) sp->socket, (double) st, (double) et, (double) irp->interval_duration, (int64_t) irp->bytes_transferred, bandwidth * 8, (int64_t) irp->interval_retrans, (int64_t) irp->snd_cwnd, (int64_t) irp->snd_wnd, (int64_t) irp->rtt, (int64_t) irp->rttvar, (int64_t) irp->pmtu, irp->omitted, sp->sender));
4075+
cJSON_AddItemToArray(json_interval_streams, iperf_json_printf("socket: %d start: %f end: %f seconds: %f bytes: %d bits_per_second: %f retransmits: %d snd_cwnd: %d snd_wnd: %d rtt: %d rttvar: %d pmtu: %d reorder: %d omitted: %b sender: %b", (int64_t) sp->socket, (double) st, (double) et, (double) irp->interval_duration, (int64_t) irp->bytes_transferred, bandwidth * 8, (int64_t) irp->interval_retrans, (int64_t) irp->snd_cwnd, (int64_t) irp->snd_wnd, (int64_t) irp->rtt, (int64_t) irp->rttvar, (int64_t) irp->pmtu, (int64_t) irp->reorder, irp->omitted, sp->sender));
40744076
else {
40754077
unit_snprintf(cbuf, UNIT_LEN, irp->snd_cwnd, 'A');
40764078
iperf_printf(test, report_bw_retrans_cwnd_format, sp->socket, mbuf, st, et, ubuf, nbuf, irp->interval_retrans, cbuf, irp->omitted?report_omitted:"");

src/iperf_api.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ long get_snd_wnd(struct iperf_interval_results *irp);
285285
long get_rtt(struct iperf_interval_results *irp);
286286
long get_rttvar(struct iperf_interval_results *irp);
287287
long get_pmtu(struct iperf_interval_results *irp);
288+
long get_reorder(struct iperf_interval_results *irp);
288289
void print_tcpinfo(struct iperf_test *test);
289290
void build_tcpinfo_message(struct iperf_interval_results *r, char *message);
290291

src/tcp_info.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,20 @@ get_pmtu(struct iperf_interval_results *irp)
213213
#endif
214214
}
215215

216+
/*************************************************************/
217+
/*
218+
* Return number of reordering events seen.
219+
*/
220+
long
221+
get_reorder(struct iperf_interval_results *irp)
222+
{
223+
#if defined(linux) && defined(TCP_REPAIR_ON)
224+
return irp->tcpInfo.tcpi_reord_seen;
225+
#else
226+
return -1;
227+
#endif
228+
}
229+
216230
/*************************************************************/
217231
void
218232
build_tcpinfo_message(struct iperf_interval_results *r, char *message)

0 commit comments

Comments
 (0)