From 89439e0a9b31908ab68b3a8ddb4d8283eb86ccc0 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Fri, 11 Dec 2020 14:00:26 +0100 Subject: [PATCH] mdns: Allow resolve its own non-strict answers the mDNS responder should not repeat questions when replying, however resolvers must ignore these questions field if they are present. esp-idf mDNS library does include questions in answering packets (thus not strictly following the RFC6762) so the resolver did not correctly resolved another instance host name. Closes https://github.com/espressif/esp-idf/issues/6190 * Original commit: espressif/esp-idf@0693e172de392086b9bfd8cf1474d8d133af3298 --- components/mdns/mdns.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index 72687e022..5fa9ed177 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -2753,7 +2753,7 @@ void mdns_parse_packet(mdns_rx_packet_t * packet) } } - if (header.questions && !parsed_packet->questions && !parsed_packet->discovery) { + if (header.questions && !parsed_packet->questions && !parsed_packet->discovery && !header.answers) { goto clear_rx_packet; } else if (header.answers || header.servers || header.additional) { uint16_t recordIndex = 0; @@ -2796,13 +2796,14 @@ void mdns_parse_packet(mdns_rx_packet_t * packet) if (parsed_packet->discovery && _mdns_name_is_discovery(name, type)) { discovery = true; - } else if (!name->sub && _mdns_name_is_ours(name)) { - ours = true; - if (name->service && name->service[0] && name->proto && name->proto[0]) { - service = _mdns_get_service_item(name->service, name->proto); - } } else { - if (header.questions || !parsed_packet->authoritative || record_type == MDNS_NS) { + if (!name->sub && _mdns_name_is_ours(name)) { + ours = true; + if (name->service && name->service[0] && name->proto && name->proto[0]) { + service = _mdns_get_service_item(name->service, name->proto); + } + } + if (!parsed_packet->authoritative || record_type == MDNS_NS) { //skip this record continue; }