feat(mdns): Allow allocate memory with configured caps

This commit is contained in:
David Cermak
2025-02-13 13:29:47 +01:00
parent f1a72ec42c
commit 7d29b47676
11 changed files with 584 additions and 372 deletions

View File

@ -10,15 +10,17 @@ else()
set(MDNS_CONSOLE "") set(MDNS_CONSOLE "")
endif() endif()
set(MDNS_MEMORY "mdns_mem_caps.c")
idf_build_get_property(target IDF_TARGET) idf_build_get_property(target IDF_TARGET)
if(${target} STREQUAL "linux") if(${target} STREQUAL "linux")
set(dependencies esp_netif_linux esp_event) set(dependencies esp_netif_linux esp_event)
set(private_dependencies esp_timer console esp_system) set(private_dependencies esp_timer console esp_system)
set(srcs "mdns.c" ${MDNS_NETWORKING} ${MDNS_CONSOLE}) set(srcs "mdns.c" ${MDNS_MEMORY} ${MDNS_NETWORKING} ${MDNS_CONSOLE})
else() else()
set(dependencies lwip console esp_netif) set(dependencies lwip console esp_netif)
set(private_dependencies esp_timer esp_wifi) set(private_dependencies esp_timer esp_wifi)
set(srcs "mdns.c" ${MDNS_NETWORKING} ${MDNS_CONSOLE}) set(srcs "mdns.c" ${MDNS_MEMORY} ${MDNS_NETWORKING} ${MDNS_CONSOLE})
endif() endif()
idf_component_register( idf_component_register(

View File

@ -71,6 +71,18 @@ menu "mDNS"
bool "mDNS task creates on the internal RAM" bool "mDNS task creates on the internal RAM"
endchoice endchoice
choice MDNS_MEMORY_ALLOC_FROM
prompt "Select mDNS memory allocation type"
default MDNS_MEMORY_ALLOC_INTERNAL
config MDNS_MEMORY_ALLOC_SPIRAM
bool "Allocate mDNS memory from SPIRAM"
depends on (SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC)
config MDNS_MEMORY_ALLOC_INTERNAL
bool "Allocate mDNS memory from internal RAM"
endchoice
config MDNS_SERVICE_ADD_TIMEOUT_MS config MDNS_SERVICE_ADD_TIMEOUT_MS
int "mDNS adding service timeout (ms)" int "mDNS adding service timeout (ms)"
range 10 30000 range 10 30000

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@ -10,6 +10,7 @@
#include "mdns.h" #include "mdns.h"
#include "mdns_private.h" #include "mdns_private.h"
#include "inttypes.h" #include "inttypes.h"
#include "mdns_mem_caps.h"
static const char *ip_protocol_str[] = {"V4", "V6", "MAX"}; static const char *ip_protocol_str[] = {"V4", "V6", "MAX"};
@ -110,7 +111,7 @@ static void register_mdns_query_a(void)
.argtable = &mdns_query_a_args .argtable = &mdns_query_a_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_init));
} }
#endif /* CONFIG_LWIP_IPV4 */ #endif /* CONFIG_LWIP_IPV4 */
@ -169,7 +170,7 @@ static void register_mdns_query_aaaa(void)
.argtable = &mdns_query_a_args .argtable = &mdns_query_a_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_init));
} }
#endif /* CONFIG_LWIP_IPV6 */ #endif /* CONFIG_LWIP_IPV6 */
@ -231,7 +232,7 @@ static void register_mdns_query_srv(void)
.argtable = &mdns_query_srv_args .argtable = &mdns_query_srv_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_init));
} }
static struct { static struct {
@ -293,7 +294,7 @@ static void register_mdns_query_txt(void)
.argtable = &mdns_query_txt_args .argtable = &mdns_query_txt_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_init));
} }
static struct { static struct {
@ -359,7 +360,7 @@ static void register_mdns_query_ptr(void)
.argtable = &mdns_query_ptr_args .argtable = &mdns_query_ptr_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_init));
} }
static struct { static struct {
@ -427,7 +428,7 @@ static void register_mdns_query_ip(void)
.argtable = &mdns_query_ip_args .argtable = &mdns_query_ip_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_init));
} }
static struct { static struct {
@ -496,7 +497,7 @@ static void register_mdns_query_svc(void)
.argtable = &mdns_query_svc_args .argtable = &mdns_query_svc_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_init));
} }
static struct { static struct {
@ -513,15 +514,15 @@ static int cmd_mdns_init(int argc, char **argv)
return 1; return 1;
} }
ESP_ERROR_CHECK( mdns_init() ); ESP_ERROR_CHECK(mdns_init());
if (mdns_init_args.hostname->sval[0]) { if (mdns_init_args.hostname->sval[0]) {
ESP_ERROR_CHECK( mdns_hostname_set(mdns_init_args.hostname->sval[0]) ); ESP_ERROR_CHECK(mdns_hostname_set(mdns_init_args.hostname->sval[0]));
printf("MDNS: Hostname: %s\n", mdns_init_args.hostname->sval[0]); printf("MDNS: Hostname: %s\n", mdns_init_args.hostname->sval[0]);
} }
if (mdns_init_args.instance->count) { if (mdns_init_args.instance->count) {
ESP_ERROR_CHECK( mdns_instance_name_set(mdns_init_args.instance->sval[0]) ); ESP_ERROR_CHECK(mdns_instance_name_set(mdns_init_args.instance->sval[0]));
printf("MDNS: Instance: %s\n", mdns_init_args.instance->sval[0]); printf("MDNS: Instance: %s\n", mdns_init_args.instance->sval[0]);
} }
@ -542,7 +543,7 @@ static void register_mdns_init(void)
.argtable = &mdns_init_args .argtable = &mdns_init_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_init));
} }
static int cmd_mdns_free(int argc, char **argv) static int cmd_mdns_free(int argc, char **argv)
@ -561,7 +562,7 @@ static void register_mdns_free(void)
.argtable = NULL .argtable = NULL
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_free) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_free));
} }
static struct { static struct {
@ -582,7 +583,7 @@ static int cmd_mdns_set_hostname(int argc, char **argv)
return 1; return 1;
} }
ESP_ERROR_CHECK( mdns_hostname_set(mdns_set_hostname_args.hostname->sval[0]) ); ESP_ERROR_CHECK(mdns_hostname_set(mdns_set_hostname_args.hostname->sval[0]));
return 0; return 0;
} }
@ -599,7 +600,7 @@ static void register_mdns_set_hostname(void)
.argtable = &mdns_set_hostname_args .argtable = &mdns_set_hostname_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_set_hostname) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_set_hostname));
} }
static struct { static struct {
@ -620,7 +621,7 @@ static int cmd_mdns_set_instance(int argc, char **argv)
return 1; return 1;
} }
ESP_ERROR_CHECK( mdns_instance_name_set(mdns_set_instance_args.instance->sval[0]) ); ESP_ERROR_CHECK(mdns_instance_name_set(mdns_set_instance_args.instance->sval[0]));
return 0; return 0;
} }
@ -637,14 +638,14 @@ static void register_mdns_set_instance(void)
.argtable = &mdns_set_instance_args .argtable = &mdns_set_instance_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_set_instance) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_set_instance));
} }
static mdns_txt_item_t *_convert_items(const char **values, int count) static mdns_txt_item_t *_convert_items(const char **values, int count)
{ {
int i = 0, e; int i = 0, e;
const char *value = NULL; const char *value = NULL;
mdns_txt_item_t *items = (mdns_txt_item_t *) malloc(sizeof(mdns_txt_item_t) * count); mdns_txt_item_t *items = (mdns_txt_item_t *) mdns_mem_malloc(sizeof(mdns_txt_item_t) * count);
if (!items) { if (!items) {
printf("ERROR: No Memory!\n"); printf("ERROR: No Memory!\n");
goto fail; goto fail;
@ -661,15 +662,15 @@ static mdns_txt_item_t *_convert_items(const char **values, int count)
} }
int var_len = esign - value; int var_len = esign - value;
int val_len = strlen(value) - var_len - 1; int val_len = strlen(value) - var_len - 1;
char *var = (char *)malloc(var_len + 1); char *var = (char *)mdns_mem_malloc(var_len + 1);
if (var == NULL) { if (var == NULL) {
printf("ERROR: No Memory!\n"); printf("ERROR: No Memory!\n");
goto fail; goto fail;
} }
char *val = (char *)malloc(val_len + 1); char *val = (char *)mdns_mem_malloc(val_len + 1);
if (val == NULL) { if (val == NULL) {
printf("ERROR: No Memory!\n"); printf("ERROR: No Memory!\n");
free(var); mdns_mem_free(var);
goto fail; goto fail;
} }
memcpy(var, value, var_len); memcpy(var, value, var_len);
@ -685,10 +686,10 @@ static mdns_txt_item_t *_convert_items(const char **values, int count)
fail: fail:
for (e = 0; e < i; e++) { for (e = 0; e < i; e++) {
free((char *)items[e].key); mdns_mem_free((char *)items[e].key);
free((char *)items[e].value); mdns_mem_free((char *)items[e].value);
} }
free(items); mdns_mem_free(items);
return NULL; return NULL;
} }
@ -734,9 +735,9 @@ static int cmd_mdns_service_add(int argc, char **argv)
} }
} }
ESP_ERROR_CHECK( mdns_service_add_for_host(instance, mdns_add_args.service->sval[0], mdns_add_args.proto->sval[0], ESP_ERROR_CHECK(mdns_service_add_for_host(instance, mdns_add_args.service->sval[0], mdns_add_args.proto->sval[0],
host, mdns_add_args.port->ival[0], items, mdns_add_args.txt->count) ); host, mdns_add_args.port->ival[0], items, mdns_add_args.txt->count));
free(items); mdns_mem_free(items);
return 0; return 0;
} }
@ -758,7 +759,7 @@ static void register_mdns_service_add(void)
.argtable = &mdns_add_args .argtable = &mdns_add_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_add) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_add));
} }
static struct { static struct {
@ -791,7 +792,7 @@ static int cmd_mdns_service_remove(int argc, char **argv)
host = mdns_remove_args.host->sval[0]; host = mdns_remove_args.host->sval[0];
} }
ESP_ERROR_CHECK( mdns_service_remove_for_host(instance, mdns_remove_args.service->sval[0], mdns_remove_args.proto->sval[0], host) ); ESP_ERROR_CHECK(mdns_service_remove_for_host(instance, mdns_remove_args.service->sval[0], mdns_remove_args.proto->sval[0], host));
return 0; return 0;
} }
@ -811,7 +812,7 @@ static void register_mdns_service_remove(void)
.argtable = &mdns_remove_args .argtable = &mdns_remove_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_remove) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_remove));
} }
static struct { static struct {
@ -869,7 +870,7 @@ static void register_mdns_service_instance_set(void)
.argtable = &mdns_service_instance_set_args .argtable = &mdns_service_instance_set_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_add) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_add));
} }
static struct { static struct {
@ -927,7 +928,7 @@ static void register_mdns_service_port_set(void)
.argtable = &mdns_service_port_set_args .argtable = &mdns_service_port_set_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_add) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_add));
} }
static struct { static struct {
@ -970,8 +971,8 @@ static int cmd_mdns_service_txt_replace(int argc, char **argv)
} }
} }
ESP_ERROR_CHECK( mdns_service_txt_set_for_host(instance, mdns_txt_replace_args.service->sval[0], mdns_txt_replace_args.proto->sval[0], host, items, mdns_txt_replace_args.txt->count) ); ESP_ERROR_CHECK(mdns_service_txt_set_for_host(instance, mdns_txt_replace_args.service->sval[0], mdns_txt_replace_args.proto->sval[0], host, items, mdns_txt_replace_args.txt->count));
free(items); mdns_mem_free(items);
return 0; return 0;
} }
@ -992,7 +993,7 @@ static void register_mdns_service_txt_replace(void)
.argtable = &mdns_txt_replace_args .argtable = &mdns_txt_replace_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_txt_set) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_txt_set));
} }
static struct { static struct {
@ -1028,7 +1029,7 @@ static int cmd_mdns_service_txt_set(int argc, char **argv)
printf("MDNS: Service for delegated host: %s\n", host); printf("MDNS: Service for delegated host: %s\n", host);
} }
ESP_ERROR_CHECK( mdns_service_txt_item_set_for_host(instance, mdns_txt_set_args.service->sval[0], mdns_txt_set_args.proto->sval[0], host, mdns_txt_set_args.var->sval[0], mdns_txt_set_args.value->sval[0]) ); ESP_ERROR_CHECK(mdns_service_txt_item_set_for_host(instance, mdns_txt_set_args.service->sval[0], mdns_txt_set_args.proto->sval[0], host, mdns_txt_set_args.var->sval[0], mdns_txt_set_args.value->sval[0]));
return 0; return 0;
} }
@ -1050,7 +1051,7 @@ static void register_mdns_service_txt_set(void)
.argtable = &mdns_txt_set_args .argtable = &mdns_txt_set_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_txt_set) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_txt_set));
} }
static struct { static struct {
@ -1082,7 +1083,7 @@ static int cmd_mdns_service_txt_remove(int argc, char **argv)
if (mdns_txt_remove_args.host->count && mdns_txt_remove_args.host->sval[0]) { if (mdns_txt_remove_args.host->count && mdns_txt_remove_args.host->sval[0]) {
host = mdns_txt_remove_args.host->sval[0]; host = mdns_txt_remove_args.host->sval[0];
} }
ESP_ERROR_CHECK( mdns_service_txt_item_remove_for_host(instance, mdns_txt_remove_args.service->sval[0], mdns_txt_remove_args.proto->sval[0], host, mdns_txt_remove_args.var->sval[0]) ); ESP_ERROR_CHECK(mdns_service_txt_item_remove_for_host(instance, mdns_txt_remove_args.service->sval[0], mdns_txt_remove_args.proto->sval[0], host, mdns_txt_remove_args.var->sval[0]));
return 0; return 0;
} }
@ -1103,7 +1104,7 @@ static void register_mdns_service_txt_remove(void)
.argtable = &mdns_txt_remove_args .argtable = &mdns_txt_remove_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_txt_remove) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_txt_remove));
} }
static int cmd_mdns_service_remove_all(int argc, char **argv) static int cmd_mdns_service_remove_all(int argc, char **argv)
@ -1122,7 +1123,7 @@ static void register_mdns_service_remove_all(void)
.argtable = NULL .argtable = NULL
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_free) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_free));
} }
#define MDNS_MAX_LOOKUP_RESULTS CONFIG_MDNS_MAX_SERVICES #define MDNS_MAX_LOOKUP_RESULTS CONFIG_MDNS_MAX_SERVICES
@ -1189,7 +1190,7 @@ static void register_mdns_lookup_service(void)
.argtable = &mdns_lookup_service_args .argtable = &mdns_lookup_service_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_lookup_service) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_lookup_service));
} }
static struct { static struct {
@ -1237,7 +1238,7 @@ static void register_mdns_delegate_host(void)
.argtable = &mdns_delegate_host_args .argtable = &mdns_delegate_host_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_delegate_host) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_delegate_host));
} }
static struct { static struct {
@ -1278,7 +1279,7 @@ static void register_mdns_undelegate_host(void)
.argtable = &mdns_undelegate_host_args .argtable = &mdns_undelegate_host_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_undelegate_host) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_undelegate_host));
} }
static struct { static struct {
@ -1310,7 +1311,7 @@ static int cmd_mdns_service_subtype(int argc, char **argv)
if (mdns_service_subtype_args.host->count && mdns_service_subtype_args.host->sval[0]) { if (mdns_service_subtype_args.host->count && mdns_service_subtype_args.host->sval[0]) {
host = mdns_service_subtype_args.host->sval[0]; host = mdns_service_subtype_args.host->sval[0];
} }
ESP_ERROR_CHECK( mdns_service_subtype_add_for_host(instance, mdns_service_subtype_args.service->sval[0], mdns_service_subtype_args.proto->sval[0], host, mdns_service_subtype_args.sub->sval[0]) ); ESP_ERROR_CHECK(mdns_service_subtype_add_for_host(instance, mdns_service_subtype_args.service->sval[0], mdns_service_subtype_args.proto->sval[0], host, mdns_service_subtype_args.sub->sval[0]));
return 0; return 0;
} }
@ -1331,7 +1332,7 @@ static void register_mdns_service_subtype_set(void)
.argtable = &mdns_service_subtype_args .argtable = &mdns_service_subtype_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_service_sub) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_service_sub));
} }
static struct { static struct {
@ -1377,7 +1378,7 @@ static void register_mdns_browse(void)
.argtable = &mdns_browse_args .argtable = &mdns_browse_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_browse) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_browse));
} }
static int cmd_mdns_browse_del(int argc, char **argv) static int cmd_mdns_browse_del(int argc, char **argv)
@ -1410,7 +1411,7 @@ static void register_mdns_browse_del(void)
.argtable = &mdns_browse_args .argtable = &mdns_browse_args
}; };
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_browse_del) ); ESP_ERROR_CHECK(esp_console_cmd_register(&cmd_browse_del));
} }
void mdns_console_register(void) void mdns_console_register(void)

