Skip to content

Commit 736df15

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

File tree

13 files changed

+144
-70
lines changed

13 files changed

+144
-70
lines changed

components/mdns/mdns_browser.c

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 51 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 51 additions & 47 deletions
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,20 @@
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+
#define MDNS_SERVICE_LOCK() xSemaphoreTake(s_service_semaphore, portMAX_DELAY)
33+
#define MDNS_SERVICE_UNLOCK() xSemaphoreGive(s_service_semaphore)
2834

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;
35+
static volatile TaskHandle_t s_service_task_handle = NULL;
36+
static SemaphoreHandle_t s_service_semaphore = NULL;
37+
static StackType_t *s_stack_buffer;
3238
static QueueHandle_t s_action_queue;
3339
static esp_timer_handle_t s_timer_handle;
3440

@@ -112,12 +118,10 @@ static void perform_event_action(mdns_if_t mdns_if, mdns_event_actions_t action)
112118
#endif /* CONFIG_MDNS_RESPOND_REVERSE_QUERIES */
113119
}
114120

115-
116-
117121
/**
118122
* @brief Free action data
119123
*/
120-
static void _mdns_free_action(mdns_action_t *action)
124+
static void free_action(mdns_action_t *action)
121125
{
122126
switch (action->type) {
123127
case ACTION_SEARCH_ADD:
@@ -152,7 +156,7 @@ static void _mdns_free_action(mdns_action_t *action)
152156
/**
153157
* @brief Called from service thread to execute given action
154158
*/
155-
static void _mdns_execute_action(mdns_action_t *action)
159+
static void execute_action(mdns_action_t *action)
156160
{
157161
switch (action->type) {
158162
case ACTION_SYSTEM_EVENT:
@@ -191,7 +195,7 @@ static void _mdns_execute_action(mdns_action_t *action)
191195
/**
192196
* @brief the main MDNS service task. Packets are received and parsed here
193197
*/
194-
static void _mdns_service_task(void *pvParameters)
198+
static void service_task(void *pvParameters)
195199
{
196200
mdns_action_t *a = NULL;
197201
for (;;) {
@@ -202,27 +206,27 @@ static void _mdns_service_task(void *pvParameters)
202206
break;
203207
}
204208
MDNS_SERVICE_LOCK();
205-
_mdns_execute_action(a);
209+
execute_action(a);
206210
MDNS_SERVICE_UNLOCK();
207211
}
208212
} else {
209213
vTaskDelay(500 * portTICK_PERIOD_MS);
210214
}
211215
}
212-
_mdns_service_task_handle = NULL;
216+
s_service_task_handle = NULL;
213217
vTaskDelay(portMAX_DELAY);
214218
}
215219

216-
static void _mdns_timer_cb(void *arg)
220+
static void timer_cb(void *arg)
217221
{
218222
mdns_priv_send_packets();
219223
mdns_priv_query_start_stop();
220224
}
221225

222-
static esp_err_t _mdns_start_timer(void)
226+
static esp_err_t start_timer(void)
223227
{
224228
esp_timer_create_args_t timer_conf = {
225-
.callback = _mdns_timer_cb,
229+
.callback = timer_cb,
226230
.arg = NULL,
227231
.dispatch_method = ESP_TIMER_TASK,
228232
.name = "mdns_timer"
@@ -234,7 +238,7 @@ static esp_err_t _mdns_start_timer(void)
234238
return esp_timer_start_periodic(s_timer_handle, MDNS_TIMER_PERIOD_US);
235239
}
236240

237-
static esp_err_t _mdns_stop_timer(void)
241+
static esp_err_t stop_timer(void)
238242
{
239243
esp_err_t err = ESP_OK;
240244
if (s_timer_handle) {
@@ -247,21 +251,21 @@ static esp_err_t _mdns_stop_timer(void)
247251
return err;
248252
}
249253

250-
static esp_err_t _mdns_task_create_with_caps(void)
254+
static esp_err_t create_task_with_caps(void)
251255
{
252256
esp_err_t ret = ESP_OK;
253257
static StaticTask_t mdns_task_buffer;
254258

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");
259+
s_stack_buffer = mdns_mem_task_malloc(MDNS_SERVICE_STACK_DEPTH);
260+
ESP_GOTO_ON_FALSE(s_stack_buffer != NULL, ESP_FAIL, err, TAG, "failed to allocate memory for the mDNS task's stack");
257261

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");
262+
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);
263+
ESP_GOTO_ON_FALSE(s_service_task_handle != NULL, ESP_FAIL, err, TAG, "failed to create task for the mDNS");
260264

261265
return ret;
262266

263267
err:
264-
mdns_mem_task_free(_mdns_stack_buffer);
268+
mdns_mem_task_free(s_stack_buffer);
265269
return ret;
266270
}
267271

@@ -272,34 +276,34 @@ static esp_err_t _mdns_task_create_with_caps(void)
272276
* - ESP_OK on success
273277
* - ESP_FAIL on error
274278
*/
275-
static esp_err_t _mdns_service_task_start(void)
279+
static esp_err_t service_task_start(void)
276280
{
277281
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");
282+
if (!s_service_semaphore) {
283+
s_service_semaphore = xSemaphoreCreateMutex();
284+
ESP_RETURN_ON_FALSE(s_service_semaphore != NULL, ESP_FAIL, TAG, "Failed to create the mDNS service lock");
281285
}
282286
MDNS_SERVICE_LOCK();
283-
ESP_GOTO_ON_ERROR(_mdns_start_timer(), err, TAG, "Failed to start the mDNS service timer");
287+
ESP_GOTO_ON_ERROR(start_timer(), err, TAG, "Failed to start the mDNS service timer");
284288

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");
289+
if (!s_service_task_handle) {
290+
ESP_GOTO_ON_ERROR(create_task_with_caps(), err_stop_timer, TAG, "Failed to start the mDNS service task");
287291
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0) && !CONFIG_IDF_TARGET_LINUX
288292
StackType_t *mdns_debug_stack_buffer;
289293
StaticTask_t *mdns_debug_task_buffer;
290-
xTaskGetStaticBuffers(_mdns_service_task_handle, &mdns_debug_stack_buffer, &mdns_debug_task_buffer);
294+
xTaskGetStaticBuffers(s_service_task_handle, &mdns_debug_stack_buffer, &mdns_debug_task_buffer);
291295
ESP_LOGD(TAG, "mdns_debug_stack_buffer:%p mdns_debug_task_buffer:%p\n", mdns_debug_stack_buffer, mdns_debug_task_buffer);
292296
#endif // CONFIG_IDF_TARGET_LINUX
293297
}
294298
MDNS_SERVICE_UNLOCK();
295299
return ret;
296300

297301
err_stop_timer:
298-
_mdns_stop_timer();
302+
stop_timer();
299303
err:
300304
MDNS_SERVICE_UNLOCK();
301-
vSemaphoreDelete(_mdns_service_semaphore);
302-
_mdns_service_semaphore = NULL;
305+
vSemaphoreDelete(s_service_semaphore);
306+
s_service_semaphore = NULL;
303307
return ret;
304308
}
305309

@@ -309,24 +313,24 @@ static esp_err_t _mdns_service_task_start(void)
309313
* @return
310314
* - ESP_OK
311315
*/
312-
static esp_err_t _mdns_service_task_stop(void)
316+
static esp_err_t service_task_stop(void)
313317
{
314-
_mdns_stop_timer();
315-
if (_mdns_service_task_handle) {
316-
TaskHandle_t task_handle = _mdns_service_task_handle;
318+
stop_timer();
319+
if (s_service_task_handle) {
320+
TaskHandle_t task_handle = s_service_task_handle;
317321
mdns_action_t action;
318322
mdns_action_t *a = &action;
319323
action.type = ACTION_TASK_STOP;
320324
if (xQueueSend(s_action_queue, &a, (TickType_t)0) != pdPASS) {
321-
_mdns_service_task_handle = NULL;
325+
s_service_task_handle = NULL;
322326
}
323-
while (_mdns_service_task_handle) {
327+
while (s_service_task_handle) {
324328
vTaskDelay(10 / portTICK_PERIOD_MS);
325329
}
326330
vTaskDelete(task_handle);
327331
}
328-
vSemaphoreDelete(_mdns_service_semaphore);
329-
_mdns_service_semaphore = NULL;
332+
vSemaphoreDelete(s_service_semaphore);
333+
s_service_semaphore = NULL;
330334
return ESP_OK;
331335
}
332336

@@ -363,7 +367,7 @@ esp_err_t mdns_init(void)
363367
goto free_queue;
364368
}
365369

366-
if (_mdns_service_task_start()) {
370+
if (service_task_start()) {
367371
//service start failed!
368372
err = ESP_FAIL;
369373
goto free_all_and_disable_pcbs;
@@ -390,14 +394,14 @@ void mdns_free(void)
390394
mdns_priv_netif_unregister_predefined_handlers();
391395

392396
mdns_service_remove_all();
393-
_mdns_service_task_stop();
397+
service_task_stop();
394398
// at this point, the service task is deleted, so we can destroy the stack size
395-
mdns_mem_task_free(_mdns_stack_buffer);
399+
mdns_mem_task_free(s_stack_buffer);
396400
mdns_priv_pcb_deinit();
397401
if (s_action_queue) {
398402
mdns_action_t *c;
399403
while (xQueueReceive(s_action_queue, &c, 0) == pdTRUE) {
400-
_mdns_free_action(c);
404+
free_action(c);
401405
}
402406
vQueueDelete(s_action_queue);
403407
}

0 commit comments

Comments
 (0)