From c4e85bd0998780aba13e41a1f01078e0f23b1126 Mon Sep 17 00:00:00 2001 From: Jiacheng Guo Date: Tue, 26 Jul 2022 15:01:49 +0800 Subject: [PATCH 1/2] mdns: fix bit order issue in DNS header flags The bit field in the header flags does not match its intended order on little endian machines. The PR removes the bit field and uses bit operations instead. --- components/mdns/mdns.c | 22 +++++++++---------- .../mdns/private_include/mdns_private.h | 20 ++++------------- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index 3e070b6e6..690108f03 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -1686,7 +1686,7 @@ static void _mdns_create_answer_from_parsed_packet(mdns_parsed_packet_t *parsed_ if (!packet) { return; } - packet->flags = MDNS_FLAGS_AUTHORITATIVE; + packet->flags = MDNS_FLAGS_QR_AUTHORITATIVE; packet->distributed = parsed_packet->distributed; packet->id = parsed_packet->id; @@ -1935,7 +1935,7 @@ static mdns_tx_packet_t * _mdns_create_announce_packet(mdns_if_t tcpip_if, mdns_ if (!packet) { return NULL; } - packet->flags = MDNS_FLAGS_AUTHORITATIVE; + packet->flags = MDNS_FLAGS_QR_AUTHORITATIVE; uint8_t i; for (i=0; iflags = MDNS_FLAGS_AUTHORITATIVE; + packet->flags = MDNS_FLAGS_QR_AUTHORITATIVE; mdns_out_answer_t * s = probe->servers; while (s) { @@ -2005,7 +2005,7 @@ static void _mdns_pcb_send_bye(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protoco if (!packet) { return; } - packet->flags = MDNS_FLAGS_AUTHORITATIVE; + packet->flags = MDNS_FLAGS_QR_AUTHORITATIVE; size_t i; for (i=0; ianswers, MDNS_TYPE_PTR, services[i]->service, NULL, true, true)) { @@ -3342,13 +3342,13 @@ void mdns_parse_packet(mdns_rx_packet_t * packet) memset(name, 0, sizeof(mdns_name_t)); header.id = _mdns_read_u16(data, MDNS_HEAD_ID_OFFSET); - header.flags.value = _mdns_read_u16(data, MDNS_HEAD_FLAGS_OFFSET); + header.flags = _mdns_read_u16(data, MDNS_HEAD_FLAGS_OFFSET); header.questions = _mdns_read_u16(data, MDNS_HEAD_QUESTIONS_OFFSET); header.answers = _mdns_read_u16(data, MDNS_HEAD_ANSWERS_OFFSET); header.servers = _mdns_read_u16(data, MDNS_HEAD_SERVERS_OFFSET); header.additional = _mdns_read_u16(data, MDNS_HEAD_ADDITIONAL_OFFSET); - if (header.flags.value == MDNS_FLAGS_AUTHORITATIVE && packet->src_port != MDNS_SERVICE_PORT) { + if (header.flags == MDNS_FLAGS_QR_AUTHORITATIVE && packet->src_port != MDNS_SERVICE_PORT) { free(parsed_packet); return; } @@ -3362,8 +3362,8 @@ void mdns_parse_packet(mdns_rx_packet_t * packet) parsed_packet->tcpip_if = packet->tcpip_if; parsed_packet->ip_protocol = packet->ip_protocol; parsed_packet->multicast = packet->multicast; - parsed_packet->authoritative = header.flags.value == MDNS_FLAGS_AUTHORITATIVE; - parsed_packet->distributed = header.flags.value == MDNS_FLAGS_DISTRIBUTED; + parsed_packet->authoritative = (header.flags == MDNS_FLAGS_QR_AUTHORITATIVE); + parsed_packet->distributed = header.flags == MDNS_FLAGS_DISTRIBUTED; parsed_packet->id = header.id; esp_netif_ip_addr_copy(&parsed_packet->src, &packet->src); parsed_packet->src_port = packet->src_port; @@ -3499,7 +3499,7 @@ void mdns_parse_packet(mdns_rx_packet_t * packet) service = _mdns_get_service_item(name->service, name->proto, NULL); } } else { - if (!header.flags.qr || record_type == MDNS_NS) { + if ((header.flags & MDNS_FLAGS_QUERY_REPSONSE) == 0 || record_type == MDNS_NS) { //skip this record continue; } @@ -6075,11 +6075,11 @@ void mdns_debug_packet(const uint8_t * data, size_t len) header.additional = _mdns_read_u16(data, MDNS_HEAD_ADDITIONAL_OFFSET); _mdns_dbg_printf("%s", - (header.flags.value == MDNS_FLAGS_AUTHORITATIVE)?"AUTHORITATIVE\n": + (header.flags.value == MDNS_FLAGS_QR_AUTHORITATIVE)?"AUTHORITATIVE\n": (header.flags.value == MDNS_FLAGS_DISTRIBUTED)?"DISTRIBUTED\n": (header.flags.value == 0)?"\n":" " ); - if (header.flags.value && header.flags.value != MDNS_FLAGS_AUTHORITATIVE) { + if (header.flags.value && header.flags.value != MDNS_FLAGS_QR_AUTHORITATIVE) { _mdns_dbg_printf("0x%04X\n", header.flags.value); } diff --git a/components/mdns/private_include/mdns_private.h b/components/mdns/private_include/mdns_private.h index bf1d6d8bf..7b0673c8f 100644 --- a/components/mdns/private_include/mdns_private.h +++ b/components/mdns/private_include/mdns_private.h @@ -71,7 +71,9 @@ #define MDNS_ANSWER_A_TTL 120 #define MDNS_ANSWER_AAAA_TTL 120 -#define MDNS_FLAGS_AUTHORITATIVE 0x8400 +#define MDNS_FLAGS_QUERY_REPSONSE 0x8000 +#define MDNS_FLAGS_AUTHORITATIVE 0x0400 +#define MDNS_FLAGS_QR_AUTHORITATIVE (MDNS_FLAGS_QUERY_REPSONSE | MDNS_FLAGS_AUTHORITATIVE) #define MDNS_FLAGS_DISTRIBUTED 0x0200 #define MDNS_NAME_REF 0xC000 @@ -211,21 +213,7 @@ typedef enum { typedef struct { uint16_t id; - union { - struct { - uint16_t qr :1; - uint16_t opCode :4; - uint16_t aa :1; - uint16_t tc :1; - uint16_t rd :1; - uint16_t ra :1; - uint16_t z :1; - uint16_t ad :1; - uint16_t cd :1; - uint16_t rCode :4;//response/error code - }; - uint16_t value; - } flags; + uint16_t flags; uint16_t questions; //QDCOUNT uint16_t answers; //ANCOUNT uint16_t servers; //NSCOUNT From d74c29618230e6da82b51610b613906a5f8f48a4 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Thu, 18 Aug 2022 16:41:38 +0200 Subject: [PATCH 2/2] fix(mdns): Example makefile to add only mdns as extra comps --- components/mdns/examples/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/mdns/examples/CMakeLists.txt b/components/mdns/examples/CMakeLists.txt index 9461155a1..cbea5b1bd 100644 --- a/components/mdns/examples/CMakeLists.txt +++ b/components/mdns/examples/CMakeLists.txt @@ -2,7 +2,7 @@ # in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) -set(EXTRA_COMPONENT_DIRS "../..") +set(EXTRA_COMPONENT_DIRS "..") # This example uses an extra component for common functions such as Wi-Fi and Ethernet connection. list(APPEND EXTRA_COMPONENT_DIRS "../../../common_components/protocol_examples_common")