Skip to content

Commit aeb0f67

Browse files
committed
feat(mdns): Make mdns-debug a separate module
1 parent 6443c81 commit aeb0f67

File tree

7 files changed

+381
-361
lines changed

7 files changed

+381
-361
lines changed

components/mdns/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ endif()
1212

1313
set(MDNS_MEMORY "mdns_mem_caps.c")
1414

15-
set(MDNS_CORE "mdns.c" "mdns_packet.c" "mdns_utils.c")
15+
set(MDNS_CORE "mdns.c" "mdns_packet.c" "mdns_utils.c" "mdns_debug.c")
1616
#set(MDNS_CORE "mdns.c" )
1717

1818
idf_build_get_property(target IDF_TARGET)

components/mdns/mdns.c

Lines changed: 5 additions & 327 deletions
Large diffs are not rendered by default.

components/mdns/mdns_debug.c

Lines changed: 321 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,321 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <string.h>
8+
#include <stdint.h>
9+
#include <stdarg.h>
10+
#include <inttypes.h>
11+
#include "sdkconfig.h"
12+
#include "mdns_private.h"
13+
#include "mdns_utils.h"
14+
15+
#define dbg_printf(...) printf(__VA_ARGS__)
16+
17+
void static dbg_packet(const uint8_t *data, size_t len)
18+
{
19+
static mdns_name_t n;
20+
mdns_header_t header;
21+
const uint8_t *content = data + MDNS_HEAD_LEN;
22+
uint32_t t = xTaskGetTickCount() * portTICK_PERIOD_MS;
23+
mdns_name_t *name = &n;
24+
memset(name, 0, sizeof(mdns_name_t));
25+
26+
dbg_printf("Packet[%" PRIu32 "]: ", t);
27+
28+
header.id = mdns_utils_read_u16(data, MDNS_HEAD_ID_OFFSET);
29+
header.flags = mdns_utils_read_u16(data, MDNS_HEAD_FLAGS_OFFSET);
30+
header.questions = mdns_utils_read_u16(data, MDNS_HEAD_QUESTIONS_OFFSET);
31+
header.answers = mdns_utils_read_u16(data, MDNS_HEAD_ANSWERS_OFFSET);
32+
header.servers = mdns_utils_read_u16(data, MDNS_HEAD_SERVERS_OFFSET);
33+
header.additional = mdns_utils_read_u16(data, MDNS_HEAD_ADDITIONAL_OFFSET);
34+
35+
dbg_printf("%s",
36+
(header.flags == MDNS_FLAGS_QR_AUTHORITATIVE) ? "AUTHORITATIVE\n" :
37+
(header.flags == MDNS_FLAGS_DISTRIBUTED) ? "DISTRIBUTED\n" :
38+
(header.flags == 0) ? "\n" : " "
39+
);
40+
if (header.flags && header.flags != MDNS_FLAGS_QR_AUTHORITATIVE) {
41+
dbg_printf("0x%04X\n", header.flags);
42+
}
43+
44+
if (header.questions) {
45+
uint8_t qs = header.questions;
46+
47+
while (qs--) {
48+
content = _mdns_parse_fqdn(data, content, name, len);
49+
if (!content || content + MDNS_CLASS_OFFSET + 1 >= data + len) {
50+
header.answers = 0;
51+
header.additional = 0;
52+
header.servers = 0;
53+
dbg_printf("ERROR: parse header questions\n");
54+
break;
55+
}
56+
57+
uint16_t type = mdns_utils_read_u16(content, MDNS_TYPE_OFFSET);
58+
uint16_t mdns_class = mdns_utils_read_u16(content, MDNS_CLASS_OFFSET);
59+
bool unicast = !!(mdns_class & 0x8000);
60+
mdns_class &= 0x7FFF;
61+
content = content + 4;
62+
63+
dbg_printf(" Q: ");
64+
if (unicast) {
65+
dbg_printf("*U* ");
66+
}
67+
if (type == MDNS_TYPE_PTR) {
68+
dbg_printf("%s.%s%s.%s.%s. PTR ", name->host, name->sub ? "_sub." : "", name->service, name->proto, name->domain);
69+
} else if (type == MDNS_TYPE_SRV) {
70+
dbg_printf("%s.%s%s.%s.%s. SRV ", name->host, name->sub ? "_sub." : "", name->service, name->proto, name->domain);
71+
} else if (type == MDNS_TYPE_TXT) {
72+
dbg_printf("%s.%s%s.%s.%s. TXT ", name->host, name->sub ? "_sub." : "", name->service, name->proto, name->domain);
73+
} else if (type == MDNS_TYPE_A) {
74+
dbg_printf("%s.%s. A ", name->host, name->domain);
75+
} else if (type == MDNS_TYPE_AAAA) {
76+
dbg_printf("%s.%s. AAAA ", name->host, name->domain);
77+
} else if (type == MDNS_TYPE_NSEC) {
78+
dbg_printf("%s.%s%s.%s.%s. NSEC ", name->host, name->sub ? "_sub." : "", name->service, name->proto, name->domain);
79+
} else if (type == MDNS_TYPE_ANY) {
80+
dbg_printf("%s.%s%s.%s.%s. ANY ", name->host, name->sub ? "_sub." : "", name->service, name->proto, name->domain);
81+
} else {
82+
dbg_printf("%s.%s%s.%s.%s. %04X ", name->host, name->sub ? "_sub." : "", name->service, name->proto, name->domain, type);
83+
}
84+
85+
if (mdns_class == 0x0001) {
86+
dbg_printf("IN");
87+
} else {
88+
dbg_printf("%04X", mdns_class);
89+
}
90+
dbg_printf("\n");
91+
}
92+
}
93+
94+
if (header.answers || header.servers || header.additional) {
95+
uint16_t recordIndex = 0;
96+
97+
while (content < (data + len)) {
98+
99+
content = _mdns_parse_fqdn(data, content, name, len);
100+
if (!content) {
101+
dbg_printf("ERROR: parse mdns records\n");
102+
break;
103+
}
104+
105+
uint16_t type = mdns_utils_read_u16(content, MDNS_TYPE_OFFSET);
106+
uint16_t mdns_class = mdns_utils_read_u16(content, MDNS_CLASS_OFFSET);
107+
uint32_t ttl = mdns_utils_read_u32(content, MDNS_TTL_OFFSET);
108+
uint16_t data_len = mdns_utils_read_u16(content, MDNS_LEN_OFFSET);
109+
const uint8_t *data_ptr = content + MDNS_DATA_OFFSET;
110+
bool flush = !!(mdns_class & 0x8000);
111+
mdns_class &= 0x7FFF;
112+
113+
content = data_ptr + data_len;
114+
if (content > (data + len)) {
115+
dbg_printf("ERROR: content length overflow\n");
116+
break;
117+
}
118+
119+
mdns_parsed_record_type_t record_type = MDNS_ANSWER;
120+
121+
if (recordIndex >= (header.answers + header.servers)) {
122+
record_type = MDNS_EXTRA;
123+
} else if (recordIndex >= (header.answers)) {
124+
record_type = MDNS_NS;
125+
}
126+
recordIndex++;
127+
128+
if (record_type == MDNS_EXTRA) {
129+
dbg_printf(" X");
130+
} else if (record_type == MDNS_NS) {
131+
dbg_printf(" S");
132+
} else {
133+
dbg_printf(" A");
134+
}
135+
136+
if (type == MDNS_TYPE_PTR) {
137+
dbg_printf(": %s%s%s.%s.%s. PTR ", name->host, name->host[0] ? "." : "", name->service, name->proto, name->domain);
138+
} else if (type == MDNS_TYPE_SRV) {
139+
dbg_printf(": %s.%s.%s.%s. SRV ", name->host, name->service, name->proto, name->domain);
140+
} else if (type == MDNS_TYPE_TXT) {
141+
dbg_printf(": %s.%s.%s.%s. TXT ", name->host, name->service, name->proto, name->domain);
142+
} else if (type == MDNS_TYPE_A) {
143+
dbg_printf(": %s.%s. A ", name->host, name->domain);
144+
} else if (type == MDNS_TYPE_AAAA) {
145+
dbg_printf(": %s.%s. AAAA ", name->host, name->domain);
146+
} else if (type == MDNS_TYPE_NSEC) {
147+
dbg_printf(": %s.%s.%s.%s. NSEC ", name->host, name->service, name->proto, name->domain);
148+
} else if (type == MDNS_TYPE_ANY) {
149+
dbg_printf(": %s.%s.%s.%s. ANY ", name->host, name->service, name->proto, name->domain);
150+
} else if (type == MDNS_TYPE_OPT) {
151+
dbg_printf(": . OPT ");
152+
} else {
153+
dbg_printf(": %s.%s.%s.%s. %04X ", name->host, name->service, name->proto, name->domain, type);
154+
}
155+
156+
if (mdns_class == 0x0001) {
157+
dbg_printf("IN ");
158+
} else {
159+
dbg_printf("%04X ", mdns_class);
160+
}
161+
if (flush) {
162+
dbg_printf("FLUSH ");
163+
}
164+
dbg_printf("%" PRIu32, ttl);
165+
dbg_printf("[%u] ", data_len);
166+
if (type == MDNS_TYPE_PTR) {
167+
if (!_mdns_parse_fqdn(data, data_ptr, name, len)) {
168+
dbg_printf("ERROR: parse PTR\n");
169+
continue;
170+
}
171+
dbg_printf("%s.%s.%s.%s.\n", name->host, name->service, name->proto, name->domain);
172+
} else if (type == MDNS_TYPE_SRV) {
173+
if (!_mdns_parse_fqdn(data, data_ptr + MDNS_SRV_FQDN_OFFSET, name, len)) {
174+
dbg_printf("ERROR: parse SRV\n");
175+
continue;
176+
}
177+
uint16_t priority = mdns_utils_read_u16(data_ptr, MDNS_SRV_PRIORITY_OFFSET);
178+
uint16_t weight = mdns_utils_read_u16(data_ptr, MDNS_SRV_WEIGHT_OFFSET);
179+
uint16_t port = mdns_utils_read_u16(data_ptr, MDNS_SRV_PORT_OFFSET);
180+
dbg_printf("%u %u %u %s.%s.\n", priority, weight, port, name->host, name->domain);
181+
} else if (type == MDNS_TYPE_TXT) {
182+
uint16_t i = 0, y;
183+
while (i < data_len) {
184+
uint8_t partLen = data_ptr[i++];
185+
if ((i + partLen) > data_len) {
186+
dbg_printf("ERROR: parse TXT\n");
187+
break;
188+
}
189+
char txt[partLen + 1];
190+
for (y = 0; y < partLen; y++) {
191+
char d = data_ptr[i++];
192+
txt[y] = d;
193+
}
194+
txt[partLen] = 0;
195+
dbg_printf("%s", txt);
196+
if (i < data_len) {
197+
dbg_printf("; ");
198+
}
199+
}
200+
dbg_printf("\n");
201+
} else if (type == MDNS_TYPE_AAAA) {
202+
esp_ip6_addr_t ip6;
203+
memcpy(&ip6, data_ptr, sizeof(esp_ip6_addr_t));
204+
dbg_printf(IPV6STR "\n", IPV62STR(ip6));
205+
} else if (type == MDNS_TYPE_A) {
206+
esp_ip4_addr_t ip;
207+
memcpy(&ip, data_ptr, sizeof(esp_ip4_addr_t));
208+
dbg_printf(IPSTR "\n", IP2STR(&ip));
209+
} else if (type == MDNS_TYPE_NSEC) {
210+
const uint8_t *old_ptr = data_ptr;
211+
const uint8_t *new_ptr = _mdns_parse_fqdn(data, data_ptr, name, len);
212+
if (new_ptr) {
213+
dbg_printf("%s.%s.%s.%s. ", name->host, name->service, name->proto, name->domain);
214+
size_t diff = new_ptr - old_ptr;
215+
data_len -= diff;
216+
data_ptr = new_ptr;
217+
}
218+
size_t i;
219+
for (i = 0; i < data_len; i++) {
220+
dbg_printf(" %02x", data_ptr[i]);
221+
}
222+
dbg_printf("\n");
223+
} else if (type == MDNS_TYPE_OPT) {
224+
uint16_t opCode = mdns_utils_read_u16(data_ptr, 0);
225+
uint16_t opLen = mdns_utils_read_u16(data_ptr, 2);
226+
dbg_printf(" Code: %04x Data[%u]:", opCode, opLen);
227+
size_t i;
228+
for (i = 4; i < data_len; i++) {
229+
dbg_printf(" %02x", data_ptr[i]);
230+
}
231+
dbg_printf("\n");
232+
} else {
233+
size_t i;
234+
for (i = 0; i < data_len; i++) {
235+
dbg_printf(" %02x", data_ptr[i]);
236+
}
237+
dbg_printf("\n");
238+
}
239+
}
240+
}
241+
}
242+
243+
void mdns_debug_tx_packet(mdns_tx_packet_t *p, uint8_t packet[MDNS_MAX_PACKET_SIZE], uint16_t index)
244+
{
245+
dbg_printf("\nTX[%lu][%lu]: ", (unsigned long)p->tcpip_if, (unsigned long)p->ip_protocol);
246+
#ifdef CONFIG_LWIP_IPV4
247+
if (p->dst.type == ESP_IPADDR_TYPE_V4) {
248+
dbg_printf("To: " IPSTR ":%u, ", IP2STR(&p->dst.u_addr.ip4), p->port);
249+
}
250+
#endif
251+
#ifdef CONFIG_LWIP_IPV6
252+
if (p->dst.type == ESP_IPADDR_TYPE_V6) {
253+
dbg_printf("To: " IPV6STR ":%u, ", IPV62STR(p->dst.u_addr.ip6), p->port);
254+
}
255+
#endif
256+
dbg_packet(packet, index);
257+
}
258+
259+
void mdns_debug_rx_packet(mdns_rx_packet_t *packet, const uint8_t* data, uint16_t len)
260+
{
261+
dbg_printf("\nRX[%lu][%lu]: ", (unsigned long)packet->tcpip_if, (unsigned long)packet->ip_protocol);
262+
#ifdef CONFIG_LWIP_IPV4
263+
if (packet->src.type == ESP_IPADDR_TYPE_V4) {
264+
dbg_printf("From: " IPSTR ":%u, To: " IPSTR ", ", IP2STR(&packet->src.u_addr.ip4), packet->src_port, IP2STR(&packet->dest.u_addr.ip4));
265+
}
266+
#endif
267+
#ifdef CONFIG_LWIP_IPV6
268+
if (packet->src.type == ESP_IPADDR_TYPE_V6) {
269+
dbg_printf("From: " IPV6STR ":%u, To: " IPV6STR ", ", IPV62STR(packet->src.u_addr.ip6), packet->src_port, IPV62STR(packet->dest.u_addr.ip6));
270+
}
271+
#endif
272+
dbg_packet(data, len);
273+
}
274+
275+
static void dbg_printf_result(mdns_result_t *r_t)
276+
{
277+
mdns_ip_addr_t *r_a = NULL;
278+
int addr_count = 0;
279+
dbg_printf("result esp_netif: %p\n", r_t->esp_netif);
280+
dbg_printf("result ip_protocol: %d\n", r_t->ip_protocol);
281+
dbg_printf("result hostname: %s\n", mdns_utils_str_null_or_empty(r_t->hostname) ? "NULL" : r_t->hostname);
282+
dbg_printf("result instance_name: %s\n", mdns_utils_str_null_or_empty(r_t->instance_name) ? "NULL" : r_t->instance_name);
283+
dbg_printf("result service_type: %s\n", mdns_utils_str_null_or_empty(r_t->service_type) ? "NULL" : r_t->service_type);
284+
dbg_printf("result proto: %s\n", mdns_utils_str_null_or_empty(r_t->proto) ? "NULL" : r_t->proto);
285+
dbg_printf("result port: %d\n", r_t->port);
286+
dbg_printf("result ttl: %" PRIu32 "\n", r_t->ttl);
287+
for (int i = 0; i < r_t->txt_count; i++) {
288+
dbg_printf("result txt item%d, key: %s, value: %s\n", i, r_t->txt[i].key, r_t->txt[i].value);
289+
}
290+
r_a = r_t->addr;
291+
while (r_a) {
292+
#ifdef CONFIG_LWIP_IPV4
293+
if (r_a->addr.type == ESP_IPADDR_TYPE_V4) {
294+
dbg_printf("Addr%d: " IPSTR "\n", addr_count++, IP2STR(&r_a->addr.u_addr.ip4));
295+
}
296+
#endif
297+
#ifdef CONFIG_LWIP_IPV6
298+
if (r_a->addr.type == ESP_IPADDR_TYPE_V6) {
299+
dbg_printf("Addr%d: " IPV6STR "\n", addr_count++, IPV62STR(r_a->addr.u_addr.ip6));
300+
}
301+
#endif
302+
r_a = r_a->next;
303+
}
304+
}
305+
306+
void mdns_debug_printf_browse_result(mdns_result_t *r_t, mdns_browse_t *b_t)
307+
{
308+
dbg_printf("----------------sync browse %s.%s result---------------\n", b_t->service, b_t->proto);
309+
dbg_printf("browse pointer: %p\n", b_t);
310+
dbg_printf_result(r_t);
311+
}
312+
313+
void mdns_debug_printf_browse_result_all(mdns_result_t *r_t)
314+
{
315+
int count = 0;
316+
while (r_t) {
317+
dbg_printf("----------------result %d---------------\n", count++);
318+
dbg_printf_result(r_t);
319+
r_t = r_t->next;
320+
}
321+
}

