Skip to content

Commit 2f85c07

Browse files
mdns: fix networking running udp_sendif from lwip thread
* Original commit: espressif/esp-idf@f7d4a4b
1 parent b30a7fe commit 2f85c07

File tree

1 file changed

+28
-10
lines changed

1 file changed

+28
-10
lines changed

components/mdns/mdns_networking.c

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,9 @@ typedef struct {
242242
struct tcpip_api_call_data call;
243243
tcpip_adapter_if_t tcpip_if;
244244
mdns_ip_protocol_t ip_protocol;
245+
struct pbuf *pbt;
246+
const ip_addr_t *ip;
247+
uint16_t port;
245248
esp_err_t err;
246249
} mdns_api_call_t;
247250

@@ -277,7 +280,7 @@ esp_err_t _mdns_pcb_init(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_prot
277280
.tcpip_if = tcpip_if,
278281
.ip_protocol = ip_protocol
279282
};
280-
tcpip_api_call(_mdns_pcb_init_api, (struct tcpip_api_call_data*)&msg);
283+
tcpip_api_call(_mdns_pcb_init_api, &msg.call);
281284
return msg.err;
282285
}
283286

@@ -287,29 +290,44 @@ esp_err_t _mdns_pcb_deinit(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_pr
287290
.tcpip_if = tcpip_if,
288291
.ip_protocol = ip_protocol
289292
};
290-
tcpip_api_call(_mdns_pcb_deinit_api, (struct tcpip_api_call_data*)&msg);
293+
tcpip_api_call(_mdns_pcb_deinit_api, &msg.call);
291294
return msg.err;
292295
}
293296

294-
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)
297+
static err_t _mdns_udp_pcb_write_api(struct tcpip_api_call_data *api_call_msg)
295298
{
296-
struct netif * netif = NULL;
297299
void * nif = NULL;
298-
esp_err_t err = tcpip_adapter_get_netif(tcpip_if, &nif);
299-
netif = (struct netif *)nif;
300+
mdns_api_call_t * msg = (mdns_api_call_t *)api_call_msg;
301+
mdns_pcb_t * _pcb = &_mdns_server->interfaces[msg->tcpip_if].pcbs[msg->ip_protocol];
302+
esp_err_t err = tcpip_adapter_get_netif(msg->tcpip_if, &nif);
300303
if (err) {
301-
return 0;
304+
msg->err = err;
305+
return err;
302306
}
307+
err = udp_sendto_if (_pcb->pcb, msg->pbt, msg->ip, msg->port, (struct netif *)nif);
308+
pbuf_free(msg->pbt);
309+
msg->err = err;
310+
return err;
311+
}
303312

313+
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)
314+
{
304315
struct pbuf* pbt = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
305316
if (pbt == NULL) {
306317
return 0;
307318
}
308319
memcpy((uint8_t *)pbt->payload, data, len);
309320

310-
err = udp_sendto_if (_mdns_server->interfaces[tcpip_if].pcbs[ip_protocol].pcb, pbt, ip, port, netif);
311-
pbuf_free(pbt);
312-
if (err) {
321+
mdns_api_call_t msg = {
322+
.tcpip_if = tcpip_if,
323+
.ip_protocol = ip_protocol,
324+
.pbt = pbt,
325+
.ip = ip,
326+
.port = port
327+
};
328+
tcpip_api_call(_mdns_udp_pcb_write_api, &msg.call);
329+
330+
if (msg.err) {
313331
return 0;
314332
}
315333
return len;

0 commit comments

Comments
 (0)