fix stop/start early
This commit is contained in:
parent
beae917a36
commit
d1be832790
|
|
@ -6,7 +6,7 @@
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <time.h> // Added for clock_gettime
|
#include <time.h>
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
#include "freertos/event_groups.h"
|
#include "freertos/event_groups.h"
|
||||||
|
|
@ -49,7 +49,6 @@ static esp_event_handler_instance_t instance_got_ip;
|
||||||
// --- Status Reporting ---
|
// --- Status Reporting ---
|
||||||
void iperf_get_stats(iperf_stats_t *stats) {
|
void iperf_get_stats(iperf_stats_t *stats) {
|
||||||
if (stats) {
|
if (stats) {
|
||||||
// Calculate config PPS on the fly
|
|
||||||
s_stats.config_pps = (s_iperf_ctrl.cfg.pacing_period_us > 0) ?
|
s_stats.config_pps = (s_iperf_ctrl.cfg.pacing_period_us > 0) ?
|
||||||
(1000000 / s_iperf_ctrl.cfg.pacing_period_us) : 0;
|
(1000000 / s_iperf_ctrl.cfg.pacing_period_us) : 0;
|
||||||
*stats = s_stats;
|
*stats = s_stats;
|
||||||
|
|
@ -60,7 +59,6 @@ void iperf_print_status(void) {
|
||||||
iperf_get_stats(&s_stats);
|
iperf_get_stats(&s_stats);
|
||||||
float err = 0.0f;
|
float err = 0.0f;
|
||||||
if (s_stats.running && s_stats.config_pps > 0) {
|
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;
|
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;
|
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) {
|
static bool iperf_wait_for_ip(void) {
|
||||||
if (!s_iperf_event_group) s_iperf_event_group = xEventGroupCreate();
|
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");
|
esp_netif_t *netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF");
|
||||||
if (netif) {
|
if (netif) {
|
||||||
esp_netif_ip_info_t ip_info;
|
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) {
|
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;
|
struct sockaddr_in addr;
|
||||||
addr.sin_family = AF_INET;
|
addr.sin_family = AF_INET;
|
||||||
addr.sin_port = htons(ctrl->cfg.dport > 0 ? ctrl->cfg.dport : 5001);
|
addr.sin_port = htons(ctrl->cfg.dport > 0 ? ctrl->cfg.dport : 5001);
|
||||||
addr.sin_addr.s_addr = ctrl->cfg.dip;
|
addr.sin_addr.s_addr = ctrl->cfg.dip;
|
||||||
|
|
||||||
// Log destination for debugging
|
|
||||||
char ip_str[32];
|
char ip_str[32];
|
||||||
inet_ntop(AF_INET, &addr.sin_addr, ip_str, sizeof(ip_str));
|
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));
|
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) {
|
if (sockfd < 0) {
|
||||||
status_led_set_state(LED_STATE_FAILED);
|
status_led_set_state(LED_STATE_FAILED);
|
||||||
ESP_LOGE(TAG, "Socket creation failed: %d", errno);
|
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;
|
return ESP_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -194,7 +196,6 @@ static esp_err_t iperf_start_udp_client(iperf_ctrl_t *ctrl) {
|
||||||
s_stats.running = true;
|
s_stats.running = true;
|
||||||
printf("IPERF_STARTED\n");
|
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 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;
|
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;
|
udp_datagram *hdr = (udp_datagram *)ctrl->buffer;
|
||||||
|
|
||||||
hdr->id = htonl(packet_id++);
|
hdr->id = htonl(packet_id++);
|
||||||
|
|
||||||
// CHANGED: gettimeofday -> clock_gettime
|
|
||||||
clock_gettime(CLOCK_REALTIME, &ts);
|
clock_gettime(CLOCK_REALTIME, &ts);
|
||||||
hdr->tv_sec = htonl(ts.tv_sec);
|
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;
|
hdr->id2 = hdr->id;
|
||||||
|
|
||||||
int sent = sendto(sockfd, ctrl->buffer, ctrl->cfg.send_len, 0, (struct sockaddr *)&addr, sizeof(addr));
|
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->id = htonl(final_id);
|
||||||
hdr->id2 = hdr->id;
|
hdr->id2 = hdr->id;
|
||||||
|
|
||||||
// CHANGED: gettimeofday -> clock_gettime
|
|
||||||
clock_gettime(CLOCK_REALTIME, &ts);
|
clock_gettime(CLOCK_REALTIME, &ts);
|
||||||
hdr->tv_sec = htonl(ts.tv_sec);
|
hdr->tv_sec = htonl(ts.tv_sec);
|
||||||
hdr->tv_usec = htonl(ts.tv_nsec / 1000);
|
hdr->tv_usec = htonl(ts.tv_nsec / 1000);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue