Skip to content

Commit 54f526e

Browse files
committed
feat(mdns): action queue abstraction
1 parent 3235b32 commit 54f526e

19 files changed

+708
-820
lines changed

components/mdns/mdns.c

+13-552
Large diffs are not rendered by default.

components/mdns/mdns_browser.c

+126-37
Original file line numberDiff line numberDiff line change
@@ -17,50 +17,64 @@ static const char *TAG = "mdns_browser";
1717

1818
static mdns_browse_t *s_browse;
1919

20-
void mdns_browse_send_all(mdns_if_t mdns_if)
20+
/**
21+
* @brief Browse action
22+
*/
23+
static esp_err_t _mdns_send_browse_action(mdns_action_type_t type, mdns_browse_t *browse)
2124
{
22-
mdns_browse_t *browse = s_browse;
23-
while (browse) {
24-
_mdns_browse_send(browse, mdns_if);
25-
browse = browse->next;
25+
mdns_action_t *action = NULL;
26+
27+
action = (mdns_action_t *)mdns_mem_malloc(sizeof(mdns_action_t));
28+
29+
if (!action) {
30+
HOOK_MALLOC_FAILED;
31+
return ESP_ERR_NO_MEM;
2632
}
27-
}
2833

29-
void mdns_browse_free(void)
30-
{
31-
while (s_browse) {
32-
mdns_browse_t *b = s_browse;
33-
s_browse = s_browse->next;
34-
_mdns_browse_item_free(b);
34+
action->type = type;
35+
action->data.browse_add.browse = browse;
36+
if (!mdns_action_queue(action)) {
37+
mdns_mem_free(action);
38+
return ESP_ERR_NO_MEM;
3539
}
40+
return ESP_OK;
3641
}
3742

3843
/**
39-
* @brief Mark browse as finished, remove and free it from browse chain
44+
* @brief Free a browse item (Not free the list).
4045
*/
41-
void _mdns_browse_finish(mdns_browse_t *browse)
46+
static void _mdns_browse_item_free(mdns_browse_t *browse)
4247
{
43-
browse->state = BROWSE_OFF;
44-
mdns_browse_t *b = s_browse;
45-
mdns_browse_t *target_free = NULL;
46-
while (b) {
47-
if (strlen(b->service) == strlen(browse->service) && memcmp(b->service, browse->service, strlen(b->service)) == 0 &&
48-
strlen(b->proto) == strlen(browse->proto) && memcmp(b->proto, browse->proto, strlen(b->proto)) == 0) {
49-
target_free = b;
50-
b = b->next;
51-
queueDetach(mdns_browse_t, s_browse, target_free);
52-
_mdns_browse_item_free(target_free);
53-
} else {
54-
b = b->next;
48+
mdns_mem_free(browse->service);
49+
mdns_mem_free(browse->proto);
50+
if (browse->result) {
51+
_mdns_query_results_free(browse->result);
52+
}
53+
mdns_mem_free(browse);
54+
}
55+
56+
static void _mdns_browse_sync(mdns_browse_sync_t *browse_sync)
57+
{
58+
mdns_browse_t *browse = browse_sync->browse;
59+
mdns_browse_result_sync_t *sync_result = browse_sync->sync_result;
60+
while (sync_result) {
61+
mdns_result_t *result = sync_result->result;
62+
DBG_BROWSE_RESULTS(result, browse_sync->browse);
63+
browse->notifier(result);
64+
if (result->ttl == 0) {
65+
queueDetach(mdns_result_t, browse->result, result);
66+
// Just free current result
67+
result->next = NULL;
68+
mdns_query_results_free(result);
5569
}
70+
sync_result = sync_result->next;
5671
}
57-
_mdns_browse_item_free(browse);
5872
}
5973

6074
/**
6175
* @brief Send PTR query packet to all available interfaces for browsing.
6276
*/
63-
void _mdns_browse_send(mdns_browse_t *browse, mdns_if_t interface)
77+
static void _mdns_browse_send(mdns_browse_t *browse, mdns_if_t interface)
6478
{
6579
// Using search once for sending the PTR query
6680
mdns_search_once_t search = {0};
@@ -78,20 +92,46 @@ void _mdns_browse_send(mdns_browse_t *browse, mdns_if_t interface)
7892
}
7993
}
8094

95+
void mdns_browse_send_all(mdns_if_t mdns_if)
96+
{
97+
mdns_browse_t *browse = s_browse;
98+
while (browse) {
99+
_mdns_browse_send(browse, mdns_if);
100+
browse = browse->next;
101+
}
102+
}
103+
104+
void mdns_browse_free(void)
105+
{
106+
while (s_browse) {
107+
mdns_browse_t *b = s_browse;
108+
s_browse = s_browse->next;
109+
_mdns_browse_item_free(b);
110+
}
111+
}
112+
81113
/**
82-
* @brief Free a browse item (Not free the list).
114+
* @brief Mark browse as finished, remove and free it from browse chain
83115
*/
84-
void _mdns_browse_item_free(mdns_browse_t *browse)
116+
static void _mdns_browse_finish(mdns_browse_t *browse)
85117
{
86-
mdns_mem_free(browse->service);
87-
mdns_mem_free(browse->proto);
88-
if (browse->result) {
89-
_mdns_query_results_free(browse->result);
118+
browse->state = BROWSE_OFF;
119+
mdns_browse_t *b = s_browse;
120+
mdns_browse_t *target_free = NULL;
121+
while (b) {
122+
if (strlen(b->service) == strlen(browse->service) && memcmp(b->service, browse->service, strlen(b->service)) == 0 &&
123+
strlen(b->proto) == strlen(browse->proto) && memcmp(b->proto, browse->proto, strlen(b->proto)) == 0) {
124+
target_free = b;
125+
b = b->next;
126+
queueDetach(mdns_browse_t, s_browse, target_free);
127+
_mdns_browse_item_free(target_free);
128+
} else {
129+
b = b->next;
130+
}
90131
}
91-
mdns_mem_free(browse);
132+
_mdns_browse_item_free(browse);
92133
}
93134

94-
95135
/**
96136
* @brief Allocate new browse structure
97137
*/
@@ -170,7 +210,7 @@ esp_err_t mdns_browse_delete(const char *service, const char *proto)
170210
/**
171211
* @brief Add new browse to the browse chain
172212
*/
173-
void _mdns_browse_add(mdns_browse_t *browse)
213+
static void _mdns_browse_add(mdns_browse_t *browse)
174214
{
175215
browse->state = BROWSE_RUNNING;
176216
mdns_browse_t *queue = s_browse;
@@ -229,3 +269,52 @@ mdns_browse_t *_mdns_browse_find(mdns_name_t *name, uint16_t type, mdns_if_t tcp
229269
}
230270
return b;
231271
}
272+
273+
static void _mdns_sync_browse_result_link_free(mdns_browse_sync_t *browse_sync)
274+
{
275+
mdns_browse_result_sync_t *current = browse_sync->sync_result;
276+
mdns_browse_result_sync_t *need_free;
277+
while (current) {
278+
need_free = current;
279+
current = current->next;
280+
mdns_mem_free(need_free);
281+
}
282+
mdns_mem_free(browse_sync);
283+
}
284+
285+
void mdns_browse_action(mdns_action_t *action, mdns_action_subtype_t type)
286+
{
287+
if (type == ACTION_RUN) {
288+
switch (action->type) {
289+
case ACTION_BROWSE_ADD:
290+
_mdns_browse_add(action->data.browse_add.browse);
291+
break;
292+
case ACTION_BROWSE_SYNC:
293+
_mdns_browse_sync(action->data.browse_sync.browse_sync);
294+
_mdns_sync_browse_result_link_free(action->data.browse_sync.browse_sync);
295+
break;
296+
case ACTION_BROWSE_END:
297+
_mdns_browse_finish(action->data.browse_add.browse);
298+
break;
299+
default:
300+
abort();
301+
}
302+
return;
303+
}
304+
if (type == ACTION_CLEANUP) {
305+
switch (action->type) {
306+
case ACTION_BROWSE_ADD:
307+
//fallthrough
308+
case ACTION_BROWSE_END:
309+
_mdns_browse_item_free(action->data.browse_add.browse);
310+
break;
311+
case ACTION_BROWSE_SYNC:
312+
_mdns_sync_browse_result_link_free(action->data.browse_sync.browse_sync);
313+
break;
314+
default:
315+
abort();
316+
}
317+
return;
318+
}
319+
320+
}

components/mdns/mdns_netif.c

+25-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
#include "mdns_netif.h"
1919
#include "mdns_send.h"
2020
#include "mdns_responder.h"
21+
22+
static const char *TAG = "mdns_netif";
23+
2124
#if CONFIG_ETH_ENABLED && CONFIG_MDNS_PREDEF_NETIF_ETH
2225
#include "esp_eth.h"
2326
#endif
@@ -169,6 +172,27 @@ static mdns_if_t _mdns_get_if_from_esp_netif(esp_netif_t *esp_netif)
169172
return MDNS_MAX_INTERFACES;
170173
}
171174

175+
static esp_err_t mdns_post_custom_action_tcpip_if(mdns_if_t mdns_if, mdns_event_actions_t event_action)
176+
{
177+
if (!is_mdns_server() || mdns_if >= MDNS_MAX_INTERFACES) {
178+
return ESP_ERR_INVALID_STATE;
179+
}
180+
181+
mdns_action_t *action = (mdns_action_t *)mdns_mem_calloc(1, sizeof(mdns_action_t));
182+
if (!action) {
183+
HOOK_MALLOC_FAILED;
184+
return ESP_ERR_NO_MEM;
185+
}
186+
action->type = ACTION_SYSTEM_EVENT;
187+
action->data.sys_event.event_action = event_action;
188+
action->data.sys_event.interface = mdns_if;
189+
190+
if (mdns_action_queue(action)) {
191+
mdns_mem_free(action);
192+
}
193+
return ESP_OK;
194+
}
195+
172196

173197
/**
174198
* @brief Dispatch interface changes based on system events
@@ -395,7 +419,7 @@ esp_err_t mdns_netif_init(void)
395419

396420
for (i = 0; i < MDNS_MAX_INTERFACES; i++) {
397421
#ifdef CONFIG_LWIP_IPV6
398-
if (!esp_netif_get_ip6_linklocal(_mdns_get_esp_netif(i), &tmp_addr6) && !_ipv6_address_is_zero(tmp_addr6)) {
422+
if (!esp_netif_get_ip6_linklocal(_mdns_get_esp_netif(i), &tmp_addr6) && !mdns_utils_ipv6_address_is_zero(tmp_addr6)) {
399423
_mdns_enable_pcb(i, MDNS_IP_PROTOCOL_V6);
400424
}
401425
#endif

components/mdns/mdns_networking_lwip.c

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

2526
/*
2627
* MDNS Server Networking
@@ -44,6 +45,25 @@ static const char *TAG = "mdns_networking";
4445

4546
static void _udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *pb, const ip_addr_t *raddr, uint16_t rport);
4647

48+
static esp_err_t _mdns_send_rx_action(mdns_rx_packet_t *packet)
49+
{
50+
mdns_action_t *action = NULL;
51+
52+
action = (mdns_action_t *)mdns_mem_malloc(sizeof(mdns_action_t));
53+
if (!action) {
54+
HOOK_MALLOC_FAILED;
55+
return ESP_ERR_NO_MEM;
56+
}
57+
58+
action->type = ACTION_RX_HANDLE;
59+
action->data.rx_handle.packet = packet;
60+
if (!mdns_action_queue(action)) {
61+
mdns_mem_free(action);
62+
return ESP_ERR_NO_MEM;
63+
}
64+
return ESP_OK;
65+
}
66+
4767
/**
4868
* @brief Low level UDP PCB Initialize
4969
*/

components/mdns/mdns_networking_socket.c

+21
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <sys/param.h>
2323
#include "esp_log.h"
2424
#include "mdns_mem_caps.h"
25+
#include "mdns_utils.h"
2526

2627
#if defined(CONFIG_IDF_TARGET_LINUX)
2728
#include <sys/ioctl.h>
@@ -58,6 +59,26 @@ struct pbuf {
5859
#define s6_addr32 un.u32_addr
5960
#endif // CONFIG_IDF_TARGET_LINUX
6061

62+
static esp_err_t _mdns_send_rx_action(mdns_rx_packet_t *packet)
63+
{
64+
mdns_action_t *action = NULL;
65+
66+
action = (mdns_action_t *)mdns_mem_malloc(sizeof(mdns_action_t));
67+
if (!action) {
68+
HOOK_MALLOC_FAILED;
69+
return ESP_ERR_NO_MEM;
70+
}
71+
72+
action->type = ACTION_RX_HANDLE;
73+
action->data.rx_handle.packet = packet;
74+
if (!mdns_action_queue(action)) {
75+
mdns_mem_free(action);
76+
return ESP_ERR_NO_MEM;
77+
}
78+
return ESP_OK;
79+
}
80+
81+
6182
static void __attribute__((constructor)) ctor_networking_socket(void)
6283
{
6384
for (int i = 0; i < sizeof(s_interfaces) / sizeof(s_interfaces[0]); ++i) {

components/mdns/mdns_packet.c

+40-3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,29 @@
2020

2121
static const char *TAG = "mdns_packet";
2222

23+
/**4
24+
* @brief Browse sync result action -> TODO: Move to the browser module
25+
*/
26+
static esp_err_t _mdns_sync_browse_action(mdns_action_type_t type, mdns_browse_sync_t *browse_sync)
27+
{
28+
mdns_action_t *action = NULL;
29+
30+
action = (mdns_action_t *)mdns_mem_malloc(sizeof(mdns_action_t));
31+
if (!action) {
32+
HOOK_MALLOC_FAILED;
33+
return ESP_ERR_NO_MEM;
34+
}
35+
36+
action->type = type;
37+
action->data.browse_sync.browse_sync = browse_sync;
38+
if (!mdns_action_queue(action)) {
39+
mdns_mem_free(action);
40+
return ESP_ERR_NO_MEM;
41+
}
42+
return ESP_OK;
43+
}
44+
45+
2346
/**
2447
* @brief Check if parsed name is discovery
2548
*/
@@ -697,7 +720,7 @@ static int _mdns_check_aaaa_collision(esp_ip6_addr_t *ip, mdns_if_t tcpip_if)
697720
{
698721
struct esp_ip6_addr if_ip6;
699722
struct esp_ip6_addr other_ip6;
700-
if (_ipv6_address_is_zero(*ip)) {
723+
if (mdns_utils_ipv6_address_is_zero(*ip)) {
701724
return 1;//denial! they win
702725
}
703726
if (esp_netif_get_ip6_linklocal(_mdns_get_esp_netif(tcpip_if), &if_ip6)) {
@@ -1110,8 +1133,9 @@ static mdns_result_t *_mdns_search_result_add_ptr(mdns_search_once_t *search, co
11101133
return NULL;
11111134
}
11121135

1113-
1114-
1136+
/*
1137+
* Received Packet Handling
1138+
* */
11151139

11161140
/**
11171141
* @brief main packet parser
@@ -1780,3 +1804,16 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
17801804
mdns_mem_free(browse_result_proto);
17811805
mdns_mem_free(out_sync_browse);
17821806
}
1807+
1808+
void mdns_receive_action(mdns_action_t *action, mdns_action_subtype_t type)
1809+
{
1810+
if (action->type != ACTION_RX_HANDLE) {
1811+
abort();
1812+
}
1813+
if (type == ACTION_RUN) {
1814+
mdns_parse_packet(action->data.rx_handle.packet);
1815+
_mdns_packet_free(action->data.rx_handle.packet);
1816+
} else if (type == ACTION_CLEANUP) {
1817+
_mdns_packet_free(action->data.rx_handle.packet);
1818+
}
1819+
}

0 commit comments

Comments
 (0)