From 8fcad10ccf95ccbe25051a36e66dbd1643d37b64 Mon Sep 17 00:00:00 2001 From: zwx Date: Fri, 24 Jan 2025 18:40:54 +0800 Subject: [PATCH 1/4] feat(mdns): support allocating mDNS task from SPIRAM --- components/mdns/Kconfig | 10 +++ components/mdns/mdns.c | 72 ++++++++++++++----- .../mdns/private_include/mdns_private.h | 15 ++++ 3 files changed, 78 insertions(+), 19 deletions(-) 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 967519461d..8ab7416979 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); @@ -5424,8 +5427,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) @@ -5462,6 +5465,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 * @@ -5471,30 +5500,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; } /** @@ -5511,7 +5545,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 From eb4ab5248757a9c4ca6841b689107a18a82a8466 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Mon, 3 Feb 2025 12:08:50 +0100 Subject: [PATCH 2/4] fix(mdns): Use correct task delete function --- components/mdns/mdns.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index 8ab7416979..b30abbcc87 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -25,8 +25,6 @@ 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 @@ -64,7 +62,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 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); @@ -5427,8 +5425,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) @@ -5485,12 +5483,6 @@ static esp_err_t _mdns_task_create_with_caps(void) 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 * @@ -5545,7 +5537,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) { - _mdns_task_free_with_caps(); + vTaskDelete(_mdns_service_task_handle); _mdns_service_task_handle = NULL; } while (_mdns_service_task_handle) { @@ -5775,6 +5767,8 @@ void mdns_free(void) mdns_service_remove_all(); free_delegated_hostnames(); _mdns_service_task_stop(); + // at this point, the service task is deleted, so we can destroy the stack size + heap_caps_free(_mdns_stack_buffer); for (i = 0; i < MDNS_MAX_INTERFACES; i++) { for (j = 0; j < MDNS_IP_PROTOCOL_MAX; j++) { mdns_pcb_deinit_local(i, j); From 0690eba3a8ca68a69c6ebe62d2fbffbc10245a93 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Mon, 3 Feb 2025 12:46:50 +0100 Subject: [PATCH 3/4] ci(mdns): Fix mdns host test layers with static task creation --- .../linux_compat/freertos/freertos_linux.c | 16 +++++++++++++++- .../freertos/include/freertos/task.h | 18 +++++++++++++++++- .../mdns/tests/test_afl_fuzz_host/esp32_mock.c | 12 +++++++++++- .../mdns/tests/test_afl_fuzz_host/esp32_mock.h | 12 ++++++++++-- 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/common_components/linux_compat/freertos/freertos_linux.c b/common_components/linux_compat/freertos/freertos_linux.c index 37b66e02a3..9055f7e55b 100644 --- a/common_components/linux_compat/freertos/freertos_linux.c +++ b/common_components/linux_compat/freertos/freertos_linux.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -212,6 +212,20 @@ void *pthread_task(void *params) return NULL; } +TaskHandle_t xTaskCreateStaticPinnedToCore( TaskFunction_t pxTaskCode, + const char *const pcName, + const uint32_t ulStackDepth, + void *const pvParameters, + UBaseType_t uxPriority, + StackType_t *const puxStackBuffer, + StaticTask_t *const pxTaskBuffer, + const BaseType_t xCoreID ) +{ + static TaskHandle_t pvCreatedTask; + xTaskCreate(pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &pvCreatedTask); + return pvCreatedTask; +} + BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pvTaskCode, const char *const pcName, const uint32_t usStackDepth, diff --git a/common_components/linux_compat/freertos/include/freertos/task.h b/common_components/linux_compat/freertos/include/freertos/task.h index 235f467613..307245d280 100644 --- a/common_components/linux_compat/freertos/include/freertos/task.h +++ b/common_components/linux_compat/freertos/include/freertos/task.h @@ -1,11 +1,12 @@ /* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #pragma once #include "freertos/FreeRTOS.h" +#include "esp_heap_caps.h" #ifdef __cplusplus extern "C" { @@ -15,6 +16,9 @@ extern "C" { #define TaskHandle_t TaskHandle_t #define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) +typedef void *StackType_t; +typedef void *StaticTask_t; + void vTaskDelay( const TickType_t xTicksToDelay ); void xTaskNotifyGive(TaskHandle_t task); @@ -25,6 +29,15 @@ TaskHandle_t xTaskGetCurrentTaskHandle(void); BaseType_t xTaskNotifyWait(uint32_t bits_entry_clear, uint32_t bits_exit_clear, uint32_t *value, TickType_t wait_time ); +TaskHandle_t xTaskCreateStaticPinnedToCore( TaskFunction_t pxTaskCode, + const char *const pcName, + const uint32_t ulStackDepth, + void *const pvParameters, + UBaseType_t uxPriority, + StackType_t *const puxStackBuffer, + StaticTask_t *const pxTaskBuffer, + const BaseType_t xCoreID ); + BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pvTaskCode, const char *const pcName, const uint32_t usStackDepth, @@ -81,6 +94,9 @@ EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, uint32_t xQueueSendToBack(QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait ); +void *heap_caps_malloc( size_t size, uint32_t caps); +void heap_caps_free( void *ptr); + #ifdef __cplusplus } #endif //__cplusplus diff --git a/components/mdns/tests/test_afl_fuzz_host/esp32_mock.c b/components/mdns/tests/test_afl_fuzz_host/esp32_mock.c index 5830c251e7..add170a9a0 100644 --- a/components/mdns/tests/test_afl_fuzz_host/esp32_mock.c +++ b/components/mdns/tests/test_afl_fuzz_host/esp32_mock.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -125,3 +125,13 @@ uint32_t esp_log_timestamp(void) { return 0; } + +void *heap_caps_malloc(size_t size, uint32_t caps) +{ + return malloc(size); +} + +void heap_caps_free( void *ptr) +{ + free(ptr); +} diff --git a/components/mdns/tests/test_afl_fuzz_host/esp32_mock.h b/components/mdns/tests/test_afl_fuzz_host/esp32_mock.h index e8e84ceb48..5af8af4b56 100644 --- a/components/mdns/tests/test_afl_fuzz_host/esp32_mock.h +++ b/components/mdns/tests/test_afl_fuzz_host/esp32_mock.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -38,6 +38,10 @@ #define ESP_ERR_INVALID_RESPONSE 0x108 #define ESP_ERR_INVALID_CRC 0x109 +#define MDNS_TASK_MEMORY_LOG "internal RAM" +#define MALLOC_CAP_8BIT (1<<2) +#define MALLOC_CAP_INTERNAL (1<<11) + #define pdTRUE true #define pdFALSE false #define pdPASS ( pdTRUE ) @@ -62,6 +66,7 @@ #define vSemaphoreDelete(s) free(s) #define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U #define xTaskCreatePinnedToCore(a,b,c,d,e,f,g) *(f) = malloc(1) +#define xTaskCreateStaticPinnedToCore(a,b,c,d,e,f,g,h) true #define vTaskDelay(m) usleep((m)*0) #define esp_random() (rand()%UINT32_MAX) @@ -79,7 +84,8 @@ typedef void *QueueHandle_t; typedef void *TaskHandle_t; typedef int BaseType_t; typedef uint32_t TickType_t; - +typedef void *StackType_t; +typedef void *StaticTask_t; struct udp_pcb { uint8_t dummy; @@ -132,5 +138,7 @@ esp_err_t esp_event_handler_unregister(const char *event_base, int32_t event_id, TaskHandle_t xTaskGetCurrentTaskHandle(void); void xTaskNotifyGive(TaskHandle_t task); BaseType_t xTaskNotifyWait(uint32_t bits_entry_clear, uint32_t bits_exit_clear, uint32_t *value, TickType_t wait_time ); +void *heap_caps_malloc(size_t size, uint32_t caps); +void heap_caps_free(void *ptr); #endif //_ESP32_COMPAT_H_ From cb061c9c38adb58cb16eb4b34ad9df1f042a5ffd Mon Sep 17 00:00:00 2001 From: David Cermak Date: Mon, 10 Feb 2025 11:18:55 +0100 Subject: [PATCH 4/4] bump(mdns): 1.5.3 -> 1.6.0 1.6.0 Features - support allocating mDNS task from SPIRAM (8fcad10c) Bug Fixes - Use correct task delete function (eb4ab524) Updated - ci(mdns): Fix mdns host test layers with static task creation (0690eba3) --- components/mdns/.cz.yaml | 2 +- components/mdns/CHANGELOG.md | 14 ++++++++++++++ components/mdns/idf_component.yml | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/components/mdns/.cz.yaml b/components/mdns/.cz.yaml index be067e4d92..d4445e24bc 100644 --- a/components/mdns/.cz.yaml +++ b/components/mdns/.cz.yaml @@ -3,6 +3,6 @@ commitizen: bump_message: 'bump(mdns): $current_version -> $new_version' pre_bump_hooks: python ../../ci/changelog.py mdns tag_format: mdns-v$version - version: 1.5.3 + version: 1.6.0 version_files: - idf_component.yml diff --git a/components/mdns/CHANGELOG.md b/components/mdns/CHANGELOG.md index 419d952b1c..fe25d96eec 100644 --- a/components/mdns/CHANGELOG.md +++ b/components/mdns/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [1.6.0](https://github.com/espressif/esp-protocols/commits/mdns-v1.6.0) + +### Features + +- support allocating mDNS task from SPIRAM ([8fcad10c](https://github.com/espressif/esp-protocols/commit/8fcad10c)) + +### Bug Fixes + +- Use correct task delete function ([eb4ab524](https://github.com/espressif/esp-protocols/commit/eb4ab524)) + +### Updated + +- ci(mdns): Fix mdns host test layers with static task creation ([0690eba3](https://github.com/espressif/esp-protocols/commit/0690eba3)) + ## [1.5.3](https://github.com/espressif/esp-protocols/commits/mdns-v1.5.3) ### Bug Fixes diff --git a/components/mdns/idf_component.yml b/components/mdns/idf_component.yml index 9d8792f9fe..00e3cb8828 100644 --- a/components/mdns/idf_component.yml +++ b/components/mdns/idf_component.yml @@ -1,4 +1,4 @@ -version: "1.5.3" +version: "1.6.0" description: "Multicast UDP service used to provide local network service and host discovery." url: "https://github.com/espressif/esp-protocols/tree/master/components/mdns" issues: "https://github.com/espressif/esp-protocols/issues"