diff --git a/src/iperf.h b/src/iperf.h index a6052737a..b7f4575a9 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -494,6 +494,7 @@ extern int gerror; /* error value from getaddrinfo(3), for use in internal error /* In Reverse mode, maximum number of packets to wait for "accept" response - to handle out of order packets */ #define MAX_REVERSE_OUT_OF_ORDER_PACKETS 2 +#define GSO_MAX_DG_IN_BF (1 << 7UL) // 128 - the Linux Kernel limit hardcoded as `UDP_MAX_SEGMENTS (1 << 7UL)` in `udpgso.c` #define GSO_BF_MAX_SIZE MAX_UDP_BLOCKSIZE #define GRO_BF_MAX_SIZE MAX_UDP_BLOCKSIZE diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 165193ba6..03d1fc7b3 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -420,7 +420,7 @@ iperf_handle_message_client(struct iperf_test *test) int iperf_connect(struct iperf_test *test) { - int opt; + int opt, n; socklen_t len; if (NULL == test) @@ -526,7 +526,11 @@ iperf_connect(struct iperf_test *test) test->settings->gso_dg_size = test->settings->blksize; /* use the multiple of datagram size for the best efficiency. */ if (test->settings->gso_dg_size > 0) { - test->settings->gso_bf_size = (test->settings->gso_bf_size / test->settings->gso_dg_size) * test->settings->gso_dg_size; + n = test->settings->gso_bf_size / test->settings->gso_dg_size; + if (n > GSO_MAX_DG_IN_BF) { + n = GSO_MAX_DG_IN_BF; + } + test->settings->gso_bf_size = n * test->settings->gso_dg_size; } else { /* If gso_dg_size is 0 (unlimited bandwidth), use default UDP datagram size */ test->settings->gso_dg_size = DEFAULT_UDP_BLKSIZE;