fix(ota): prevent connection aborts by disabling socket keep-alive, keeping RF awake, and enabling dynamic mbedTLS buffers
All checks were successful
ESP32 Build & Release / build (push) Successful in 1m14s
All checks were successful
ESP32 Build & Release / build (push) Successful in 1m14s
This commit is contained in:
@@ -504,15 +504,15 @@ static void ota_download_task(void *arg)
|
|||||||
|
|
||||||
set_state(OTA_STATUS_DOWNLOADING, "Starting download...");
|
set_state(OTA_STATUS_DOWNLOADING, "Starting download...");
|
||||||
ESP_LOGI(TAG, "Starting HTTPS OTA from: %s", s_release.download_url);
|
ESP_LOGI(TAG, "Starting HTTPS OTA from: %s", s_release.download_url);
|
||||||
|
wifi_manager_set_power_save(false);
|
||||||
rfid_manager_pause(true);
|
rfid_manager_pause(true);
|
||||||
|
|
||||||
esp_http_client_config_t http_cfg = {
|
esp_http_client_config_t http_cfg = {
|
||||||
.url = s_release.download_url,
|
.url = s_release.download_url,
|
||||||
.transport_type = HTTP_TRANSPORT_OVER_SSL,
|
.transport_type = HTTP_TRANSPORT_OVER_SSL,
|
||||||
.timeout_ms = 45000,
|
.timeout_ms = 45000,
|
||||||
.keep_alive_enable = true,
|
|
||||||
.buffer_size = 4096,
|
.buffer_size = 4096,
|
||||||
.buffer_size_tx = 2048,
|
.buffer_size_tx = 1024,
|
||||||
.cert_pem = s_isrg_root_x1_pem,
|
.cert_pem = s_isrg_root_x1_pem,
|
||||||
.cert_len = sizeof(s_isrg_root_x1_pem),
|
.cert_len = sizeof(s_isrg_root_x1_pem),
|
||||||
};
|
};
|
||||||
@@ -525,6 +525,7 @@ static void ota_download_task(void *arg)
|
|||||||
esp_err_t err = esp_https_ota_begin(&ota_cfg, &ota_handle);
|
esp_err_t err = esp_https_ota_begin(&ota_cfg, &ota_handle);
|
||||||
if (err != ESP_OK || ota_handle == NULL) {
|
if (err != ESP_OK || ota_handle == NULL) {
|
||||||
rfid_manager_pause(false);
|
rfid_manager_pause(false);
|
||||||
|
wifi_manager_set_power_save(true);
|
||||||
wifi_manager_release_net_lock();
|
wifi_manager_release_net_lock();
|
||||||
ESP_LOGE(TAG, "esp_https_ota_begin failed: %s", esp_err_to_name(err));
|
ESP_LOGE(TAG, "esp_https_ota_begin failed: %s", esp_err_to_name(err));
|
||||||
set_state(OTA_STATUS_FAILED, "Failed to connect to image");
|
set_state(OTA_STATUS_FAILED, "Failed to connect to image");
|
||||||
@@ -541,6 +542,7 @@ static void ota_download_task(void *arg)
|
|||||||
ESP_LOGW(TAG, "Incoming image has identical ELF SHA-256 as running app - aborting flash write");
|
ESP_LOGW(TAG, "Incoming image has identical ELF SHA-256 as running app - aborting flash write");
|
||||||
esp_https_ota_abort(ota_handle);
|
esp_https_ota_abort(ota_handle);
|
||||||
rfid_manager_pause(false);
|
rfid_manager_pause(false);
|
||||||
|
wifi_manager_set_power_save(true);
|
||||||
wifi_manager_release_net_lock();
|
wifi_manager_release_net_lock();
|
||||||
set_state(OTA_STATUS_UP_TO_DATE, "Firmware is already up to date");
|
set_state(OTA_STATUS_UP_TO_DATE, "Firmware is already up to date");
|
||||||
s_ota_task_handle = NULL;
|
s_ota_task_handle = NULL;
|
||||||
@@ -550,11 +552,13 @@ static void ota_download_task(void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int chunk_counter = 0;
|
int chunk_counter = 0;
|
||||||
|
int last_logged_step = -1;
|
||||||
while (1) {
|
while (1) {
|
||||||
if (s_cancel_requested) {
|
if (s_cancel_requested) {
|
||||||
ESP_LOGW(TAG, "OTA canceled by user");
|
ESP_LOGW(TAG, "OTA canceled by user");
|
||||||
esp_https_ota_abort(ota_handle);
|
esp_https_ota_abort(ota_handle);
|
||||||
rfid_manager_pause(false);
|
rfid_manager_pause(false);
|
||||||
|
wifi_manager_set_power_save(true);
|
||||||
wifi_manager_release_net_lock();
|
wifi_manager_release_net_lock();
|
||||||
set_state(OTA_STATUS_IDLE, "Update canceled");
|
set_state(OTA_STATUS_IDLE, "Update canceled");
|
||||||
s_ota_task_handle = NULL;
|
s_ota_task_handle = NULL;
|
||||||
@@ -572,6 +576,14 @@ static void ota_download_task(void *arg)
|
|||||||
if (read > 0) s_bytes_read = (size_t)read;
|
if (read > 0) s_bytes_read = (size_t)read;
|
||||||
if (total > 0) s_total_bytes = (size_t)total;
|
if (total > 0) s_total_bytes = (size_t)total;
|
||||||
|
|
||||||
|
if (total > 0) {
|
||||||
|
int step = (read * 10) / total;
|
||||||
|
if (step != last_logged_step) {
|
||||||
|
last_logged_step = step;
|
||||||
|
ESP_LOGI(TAG, "OTA download: %d%% (%d / %d KB)", (read * 100) / total, read / 1024, total / 1024);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Yield every 4 chunks (16 KB) to feed the task watchdog without throttling throughput */
|
/* Yield every 4 chunks (16 KB) to feed the task watchdog without throttling throughput */
|
||||||
if (++chunk_counter % 4 == 0) {
|
if (++chunk_counter % 4 == 0) {
|
||||||
vTaskDelay(1);
|
vTaskDelay(1);
|
||||||
@@ -579,6 +591,7 @@ static void ota_download_task(void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
rfid_manager_pause(false);
|
rfid_manager_pause(false);
|
||||||
|
wifi_manager_set_power_save(true);
|
||||||
|
|
||||||
if (err == ESP_OK) {
|
if (err == ESP_OK) {
|
||||||
if (esp_https_ota_is_complete_data_received(ota_handle)) {
|
if (esp_https_ota_is_complete_data_received(ota_handle)) {
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ static SemaphoreHandle_t s_wifi_mux = NULL;
|
|||||||
static SemaphoreHandle_t s_net_lock = NULL;
|
static SemaphoreHandle_t s_net_lock = NULL;
|
||||||
static bool s_manual_disconnect = false;
|
static bool s_manual_disconnect = false;
|
||||||
static esp_netif_t *s_sta_netif = NULL;
|
static esp_netif_t *s_sta_netif = NULL;
|
||||||
|
static bool s_power_save_enabled = true;
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
@@ -205,9 +206,14 @@ static void wifi_event_handler(void *arg, esp_event_base_t base, int32_t id, voi
|
|||||||
dns_fallback.ip.u_addr.ip4.addr = ESP_IP4TOADDR(8, 8, 8, 8);
|
dns_fallback.ip.u_addr.ip4.addr = ESP_IP4TOADDR(8, 8, 8, 8);
|
||||||
esp_netif_set_dns_info(s_sta_netif, ESP_NETIF_DNS_FALLBACK, &dns_fallback);
|
esp_netif_set_dns_info(s_sta_netif, ESP_NETIF_DNS_FALLBACK, &dns_fallback);
|
||||||
}
|
}
|
||||||
/* Enable modem power saving when idle on station network */
|
/* Enable modem power saving only if power save is allowed */
|
||||||
esp_wifi_set_ps(WIFI_PS_MIN_MODEM);
|
if (s_power_save_enabled) {
|
||||||
ESP_LOGI(TAG, "Wi-Fi modem sleep enabled (WIFI_PS_MIN_MODEM: ~30-40 mA saved)");
|
esp_wifi_set_ps(WIFI_PS_MIN_MODEM);
|
||||||
|
ESP_LOGI(TAG, "Wi-Fi modem sleep enabled (WIFI_PS_MIN_MODEM: ~30-40 mA saved)");
|
||||||
|
} else {
|
||||||
|
esp_wifi_set_ps(WIFI_PS_NONE);
|
||||||
|
ESP_LOGI(TAG, "Wi-Fi power save disabled (WIFI_PS_NONE)");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -510,8 +516,6 @@ esp_err_t wifi_manager_start(void)
|
|||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool s_power_save_enabled = true;
|
|
||||||
|
|
||||||
esp_err_t wifi_manager_acquire_net_lock(TickType_t timeout_ticks)
|
esp_err_t wifi_manager_acquire_net_lock(TickType_t timeout_ticks)
|
||||||
{
|
{
|
||||||
if (!s_net_lock) {
|
if (!s_net_lock) {
|
||||||
|
|||||||
@@ -1665,7 +1665,9 @@ CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y
|
|||||||
CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
|
CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
|
||||||
CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384
|
CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384
|
||||||
CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096
|
CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096
|
||||||
# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set
|
CONFIG_MBEDTLS_DYNAMIC_BUFFER=y
|
||||||
|
CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA=y
|
||||||
|
CONFIG_MBEDTLS_DYNAMIC_FREE_CA_CERT=y
|
||||||
# CONFIG_MBEDTLS_DEBUG is not set
|
# CONFIG_MBEDTLS_DEBUG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|||||||
Reference in New Issue
Block a user