From 986603cf07413b46c88c76c324bf500edcfb6171 Mon Sep 17 00:00:00 2001 From: Jiacheng Guo Date: Thu, 5 Aug 2021 16:59:04 +0800 Subject: [PATCH] mdns: add notification callback for async APIs --- components/mdns/include/mdns.h | 6 +++++- components/mdns/mdns.c | 14 ++++++++++---- components/mdns/private_include/mdns_private.h | 1 + components/mdns/test_afl_fuzz_host/mdns_di.h | 9 ++++++--- examples/protocols/mdns/main/mdns_example_main.c | 4 ++-- 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/components/mdns/include/mdns.h b/components/mdns/include/mdns.h index 7089eabe6a..4318ef37f7 100644 --- a/components/mdns/include/mdns.h +++ b/components/mdns/include/mdns.h @@ -90,6 +90,8 @@ typedef struct mdns_result_s { mdns_ip_addr_t * addr; /*!< linked list of IP addresses found */ } mdns_result_t; +typedef void (*mdns_query_notify_t)(mdns_search_once_t *search); + /** * @brief Initialize mDNS on given interface * @@ -519,11 +521,13 @@ bool mdns_query_async_get_results(mdns_search_once_t* search, uint32_t timeout, * @param type type of query (MDNS_TYPE_*) * @param timeout time in milliseconds during which mDNS query is active * @param max_results maximum results to be collected + * @param notifier Notification function to be called when the result is ready, can be NULL * * @return mdns_search_once_s pointer to new search object if query initiated successfully. * NULL otherwise. */ -mdns_search_once_t* mdns_query_async_new(const char * name, const char * service_type, const char * proto, uint16_t type, uint32_t timeout, size_t max_results); +mdns_search_once_t *mdns_query_async_new(const char *name, const char *service_type, const char *proto, uint16_t type, + uint32_t timeout, size_t max_results, mdns_query_notify_t notifier); /** * @brief Query mDNS for host or service diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index 508672d30e..8f97914925 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -3592,7 +3592,8 @@ static void _mdns_search_free(mdns_search_once_t * search) /** * @brief Allocate new search structure */ -static mdns_search_once_t * _mdns_search_init(const char * name, const char * service, const char * proto, uint16_t type, uint32_t timeout, uint8_t max_results) +static mdns_search_once_t *_mdns_search_init(const char *name, const char *service, const char *proto, uint16_t type, + uint32_t timeout, uint8_t max_results, mdns_query_notify_t notifier) { mdns_search_once_t * search = (mdns_search_once_t *)malloc(sizeof(mdns_search_once_t)); if (!search) { @@ -3639,6 +3640,7 @@ static mdns_search_once_t * _mdns_search_init(const char * name, const char * se search->state = SEARCH_INIT; search->sent_at = 0; search->started_at = xTaskGetTickCount() * portTICK_PERIOD_MS; + search->notifier = notifier; search->next = NULL; return search; @@ -3651,6 +3653,9 @@ static void _mdns_search_finish(mdns_search_once_t * search) { search->state = SEARCH_OFF; queueDetach(mdns_search_once_t, _mdns_server->search_once, search); + if (search->notifier) { + search->notifier(search); + } xSemaphoreGive(search->done_semaphore); } @@ -5310,7 +5315,8 @@ bool mdns_query_async_get_results(mdns_search_once_t* search, uint32_t timeout, return false; } -mdns_search_once_t* mdns_query_async_new(const char * name, const char * service, const char * proto, uint16_t type, uint32_t timeout, size_t max_results) +mdns_search_once_t *mdns_query_async_new(const char *name, const char *service, const char *proto, uint16_t type, + uint32_t timeout, size_t max_results, mdns_query_notify_t notifier) { mdns_search_once_t *search = NULL; @@ -5318,7 +5324,7 @@ mdns_search_once_t* mdns_query_async_new(const char * name, const char * service return NULL; } - search = _mdns_search_init(name, service, proto, type, timeout, max_results); + search = _mdns_search_init(name, service, proto, type, timeout, max_results, notifier); if (!search) { return NULL; } @@ -5345,7 +5351,7 @@ esp_err_t mdns_query(const char * name, const char * service, const char * proto return ESP_ERR_INVALID_ARG; } - search = _mdns_search_init(name, service, proto, type, timeout, max_results); + search = _mdns_search_init(name, service, proto, type, timeout, max_results, NULL); if (!search) { return ESP_ERR_NO_MEM; } diff --git a/components/mdns/private_include/mdns_private.h b/components/mdns/private_include/mdns_private.h index 6931d4f5a7..564219bf6f 100644 --- a/components/mdns/private_include/mdns_private.h +++ b/components/mdns/private_include/mdns_private.h @@ -364,6 +364,7 @@ typedef struct mdns_search_once_s { uint32_t started_at; uint32_t sent_at; uint32_t timeout; + mdns_query_notify_t notifier; SemaphoreHandle_t done_semaphore; uint16_t type; uint8_t max_results; diff --git a/components/mdns/test_afl_fuzz_host/mdns_di.h b/components/mdns/test_afl_fuzz_host/mdns_di.h index 4ed0e84cdd..12c0c56f77 100644 --- a/components/mdns/test_afl_fuzz_host/mdns_di.h +++ b/components/mdns/test_afl_fuzz_host/mdns_di.h @@ -8,13 +8,16 @@ void (*mdns_test_static_execute_action)(mdns_action_t *) = NULL; mdns_srv_item_t * (*mdns_test_static_mdns_get_service_item)(const char * service, const char * proto, const char *hostname) = NULL; -mdns_search_once_t * (*mdns_test_static_search_init)(const char * name, const char * service, const char * proto, uint16_t type, uint32_t timeout, uint8_t max_results) = NULL; +mdns_search_once_t *(*mdns_test_static_search_init)(const char *name, const char *service, const char *proto, + uint16_t type, uint32_t timeout, uint8_t max_results, + mdns_query_notify_t notifier) = NULL; esp_err_t (*mdns_test_static_send_search_action)(mdns_action_type_t type, mdns_search_once_t * search) = NULL; void (*mdns_test_static_search_free)(mdns_search_once_t * search) = NULL; static void _mdns_execute_action(mdns_action_t * action); static mdns_srv_item_t * _mdns_get_service_item(const char * service, const char * proto, const char *hostname); -static mdns_search_once_t * _mdns_search_init(const char * name, const char * service, const char * proto, uint16_t type, uint32_t timeout, uint8_t max_results); +static mdns_search_once_t *_mdns_search_init(const char *name, const char *service, const char *proto, uint16_t type, + uint32_t timeout, uint8_t max_results, mdns_query_notify_t notifier); static esp_err_t _mdns_send_search_action(mdns_action_type_t type, mdns_search_once_t * search); static void _mdns_search_free(mdns_search_once_t * search); @@ -44,7 +47,7 @@ esp_err_t mdns_test_send_search_action(mdns_action_type_t type, mdns_search_once mdns_search_once_t * mdns_test_search_init(const char * name, const char * service, const char * proto, uint16_t type, uint32_t timeout, uint8_t max_results) { - return mdns_test_static_search_init(name, service, proto, type, timeout, max_results); + return mdns_test_static_search_init(name, service, proto, type, timeout, max_results, NULL); } mdns_srv_item_t * mdns_test_mdns_get_service_item(const char * service, const char * proto) diff --git a/examples/protocols/mdns/main/mdns_example_main.c b/examples/protocols/mdns/main/mdns_example_main.c index fc5b450374..da772b5edb 100644 --- a/examples/protocols/mdns/main/mdns_example_main.c +++ b/examples/protocols/mdns/main/mdns_example_main.c @@ -169,9 +169,9 @@ static void query_mdns_hosts_async(const char * host_name) { ESP_LOGI(TAG, "Query both A and AAA: %s.local", host_name); - mdns_search_once_t *s_a = mdns_query_async_new(host_name, NULL, NULL, MDNS_TYPE_A, 1000, 1); + mdns_search_once_t *s_a = mdns_query_async_new(host_name, NULL, NULL, MDNS_TYPE_A, 1000, 1, NULL); mdns_query_async_delete(s_a); - mdns_search_once_t *s_aaaa = mdns_query_async_new(host_name, NULL, NULL, MDNS_TYPE_AAAA, 1000, 1); + mdns_search_once_t *s_aaaa = mdns_query_async_new(host_name, NULL, NULL, MDNS_TYPE_AAAA, 1000, 1, NULL); while (s_a || s_aaaa) { if (s_a && check_and_print_result(s_a)) { ESP_LOGI(TAG, "Query A %s.local finished", host_name);