@@ -17,50 +17,64 @@ static const char *TAG = "mdns_browser";
1717
1818static 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+ }
0 commit comments