From 709581e221b889735612c7fa55c7fecd8f3b51a3 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Mon, 13 Oct 2014 08:55:41 -0700 Subject: [PATCH] The maximum send length for UDP is the maximum size of a UDP datagram. For UDP over IPv4, this is the maximum IPv4 packet size (65535) minus the size of the IPv4 and UDP headers, arriving at 65507. In theory for a system implementing IPv6 jumbogram support, there is no maximum packet size for UDP. In practice we've observed with CentOS 5 a limitation of 65535 - 8, which is dictated by the size field in the UDP header (it has a maximum value of 65535, but needs to count both payload and header bytes, thus subtracting off the 8 bytes for the UDP header). We take the most conservative approach and use the 65507 value for UDP / IPv4. This is (I believe) the last part of issue #212. (cherry picked from commit 96d0c77ca24da07d52f8d1c20301c202e4f0360b) Signed-off-by: Bruce A. Mah Conflicts: src/iperf_api.h src/iperf_error.c --- src/iperf.h | 2 ++ src/iperf_api.c | 5 +++++ src/iperf_api.h | 1 + src/iperf_error.c | 3 +++ 4 files changed, 11 insertions(+) diff --git a/src/iperf.h b/src/iperf.h index e7eb68e..daed1c6 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -270,6 +270,8 @@ struct iperf_test #define MB (1024 * 1024) #define MAX_TCP_BUFFER (512 * MB) #define MAX_BLOCKSIZE MB +/* Maximum size UDP send is (64K - 1) - IP and UDP header sizes */ +#define MAX_UDP_BLOCKSIZE (65535 - 8 - 20) #define MIN_INTERVAL 0.1 #define MAX_INTERVAL 60.0 #define MAX_TIME 86400 diff --git a/src/iperf_api.c b/src/iperf_api.c index 34d97ec..716b881 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -820,6 +820,11 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) i_errno = IEBLOCKSIZE; return -1; } + if (test->protocol->id == Pudp && + blksize > MAX_UDP_BLOCKSIZE) { + i_errno = IEUDPBLOCKSIZE; + return -1; + } test->settings->blksize = blksize; if (!rate_flag) diff --git a/src/iperf_api.h b/src/iperf_api.h index 73cba47..0c78985 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -268,6 +268,7 @@ enum { IEFILE = 14, // -F file couldn't be opened IEBURST = 15, // Invalid burst count. Maximum value = %dMAX_BURST IEENDCONDITIONS = 16, // Only one test end condition (-t, -n, -k) may be specified + IEUDPBLOCKSIZE = 20, // Block size too large. Maximum value = %dMAX_UDP_BLOCKSIZE /* Test errors */ IENEWTEST = 100, // Unable to create a new test (check perror) IEINITTEST = 101, // Test initialization failed (check perror) diff --git a/src/iperf_error.c b/src/iperf_error.c index e1c42ef..1b896e0 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -110,6 +110,9 @@ iperf_strerror(int i_errno) case IEINTERVAL: snprintf(errstr, len, "invalid report interval (min = %g, max = %g seconds)", MIN_INTERVAL, MAX_INTERVAL); break; + case IEUDPBLOCKSIZE: + snprintf(errstr, len, "block size too large (maximum = %d bytes)", MAX_UDP_BLOCKSIZE); + break; case IEMSS: snprintf(errstr, len, "TCP MSS too large (maximum = %d bytes)", MAX_MSS); break;