fix stop/start early

This commit is contained in:
Bob 2025-12-14 15:27:55 -08:00
parent beae917a36
commit d1be832790
1 changed files with 9 additions and 12 deletions

View File

@ -6,7 +6,7 @@
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <time.h> // Added for clock_gettime
#include <time.h>
#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);