mirror of
https://github.com/espressif/esp-protocols.git
synced 2025-07-29 10:17:30 +02:00
mdns: allow mutiple instances with same service type
* Original commit: espressif/esp-idf@b7a99f4658
This commit is contained in:
committed by
suren-gabrielyan-espressif
parent
5e087d82d6
commit
b26606252f
@ -223,15 +223,8 @@ esp_err_t _mdns_send_rx_action(mdns_rx_packet_t * packet)
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the service name of a service
|
||||
*/
|
||||
static const char * _mdns_get_service_instance_name(mdns_service_t * service)
|
||||
static const char *_mdns_get_default_instance_name(void)
|
||||
{
|
||||
if (service && !_str_null_or_empty(service->instance)) {
|
||||
return service->instance;
|
||||
}
|
||||
|
||||
if (_mdns_server && !_str_null_or_empty(_mdns_server->instance)) {
|
||||
return _mdns_server->instance;
|
||||
}
|
||||
@ -243,6 +236,49 @@ static const char * _mdns_get_service_instance_name(mdns_service_t * service)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the service name of a service
|
||||
*/
|
||||
static const char * _mdns_get_service_instance_name(const mdns_service_t * service)
|
||||
{
|
||||
if (service && !_str_null_or_empty(service->instance)) {
|
||||
return service->instance;
|
||||
}
|
||||
|
||||
return _mdns_get_default_instance_name();
|
||||
}
|
||||
|
||||
static bool _mdns_instance_name_match(const char *lhs, const char *rhs)
|
||||
{
|
||||
if (lhs == NULL) {
|
||||
lhs = _mdns_get_default_instance_name();
|
||||
}
|
||||
if (rhs == NULL) {
|
||||
rhs = _mdns_get_default_instance_name();
|
||||
}
|
||||
return !strcasecmp(lhs, rhs);
|
||||
}
|
||||
|
||||
static bool _mdns_service_match_instance(const mdns_service_t *srv, const char *instance, const char *service,
|
||||
const char *proto, const char *hostname)
|
||||
{
|
||||
return !strcasecmp(srv->service, service) && _mdns_instance_name_match(srv->instance, instance) &&
|
||||
!strcasecmp(srv->proto, proto) && (_str_null_or_empty(hostname) || !strcasecmp(srv->hostname, hostname));
|
||||
}
|
||||
|
||||
static mdns_srv_item_t *_mdns_get_service_item_instance(const char *instance, const char *service, const char *proto,
|
||||
const char *hostname)
|
||||
{
|
||||
mdns_srv_item_t *s = _mdns_server->services;
|
||||
while (s) {
|
||||
if (_mdns_service_match_instance(s->service, instance, service, proto, hostname)) {
|
||||
return s;
|
||||
}
|
||||
s = s->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief reads MDNS FQDN into mdns_name_t structure
|
||||
* FQDN is in format: [hostname.|[instance.]_service._proto.]local.
|
||||
@ -1420,7 +1456,13 @@ static void _mdns_create_answer_from_parsed_packet(mdns_parsed_packet_t *parsed_
|
||||
mdns_parsed_question_t *q = parsed_packet->questions;
|
||||
while (q) {
|
||||
shared = q->type == MDNS_TYPE_PTR || q->type == MDNS_TYPE_SDPTR || !parsed_packet->probe;
|
||||
if (q->service && q->proto) {
|
||||
if (q->type == MDNS_TYPE_SRV || q->type == MDNS_TYPE_TXT) {
|
||||
mdns_srv_item_t *service = _mdns_get_service_item_instance(q->host, q->service, q->proto, NULL);
|
||||
if (!_mdns_create_answer_from_service(packet, service->service, q, shared, send_flush)) {
|
||||
_mdns_free_tx_packet(packet);
|
||||
return;
|
||||
}
|
||||
} else if (q->service && q->proto) {
|
||||
mdns_srv_item_t *service = _mdns_server->services;
|
||||
while (service) {
|
||||
if (_mdns_service_match(service->service, q->service, q->proto, NULL)) {
|
||||
@ -2659,7 +2701,12 @@ static bool _mdns_name_is_ours(mdns_name_t * name)
|
||||
}
|
||||
|
||||
//find the service
|
||||
mdns_srv_item_t * service = _mdns_get_service_item(name->service, name->proto, NULL);
|
||||
mdns_srv_item_t * service;
|
||||
if (_str_null_or_empty(name->host)) {
|
||||
service = _mdns_get_service_item(name->service, name->proto, NULL);
|
||||
} else {
|
||||
service = _mdns_get_service_item_instance(name->host, name->service, name->proto, NULL);
|
||||
}
|
||||
if (!service) {
|
||||
return false;
|
||||
}
|
||||
@ -4941,7 +4988,11 @@ esp_err_t mdns_service_add_for_host(const char * instance, const char * service,
|
||||
return ESP_ERR_NO_MEM;
|
||||
}
|
||||
|
||||
#if CONFIG_MDNS_MULTIPLE_INSTANCE
|
||||
mdns_srv_item_t * item = _mdns_get_service_item_instance(instance, service, proto, hostname);
|
||||
#else
|
||||
mdns_srv_item_t * item = _mdns_get_service_item(service, proto, hostname);
|
||||
#endif // CONFIG_MDNS_MULTIPLE_INSTANCE
|
||||
if (item) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
@ -5004,6 +5055,12 @@ bool mdns_service_exists(const char * service_type, const char * proto, const ch
|
||||
return _mdns_get_service_item(service_type, proto, hostname) != NULL;
|
||||
}
|
||||
|
||||
bool mdns_service_exists_with_instance(const char *instance, const char *service_type, const char *proto,
|
||||
const char *hostname)
|
||||
{
|
||||
return _mdns_get_service_item_instance(instance, service_type, proto, hostname) != NULL;
|
||||
}
|
||||
|
||||
esp_err_t mdns_service_port_set_for_host(const char * service, const char * proto, const char * hostname, uint16_t port)
|
||||
{
|
||||
if (!_mdns_server || !_mdns_server->services || _str_null_or_empty(service) || _str_null_or_empty(proto) || !port) {
|
||||
|
Reference in New Issue
Block a user