From 7b4961afaa179e055881599de544066781526ec4 Mon Sep 17 00:00:00 2001 From: zhangwenxu Date: Tue, 28 Feb 2023 16:26:02 +0800 Subject: [PATCH] iperf: support iperf break after tcp tx send timeout --- .../common_components/iperf/Kconfig.projbuild | 18 ++++++++++++++++++ .../common_components/iperf/include/iperf.h | 3 ++- examples/common_components/iperf/iperf.c | 9 +++++---- 3 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 examples/common_components/iperf/Kconfig.projbuild diff --git a/examples/common_components/iperf/Kconfig.projbuild b/examples/common_components/iperf/Kconfig.projbuild new file mode 100644 index 00000000000..ab56acc76e6 --- /dev/null +++ b/examples/common_components/iperf/Kconfig.projbuild @@ -0,0 +1,18 @@ +menu "Iperf Configuration" + + config IPERF_SOCKET_RX_TIMEOUT + int "iperf socket TCP/UDP rx timeout in seconds" + default 10 + help + The value is used for iperf socket TCP/UDP rx timeout, iperf will be aborted + and socket will be closed and shutdown. + + config IPERF_SOCKET_TCP_TX_TIMEOUT + int "iperf socket TCP tx timeout in seconds" + default 10 + help + The value is used for iperf socket TCP tx timeout, iperf will be aborted + and socket will be closed and shutdown. + + +endmenu diff --git a/examples/common_components/iperf/include/iperf.h b/examples/common_components/iperf/include/iperf.h index 75f338d6901..53aeca443f0 100644 --- a/examples/common_components/iperf/include/iperf.h +++ b/examples/common_components/iperf/include/iperf.h @@ -49,7 +49,8 @@ extern "C" { #define IPERF_MAX_DELAY 64 -#define IPERF_SOCKET_RX_TIMEOUT 10 +#define IPERF_SOCKET_RX_TIMEOUT CONFIG_IPERF_SOCKET_RX_TIMEOUT +#define IPERF_SOCKET_TCP_TX_TIMEOUT CONFIG_IPERF_SOCKET_TCP_TX_TIMEOUT #define IPERF_SOCKET_ACCEPT_TIMEOUT 5 typedef enum { diff --git a/examples/common_components/iperf/iperf.c b/examples/common_components/iperf/iperf.c index d2adf83276b..8d2605769b9 100644 --- a/examples/common_components/iperf/iperf.c +++ b/examples/common_components/iperf/iperf.c @@ -248,9 +248,6 @@ static esp_err_t IRAM_ATTR iperf_run_tcp_server(void) err = listen(listen_socket, 1); ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, TAG, "Error occurred during listen: errno %d", errno); - timeout.tv_sec = IPERF_SOCKET_RX_TIMEOUT; - setsockopt(listen_socket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); - memcpy(&listen_addr, &listen_addr6, sizeof(listen_addr6)); } else if (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV4) { listen_addr4.sin_family = AF_INET; @@ -272,6 +269,8 @@ static esp_err_t IRAM_ATTR iperf_run_tcp_server(void) memcpy(&listen_addr, &listen_addr4, sizeof(listen_addr4)); } + timeout.tv_sec = IPERF_SOCKET_RX_TIMEOUT; + setsockopt(listen_socket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); client_socket = accept(listen_socket, (struct sockaddr *)&remote_addr, &addr_len); ESP_GOTO_ON_FALSE((client_socket >= 0), ESP_FAIL, exit, TAG, "Unable to accept connection: errno %d", errno); ESP_LOGI(TAG, "accept: %s,%d\n", inet_ntoa(remote_addr.sin_addr), htons(remote_addr.sin_port)); @@ -315,6 +314,7 @@ static esp_err_t iperf_run_tcp_client(void) struct sockaddr_storage dest_addr = { 0 }; struct sockaddr_in6 dest_addr6 = { 0 }; struct sockaddr_in dest_addr4 = { 0 }; + struct timeval timeout = { 0 }; ESP_GOTO_ON_FALSE((s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV6 || s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV4), ESP_FAIL, exit, TAG, "Ivalid AF types"); @@ -342,7 +342,8 @@ static esp_err_t iperf_run_tcp_client(void) ESP_LOGI(TAG, "Successfully connected"); memcpy(&dest_addr, &dest_addr4, sizeof(dest_addr4)); } - + timeout.tv_sec = IPERF_SOCKET_TCP_TX_TIMEOUT; + setsockopt(client_socket, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)); #if CONFIG_ESP_WIFI_ENABLE_WIFI_RX_STATS wifi_cmd_clr_rx_statistics(0, NULL);