View File

@ -0,0 +1,56 @@
/*
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <string.h>
#include "mdns_private.h"
#include "mdns_mem_caps.h"
#include "esp_heap_caps.h"
#ifndef MDNS_MEMORY_CAPS
#warning "No memory allocation method defined, using internal memory"
#define MDNS_MEMORY_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)
#endif
void *mdns_mem_malloc(size_t size)
{
return heap_caps_malloc(size, MDNS_MEMORY_CAPS);
}
void *mdns_mem_calloc(size_t num, size_t size)
{
return heap_caps_calloc(num, size, MDNS_MEMORY_CAPS);
}
void mdns_mem_free(void *ptr)
{
heap_caps_free(ptr);
}
char *mdns_mem_strdup(const char *s)
{
if (!s) {
return NULL;
}
size_t len = strlen(s) + 1;
char *copy = (char *)heap_caps_malloc(len, MDNS_MEMORY_CAPS);
if (copy) {
memcpy(copy, s, len);
}
return copy;
}
char *mdns_mem_strndup(const char *s, size_t n)
{
if (!s) {
return NULL;
}
size_t len = strnlen(s, n);
char *copy = (char *)heap_caps_malloc(len + 1, MDNS_MEMORY_CAPS);
if (copy) {
memcpy(copy, s, len);
copy[len] = '\0';
}
return copy;
}

View File

@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@ -20,6 +20,7 @@
#include "esp_event.h" #include "esp_event.h"
#include "mdns_networking.h" #include "mdns_networking.h"
#include "esp_netif_net_stack.h" #include "esp_netif_net_stack.h"
#include "mdns_mem_caps.h"
/* /*
* MDNS Server Networking * MDNS Server Networking
@ -143,7 +144,7 @@ static void _udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *pb, const ip
pb = pb->next; pb = pb->next;
this_pb->next = NULL; this_pb->next = NULL;
mdns_rx_packet_t *packet = (mdns_rx_packet_t *)malloc(sizeof(mdns_rx_packet_t)); mdns_rx_packet_t *packet = (mdns_rx_packet_t *)mdns_mem_malloc(sizeof(mdns_rx_packet_t));
if (!packet) { if (!packet) {
HOOK_MALLOC_FAILED; HOOK_MALLOC_FAILED;
//missed packet - no memory //missed packet - no memory
@ -188,7 +189,7 @@ static void _udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *pb, const ip
bool found = false; bool found = false;
for (i = 0; i < MDNS_MAX_INTERFACES; i++) { for (i = 0; i < MDNS_MAX_INTERFACES; i++) {
netif = esp_netif_get_netif_impl(_mdns_get_esp_netif(i)); netif = esp_netif_get_netif_impl(_mdns_get_esp_netif(i));
if (s_interfaces[i].proto && netif && netif == ip_current_input_netif ()) { if (s_interfaces[i].proto && netif && netif == ip_current_input_netif()) {
#if LWIP_IPV4 #if LWIP_IPV4
if (packet->src.type == IPADDR_TYPE_V4) { if (packet->src.type == IPADDR_TYPE_V4) {
if ((packet->src.u_addr.ip4.addr & ip_2_ip4(&netif->netmask)->addr) != (ip_2_ip4(&netif->ip_addr)->addr & ip_2_ip4(&netif->netmask)->addr)) { if ((packet->src.u_addr.ip4.addr & ip_2_ip4(&netif->netmask)->addr) != (ip_2_ip4(&netif->ip_addr)->addr & ip_2_ip4(&netif->netmask)->addr)) {
@ -205,7 +206,7 @@ static void _udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *pb, const ip
if (!found || _mdns_send_rx_action(packet) != ESP_OK) { if (!found || _mdns_send_rx_action(packet) != ESP_OK) {
pbuf_free(this_pb); pbuf_free(this_pb);
free(packet); mdns_mem_free(packet);
} }
} }
@ -338,7 +339,7 @@ static err_t _mdns_udp_pcb_write_api(struct tcpip_api_call_data *api_call_msg)
msg->err = ERR_IF; msg->err = ERR_IF;
return ERR_IF; return ERR_IF;
} }
esp_err_t err = udp_sendto_if (_pcb_main, msg->pbt, msg->ip, msg->port, (struct netif *)nif); esp_err_t err = udp_sendto_if(_pcb_main, msg->pbt, msg->ip, msg->port, (struct netif *)nif);
pbuf_free(msg->pbt); pbuf_free(msg->pbt);
msg->err = err; msg->err = err;
return err; return err;
@ -393,5 +394,5 @@ size_t _mdns_get_packet_len(mdns_rx_packet_t *packet)
void _mdns_packet_free(mdns_rx_packet_t *packet) void _mdns_packet_free(mdns_rx_packet_t *packet)
{ {
pbuf_free(packet->pb); pbuf_free(packet->pb);
free(packet); mdns_mem_free(packet);
} }

View File

@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@ -21,6 +21,7 @@
#include <unistd.h> #include <unistd.h>
#include <sys/param.h> #include <sys/param.h>
#include "esp_log.h" #include "esp_log.h"
#include "mdns_mem_caps.h"
#if defined(CONFIG_IDF_TARGET_LINUX) #if defined(CONFIG_IDF_TARGET_LINUX)
#include <sys/ioctl.h> #include <sys/ioctl.h>
@ -87,9 +88,9 @@ size_t _mdns_get_packet_len(mdns_rx_packet_t *packet)
void _mdns_packet_free(mdns_rx_packet_t *packet) void _mdns_packet_free(mdns_rx_packet_t *packet)
{ {
free(packet->pb->payload); mdns_mem_free(packet->pb->payload);
free(packet->pb); mdns_mem_free(packet->pb);
free(packet); mdns_mem_free(packet);
} }
esp_err_t _mdns_pcb_deinit(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol) esp_err_t _mdns_pcb_deinit(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol)
@ -297,13 +298,13 @@ void sock_recv_task(void *arg)
inet_to_espaddr(&raddr, &addr, &port); inet_to_espaddr(&raddr, &addr, &port);
// Allocate the packet structure and pass it to the mdns main engine // Allocate the packet structure and pass it to the mdns main engine
mdns_rx_packet_t *packet = (mdns_rx_packet_t *) calloc(1, sizeof(mdns_rx_packet_t)); mdns_rx_packet_t *packet = (mdns_rx_packet_t *) mdns_mem_calloc(1, sizeof(mdns_rx_packet_t));
struct pbuf *packet_pbuf = calloc(1, sizeof(struct pbuf)); struct pbuf *packet_pbuf = mdns_mem_calloc(1, sizeof(struct pbuf));
uint8_t *buf = malloc(len); uint8_t *buf = mdns_mem_malloc(len);
if (packet == NULL || packet_pbuf == NULL || buf == NULL ) { if (packet == NULL || packet_pbuf == NULL || buf == NULL) {
free(buf); mdns_mem_free(buf);
free(packet_pbuf); mdns_mem_free(packet_pbuf);
free(packet); mdns_mem_free(packet);
HOOK_MALLOC_FAILED; HOOK_MALLOC_FAILED;
ESP_LOGE(TAG, "Failed to allocate the mdns packet"); ESP_LOGE(TAG, "Failed to allocate the mdns packet");
continue; continue;
@ -326,9 +327,9 @@ void sock_recv_task(void *arg)
packet->src.type == ESP_IPADDR_TYPE_V4 ? MDNS_IP_PROTOCOL_V4 : MDNS_IP_PROTOCOL_V6; packet->src.type == ESP_IPADDR_TYPE_V4 ? MDNS_IP_PROTOCOL_V4 : MDNS_IP_PROTOCOL_V6;
if (_mdns_send_rx_action(packet) != ESP_OK) { if (_mdns_send_rx_action(packet) != ESP_OK) {
ESP_LOGE(TAG, "_mdns_send_rx_action failed!"); ESP_LOGE(TAG, "_mdns_send_rx_action failed!");
free(packet->pb->payload); mdns_mem_free(packet->pb->payload);
free(packet->pb); mdns_mem_free(packet->pb);
free(packet); mdns_mem_free(packet);
} }
} }
} }
@ -341,7 +342,7 @@ static void mdns_networking_init(void)
{ {
if (s_run_sock_recv_task == false) { if (s_run_sock_recv_task == false) {
s_run_sock_recv_task = true; s_run_sock_recv_task = true;
xTaskCreate( sock_recv_task, "mdns recv task", 3 * 1024, NULL, 5, NULL ); xTaskCreate(sock_recv_task, "mdns recv task", 3 * 1024, NULL, 5, NULL);
} }
} }
@ -392,7 +393,7 @@ static int create_socket(esp_netif_t *netif)
} }
int on = 1; int on = 1;
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ) < 0) { if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) {
ESP_LOGE(TAG, "Failed setsockopt() to set SO_REUSEADDR. errno=%d: %s\n", errno, strerror(errno)); ESP_LOGE(TAG, "Failed setsockopt() to set SO_REUSEADDR. errno=%d: %s\n", errno, strerror(errno));
} }
// Bind the socket to any address // Bind the socket to any address
@ -419,7 +420,7 @@ static int create_socket(esp_netif_t *netif)
#endif // CONFIG_LWIP_IPV6 #endif // CONFIG_LWIP_IPV6
struct ifreq ifr; struct ifreq ifr;
esp_netif_get_netif_impl_name(netif, ifr.ifr_name); esp_netif_get_netif_impl_name(netif, ifr.ifr_name);
int ret = setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(struct ifreq)); int ret = setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(struct ifreq));
if (ret < 0) { if (ret < 0) {
ESP_LOGE(TAG, "\"%s\" Unable to bind socket to specified interface. errno=%d: %s", esp_netif_get_desc(netif), errno, strerror(errno)); ESP_LOGE(TAG, "\"%s\" Unable to bind socket to specified interface. errno=%d: %s", esp_netif_get_desc(netif), errno, strerror(errno));
goto err; goto err;

View File

@ -0,0 +1,54 @@
# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import re
import sys
# Configurable prefix for memory functions
MDNS_MEM_PREFIX = 'mdns_mem_' # Change this to modify the prefix
def add_prefix_to_mem_funcs(content):
# List of memory functions to prefix
mem_funcs = [
'malloc',
'calloc',
'free',
'strdup',
'strndup'
]
# Create regex pattern matching the memory functions but not already prefixed ones
pattern = fr'(?<!{MDNS_MEM_PREFIX})(?<![\w])(' + '|'.join(mem_funcs) + r')(?=\s*\()'
# Replace all occurrences with configured prefix
modified = re.sub(pattern, fr'{MDNS_MEM_PREFIX}\1', content)
return modified
def process_file(filename):
try:
# Read the file
with open(filename, 'r') as f:
content = f.read()
# Add prefixes
modified = add_prefix_to_mem_funcs(content)
# Write back to file
with open(filename, 'w') as f:
f.write(modified)
print(f'Successfully processed {filename}')
except Exception as e:
print(f'Error processing {filename}: {str(e)}')
sys.exit(1)
if __name__ == '__main__':
if len(sys.argv) != 2:
print('Usage: python script.py <filename>')
sys.exit(1)
process_file(sys.argv[1])

View File

@ -0,0 +1,52 @@
/*
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Allocate memory.
* @param size Number of bytes to allocate.
* @return Pointer to allocated memory, or NULL on failure.
*/
void *mdns_mem_malloc(size_t size);
/**
* @brief Allocate and zero memory.
* @param num Number of elements.
* @param size Size of each element.
* @return Pointer to allocated memory, or NULL on failure.
*/
void *mdns_mem_calloc(size_t num, size_t size);
/**
* @brief Free allocated memory.
* @param ptr Pointer to memory to free.
*/
void mdns_mem_free(void *ptr);
/**
* @brief Duplicate a string.
* @param s String to duplicate.
* @return Pointer to duplicated string, or NULL on failure.
*/
char *mdns_mem_strdup(const char *s);
/**
* @brief Duplicate a string with length limit.
* @param s String to duplicate.
* @param n Maximum number of characters to copy.
* @return Pointer to duplicated string, or NULL on failure.
*/
char *mdns_mem_strndup(const char *s, size_t n);
#ifdef __cplusplus
}
#endif

