mirror of
https://github.com/espressif/esp-protocols.git
synced 2025-07-30 10:47:29 +02:00
Merge pull request #114 from david-cermak/bugfix/dns-header-bit-order
mdns: fix bit order issue in DNS header flags (updated)
This commit is contained in:
@ -2,7 +2,7 @@
|
|||||||
# in this exact order for cmake to work correctly
|
# in this exact order for cmake to work correctly
|
||||||
cmake_minimum_required(VERSION 3.5)
|
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.
|
# 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")
|
list(APPEND EXTRA_COMPONENT_DIRS "../../../common_components/protocol_examples_common")
|
||||||
|
|
||||||
|
@ -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