diff --git a/components/iperf/iperf.c b/components/iperf/iperf.c index 76ccfd6..10adc42 100644 --- a/components/iperf/iperf.c +++ b/components/iperf/iperf.c @@ -6,7 +6,7 @@ #include #include #include -#include // Added for clock_gettime +#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/event_groups.h" @@ -49,7 +49,6 @@ static esp_event_handler_instance_t instance_got_ip; // --- Status Reporting --- void iperf_get_stats(iperf_stats_t *stats) { if (stats) { - // Calculate config PPS on the fly s_stats.config_pps = (s_iperf_ctrl.cfg.pacing_period_us > 0) ? (1000000 / s_iperf_ctrl.cfg.pacing_period_us) : 0; *stats = s_stats; @@ -60,7 +59,6 @@ void iperf_print_status(void) { iperf_get_stats(&s_stats); float err = 0.0f; if (s_stats.running && s_stats.config_pps > 0) { - // Error = (Target - Actual) / Target int32_t diff = (int32_t)s_stats.config_pps - (int32_t)s_stats.actual_pps; err = (float)diff * 100.0f / (float)s_stats.config_pps; } @@ -84,7 +82,6 @@ static void iperf_network_event_handler(void* arg, esp_event_base_t event_base, static bool iperf_wait_for_ip(void) { if (!s_iperf_event_group) s_iperf_event_group = xEventGroupCreate(); - // Check if we already have IP esp_netif_t *netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); if (netif) { esp_netif_ip_info_t ip_info; @@ -171,14 +168,17 @@ uint32_t iperf_get_pps(void) { } static esp_err_t iperf_start_udp_client(iperf_ctrl_t *ctrl) { - if (!iperf_wait_for_ip()) return ESP_FAIL; + // FIX 1: If wait is aborted (stop requested), print STOPPED so controller knows + if (!iperf_wait_for_ip()) { + printf("IPERF_STOPPED\n"); + return ESP_OK; + } struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(ctrl->cfg.dport > 0 ? ctrl->cfg.dport : 5001); addr.sin_addr.s_addr = ctrl->cfg.dip; - // Log destination for debugging char ip_str[32]; inet_ntop(AF_INET, &addr.sin_addr, ip_str, sizeof(ip_str)); ESP_LOGI(TAG, "Client sending to %s:%d", ip_str, ntohs(addr.sin_port)); @@ -187,6 +187,8 @@ static esp_err_t iperf_start_udp_client(iperf_ctrl_t *ctrl) { if (sockfd < 0) { status_led_set_state(LED_STATE_FAILED); ESP_LOGE(TAG, "Socket creation failed: %d", errno); + // FIX 2: Print STOPPED on failure so controller doesn't timeout + printf("IPERF_STOPPED\n"); return ESP_FAIL; } @@ -194,7 +196,6 @@ static esp_err_t iperf_start_udp_client(iperf_ctrl_t *ctrl) { s_stats.running = true; printf("IPERF_STARTED\n"); - // Fix: Ensure we have a default time if 0 (infinite) int64_t next_send_time = esp_timer_get_time(); int64_t end_time = (ctrl->cfg.time == 0) ? INT64_MAX : esp_timer_get_time() + (int64_t)ctrl->cfg.time * 1000000LL; @@ -215,12 +216,9 @@ static esp_err_t iperf_start_udp_client(iperf_ctrl_t *ctrl) { udp_datagram *hdr = (udp_datagram *)ctrl->buffer; hdr->id = htonl(packet_id++); - - // CHANGED: gettimeofday -> clock_gettime clock_gettime(CLOCK_REALTIME, &ts); hdr->tv_sec = htonl(ts.tv_sec); - hdr->tv_usec = htonl(ts.tv_nsec / 1000); // Nanoseconds to Microseconds - + hdr->tv_usec = htonl(ts.tv_nsec / 1000); hdr->id2 = hdr->id; int sent = sendto(sockfd, ctrl->buffer, ctrl->cfg.send_len, 0, (struct sockaddr *)&addr, sizeof(addr)); @@ -262,7 +260,6 @@ exit: hdr->id = htonl(final_id); hdr->id2 = hdr->id; - // CHANGED: gettimeofday -> clock_gettime clock_gettime(CLOCK_REALTIME, &ts); hdr->tv_sec = htonl(ts.tv_sec); hdr->tv_usec = htonl(ts.tv_nsec / 1000);