Skip to content

Commit f0df12d

Browse files
committed
feat(mdns): Add APIs for looking up self hosted services and getting the self hostname
1 parent 441f790 commit f0df12d

File tree

3 files changed

+93
-7
lines changed

3 files changed

+93
-7
lines changed

components/mdns/examples/main/mdns_example_main.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,23 @@ static void lookup_mdns_delegated_service(const char *service_name, const char *
163163
}
164164
#endif // CONFIG_MDNS_PUBLISH_DELEGATE_HOST
165165

166+
static void lookup_mdns_selfhosted_service(const char *service_name, const char *proto)
167+
{
168+
ESP_LOGI(TAG, "Lookup selfhosted service: %s.%s.local", service_name, proto);
169+
mdns_result_t *results = NULL;
170+
esp_err_t err = mdns_lookup_selfhosted_service(NULL, service_name, proto, 20, &results);
171+
if (err) {
172+
ESP_LOGE(TAG, "Lookup Failed: %s", esp_err_to_name(err));
173+
return;
174+
}
175+
if (!results) {
176+
ESP_LOGW(TAG, "No results found!");
177+
return;
178+
}
179+
mdns_print_results(results);
180+
mdns_query_results_free(results);
181+
}
182+
166183
static bool check_and_print_result(mdns_search_once_t *search)
167184
{
168185
// Check if any result is available
@@ -260,6 +277,7 @@ static void check_button(void)
260277
#if CONFIG_MDNS_PUBLISH_DELEGATE_HOST
261278
lookup_mdns_delegated_service("_http", "_tcp");
262279
#endif // CONFIG_MDNS_PUBLISH_DELEGATE_HOST
280+
lookup_mdns_selfhosted_service("_http", "_tcp");
263281
}
264282
old_level = new_level;
265283
}

components/mdns/include/mdns.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,19 @@ void mdns_free(void);
128128
*/
129129
esp_err_t mdns_hostname_set(const char *hostname);
130130

