Skip to content

Commit

Permalink
Merge branch 'support/iperf_break_after_tcp_send_timeout' into 'master'
Browse files Browse the repository at this point in the history
iperf: support iperf break after tcp tx send timeout

See merge request espressif/esp-idf!22539
  • Loading branch information
suda-morris committed Mar 1, 2023
2 parents 14555a1 + 7b4961a commit d4b9989
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 5 deletions.
18 changes: 18 additions & 0 deletions 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
3 changes: 2 additions & 1 deletion examples/common_components/iperf/include/iperf.h
Expand Up @@ -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 {
Expand Down
9 changes: 5 additions & 4 deletions examples/common_components/iperf/iperf.c
Expand Up @@ -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;
Expand All @@ -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));
Expand Down Expand Up @@ -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");

Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit d4b9989

Please sign in to comment.