From 212a2fe3ae2e600617a1fde7e6a1a0a1488a341f Mon Sep 17 00:00:00 2001 From: DavidBar-On Date: Sat, 2 May 2026 12:12:39 +0300 Subject: [PATCH] Limit UDP GSO number of segments in a message to the allowed value --- src/iperf.h | 1 + src/iperf_client_api.c | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) --- a/src/iperf.h +++ b/src/iperf.h @@ -494,6 +494,7 @@ extern int gerror; /* error value from g /* 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 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -420,7 +420,7 @@ iperf_handle_message_client(struct iperf 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;