ESP-IDF 5.4.2: esp_ping 'send error=0' when deleting session
I implemented a ping function for ESP-IDF 5.4.2, but sometimes I get the error: "E (185212) ping_sock: send error=0". I also tried using a SemaphoreHandle_t, but the result was worse than with this code. Do you have any ideas on how to solve this issue? I call the function to have the ping result: PingIp(192.168.1.23, 2, 100, 2000); Thanks in advance!
static E_COMMON_Status ping_result;
static void on_ping_success(esp_ping_handle_t hdl, void *args)
{
ping_result = COMMON_STATUS_OK;
}
static void on_ping_timeout(esp_ping_handle_t hdl, void *args)
{
}
static void on_ping_end(esp_ping_handle_t hdl, void *args)
{
uint32_t transmitted;
uint32_t received;
uint32_t total_time_ms;
esp_ping_get_profile(hdl, ESP_PING_PROF_REQUEST, &transmitted, sizeof(transmitted));
esp_ping_get_profile(hdl, ESP_PING_PROF_REPLY, &received, sizeof(received));
esp_ping_get_profile(hdl, ESP_PING_PROF_DURATION, &total_time_ms,
sizeof(total_time_ms));
}
E_COMMON_Status PingIp(char *ip_string, uint8_t pingCount, uint8_t pingInterval, uint8_t pingTimeout)
{
ping_result = COMMON_STATUS_KO;
MY_LOGI_MQTT(TAG, "PING:AVVIO DEL PING SU %s", ip_string);
ip_addr_t target_addr;
if (!inet_aton(ip_string, &target_addr))
{
MY_LOGI_MQTT(TAG, "Conversione IP \"%s\" fallita", ip_string);
return COMMON_STATUS_KO;
}
esp_ping_config_t config = ESP_PING_DEFAULT_CONFIG();
config.target_addr = target_addr;
config.count = pingCount;
config.interval_ms = pingInterval;
config.timeout_ms = pingTimeout;
esp_ping_callbacks_t cbs = {
.on_ping_success = on_ping_success,
.on_ping_timeout = on_ping_timeout,
.on_ping_end = on_ping_end,
.cb_args = NULL};
// ping_result = COMMON_STATUS_KO;
esp_ping_handle_t ping;
esp_err_t err = esp_ping_new_session(&config, &cbs, &ping);
if (err != ESP_OK)
{
MY_LOGI_MQTT(TAG, "esp_ping_new_session errore: %d", err);
return COMMON_STATUS_KO;
}
err = esp_ping_start(ping);
if (err != ESP_OK)
{
MY_LOGI_MQTT(TAG, "esp_ping_start errore: %d", err);
esp_ping_delete_session(ping);
return COMMON_STATUS_KO;
}
vTaskDelay((config.timeout_ms * config.count + 500) / portTICK_PERIOD_MS);
esp_ping_stop(ping);
esp_ping_delete_session(ping);
if (ping_result == COMMON_STATUS_OK)
{
MY_LOGI_MQTT(TAG, "STATO DEL PING: OK");
}
else
{
MY_LOGI_MQTT(TAG, "STATO DEL PING: KO");
}
return ping_result;
}