mirror of
https://github.com/espressif/esp-protocols.git
synced 2025-07-23 23:37:31 +02:00
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.
This commit is contained in:
committed by
David Cermak
parent
85ba60e405
commit
c4e85bd099
@ -1686,7 +1686,7 @@ static void _mdns_create_answer_from_parsed_packet(mdns_parsed_packet_t *parsed_
|
|||||||
if (!packet) {
|
if (!packet) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
packet->flags = MDNS_FLAGS_AUTHORITATIVE;
|
packet->flags = MDNS_FLAGS_QR_AUTHORITATIVE;
|
||||||
packet->distributed = parsed_packet->distributed;
|
packet->distributed = parsed_packet->distributed;
|
||||||
packet->id = parsed_packet->id;
|
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) {
|
if (!packet) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
packet->flags = MDNS_FLAGS_AUTHORITATIVE;
|
packet->flags = MDNS_FLAGS_QR_AUTHORITATIVE;
|
||||||
|
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
for (i=0; i<len; i++) {
|
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
|
|||||||
if (!packet) {
|
if (!packet) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
packet->flags = MDNS_FLAGS_AUTHORITATIVE;
|
packet->flags = MDNS_FLAGS_QR_AUTHORITATIVE;
|
||||||
|
|
||||||
mdns_out_answer_t * s = probe->servers;
|
mdns_out_answer_t * s = probe->servers;
|
||||||
while (s) {
|
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) {
|
if (!packet) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
packet->flags = MDNS_FLAGS_AUTHORITATIVE;
|
packet->flags = MDNS_FLAGS_QR_AUTHORITATIVE;
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i=0; i<len; i++) {
|
for (i=0; i<len; i++) {
|
||||||
if (!_mdns_alloc_answer(&packet->answers, MDNS_TYPE_PTR, services[i]->service, NULL, true, true)) {
|
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)
|
|||||||
memset(name, 0, sizeof(mdns_name_t));
|
memset(name, 0, sizeof(mdns_name_t));
|
||||||
|
|
||||||
header.id = _mdns_read_u16(data, MDNS_HEAD_ID_OFFSET);
|
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.questions = _mdns_read_u16(data, MDNS_HEAD_QUESTIONS_OFFSET);
|
||||||
header.answers = _mdns_read_u16(data, MDNS_HEAD_ANSWERS_OFFSET);
|
header.answers = _mdns_read_u16(data, MDNS_HEAD_ANSWERS_OFFSET);
|
||||||
header.servers = _mdns_read_u16(data, MDNS_HEAD_SERVERS_OFFSET);
|
header.servers = _mdns_read_u16(data, MDNS_HEAD_SERVERS_OFFSET);
|
||||||
header.additional = _mdns_read_u16(data, MDNS_HEAD_ADDITIONAL_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);
|
free(parsed_packet);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3362,8 +3362,8 @@ void mdns_parse_packet(mdns_rx_packet_t * packet)
|
|||||||
parsed_packet->tcpip_if = packet->tcpip_if;
|
parsed_packet->tcpip_if = packet->tcpip_if;
|
||||||
parsed_packet->ip_protocol = packet->ip_protocol;
|
parsed_packet->ip_protocol = packet->ip_protocol;
|
||||||
parsed_packet->multicast = packet->multicast;
|
parsed_packet->multicast = packet->multicast;
|
||||||
parsed_packet->authoritative = header.flags.value == MDNS_FLAGS_AUTHORITATIVE;
|
parsed_packet->authoritative = (header.flags == MDNS_FLAGS_QR_AUTHORITATIVE);
|
||||||
parsed_packet->distributed = header.flags.value == MDNS_FLAGS_DISTRIBUTED;
|
parsed_packet->distributed = header.flags == MDNS_FLAGS_DISTRIBUTED;
|
||||||
parsed_packet->id = header.id;
|
parsed_packet->id = header.id;
|
||||||
esp_netif_ip_addr_copy(&parsed_packet->src, &packet->src);
|
esp_netif_ip_addr_copy(&parsed_packet->src, &packet->src);
|
||||||
parsed_packet->src_port = packet->src_port;
|
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);
|
service = _mdns_get_service_item(name->service, name->proto, NULL);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!header.flags.qr || record_type == MDNS_NS) {
|
if ((header.flags & MDNS_FLAGS_QUERY_REPSONSE) == 0 || record_type == MDNS_NS) {
|
||||||
//skip this record
|
//skip this record
|
||||||
continue;
|
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);
|
header.additional = _mdns_read_u16(data, MDNS_HEAD_ADDITIONAL_OFFSET);
|
||||||
|
|
||||||
_mdns_dbg_printf("%s",
|
_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 == MDNS_FLAGS_DISTRIBUTED)?"DISTRIBUTED\n":
|
||||||
(header.flags.value == 0)?"\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);
|
_mdns_dbg_printf("0x%04X\n", header.flags.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,7 +71,9 @@
|
|||||||
#define MDNS_ANSWER_A_TTL 120
|
#define MDNS_ANSWER_A_TTL 120
|
||||||
#define MDNS_ANSWER_AAAA_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_FLAGS_DISTRIBUTED 0x0200
|
||||||
|
|
||||||
#define MDNS_NAME_REF 0xC000
|
#define MDNS_NAME_REF 0xC000
|
||||||
@ -211,21 +213,7 @@ typedef enum {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16_t id;
|
uint16_t id;
|
||||||
union {
|
uint16_t flags;
|
||||||
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 questions; //QDCOUNT
|
uint16_t questions; //QDCOUNT
|
||||||
uint16_t answers; //ANCOUNT
|
uint16_t answers; //ANCOUNT
|
||||||
uint16_t servers; //NSCOUNT
|
uint16_t servers; //NSCOUNT
|
||||||
|
Reference in New Issue
Block a user