View File

@ -36,6 +36,13 @@
#define MDNS_TASK_MEMORY_LOG "internal RAM" #define MDNS_TASK_MEMORY_LOG "internal RAM"
#endif #endif
#if CONFIG_MDNS_MEMORY_ALLOC_SPIRAM
#define MDNS_MEMORY_CAPS (MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT)
#endif
#if CONFIG_MDNS_MEMORY_ALLOC_INTERNAL
#define MDNS_MEMORY_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)
#endif
/** Number of predefined interfaces */ /** Number of predefined interfaces */
#ifndef CONFIG_MDNS_PREDEF_NETIF_STA #ifndef CONFIG_MDNS_PREDEF_NETIF_STA
#define CONFIG_MDNS_PREDEF_NETIF_STA 0 #define CONFIG_MDNS_PREDEF_NETIF_STA 0

View File

@ -135,3 +135,28 @@ void heap_caps_free(void *ptr)
{ {
free(ptr); free(ptr);
} }
void *mdns_mem_malloc(size_t size)
{
return malloc(size);
}
void *mdns_mem_calloc(size_t num, size_t size)
{
return calloc(num, size);
}
void mdns_mem_free(void *ptr)
{
free(ptr);
}
char *mdns_mem_strdup(const char *s)
{
return strdup(s);
}
char *mdns_mem_strndup(const char *s, size_t n)
{
return strndup(s, n);
}