131+
/**
132+
* @brief Get the hostname for mDNS server
133+
*
134+
* @param hostname pointer to the hostname, it should be allocated
135+
* and hold at least MDNS_NAME_BUF_LEN chars
136+
*
137+
* @return
138+
* - ESP_OK success
139+
* - ESP_ERR_INVALID_ARG Parameter error
140+
* - ESP_ERR_INVALID_STATE when mdns is not initialized
141+
*/
142+
esp_err_t mdns_hostname_get(char *hostname);
143+
131144
/**
132145
* @brief Adds a hostname and address to be delegated
133146
* A/AAAA queries will be replied for the hostname and
@@ -703,6 +716,24 @@ esp_err_t mdns_query_txt(const char *instance_name, const char *service_type, co
703716
esp_err_t mdns_lookup_delegated_service(const char *instance, const char *service_type, const char *proto, size_t max_results,
704717
mdns_result_t **result);
705718

719+
/**
720+
* @brief Look up self hosted services.
721+
*
722+
* @param instance instance name (NULL for uncertain instance)
723+
* @param service_type service type (_http, _ftp, etc)
724+
* @param proto service protocol (_tcp, _udp)
725+
* @param max_results maximum results to be collected
726+
* @param result pointer to the result of the search
727+
*
728+
* @return
729+
* - ESP_OK success
730+
* - ESP_ERR_INVALID_STATE mDNS is not running
731+
* - ESP_ERR_NO_MEM memory error
732+
* - ESP_ERR_INVALID_ARG parameter error
733+
*/
734+
esp_err_t mdns_lookup_selfhosted_service(const char *instance, const char *service_type, const char *proto, size_t max_results,
735+
mdns_result_t **result);
736+
706737
/**
707738
* @brief Query mDNS for A record
708739
*

components/mdns/mdns.c

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5561,6 +5561,17 @@ esp_err_t mdns_hostname_set(const char *hostname)
55615561
return ESP_OK;
55625562
}
55635563

5564+
esp_err_t mdns_hostname_get(char *hostname)
5565+
{
5566+
if (!_mdns_server || !hostname) {
5567+
return ESP_ERR_INVALID_ARG;
5568+
}
5569+
MDNS_SERVICE_LOCK();
5570+
strncpy(hostname, _mdns_server->hostname, strnlen(_mdns_server->hostname, MDNS_NAME_BUF_LEN));
5571+
MDNS_SERVICE_UNLOCK();
5572+
return ESP_OK;
5573+
}
5574+
55645575
esp_err_t mdns_delegate_hostname_add(const char *hostname, const mdns_ip_addr_t *address_list)
55655576
{
55665577
if (!_mdns_server) {
@@ -5798,7 +5809,7 @@ static mdns_ip_addr_t *_copy_delegated_host_address_list(char *hostname)
57985809
return NULL;
57995810
}
58005811

5801-
static mdns_result_t *_mdns_lookup_delegated_service(const char *instance, const char *service, const char *proto, size_t max_results)
5812+
static mdns_result_t *_mdns_lookup_service(const char *instance, const char *service, const char *proto, size_t max_results, bool selfhost)
58025813
{
58035814
if (_str_null_or_empty(service) || _str_null_or_empty(proto)) {
58045815
return NULL;
@@ -5808,7 +5819,13 @@ static mdns_result_t *_mdns_lookup_delegated_service(const char *instance, const
58085819
mdns_srv_item_t *s = _mdns_server->services;
58095820
while (s) {
58105821
mdns_service_t *srv = s->service;
5811-
if (srv && srv->hostname && (_str_null_or_empty(_mdns_server->hostname) || strcmp(_mdns_server->hostname, srv->hostname) != 0)) {
5822+
if (!srv || !srv->hostname) {
5823+
s = s->next;
5824+
continue;
5825+
}
5826+
bool is_service_selfhosted = !_str_null_or_empty(_mdns_server->hostname) && !strcasecmp(_mdns_server->hostname, srv->hostname);
5827+
bool is_service_delegated = _str_null_or_empty(_mdns_server->hostname) || strcasecmp(_mdns_server->hostname, srv->hostname);
5828+
if ((selfhost && is_service_selfhosted) || (!selfhost && is_service_delegated)) {
58125829
if (!strcasecmp(srv->service, service) && !strcasecmp(srv->proto, proto) &&
58135830
(_str_null_or_empty(instance) || _mdns_instance_name_match(srv->instance, instance))) {
58145831
mdns_result_t *item = (mdns_result_t *)malloc(sizeof(mdns_result_t));
@@ -5819,7 +5836,7 @@ static mdns_result_t *_mdns_lookup_delegated_service(const char *instance, const
58195836
item->next = results;
58205837
results = item;
58215838
item->esp_netif = NULL;
5822-
item->ttl = UINT32_MAX;
5839+
item->ttl = _str_null_or_empty(instance) ? MDNS_ANSWER_PTR_TTL : MDNS_ANSWER_SRV_TTL;
58235840
item->ip_protocol = MDNS_IP_PROTOCOL_MAX;
58245841
item->instance_name = strndup(srv->instance, MDNS_NAME_BUF_LEN - 1);
58255842
if (!item->instance_name) {
@@ -5843,9 +5860,14 @@ static mdns_result_t *_mdns_lookup_delegated_service(const char *instance, const
58435860
}
58445861
item->port = srv->port;
58455862
item->txt = _copy_mdns_txt_items(srv->txt, &(item->txt_value_len), &(item->txt_count));
5846-
item->addr = _copy_delegated_host_address_list(item->hostname);
5847-
if (!item->addr) {
5848-
goto handle_error;
5863+
// We should not append addresses for selfhost lookup result as we don't know which interface's address to append.
5864+
if (selfhost) {
5865+
item->addr = NULL;
5866+
} else {
5867+
item->addr = _copy_delegated_host_address_list(item->hostname);
5868+
if (!item->addr) {
5869+
goto handle_error;
5870+
}
58495871
}
58505872
if (num_results < max_results) {
58515873
num_results++;
@@ -6344,7 +6366,22 @@ esp_err_t mdns_lookup_delegated_service(const char *instance, const char *servic
63446366
return ESP_ERR_INVALID_ARG;
63456367
}
63466368
MDNS_SERVICE_LOCK();
6347-
*result = _mdns_lookup_delegated_service(instance, service, proto, max_results);
6369+
*result = _mdns_lookup_service(instance, service, proto, max_results, false);
6370+
MDNS_SERVICE_UNLOCK();
6371+
return ESP_OK;
6372+
}
6373+
6374+
esp_err_t mdns_lookup_selfhosted_service(const char *instance, const char *service, const char *proto, size_t max_results,
6375+
mdns_result_t **result)
6376+
{
6377+
if (!_mdns_server) {
6378+
return ESP_ERR_INVALID_STATE;
6379+
}
6380+
if (!result || _str_null_or_empty(service) || _str_null_or_empty(proto)) {
6381+
return ESP_ERR_INVALID_ARG;
6382+
}
6383+
MDNS_SERVICE_LOCK();
6384+
*result = _mdns_lookup_service(instance, service, proto, max_results, true);
63486385
MDNS_SERVICE_UNLOCK();
63496386
return ESP_OK;
63506387
}

0 commit comments

Comments
 (0)