Skip to content

Commit ed87fa2

Browse files
committed
fix(mdns): Add data-flow diagram
1 parent 582d2e4 commit ed87fa2

13 files changed

+145
-81
lines changed

components/mdns/mdns_browser.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
#include <string.h>
77
#include "mdns_private.h"
88
#include "mdns_browser.h"
9-
#include "mdns_send.h"
109
#include "mdns_mem_caps.h"
1110
#include "mdns_debug.h"
1211
#include "mdns_utils.h"
1312
#include "mdns_querier.h"
1413
#include "mdns_responder.h"
1514
#include "mdns_netif.h"
15+
#include "mdns_service.h"
1616
#include "esp_log.h"
1717

1818
static const char *TAG = "mdns_browser";

components/mdns/mdns_debug.c

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <stdint.h>
99
#include <stdarg.h>
1010
#include <inttypes.h>
11+
#include "freertos/FreeRTOS.h"
1112
#include "sdkconfig.h"
1213
#include "mdns_private.h"
1314
#include "mdns_utils.h"

components/mdns/mdns_diagram.md

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
```mermaid
2+
graph TB
3+
%% Housekeeping modules at the top
4+
subgraph Housekeeping [Support Modules]
5+
Service[mdns_service.c]
6+
Utils[mdns_utils.c]
7+
MemCaps[mdns_mem_caps.c]
8+
Debug[mdns_debug.c]
9+
end
10+
11+
%% Switch to LR direction for the main flow
12+
subgraph MainFlow [Main Data Flow]
13+
direction LR
14+
15+
%% Network on left side
16+
Network((Network)) <--> Networking
17+
18+
%% Networking layer
19+
subgraph Networking [Networking Layer]
20+
LWIP[mdns_networking_lwip.c]
21+
Socket[mdns_networking_socket.c]
22+
end
23+
24+
%% Traffic flow
25+
Networking --> |Incoming| Receive[mdns_receive.c]
26+
Send[mdns_send.c] --> |Outgoing| Networking
27+
28+
%% Core MDNS components
29+
Receive --> Responder[mdns_responder.c]
30+
Receive --> Browser[mdns_browser.c]
31+
Receive --> Querier[mdns_querier.c]
32+
33+
Responder --> Send
34+
Browser --> Send
35+
Querier --> Send
36+
37+
PCB[mdns_pcb.c] --> Send
38+
NetIF[mdns_netif.c]
39+
40+
%% Users on the right side, aligned vertically
41+
Responder --> Advertise((User: Advertising))
42+
Querier --> Search((User: Searching))
43+
Browser --> Browse((User: Browsing))
44+
end
45+
46+
%% Style user nodes
47+
style Advertise fill:#f9f,stroke:#333,stroke-width:2px
48+
style Search fill:#f9f,stroke:#333,stroke-width:2px
49+
style Browse fill:#f9f,stroke:#333,stroke-width:2px
50+
style Housekeeping fill:#e6f7ff,stroke:#333,stroke-width:1px
51+
```

components/mdns/mdns_netif.c

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "mdns_netif.h"
1818
#include "mdns_pcb.h"
1919
#include "mdns_responder.h"
20+
#include "mdns_service.h"
2021

2122
static const char *TAG = "mdns_netif";
2223

components/mdns/mdns_networking_lwip.c

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "mdns_mem_caps.h"
2222
#include "mdns_utils.h"
2323
#include "mdns_netif.h"
24+
#include "mdns_service.h"
2425