components/mdns/mdns_packet.c

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,10 @@
1111
#include "mdns_mem_caps.h"
1212
#include "esp_log.h"
1313
#include "mdns_utils.h"
14+
#include "mdns_debug.h"
1415

1516
static const char *TAG = "mdns_packet";
1617

17-
#ifdef MDNS_ENABLE_DEBUG
18-
void mdns_debug_packet(const uint8_t *data, size_t len);
19-
void debug_printf_browse_result(mdns_result_t *r_t, mdns_browse_t *b_t);
20-
void debug_printf_browse_result_all(mdns_result_t *r_t);
21-
#endif
22-
2318
/**
2419
* @brief Check if parsed name is discovery
2520
*/
@@ -1279,20 +1274,7 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
12791274
char *browse_result_proto = NULL;
12801275
mdns_browse_sync_t *out_sync_browse = NULL;
12811276

1282-
#ifdef MDNS_ENABLE_DEBUG
1283-
_mdns_dbg_printf("\nRX[%lu][%lu]: ", (unsigned long)packet->tcpip_if, (unsigned long)packet->ip_protocol);
1284-
#ifdef CONFIG_LWIP_IPV4
1285-
if (packet->src.type == ESP_IPADDR_TYPE_V4) {
1286-
_mdns_dbg_printf("From: " IPSTR ":%u, To: " IPSTR ", ", IP2STR(&packet->src.u_addr.ip4), packet->src_port, IP2STR(&packet->dest.u_addr.ip4));
1287-
}
1288-
#endif
1289-
#ifdef CONFIG_LWIP_IPV6
1290-
if (packet->src.type == ESP_IPADDR_TYPE_V6) {
1291-
_mdns_dbg_printf("From: " IPV6STR ":%u, To: " IPV6STR ", ", IPV62STR(packet->src.u_addr.ip6), packet->src_port, IPV62STR(packet->dest.u_addr.ip6));
1292-
}
1293-
#endif
1294-
mdns_debug_packet(data, len);
1295-
#endif
1277+
DBG_RX_PACKET(packet, data, len);
12961278

