Skip to content

Commit ee2fbbb

Browse files
authored
Merge pull request #756 from david-cermak/feat/mdns_alloc_task
[mdns]: support allocating mDNS task with caps
2 parents 936e43f + cb061c9 commit ee2fbbb

File tree

10 files changed

+139
-24
lines changed

10 files changed

+139
-24
lines changed

common_components/linux_compat/freertos/freertos_linux.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -212,6 +212,20 @@ void *pthread_task(void *params)
212212
return NULL;
213213
}
214214

215+
TaskHandle_t xTaskCreateStaticPinnedToCore( TaskFunction_t pxTaskCode,
216+
const char *const pcName,
217+
const uint32_t ulStackDepth,
218+
void *const pvParameters,
219+
UBaseType_t uxPriority,
220+
StackType_t *const puxStackBuffer,
221+
StaticTask_t *const pxTaskBuffer,
222+
const BaseType_t xCoreID )
223+
{
224+
static TaskHandle_t pvCreatedTask;
225+
xTaskCreate(pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &pvCreatedTask);
226+
return pvCreatedTask;
227+
}
228+
215229
BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pvTaskCode,
216230
const char *const pcName,
217231
const uint32_t usStackDepth,

common_components/linux_compat/freertos/include/freertos/task.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
/*
2-
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66
#pragma once
77

88
#include "freertos/FreeRTOS.h"
9+
#include "esp_heap_caps.h"
910

1011
#ifdef __cplusplus
1112
extern "C" {
@@ -15,6 +16,9 @@ extern "C" {
1516
#define TaskHandle_t TaskHandle_t
1617
#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) )
1718

19+
typedef void *StackType_t;
20+
typedef void *StaticTask_t;
21+
1822
void vTaskDelay( const TickType_t xTicksToDelay );
1923

2024
void xTaskNotifyGive(TaskHandle_t task);
@@ -25,6 +29,15 @@ TaskHandle_t xTaskGetCurrentTaskHandle(void);
2529

2630
BaseType_t xTaskNotifyWait(uint32_t bits_entry_clear, uint32_t bits_exit_clear, uint32_t *value, TickType_t wait_time );
2731

32+
TaskHandle_t xTaskCreateStaticPinnedToCore( TaskFunction_t pxTaskCode,
33+
const char *const pcName,
34+
const uint32_t ulStackDepth,
35+
void *const pvParameters,
36+
UBaseType_t uxPriority,
37+
StackType_t *const puxStackBuffer,
38+
StaticTask_t *const pxTaskBuffer,
39+
const BaseType_t xCoreID );
40+
2841
BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pvTaskCode,
2942
const char *const pcName,
3043
const uint32_t usStackDepth,
@@ -81,6 +94,9 @@ EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,
8194

8295
uint32_t xQueueSendToBack(QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait );
8396

97+
void *heap_caps_malloc( size_t size, uint32_t caps);
98+
void heap_caps_free( void *ptr);
99+
84100
#ifdef __cplusplus
85101
}
86102
#endif //__cplusplus

components/mdns/.cz.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ commitizen:
33
bump_message: 'bump(mdns): $current_version -> $new_version'
44
pre_bump_hooks: python ../../ci/changelog.py mdns
55
tag_format: mdns-v$version
6-
version: 1.5.3
6+
version: 1.6.0
77
version_files:
88
- idf_component.yml

components/mdns/CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
# Changelog
22

3+
## [1.6.0](https://github.com/espressif/esp-protocols/commits/mdns-v1.6.0)
4+
5+
### Features
6+
7+
- support allocating mDNS task from SPIRAM ([8fcad10c](https://github.com/espressif/esp-protocols/commit/8fcad10c))
8+
9+
### Bug Fixes
10+
11+
- Use correct task delete function ([eb4ab524](https://github.com/espressif/esp-protocols/commit/eb4ab524))
12+
13+
### Updated
14+
15+
- ci(mdns): Fix mdns host test layers with static task creation ([0690eba3](https://github.com/espressif/esp-protocols/commit/0690eba3))
16+
317
## [1.5.3](https://github.com/espressif/esp-protocols/commits/mdns-v1.5.3)
418

519
### Bug Fixes

components/mdns/Kconfig

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@ menu "mDNS"
6161
default 0x0 if MDNS_TASK_AFFINITY_CPU0
6262
default 0x1 if MDNS_TASK_AFFINITY_CPU1
6363

64+
choice MDNS_TASK_MEMORY_ALLOC_FROM
65+
prompt "Select mDNS task create on which type of memory"
66+
default MDNS_TASK_CREATE_FROM_INTERNAL
67+
config MDNS_TASK_CREATE_FROM_SPIRAM
68+
bool "mDNS task creates on the SPIRAM"
69+
depends on (SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC)
70+
config MDNS_TASK_CREATE_FROM_INTERNAL
71+
bool "mDNS task creates on the internal RAM"
72+
endchoice
73+
6474
config MDNS_SERVICE_ADD_TIMEOUT_MS
6575
int "mDNS adding service timeout (ms)"
6676
range 10 30000

components/mdns/idf_component.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version: "1.5.3"
1+
version: "1.6.0"
22
description: "Multicast UDP service used to provide local network service and host discovery."
33
url: "https://github.com/espressif/esp-protocols/tree/master/components/mdns"
44
issues: "https://github.com/espressif/esp-protocols/issues"

components/mdns/mdns.c

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ static const char *TAG = "mdns";
6262

6363
static volatile TaskHandle_t _mdns_service_task_handle = NULL;
6464
static SemaphoreHandle_t _mdns_service_semaphore = NULL;
65+
static StackType_t *_mdns_stack_buffer;
6566

6667
static void _mdns_search_finish_done(void);
6768
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);
@@ -5462,6 +5463,26 @@ static esp_err_t _mdns_stop_timer(void)
54625463
return err;
54635464
}
54645465

5466+
static esp_err_t _mdns_task_create_with_caps(void)
5467+
{
5468+
ESP_LOGI(TAG, "mDNS task will be created from %s", MDNS_TASK_MEMORY_LOG);
5469+
esp_err_t ret = ESP_OK;
5470+
static StaticTask_t mdns_task_buffer;
5471+
5472+
// Allocate memory for the mDNS task's stack using the MDNS_TASK_MEMORY_CAPS
5473+
_mdns_stack_buffer = heap_caps_malloc(MDNS_SERVICE_STACK_DEPTH, MDNS_TASK_MEMORY_CAPS);
5474+
ESP_GOTO_ON_FALSE(_mdns_stack_buffer != NULL, ESP_FAIL, err, TAG, "failed to allocate memory for the mDNS task's stack");
5475+
5476+
_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 );
5477+
ESP_GOTO_ON_FALSE(_mdns_service_task_handle != NULL, ESP_FAIL, err, TAG, "failed to create task for the mDNS");
5478+
5479+
return ret;
5480+
5481+
err:
5482+
heap_caps_free(_mdns_stack_buffer);
5483+
return ret;
5484+
}
5485+
54655486
/**
54665487
* @brief Start the service thread if not running
54675488
*
@@ -5471,30 +5492,35 @@ static esp_err_t _mdns_stop_timer(void)
54715492
*/
54725493
static esp_err_t _mdns_service_task_start(void)
54735494
{
5495+
esp_err_t ret = ESP_OK;
54745496
if (!_mdns_service_semaphore) {
54755497
_mdns_service_semaphore = xSemaphoreCreateMutex();
5476-
if (!_mdns_service_semaphore) {
5477-
return ESP_FAIL;
5478-
}
5498+
ESP_RETURN_ON_FALSE(_mdns_service_semaphore != NULL, ESP_FAIL, TAG, "Failed to create the mDNS service lock");
54795499
}
54805500
MDNS_SERVICE_LOCK();
5481-
if (_mdns_start_timer()) {
5482-
MDNS_SERVICE_UNLOCK();
5483-
return ESP_FAIL;
5484-
}
5501+
ESP_GOTO_ON_ERROR(_mdns_start_timer(), err, TAG, "Failed to start the mDNS service timer");
5502+
54855503
if (!_mdns_service_task_handle) {
5486-
xTaskCreatePinnedToCore(_mdns_service_task, "mdns", MDNS_SERVICE_STACK_DEPTH, NULL, MDNS_TASK_PRIORITY,
5487-
(TaskHandle_t *const)(&_mdns_service_task_handle), MDNS_TASK_AFFINITY);
5488-
if (!_mdns_service_task_handle) {
5489-
_mdns_stop_timer();
5490-
MDNS_SERVICE_UNLOCK();
5491-
vSemaphoreDelete(_mdns_service_semaphore);
5492-
_mdns_service_semaphore = NULL;
5493-
return ESP_FAIL;
5494-
}
5504+
ESP_GOTO_ON_ERROR(_mdns_task_create_with_caps(), err_stop_timer, TAG, "Failed to start the mDNS service task");
5505+
#ifdef MDNS_ENABLE_DEBUG
5506+
#if !CONFIG_IDF_TARGET_LINUX
5507+
StackType_t *mdns_debug_stack_buffer;
5508+
StaticTask_t *mdns_debug_task_buffer;
5509+
xTaskGetStaticBuffers(_mdns_service_task_handle, &mdns_debug_stack_buffer, &mdns_debug_task_buffer);
5510+
_mdns_dbg_printf("mdns_debug_stack_buffer:%p mdns_debug_task_buffer:%p\n", mdns_debug_stack_buffer, mdns_debug_task_buffer);
5511+
#endif // CONFIG_IDF_TARGET_LINUX
5512+
#endif // MDNS_ENABLE_DEBUG
54955513
}
54965514
MDNS_SERVICE_UNLOCK();
5497-
return ESP_OK;
5515+
return ret;
5516+
5517+
err_stop_timer:
5518+
_mdns_stop_timer();
5519+
err:
5520+
MDNS_SERVICE_UNLOCK();
5521+
vSemaphoreDelete(_mdns_service_semaphore);
5522+
_mdns_service_semaphore = NULL;
5523+
return ret;
54985524
}
54995525

