mirror of
https://github.com/espressif/esp-protocols.git
synced 2025-07-16 03:52:13 +02:00
committed by
suren-gabrielyan-espressif
parent
75de31cea3
commit
4a8582f500
@ -14,6 +14,7 @@
|
||||
#include "mdns.h"
|
||||
|
||||
#include <string.h>
|
||||
#ifndef MDNS_TEST_MODE
|
||||
#include "sdkconfig.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/queue.h"
|
||||
@ -23,6 +24,7 @@
|
||||
#include "lwip/igmp.h"
|
||||
#include "lwip/udp.h"
|
||||
#include "esp_wifi.h"
|
||||
#endif
|
||||
|
||||
#define MDNS_FLAGS_AUTHORITATIVE 0x8400
|
||||
|
||||
@ -162,6 +164,9 @@ static const char * MDNS_DEFAULT_DOMAIN = "local";
|
||||
static const char * MDNS_SUB_STR = "_sub";
|
||||
|
||||
static mdns_server_t * _mdns_servers[TCPIP_ADAPTER_IF_MAX] = {0,0,0};
|
||||
|
||||
#ifndef MDNS_TEST_MODE
|
||||
|
||||
static TaskHandle_t _mdns_service_task_handle = NULL;
|
||||
static QueueSetHandle_t _mdns_queue_set = NULL;
|
||||
|
||||
@ -257,6 +262,7 @@ esp_err_t _mdns_server_deinit(mdns_server_t * server)
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief send packet over UDP
|
||||
@ -269,25 +275,28 @@ esp_err_t _mdns_server_deinit(mdns_server_t * server)
|
||||
*/
|
||||
static size_t _mdns_server_write(mdns_server_t * server, uint8_t * data, size_t len)
|
||||
{
|
||||
struct pbuf* pbt = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
|
||||
if (pbt == NULL) {
|
||||
return 0;
|
||||
}
|
||||
uint8_t* dst = (uint8_t *)pbt->payload;
|
||||
memcpy(dst, data, len);
|
||||
err_t err = udp_sendto(server->pcb, pbt, &(server->pcb->remote_ip), server->pcb->remote_port);
|
||||
pbuf_free(pbt);
|
||||
if (err) {
|
||||
return 0;
|
||||
}
|
||||
return len;
|
||||
#ifndef MDNS_TEST_MODE
|
||||
struct pbuf* pbt = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
|
||||
if (pbt == NULL) {
|
||||
return 0;
|
||||
}
|
||||
uint8_t* dst = (uint8_t *)pbt->payload;
|
||||
memcpy(dst, data, len);
|
||||
err_t err = udp_sendto(server->pcb, pbt, &(server->pcb->remote_ip), server->pcb->remote_port);
|
||||
pbuf_free(pbt);
|
||||
if (err) {
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
return len;
|
||||
}
|
||||
|
||||
/*
|
||||
* MDNS Servers
|
||||
* */
|
||||
|
||||
static void _mdns_parse_packet(mdns_server_t * server, const uint8_t * data, size_t len);
|
||||
#ifndef MDNS_TEST_MODE
|
||||
void mdns_parse_packet(mdns_server_t * server, const uint8_t * data, size_t len);
|
||||
|
||||
/**
|
||||
* @brief the main MDNS service task. Packets are received and parsed here
|
||||
@ -305,7 +314,7 @@ static void _mdns_service_task(void *pvParameters)
|
||||
mdns_server_t * server = _mdns_servers[i];
|
||||
if (server && server->queue == queue) {
|
||||
MDNS_MUTEX_LOCK();
|
||||
_mdns_parse_packet(server, (uint8_t*)pb->payload, pb->len);
|
||||
mdns_parse_packet(server, (uint8_t*)pb->payload, pb->len);
|
||||
MDNS_MUTEX_UNLOCK();
|
||||
break;
|
||||
}
|
||||
@ -314,6 +323,7 @@ static void _mdns_service_task(void *pvParameters)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief get the server assigned to particular interface
|
||||
@ -342,6 +352,7 @@ static mdns_server_t * _mdns_server_get(tcpip_adapter_if_t tcpip_if)
|
||||
*/
|
||||
static esp_err_t _mdns_server_add(mdns_server_t * server)
|
||||
{
|
||||
#ifndef MDNS_TEST_MODE
|
||||
if (!_mdns_service_semaphore) {
|
||||
_mdns_service_semaphore = xSemaphoreCreateMutex();
|
||||
if (!_mdns_service_semaphore) {
|
||||
@ -374,7 +385,7 @@ static esp_err_t _mdns_server_add(mdns_server_t * server)
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
#endif
|
||||
_mdns_servers[server->tcpip_if] = server;
|
||||
|
||||
return ESP_OK;
|
||||
@ -392,7 +403,7 @@ static esp_err_t _mdns_server_add(mdns_server_t * server)
|
||||
static esp_err_t _mdns_server_remove(mdns_server_t * server)
|
||||
{
|
||||
_mdns_servers[server->tcpip_if] = NULL;
|
||||
|
||||
#ifndef MDNS_TEST_MODE
|
||||
//stop UDP
|
||||
_mdns_server_deinit(server);
|
||||
|
||||
@ -417,7 +428,7 @@ static esp_err_t _mdns_server_remove(mdns_server_t * server)
|
||||
}
|
||||
MDNS_SERVICE_UNLOCK();
|
||||
}
|
||||
|
||||
#endif
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
@ -1294,7 +1305,7 @@ static inline uint16_t _mdns_read_u16(const uint8_t * packet, uint16_t index)
|
||||
* @param data byte array holding the packet data
|
||||
* @param len length of the byte array
|
||||
*/
|
||||
static void _mdns_parse_packet(mdns_server_t * server, const uint8_t * data, size_t len)
|
||||
void mdns_parse_packet(mdns_server_t * server, const uint8_t * data, size_t len)
|
||||
{
|
||||
static mdns_name_t n;
|
||||
static mdns_result_temp_t a;
|
||||
@ -1401,7 +1412,6 @@ static void _mdns_parse_packet(mdns_server_t * server, const uint8_t * data, siz
|
||||
const uint8_t * data_ptr = content + MDNS_DATA_OFFSET;
|
||||
|
||||
content = data_ptr + data_len;
|
||||
|
||||
if(content > (data + len)){
|
||||
return;
|
||||
}
|
||||
@ -1410,18 +1420,22 @@ static void _mdns_parse_packet(mdns_server_t * server, const uint8_t * data, siz
|
||||
if (!_mdns_parse_fqdn(data, data_ptr, name)) {
|
||||
continue;//error
|
||||
}
|
||||
#ifndef MDNS_TEST_MODE
|
||||
if (server->search.host[0] ||
|
||||
(strcmp(name->service, server->search.service) != 0) ||
|
||||
(strcmp(name->proto, server->search.proto) != 0)) {
|
||||
continue;//not searching for service or wrong service/proto
|
||||
}
|
||||
#endif
|
||||
strlcpy(answer->instance, name->host, MDNS_NAME_BUF_LEN);
|
||||
} else if (type == MDNS_TYPE_SRV) {
|
||||
#ifndef MDNS_TEST_MODE
|
||||
if (server->search.host[0] ||
|
||||
(strcmp(name->service, server->search.service) != 0) ||
|
||||
(strcmp(name->proto, server->search.proto) != 0)) {
|
||||
continue;//not searching for service or wrong service/proto
|
||||
}
|
||||
#endif
|
||||
if (answer->instance[0]) {
|
||||
if (strcmp(answer->instance, name->host) != 0) {
|
||||
continue;//instance name is not the same as the one in the PTR record
|
||||
@ -1468,9 +1482,11 @@ static void _mdns_parse_packet(mdns_server_t * server, const uint8_t * data, siz
|
||||
answer->txt[b] = 0;
|
||||
} else if (type == MDNS_TYPE_AAAA) {
|
||||
if (server->search.host[0]) {
|
||||
#ifndef MDNS_TEST_MODE
|
||||
if (strcmp(name->host, server->search.host) != 0) {
|
||||
continue;//wrong host
|
||||
}
|
||||
#endif
|
||||
} else if (!answer->ptr) {
|
||||
strlcpy(answer->host, name->host, MDNS_NAME_BUF_LEN);
|
||||
} else if (strcmp(answer->host, name->host) != 0) {
|
||||
@ -1479,9 +1495,11 @@ static void _mdns_parse_packet(mdns_server_t * server, const uint8_t * data, siz
|
||||
memcpy(answer->addrv6, data_ptr, sizeof(ip6_addr_t));
|
||||
} else if (type == MDNS_TYPE_A) {
|
||||
if (server->search.host[0]) {
|
||||
#ifndef MDNS_TEST_MODE
|
||||
if (strcmp(name->host, server->search.host) != 0) {
|
||||
continue;//wrong host
|
||||
}
|
||||
#endif
|
||||
} else if (!answer->ptr) {
|
||||
strlcpy(answer->host, name->host, MDNS_NAME_BUF_LEN);
|
||||
} else if (strcmp(answer->host, name->host) != 0) {
|
||||
|
Reference in New Issue
Block a user