|
|
@@ -9,6 +9,7 @@
|
|
|
|
|
|
#include <stdio.h>
|
|
|
#include <string.h>
|
|
|
+#include <sys/param.h>
|
|
|
#include <sys/socket.h>
|
|
|
#include "freertos/FreeRTOS.h"
|
|
|
#include "freertos/task.h"
|
|
|
@@ -111,36 +112,25 @@ static esp_err_t iperf_start_report(void)
|
|
|
|
|
|
static void socket_recv(int recv_socket, struct sockaddr_storage listen_addr, uint8_t type)
|
|
|
{
|
|
|
- bool udp_recv_start = true;
|
|
|
+ bool iperf_recv_start = true;
|
|
|
uint8_t *buffer;
|
|
|
int want_recv = 0;
|
|
|
int actual_recv = 0;
|
|
|
- socklen_t addr_len = sizeof(struct sockaddr);
|
|
|
+ socklen_t socklen = (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV6) ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in);
|
|
|
+ const char *error_log = (type == IPERF_TRANS_TYPE_TCP) ? "tcp server recv" : "udp server recv";
|
|
|
|
|
|
buffer = s_iperf_ctrl.buffer;
|
|
|
want_recv = s_iperf_ctrl.buffer_len;
|
|
|
-
|
|
|
while (!s_iperf_ctrl.finish) {
|
|
|
- if (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV6) {
|
|
|
- addr_len = sizeof(struct sockaddr_in6);
|
|
|
- actual_recv = recvfrom(recv_socket, buffer, want_recv, 0, (struct sockaddr *)&listen_addr, &addr_len);
|
|
|
- } else if (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV4) {
|
|
|
- addr_len = sizeof(struct sockaddr_in);
|
|
|
- actual_recv = recvfrom(recv_socket, buffer, want_recv, 0, (struct sockaddr *)&listen_addr, &addr_len);
|
|
|
- }
|
|
|
+ actual_recv = recvfrom(recv_socket, buffer, want_recv, 0, (struct sockaddr *)&listen_addr, &socklen);
|
|
|
if (actual_recv < 0) {
|
|
|
- if (type == IPERF_TRANS_TYPE_TCP) {
|
|
|
- iperf_show_socket_error_reason("tcp server recv", recv_socket);
|
|
|
- }
|
|
|
- if (type == IPERF_TRANS_TYPE_UDP) {
|
|
|
- iperf_show_socket_error_reason("udp server recv", recv_socket);
|
|
|
- }
|
|
|
+ iperf_show_socket_error_reason(error_log, recv_socket);
|
|
|
s_iperf_ctrl.finish = true;
|
|
|
break;
|
|
|
} else {
|
|
|
- if (udp_recv_start) {
|
|
|
+ if (iperf_recv_start) {
|
|
|
iperf_start_report();
|
|
|
- udp_recv_start = false;
|
|
|
+ iperf_recv_start = false;
|
|
|
}
|
|
|
s_iperf_ctrl.actual_len += actual_recv;
|
|
|
}
|
|
|
@@ -149,51 +139,35 @@ static void socket_recv(int recv_socket, struct sockaddr_storage listen_addr, ui
|
|
|
|
|
|
static void socket_send(int send_socket, struct sockaddr_storage dest_addr, uint8_t type)
|
|
|
{
|
|
|
- bool retry = false;
|
|
|
uint8_t *buffer;
|
|
|
- uint8_t delay = 0;
|
|
|
+ uint8_t delay = 1;
|
|
|
int actual_send = 0;
|
|
|
int want_send = 0;
|
|
|
int err = 0;
|
|
|
+ const socklen_t socklen = (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV6) ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in);
|
|
|
+ const char *error_log = (type == IPERF_TRANS_TYPE_TCP) ? "tcp client send" : "udp client send";
|
|
|
|
|
|
buffer = s_iperf_ctrl.buffer;
|
|
|
want_send = s_iperf_ctrl.buffer_len;
|
|
|
iperf_start_report();
|
|
|
|
|
|
while (!s_iperf_ctrl.finish) {
|
|
|
- if (type == IPERF_TRANS_TYPE_UDP) {
|
|
|
- if (false == retry) {
|
|
|
- delay = 1;
|
|
|
- }
|
|
|
- retry = false;
|
|
|
- }
|
|
|
- if (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV6) {
|
|
|
- actual_send = sendto(send_socket, buffer, want_send, 0, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in6));
|
|
|
- } else if (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV4) {
|
|
|
- actual_send = sendto(send_socket, buffer, want_send, 0, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in));
|
|
|
- }
|
|
|
+ actual_send = sendto(send_socket, buffer, want_send, 0, (struct sockaddr *)&dest_addr, socklen);
|
|
|
if (actual_send != want_send) {
|
|
|
if (type == IPERF_TRANS_TYPE_UDP) {
|
|
|
err = iperf_get_socket_error_code(send_socket);
|
|
|
if (err == ENOMEM) {
|
|
|
vTaskDelay(delay);
|
|
|
- if (delay < IPERF_MAX_DELAY) {
|
|
|
- delay <<= 1;
|
|
|
- }
|
|
|
- retry = true;
|
|
|
- continue;
|
|
|
+ delay = MIN(delay << 1, IPERF_MAX_DELAY);
|
|
|
} else {
|
|
|
- if (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV4) {
|
|
|
- ESP_LOGE(TAG, "udp client send abort: err=%d", err);
|
|
|
- }
|
|
|
+ iperf_show_socket_error_reason(error_log, send_socket);
|
|
|
}
|
|
|
- }
|
|
|
- if (type == IPERF_TRANS_TYPE_TCP) {
|
|
|
- iperf_show_socket_error_reason("tcp client send", send_socket);
|
|
|
- ESP_LOGI(TAG, "tcp client send error\n");
|
|
|
+ } else if (type == IPERF_TRANS_TYPE_TCP) {
|
|
|
+ iperf_show_socket_error_reason(error_log, send_socket);
|
|
|
break;
|
|
|
}
|
|
|
} else {
|
|
|
+ delay = 1;
|
|
|
s_iperf_ctrl.actual_len += actual_send;
|
|
|
}
|
|
|
}
|