@@ -17,50 +17,64 @@ static const char *TAG = "mdns_browser";
17
17
18
18
static mdns_browse_t * s_browse ;
19
19
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 )
21
24
{
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 ;
26
32
}
27
- }
28
33
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 ;
35
39
}
40
+ return ESP_OK ;
36
41
}
37
42
38
43
/**
39
- * @brief Mark browse as finished, remove and free it from browse chain
44
+ * @brief Free a browse item (Not free the list).
40
45
*/
41
- void _mdns_browse_finish (mdns_browse_t * browse )
46
+ static void _mdns_browse_item_free (mdns_browse_t * browse )
42
47
{
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 );
55
69
}
70
+ sync_result = sync_result -> next ;
56
71
}
57
- _mdns_browse_item_free (browse );
58
72
}
59
73
60
74
/**
61
75
* @brief Send PTR query packet to all available interfaces for browsing.
62
76
*/
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 )
64
78
{
65
79
// Using search once for sending the PTR query
66
80
mdns_search_once_t search = {0 };
@@ -78,20 +92,46 @@ void _mdns_browse_send(mdns_browse_t *browse, mdns_if_t interface)
78
92
}
79
93
}
80
94
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
+
81
113
/**
82
- * @brief Free a browse item (Not free the list).
114
+ * @brief Mark browse as finished, remove and free it from browse chain
83
115
*/
84
- void _mdns_browse_item_free (mdns_browse_t * browse )
116
+ static void _mdns_browse_finish (mdns_browse_t * browse )
85
117
{
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
+ }
90
131
}
91
- mdns_mem_free (browse );
132
+ _mdns_browse_item_free (browse );
92
133
}
93
134
94
-
95
135
/**
96
136
* @brief Allocate new browse structure
97
137
*/
@@ -170,7 +210,7 @@ esp_err_t mdns_browse_delete(const char *service, const char *proto)
170
210
/**
171
211
* @brief Add new browse to the browse chain
172
212
*/
173
- void _mdns_browse_add (mdns_browse_t * browse )
213
+ static void _mdns_browse_add (mdns_browse_t * browse )
174
214
{
175
215
browse -> state = BROWSE_RUNNING ;
176
216
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
229
269
}
230
270
return b ;
231
271
}
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
+ }
0 commit comments