]> granicus.if.org Git - esp-idf/blobdiff - components/mdns/mdns_networking.c
Merge branch 'bugfix/mdns_udp_send_protected_backport3.2' into 'release/v3.2'
[esp-idf] / components / mdns / mdns_networking.c
index 4e64e36cf61f81600fa7349e9dbfdcdb971a3e6e..981b9d8252662c53da9c2da2d3da33fafb466831 100644 (file)
@@ -5,6 +5,7 @@
  */
 #include <string.h>
 #include "mdns_networking.h"
+#include "esp_log.h"
 
 
 extern mdns_server_t * _mdns_server;
@@ -13,6 +14,7 @@ extern mdns_server_t * _mdns_server;
  * MDNS Server Networking
  *
  */
+static const char *TAG = "MDNS_Networking";
 
 static struct udp_pcb * _pcb_main = NULL;
 
@@ -62,6 +64,12 @@ static esp_err_t _udp_join_group(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t
 {
     struct netif * netif = NULL;
     void * nif = NULL;
+
+    if (!tcpip_adapter_is_netif_up(tcpip_if)) {
+        // Network interface went down before event propagated, skipping IGMP config
+        return ESP_ERR_INVALID_STATE;
+    }
+
     esp_err_t err = tcpip_adapter_get_netif(tcpip_if, &nif);
     if (err) {
         return ESP_ERR_INVALID_ARG;
@@ -112,6 +120,7 @@ static void _udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *pb, const ip
 
         mdns_rx_packet_t * packet = (mdns_rx_packet_t *)malloc(sizeof(mdns_rx_packet_t));
         if (!packet) {
+            HOOK_MALLOC_FAILED;
             //missed packet - no memory
             pbuf_free(this_pb);
             continue;
@@ -233,6 +242,9 @@ typedef struct {
     struct tcpip_api_call_data call;
     tcpip_adapter_if_t tcpip_if;
     mdns_ip_protocol_t ip_protocol;
+    struct pbuf *pbt;
+    const ip_addr_t *ip;
+    uint16_t port;
     esp_err_t err;
 } mdns_api_call_t;
 
@@ -268,7 +280,7 @@ esp_err_t _mdns_pcb_init(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_prot
         .tcpip_if = tcpip_if,
         .ip_protocol = ip_protocol
     };
-    tcpip_api_call(_mdns_pcb_init_api, (struct tcpip_api_call_data*)&msg);
+    tcpip_api_call(_mdns_pcb_init_api, &msg.call);
     return msg.err;
 }
 
@@ -278,29 +290,44 @@ esp_err_t _mdns_pcb_deinit(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_pr
         .tcpip_if = tcpip_if,
         .ip_protocol = ip_protocol
     };
-    tcpip_api_call(_mdns_pcb_deinit_api, (struct tcpip_api_call_data*)&msg);
+    tcpip_api_call(_mdns_pcb_deinit_api, &msg.call);
     return msg.err;
 }
 
-size_t _mdns_udp_pcb_write(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_protocol, const ip_addr_t *ip, uint16_t port, uint8_t * data, size_t len)
+static err_t _mdns_udp_pcb_write_api(struct tcpip_api_call_data *api_call_msg)
 {
-    struct netif * netif = NULL;
     void * nif = NULL;
-    esp_err_t err = tcpip_adapter_get_netif(tcpip_if, &nif);
-    netif = (struct netif *)nif;
+    mdns_api_call_t * msg = (mdns_api_call_t *)api_call_msg;
+    mdns_pcb_t * _pcb = &_mdns_server->interfaces[msg->tcpip_if].pcbs[msg->ip_protocol];
+    esp_err_t err = tcpip_adapter_get_netif(msg->tcpip_if, &nif);
     if (err) {
-        return 0;
+        msg->err = err;
+        return err;
     }
+    err = udp_sendto_if (_pcb->pcb, msg->pbt, msg->ip, msg->port, (struct netif *)nif);
+    pbuf_free(msg->pbt);
+    msg->err = err;
+    return err;
+}
 
+size_t _mdns_udp_pcb_write(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_protocol, const ip_addr_t *ip, uint16_t port, uint8_t * data, size_t len)
+{
     struct pbuf* pbt = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
     if (pbt == NULL) {
         return 0;
     }
     memcpy((uint8_t *)pbt->payload, data, len);
 
-    err = udp_sendto_if (_mdns_server->interfaces[tcpip_if].pcbs[ip_protocol].pcb, pbt, ip, port, netif);
-    pbuf_free(pbt);
-    if (err) {
+    mdns_api_call_t msg = {
+        .tcpip_if = tcpip_if,
+        .ip_protocol = ip_protocol,
+        .pbt = pbt,
+        .ip = ip,
+        .port = port
+    };
+    tcpip_api_call(_mdns_udp_pcb_write_api, &msg.call);
+
+    if (msg.err) {
         return 0;
     }
     return len;