55005526
/**
@@ -5741,6 +5767,8 @@ void mdns_free(void)
57415767
mdns_service_remove_all();
57425768
free_delegated_hostnames();
57435769
_mdns_service_task_stop();
5770+
// at this point, the service task is deleted, so we can destroy the stack size
5771+
heap_caps_free(_mdns_stack_buffer);
57445772
for (i = 0; i < MDNS_MAX_INTERFACES; i++) {
57455773
for (j = 0; j < MDNS_IP_PROTOCOL_MAX; j++) {
57465774
mdns_pcb_deinit_local(i, j);

components/mdns/private_include/mdns_private.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,21 @@
2121
#define _mdns_dbg_printf(...) printf(__VA_ARGS__)
2222
#endif
2323

24+
#if CONFIG_MDNS_TASK_CREATE_FROM_SPIRAM
25+
#define MDNS_TASK_MEMORY_CAPS (MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT)
26+
#define MDNS_TASK_MEMORY_LOG "SPIRAM"
27+
#endif
28+
#if CONFIG_MDNS_TASK_CREATE_FROM_INTERNAL
29+
#define MDNS_TASK_MEMORY_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)
30+
#define MDNS_TASK_MEMORY_LOG "internal RAM"
31+
#endif
32+
33+
// Allocate memory from internal heap as default.
34+
#ifndef MDNS_TASK_MEMORY_CAPS
35+
#define MDNS_TASK_MEMORY_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)
36+
#define MDNS_TASK_MEMORY_LOG "internal RAM"
37+
#endif
38+
2439
/** Number of predefined interfaces */
2540
#ifndef CONFIG_MDNS_PREDEF_NETIF_STA
2641
#define CONFIG_MDNS_PREDEF_NETIF_STA 0

