Skip to content

Commit c4e85bd

Browse files
gjc13david-cermak
authored andcommitted
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.
1 parent 85ba60e commit c4e85bd

File tree

2 files changed

+15
-27
lines changed

2 files changed

+15
-27
lines changed

components/mdns/mdns.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1686,7 +1686,7 @@ static void _mdns_create_answer_from_parsed_packet(mdns_parsed_packet_t *parsed_
16861686
if (!packet) {
16871687
return;
16881688
}
1689-
packet->flags = MDNS_FLAGS_AUTHORITATIVE;
1689+
packet->flags = MDNS_FLAGS_QR_AUTHORITATIVE;
16901690
packet->distributed = parsed_packet->distributed;
16911691
packet->id = parsed_packet->id;
16921692

@@ -1935,7 +1935,7 @@ static mdns_tx_packet_t * _mdns_create_announce_packet(mdns_if_t tcpip_if, mdns_
19351935
if (!packet) {
19361936
return NULL;
19371937
}
1938-
packet->flags = MDNS_FLAGS_AUTHORITATIVE;
1938+
packet->flags = MDNS_FLAGS_QR_AUTHORITATIVE;
19391939

19401940
uint8_t i;
19411941
for (i=0; i<len; i++) {
@@ -1965,7 +1965,7 @@ static mdns_tx_packet_t * _mdns_create_announce_from_probe(mdns_tx_packet_t * pr
19651965
if (!packet) {
19661966
return NULL;
19671967
}
1968-
packet->flags = MDNS_FLAGS_AUTHORITATIVE;
1968+
packet->flags = MDNS_FLAGS_QR_AUTHORITATIVE;
19691969

19701970
mdns_out_answer_t * s = probe->servers;
19711971
while (s) {
@@ -2005,7 +2005,7 @@ static void _mdns_pcb_send_bye(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protoco
20052005
if (!packet) {
20062006
return;
20072007
}
2008-
packet->flags = MDNS_FLAGS_AUTHORITATIVE;
2008+
packet->flags = MDNS_FLAGS_QR_AUTHORITATIVE;
20092009
size_t i;
20102010
for (i=0; i<len; i++) {
20112011
if (!_mdns_alloc_answer(&packet->answers, MDNS_TYPE_PTR, services[i]->service, NULL, true, true)) {
@@ -3342,13 +3342,13 @@ void mdns_parse_packet(mdns_rx_packet_t * packet)
33423342
memset(name, 0, sizeof(mdns_name_t));
33433343

33443344
header.id = _mdns_read_u16(data, MDNS_HEAD_ID_OFFSET);
3345-
header.flags.value = _mdns_read_u16(data, MDNS_HEAD_FLAGS_OFFSET);
3345+
header.flags = _mdns_read_u16(data, MDNS_HEAD_FLAGS_OFFSET);
33463346
header.questions = _mdns_read_u16(data, MDNS_HEAD_QUESTIONS_OFFSET);
33473347
header.answers = _mdns_read_u16(data, MDNS_HEAD_ANSWERS_OFFSET);
33483348
header.servers = _mdns_read_u16(data, MDNS_HEAD_SERVERS_OFFSET);
33493349
header.additional = _mdns_read_u16(data, MDNS_HEAD_ADDITIONAL_OFFSET);
33503350

3351-
if (header.flags.value == MDNS_FLAGS_AUTHORITATIVE && packet->src_port != MDNS_SERVICE_PORT) {
3351+
if (header.flags == MDNS_FLAGS_QR_AUTHORITATIVE && packet->src_port != MDNS_SERVICE_PORT) {
33523352
free(parsed_packet);
33533353
return;
33543354
}
@@ -3362,8 +3362,8 @@ void mdns_parse_packet(mdns_rx_packet_t * packet)
33623362
parsed_packet->tcpip_if = packet->tcpip_if;
33633363
parsed_packet->ip_protocol = packet->ip_protocol;
33643364
parsed_packet->multicast = packet->multicast;
3365-
parsed_packet->authoritative = header.flags.value == MDNS_FLAGS_AUTHORITATIVE;
3366-
parsed_packet->distributed = header.flags.value == MDNS_FLAGS_DISTRIBUTED;
3365+
parsed_packet->authoritative = (header.flags == MDNS_FLAGS_QR_AUTHORITATIVE);
3366+
parsed_packet->distributed = header.flags == MDNS_FLAGS_DISTRIBUTED;
33673367
parsed_packet->id = header.id;
33683368
esp_netif_ip_addr_copy(&parsed_packet->src, &packet->src);
33693369
parsed_packet->src_port = packet->src_port;
@@ -3499,7 +3499,7 @@ void mdns_parse_packet(mdns_rx_packet_t * packet)
34993499
service = _mdns_get_service_item(name->service, name->proto, NULL);
35003500
}
35013501
} else {
3502-
if (!header.flags.qr || record_type == MDNS_NS) {
3502+
if ((header.flags & MDNS_FLAGS_QUERY_REPSONSE) == 0 || record_type == MDNS_NS) {
35033503
//skip this record
35043504
continue;
35053505
}
@@ -6075,11 +6075,11 @@ void mdns_debug_packet(const uint8_t * data, size_t len)
60756075
header.additional = _mdns_read_u16(data, MDNS_HEAD_ADDITIONAL_OFFSET);
60766076

60776077
_mdns_dbg_printf("%s",
6078-
(header.flags.value == MDNS_FLAGS_AUTHORITATIVE)?"AUTHORITATIVE\n":
6078+
(header.flags.value == MDNS_FLAGS_QR_AUTHORITATIVE)?"AUTHORITATIVE\n":
60796079
(header.flags.value == MDNS_FLAGS_DISTRIBUTED)?"DISTRIBUTED\n":
60806080
(header.flags.value == 0)?"\n":" "
60816081
);
6082-
if (header.flags.value && header.flags.value != MDNS_FLAGS_AUTHORITATIVE) {
6082+
if (header.flags.value && header.flags.value != MDNS_FLAGS_QR_AUTHORITATIVE) {
60836083
_mdns_dbg_printf("0x%04X\n", header.flags.value);
60846084
}
60856085

components/mdns/private_include/mdns_private.h

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@
7171
#define MDNS_ANSWER_A_TTL 120
7272
#define MDNS_ANSWER_AAAA_TTL 120
7373

74-
#define MDNS_FLAGS_AUTHORITATIVE 0x8400
74+
#define MDNS_FLAGS_QUERY_REPSONSE 0x8000
75+
#define MDNS_FLAGS_AUTHORITATIVE 0x0400
76+
#define MDNS_FLAGS_QR_AUTHORITATIVE (MDNS_FLAGS_QUERY_REPSONSE | MDNS_FLAGS_AUTHORITATIVE)
7577
#define MDNS_FLAGS_DISTRIBUTED 0x0200
7678

7779
#define MDNS_NAME_REF 0xC000
@@ -211,21 +213,7 @@ typedef enum {
211213

212214
typedef struct {
213215
uint16_t id;
214-
union {
215-
struct {
216-
uint16_t qr :1;
217-
uint16_t opCode :4;
218-
uint16_t aa :1;
219-
uint16_t tc :1;
220-
uint16_t rd :1;
221-
uint16_t ra :1;
222-
uint16_t z :1;
223-
uint16_t ad :1;
224-
uint16_t cd :1;
225-
uint16_t rCode :4;//response/error code
226-
};
227-
uint16_t value;
228-
} flags;
216+
uint16_t flags;
229217
uint16_t questions; //QDCOUNT
230218
uint16_t answers; //ANCOUNT
231219
uint16_t servers; //NSCOUNT

0 commit comments

Comments
 (0)