2526
/*
2627
* MDNS Server Networking

components/mdns/mdns_networking_socket.c

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "mdns_mem_caps.h"
2525
#include "mdns_utils.h"
2626
#include "mdns_netif.h"
27+
#include "mdns_service.h"
2728

2829
#if defined(CONFIG_IDF_TARGET_LINUX)
2930
#include <sys/ioctl.h>

components/mdns/mdns_querier.c

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "mdns_pcb.h"
1414
#include "mdns_netif.h"
1515
#include "mdns_responder.h"
16+
#include "mdns_service.h"
1617

1718
static const char *TAG = "mdns_querier";
1819
static mdns_search_once_t *s_search_once;

components/mdns/mdns_responder.c

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "mdns_send.h"
1515
#include "mdns_querier.h"
1616
#include "mdns_pcb.h"
17+
#include "mdns_service.h"
1718

1819
typedef struct mdns_server_s {
1920
const char *hostname;

components/mdns/mdns_send.c

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "mdns_netif.h"
1616
#include "mdns_pcb.h"
1717
#include "mdns_responder.h"
18+
#include "mdns_service.h"
1819

1920
static const char *TAG = "mdns_send";
2021
static const char *MDNS_SUB_STR = "_sub";

components/mdns/mdns_service.c

+52-47
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,14 @@
55
*/
66
#include <string.h>
77
#include "mdns_private.h"
8-
#include "mdns_networking.h"
98
#include "freertos/FreeRTOS.h"
109
#include "freertos/task.h"
1110
#include "freertos/queue.h"
1211
#include "freertos/semphr.h"
1312
#include "esp_check.h"
1413
#include "mdns.h"
15-
#include "mdns_private.h"
16-
#include "mdns_networking.h"
1714
#include "mdns_mem_caps.h"
1815
#include "mdns_utils.h"
19-
#include "mdns_debug.h"
2016
#include "mdns_browser.h"
2117
#include "mdns_netif.h"
2218
#include "mdns_send.h"
@@ -25,10 +21,21 @@
2521
#include "mdns_pcb.h"
2622
#include "mdns_responder.h"
2723

24+
#define MDNS_SERVICE_STACK_DEPTH CONFIG_MDNS_TASK_STACK_SIZE
25+
#define MDNS_TASK_PRIORITY CONFIG_MDNS_TASK_PRIORITY
26+
#if (MDNS_TASK_PRIORITY > ESP_TASK_PRIO_MAX)
27+
#error "mDNS task priority is higher than ESP_TASK_PRIO_MAX"
28+
#elif (MDNS_TASK_PRIORITY > ESP_TASKD_EVENT_PRIO)
29+
#warning "mDNS task priority is higher than ESP_TASKD_EVENT_PRIO, mDNS library might not work correctly"
30+
#endif
31+
#define MDNS_TASK_AFFINITY CONFIG_MDNS_TASK_AFFINITY
32+
33+
#define MDNS_SERVICE_LOCK() xSemaphoreTake(s_service_semaphore, portMAX_DELAY)
34+
#define MDNS_SERVICE_UNLOCK() xSemaphoreGive(s_service_semaphore)
2835

29-
static volatile TaskHandle_t _mdns_service_task_handle = NULL;
30-
static SemaphoreHandle_t _mdns_service_semaphore = NULL;
31-
static StackType_t *_mdns_stack_buffer;
36+
static volatile TaskHandle_t s_service_task_handle = NULL;
37+
static SemaphoreHandle_t s_service_semaphore = NULL;
38+
static StackType_t *s_stack_buffer;
3239
static QueueHandle_t s_action_queue;
3340
static esp_timer_handle_t s_timer_handle;
3441

@@ -112,12 +119,10 @@ static void perform_event_action(mdns_if_t mdns_if, mdns_event_actions_t action)
112119
#endif /* CONFIG_MDNS_RESPOND_REVERSE_QUERIES */
113120
}
114121