components/mdns/tests/test_afl_fuzz_host/esp32_mock.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Unlicense OR CC0-1.0
55
*/
@@ -125,3 +125,13 @@ uint32_t esp_log_timestamp(void)
125125
{
126126
return 0;
127127
}
128+
129+
void *heap_caps_malloc(size_t size, uint32_t caps)
130+
{
131+
return malloc(size);
132+
}
133+
134+
void heap_caps_free( void *ptr)
135+
{
136+
free(ptr);
137+
}

components/mdns/tests/test_afl_fuzz_host/esp32_mock.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -38,6 +38,10 @@
3838
#define ESP_ERR_INVALID_RESPONSE 0x108
3939
#define ESP_ERR_INVALID_CRC 0x109
4040

41+
#define MDNS_TASK_MEMORY_LOG "internal RAM"
42+
#define MALLOC_CAP_8BIT (1<<2)
43+
#define MALLOC_CAP_INTERNAL (1<<11)
44+
4145
#define pdTRUE true
4246
#define pdFALSE false
4347
#define pdPASS ( pdTRUE )
@@ -62,6 +66,7 @@
6266
#define vSemaphoreDelete(s) free(s)
6367
#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U
6468
#define xTaskCreatePinnedToCore(a,b,c,d,e,f,g) *(f) = malloc(1)
69+
#define xTaskCreateStaticPinnedToCore(a,b,c,d,e,f,g,h) true
6570
#define vTaskDelay(m) usleep((m)*0)
6671
#define esp_random() (rand()%UINT32_MAX)
6772

@@ -79,7 +84,8 @@ typedef void *QueueHandle_t;
7984
typedef void *TaskHandle_t;
8085
typedef int BaseType_t;
8186
typedef uint32_t TickType_t;
82-
87+
typedef void *StackType_t;
88+
typedef void *StaticTask_t;
8389

8490
struct udp_pcb {
8591
uint8_t dummy;
@@ -132,5 +138,7 @@ esp_err_t esp_event_handler_unregister(const char *event_base, int32_t event_id,
132138
TaskHandle_t xTaskGetCurrentTaskHandle(void);
133139
void xTaskNotifyGive(TaskHandle_t task);
134140
BaseType_t xTaskNotifyWait(uint32_t bits_entry_clear, uint32_t bits_exit_clear, uint32_t *value, TickType_t wait_time );
141+
void *heap_caps_malloc(size_t size, uint32_t caps);
142+
void heap_caps_free(void *ptr);
135143

136144
#endif //_ESP32_COMPAT_H_

0 commit comments

Comments
 (0)