12971279
#ifndef CONFIG_MDNS_SKIP_SUPPRESSING_OWN_QUERIES
12981280
// Check if the packet wasn't sent by us
@@ -1888,15 +1870,11 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
18881870
_mdns_create_answer_from_parsed_packet(parsed_packet);
18891871
}
18901872
if (out_sync_browse) {
1891-
#ifdef MDNS_ENABLE_DEBUG
1892-
_mdns_dbg_printf("Browse %s%s total result:", out_sync_browse->browse->service, out_sync_browse->browse->proto);
1893-
debug_printf_browse_result_all(out_sync_browse->browse->result);
1894-
#endif // MDNS_ENABLE_DEBUG
1873+
DBG_BROWSE_RESULTS_WITH_MSG(out_sync_browse->browse->result,
1874+
"Browse %s%s total result:", out_sync_browse->browse->service, out_sync_browse->browse->proto);
18951875
if (out_sync_browse->sync_result) {
1896-
#ifdef MDNS_ENABLE_DEBUG
1897-
_mdns_dbg_printf("Changed result:");
1898-
debug_printf_browse_result_all(out_sync_browse->sync_result->result);
1899-
#endif // MDNS_ENABLE_DEBUG
1876+
DBG_BROWSE_RESULTS_WITH_MSG(out_sync_browse->sync_result->result,
1877+
"Changed result:");
19001878
_mdns_sync_browse_action(ACTION_BROWSE_SYNC, out_sync_browse);
19011879
} else {
19021880
mdns_mem_free(out_sync_browse);

0 commit comments

Comments
 (0)