115-
116-
117122
/**
118123
* @brief Free action data
119124
*/
120-
static void _mdns_free_action(mdns_action_t *action)
125+
static void free_action(mdns_action_t *action)
121126
{
122127
switch (action->type) {
123128
case ACTION_SEARCH_ADD:
@@ -152,7 +157,7 @@ static void _mdns_free_action(mdns_action_t *action)
152157
/**
153158
* @brief Called from service thread to execute given action
154159
*/
155-
static void _mdns_execute_action(mdns_action_t *action)
160+
static void execute_action(mdns_action_t *action)
156161
{
157162
switch (action->type) {
158163
case ACTION_SYSTEM_EVENT:
@@ -191,7 +196,7 @@ static void _mdns_execute_action(mdns_action_t *action)
191196
/**
192197
* @brief the main MDNS service task. Packets are received and parsed here
193198
*/
194-
static void _mdns_service_task(void *pvParameters)
199+
static void service_task(void *pvParameters)
195200
{
196201
mdns_action_t *a = NULL;
197202
for (;;) {
@@ -202,27 +207,27 @@ static void _mdns_service_task(void *pvParameters)
202207
break;
203208
}
204209
MDNS_SERVICE_LOCK();
205-
_mdns_execute_action(a);
210+
execute_action(a);
206211
MDNS_SERVICE_UNLOCK();
207212
}
208213
} else {
209214
vTaskDelay(500 * portTICK_PERIOD_MS);
210215
}
211216
}
212-
_mdns_service_task_handle = NULL;
217+
s_service_task_handle = NULL;
213218
vTaskDelay(portMAX_DELAY);
214219
}
215220

216-
static void _mdns_timer_cb(void *arg)
221+
static void timer_cb(void *arg)
217222
{
218223
mdns_priv_send_packets();
219224
mdns_priv_query_start_stop();
220225
}
221226

222-
static esp_err_t _mdns_start_timer(void)
227+
static esp_err_t start_timer(void)
223228
{
224229
esp_timer_create_args_t timer_conf = {
225-
.callback = _mdns_timer_cb,
230+
.callback = timer_cb,
226231
.arg = NULL,
227232
.dispatch_method = ESP_TIMER_TASK,
228233
.name = "mdns_timer"
@@ -234,7 +239,7 @@ static esp_err_t _mdns_start_timer(void)
234239
return esp_timer_start_periodic(s_timer_handle, MDNS_TIMER_PERIOD_US);
235240
}
236241

237-
static esp_err_t _mdns_stop_timer(void)
242+
static esp_err_t stop_timer(void)
238243
{
239244
esp_err_t err = ESP_OK;
240245
if (s_timer_handle) {
@@ -247,21 +252,21 @@ static esp_err_t _mdns_stop_timer(void)
247252
return err;
248253
}
249254

250-
static esp_err_t _mdns_task_create_with_caps(void)
255+
static esp_err_t create_task_with_caps(void)
251256
{
252257
esp_err_t ret = ESP_OK;
253258
static StaticTask_t mdns_task_buffer;
254259

255-
_mdns_stack_buffer = mdns_mem_task_malloc(MDNS_SERVICE_STACK_DEPTH);
256-
ESP_GOTO_ON_FALSE(_mdns_stack_buffer != NULL, ESP_FAIL, err, TAG, "failed to allocate memory for the mDNS task's stack");
260+
s_stack_buffer = mdns_mem_task_malloc(MDNS_SERVICE_STACK_DEPTH);
261+
ESP_GOTO_ON_FALSE(s_stack_buffer != NULL, ESP_FAIL, err, TAG, "failed to allocate memory for the mDNS task's stack");
257262

258-
_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);
259-
ESP_GOTO_ON_FALSE(_mdns_service_task_handle != NULL, ESP_FAIL, err, TAG, "failed to create task for the mDNS");
263+
s_service_task_handle = xTaskCreateStaticPinnedToCore(service_task, "mdns", MDNS_SERVICE_STACK_DEPTH, NULL, MDNS_TASK_PRIORITY, s_stack_buffer, &mdns_task_buffer, MDNS_TASK_AFFINITY);
264+
ESP_GOTO_ON_FALSE(s_service_task_handle != NULL, ESP_FAIL, err, TAG, "failed to create task for the mDNS");
260265

261266
return ret;
262267

263268
err:
264-
mdns_mem_task_free(_mdns_stack_buffer);
269+
mdns_mem_task_free(s_stack_buffer);
265270
return ret;
266271
}
267272

@@ -272,34 +277,34 @@ static esp_err_t _mdns_task_create_with_caps(void)
272277
* - ESP_OK on success
273278
* - ESP_FAIL on error
274279
*/
275-
static esp_err_t _mdns_service_task_start(void)
280+
static esp_err_t service_task_start(void)
276281
{
277282
esp_err_t ret = ESP_OK;
278-
if (!_mdns_service_semaphore) {
279-
_mdns_service_semaphore = xSemaphoreCreateMutex();
280-
ESP_RETURN_ON_FALSE(_mdns_service_semaphore != NULL, ESP_FAIL, TAG, "Failed to create the mDNS service lock");
283+
if (!s_service_semaphore) {
284+
s_service_semaphore = xSemaphoreCreateMutex();
285+
ESP_RETURN_ON_FALSE(s_service_semaphore != NULL, ESP_FAIL, TAG, "Failed to create the mDNS service lock");
281286
}
282287
MDNS_SERVICE_LOCK();
283-
ESP_GOTO_ON_ERROR(_mdns_start_timer(), err, TAG, "Failed to start the mDNS service timer");
288+
ESP_GOTO_ON_ERROR(start_timer(), err, TAG, "Failed to start the mDNS service timer");
284289

285-
if (!_mdns_service_task_handle) {
286-
ESP_GOTO_ON_ERROR(_mdns_task_create_with_caps(), err_stop_timer, TAG, "Failed to start the mDNS service task");
290+
if (!s_service_task_handle) {
291+
ESP_GOTO_ON_ERROR(create_task_with_caps(), err_stop_timer, TAG, "Failed to start the mDNS service task");
287292
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0) && !CONFIG_IDF_TARGET_LINUX
288293
StackType_t *mdns_debug_stack_buffer;
289294
StaticTask_t *mdns_debug_task_buffer;
290-
xTaskGetStaticBuffers(_mdns_service_task_handle, &mdns_debug_stack_buffer, &mdns_debug_task_buffer);
295+
xTaskGetStaticBuffers(s_service_task_handle, &mdns_debug_stack_buffer, &mdns_debug_task_buffer);
291296
ESP_LOGD(TAG, "mdns_debug_stack_buffer:%p mdns_debug_task_buffer:%p\n", mdns_debug_stack_buffer, mdns_debug_task_buffer);
292297
#endif // CONFIG_IDF_TARGET_LINUX
293298
}
294299
MDNS_SERVICE_UNLOCK();
295300
return ret;
296301

297302
err_stop_timer:
298-
_mdns_stop_timer();
303+
stop_timer();
299304
err:
300305
MDNS_SERVICE_UNLOCK();
301-
vSemaphoreDelete(_mdns_service_semaphore);
302-
_mdns_service_semaphore = NULL;
306+
vSemaphoreDelete(s_service_semaphore);
307+
s_service_semaphore = NULL;
303308
return ret;
304309
}
305310

@@ -309,24 +314,24 @@ static esp_err_t _mdns_service_task_start(void)
309314
* @return
310315
* - ESP_OK
311316
*/
312-
static esp_err_t _mdns_service_task_stop(void)
317+
static esp_err_t service_task_stop(void)
313318
{
314-
_mdns_stop_timer();
315-
if (_mdns_service_task_handle) {
316-
TaskHandle_t task_handle = _mdns_service_task_handle;
319+
stop_timer();
320+
if (s_service_task_handle) {
321+
TaskHandle_t task_handle = s_service_task_handle;
317322
mdns_action_t action;
318323
mdns_action_t *a = &action;
319324
action.type = ACTION_TASK_STOP;
320325
if (xQueueSend(s_action_queue, &a, (TickType_t)0) != pdPASS) {
321-
_mdns_service_task_handle = NULL;
326+
s_service_task_handle = NULL;
322327
}
323-
while (_mdns_service_task_handle) {
328+
while (s_service_task_handle) {
324329
vTaskDelay(10 / portTICK_PERIOD_MS);
325330
}
326331
vTaskDelete(task_handle);
327332
}
328-
vSemaphoreDelete(_mdns_service_semaphore);
329-
_mdns_service_semaphore = NULL;
333+
vSemaphoreDelete(s_service_semaphore);
334+
s_service_semaphore = NULL;
330335
return ESP_OK;
331336
}
332337

@@ -363,7 +368,7 @@ esp_err_t mdns_init(void)
363368
goto free_queue;
364369
}
365370

366-
if (_mdns_service_task_start()) {
371+
if (service_task_start()) {
367372
//service start failed!
368373
err = ESP_FAIL;
369374
goto free_all_and_disable_pcbs;
@@ -390,14 +395,14 @@ void mdns_free(void)
390395
mdns_priv_netif_unregister_predefined_handlers();
391396

392397
mdns_service_remove_all();
393-
_mdns_service_task_stop();
398+
service_task_stop();
394399
// at this point, the service task is deleted, so we can destroy the stack size
395-
mdns_mem_task_free(_mdns_stack_buffer);
400+
mdns_mem_task_free(s_stack_buffer);
396401
mdns_priv_pcb_deinit();
397402
if (s_action_queue) {
398403
mdns_action_t *c;
399404
while (xQueueReceive(s_action_queue, &c, 0) == pdTRUE) {
400-
_mdns_free_action(c);
405+
free_action(c);
401406
}
402407
vQueueDelete(s_action_queue);
403408
}

0 commit comments

Comments
 (0)