diff --git a/components/mdns/Kconfig b/components/mdns/Kconfig index 3ef88c8d65..79080e533a 100644 --- a/components/mdns/Kconfig +++ b/components/mdns/Kconfig @@ -61,6 +61,16 @@ menu "mDNS" default 0x0 if MDNS_TASK_AFFINITY_CPU0 default 0x1 if MDNS_TASK_AFFINITY_CPU1 + choice MDNS_TASK_MEMORY_ALLOC_FROM + prompt "Select mDNS task create on which type of memory" + default MDNS_TASK_CREATE_FROM_INTERNAL + config MDNS_TASK_CREATE_FROM_SPIRAM + bool "mDNS task creates on the SPIRAM" + depends on (SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC) + config MDNS_TASK_CREATE_FROM_INTERNAL + bool "mDNS task creates on the internal RAM" + endchoice + config MDNS_SERVICE_ADD_TIMEOUT_MS int "mDNS adding service timeout (ms)" range 10 30000 diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index 903cc02b4c..d39c39fd9e 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -25,6 +25,8 @@ static void _mdns_browse_finish(mdns_browse_t *browse); static void _mdns_browse_add(mdns_browse_t *browse); static void _mdns_browse_send(mdns_browse_t *browse, mdns_if_t interface); +static void _mdns_task_free_with_caps(void); + #if CONFIG_ETH_ENABLED && CONFIG_MDNS_PREDEF_NETIF_ETH #include "esp_eth.h" #endif @@ -62,6 +64,7 @@ static const char *TAG = "mdns"; static volatile TaskHandle_t _mdns_service_task_handle = NULL; static SemaphoreHandle_t _mdns_service_semaphore = NULL; +StackType_t *_mdns_stack_buffer; static void _mdns_search_finish_done(void); static mdns_search_once_t *_mdns_search_find_from(mdns_search_once_t *search, mdns_name_t *name, uint16_t type, mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol); @@ -5417,8 +5420,8 @@ static void _mdns_service_task(void *pvParameters) vTaskDelay(500 * portTICK_PERIOD_MS); } } + _mdns_task_free_with_caps(); _mdns_service_task_handle = NULL; - vTaskDelete(NULL); } static void _mdns_timer_cb(void *arg) @@ -5455,6 +5458,32 @@ static esp_err_t _mdns_stop_timer(void) return err; } +static esp_err_t _mdns_task_create_with_caps(void) +{ + ESP_LOGI(TAG, "mDNS task will be created from %s", MDNS_TASK_MEMORY_LOG); + esp_err_t ret = ESP_OK; + static StaticTask_t mdns_task_buffer; + + // Allocate memory for the mDNS task's stack using the MDNS_TASK_MEMORY_CAPS + _mdns_stack_buffer = heap_caps_malloc(MDNS_SERVICE_STACK_DEPTH, MDNS_TASK_MEMORY_CAPS); + ESP_GOTO_ON_FALSE(_mdns_stack_buffer != NULL, ESP_FAIL, err, TAG, "failed to allocate memory for the mDNS task's stack"); + + _mdns_service_task_handle = xTaskCreateStaticPinnedToCore( _mdns_service_task, "mdns", MDNS_SERVICE_STACK_DEPTH, NULL, MDNS_TASK_PRIORITY, _mdns_stack_buffer, &mdns_task_buffer, MDNS_TASK_AFFINITY ); + ESP_GOTO_ON_FALSE(_mdns_service_task_handle != NULL, ESP_FAIL, err, TAG, "failed to create task for the mDNS"); + + return ret; + +err: + heap_caps_free(_mdns_stack_buffer); + return ret; +} + +static void _mdns_task_free_with_caps(void) +{ + vTaskDelete(_mdns_service_task_handle); + heap_caps_free(_mdns_stack_buffer); +} + /** * @brief Start the service thread if not running * @@ -5464,30 +5493,35 @@ static esp_err_t _mdns_stop_timer(void) */ static esp_err_t _mdns_service_task_start(void) { + esp_err_t ret = ESP_OK; if (!_mdns_service_semaphore) { _mdns_service_semaphore = xSemaphoreCreateMutex(); - if (!_mdns_service_semaphore) { - return ESP_FAIL; - } + ESP_RETURN_ON_FALSE(_mdns_service_semaphore != NULL, ESP_FAIL, TAG, "Failed to create the mDNS service lock"); } MDNS_SERVICE_LOCK(); - if (_mdns_start_timer()) { - MDNS_SERVICE_UNLOCK(); - return ESP_FAIL; - } + ESP_GOTO_ON_ERROR(_mdns_start_timer(), err, TAG, "Failed to start the mDNS service timer"); + if (!_mdns_service_task_handle) { - xTaskCreatePinnedToCore(_mdns_service_task, "mdns", MDNS_SERVICE_STACK_DEPTH, NULL, MDNS_TASK_PRIORITY, - (TaskHandle_t *const)(&_mdns_service_task_handle), MDNS_TASK_AFFINITY); - if (!_mdns_service_task_handle) { - _mdns_stop_timer(); - MDNS_SERVICE_UNLOCK(); - vSemaphoreDelete(_mdns_service_semaphore); - _mdns_service_semaphore = NULL; - return ESP_FAIL; - } + ESP_GOTO_ON_ERROR(_mdns_task_create_with_caps(), err_stop_timer, TAG, "Failed to start the mDNS service task"); +#ifdef MDNS_ENABLE_DEBUG +#if !CONFIG_IDF_TARGET_LINUX + StackType_t *mdns_debug_stack_buffer; + StaticTask_t *mdns_debug_task_buffer; + xTaskGetStaticBuffers(_mdns_service_task_handle, &mdns_debug_stack_buffer, &mdns_debug_task_buffer); + _mdns_dbg_printf("mdns_debug_stack_buffer:%p mdns_debug_task_buffer:%p\n", mdns_debug_stack_buffer, mdns_debug_task_buffer); +#endif // CONFIG_IDF_TARGET_LINUX +#endif // MDNS_ENABLE_DEBUG } MDNS_SERVICE_UNLOCK(); - return ESP_OK; + return ret; + +err_stop_timer: + _mdns_stop_timer(); +err: + MDNS_SERVICE_UNLOCK(); + vSemaphoreDelete(_mdns_service_semaphore); + _mdns_service_semaphore = NULL; + return ret; } /** @@ -5504,7 +5538,7 @@ static esp_err_t _mdns_service_task_stop(void) mdns_action_t *a = &action; action.type = ACTION_TASK_STOP; if (xQueueSend(_mdns_server->action_queue, &a, (TickType_t)0) != pdPASS) { - vTaskDelete(_mdns_service_task_handle); + _mdns_task_free_with_caps(); _mdns_service_task_handle = NULL; } while (_mdns_service_task_handle) { diff --git a/components/mdns/private_include/mdns_private.h b/components/mdns/private_include/mdns_private.h index ce4c96b631..8976ed1e79 100644 --- a/components/mdns/private_include/mdns_private.h +++ b/components/mdns/private_include/mdns_private.h @@ -21,6 +21,21 @@ #define _mdns_dbg_printf(...) printf(__VA_ARGS__) #endif +#if CONFIG_MDNS_TASK_CREATE_FROM_SPIRAM +#define MDNS_TASK_MEMORY_CAPS (MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT) +#define MDNS_TASK_MEMORY_LOG "SPIRAM" +#endif +#if CONFIG_MDNS_TASK_CREATE_FROM_INTERNAL +#define MDNS_TASK_MEMORY_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT) +#define MDNS_TASK_MEMORY_LOG "internal RAM" +#endif + +// Allocate memory from internal heap as default. +#ifndef MDNS_TASK_MEMORY_CAPS +#define MDNS_TASK_MEMORY_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT) +#define MDNS_TASK_MEMORY_LOG "internal RAM" +#endif + /** Number of predefined interfaces */ #ifndef CONFIG_MDNS_PREDEF_NETIF_STA #define CONFIG_MDNS_PREDEF_NETIF_STA 0