forked from espressif/esp-protocols
Merge pull request #225 from david-cermak/bugfix/mdns_wrong_name_collision
fix(mdns): Incorrect name collision
This commit is contained in:
@ -3059,6 +3059,29 @@ static bool _mdns_name_is_discovery(mdns_name_t *name, uint16_t type)
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if the parsed name is self-hosted, i.e. we should resolve conflicts
|
||||||
|
*/
|
||||||
|
static bool _mdns_name_is_selfhosted(mdns_name_t *name)
|
||||||
|
{
|
||||||
|
if (_str_null_or_empty(_mdns_server->hostname)) { // self-hostname needs to be defined
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// hostname only -- check if selfhosted name
|
||||||
|
if (_str_null_or_empty(name->service) && _str_null_or_empty(name->proto) &&
|
||||||
|
strcasecmp(name->host, _mdns_server->hostname) == 0 ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// service -- check if selfhosted service
|
||||||
|
mdns_srv_item_t *srv = _mdns_get_service_item(name->service, name->proto, NULL);
|
||||||
|
if (srv && strcasecmp(_mdns_server->hostname, srv->service->hostname) == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Check if the parsed name is ours (matches service or host name)
|
* @brief Check if the parsed name is ours (matches service or host name)
|
||||||
*/
|
*/
|
||||||
@ -3667,7 +3690,7 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
bool is_selfhosted = _mdns_name_is_selfhosted(name);
|
||||||
if (!_mdns_parse_fqdn(data, data_ptr + MDNS_SRV_FQDN_OFFSET, name, len)) {
|
if (!_mdns_parse_fqdn(data, data_ptr + MDNS_SRV_FQDN_OFFSET, name, len)) {
|
||||||
continue;//error
|
continue;//error
|
||||||
}
|
}
|
||||||
@ -3695,6 +3718,9 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
|
|||||||
_mdns_remove_scheduled_answer(packet->tcpip_if, packet->ip_protocol, type, service);
|
_mdns_remove_scheduled_answer(packet->tcpip_if, packet->ip_protocol, type, service);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!is_selfhosted) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
//detect collision (-1=won, 0=none, 1=lost)
|
//detect collision (-1=won, 0=none, 1=lost)
|
||||||
int col = 0;
|
int col = 0;
|
||||||
if (mdns_class > 1) {
|
if (mdns_class > 1) {
|
||||||
@ -3785,6 +3811,9 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
|
|||||||
_mdns_remove_parsed_question(parsed_packet, type, service);
|
_mdns_remove_parsed_question(parsed_packet, type, service);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!_mdns_name_is_selfhosted(name)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
//detect collision (-1=won, 0=none, 1=lost)
|
//detect collision (-1=won, 0=none, 1=lost)
|
||||||
int col = 0;
|
int col = 0;
|
||||||
if (mdns_class > 1) {
|
if (mdns_class > 1) {
|
||||||
@ -3819,6 +3848,9 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
|
|||||||
_mdns_remove_parsed_question(parsed_packet, type, NULL);
|
_mdns_remove_parsed_question(parsed_packet, type, NULL);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!_mdns_name_is_selfhosted(name)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
//detect collision (-1=won, 0=none, 1=lost)
|
//detect collision (-1=won, 0=none, 1=lost)
|
||||||
int col = 0;
|
int col = 0;
|
||||||
if (mdns_class > 1) {
|
if (mdns_class > 1) {
|
||||||
@ -3869,6 +3901,9 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
|
|||||||
_mdns_remove_parsed_question(parsed_packet, type, NULL);
|
_mdns_remove_parsed_question(parsed_packet, type, NULL);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!_mdns_name_is_selfhosted(name)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
//detect collision (-1=won, 0=none, 1=lost)
|
//detect collision (-1=won, 0=none, 1=lost)
|
||||||
int col = 0;
|
int col = 0;
|
||||||
if (mdns_class > 1) {
|
if (mdns_class > 1) {
|
||||||
@ -5349,16 +5384,10 @@ esp_err_t mdns_init(void)
|
|||||||
s_esp_netifs[i].netif = NULL;
|
s_esp_netifs[i].netif = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
_mdns_server->lock = xSemaphoreCreateMutex();
|
|
||||||
if (!_mdns_server->lock) {
|
|
||||||
err = ESP_ERR_NO_MEM;
|
|
||||||
goto free_server;
|
|
||||||
}
|
|
||||||
|
|
||||||
_mdns_server->action_queue = xQueueCreate(MDNS_ACTION_QUEUE_LEN, sizeof(mdns_action_t *));
|
_mdns_server->action_queue = xQueueCreate(MDNS_ACTION_QUEUE_LEN, sizeof(mdns_action_t *));
|
||||||
if (!_mdns_server->action_queue) {
|
if (!_mdns_server->action_queue) {
|
||||||
err = ESP_ERR_NO_MEM;
|
err = ESP_ERR_NO_MEM;
|
||||||
goto free_lock;
|
goto free_server;
|
||||||
}
|
}
|
||||||
|
|
||||||
_mdns_server->action_sema = xSemaphoreCreateBinary();
|
_mdns_server->action_sema = xSemaphoreCreateBinary();
|
||||||
@ -5425,8 +5454,6 @@ free_event_handlers:
|
|||||||
vSemaphoreDelete(_mdns_server->action_sema);
|
vSemaphoreDelete(_mdns_server->action_sema);
|
||||||
free_queue:
|
free_queue:
|
||||||
vQueueDelete(_mdns_server->action_queue);
|
vQueueDelete(_mdns_server->action_queue);
|
||||||
free_lock:
|
|
||||||
vSemaphoreDelete(_mdns_server->lock);
|
|
||||||
free_server:
|
free_server:
|
||||||
free(_mdns_server);
|
free(_mdns_server);
|
||||||
_mdns_server = NULL;
|
_mdns_server = NULL;
|
||||||
@ -5474,7 +5501,6 @@ void mdns_free(void)
|
|||||||
free(h);
|
free(h);
|
||||||
}
|
}
|
||||||
vSemaphoreDelete(_mdns_server->action_sema);
|
vSemaphoreDelete(_mdns_server->action_sema);
|
||||||
vSemaphoreDelete(_mdns_server->lock);
|
|
||||||
free(_mdns_server);
|
free(_mdns_server);
|
||||||
_mdns_server = NULL;
|
_mdns_server = NULL;
|
||||||
}
|
}
|
||||||
|
@ -382,7 +382,6 @@ typedef struct mdns_server_s {
|
|||||||
const char *hostname;
|
const char *hostname;
|
||||||
const char *instance;
|
const char *instance;
|
||||||
mdns_srv_item_t *services;
|
mdns_srv_item_t *services;
|
||||||
SemaphoreHandle_t lock;
|
|
||||||
QueueHandle_t action_queue;
|
QueueHandle_t action_queue;
|
||||||
SemaphoreHandle_t action_sema;
|
SemaphoreHandle_t action_sema;
|
||||||
mdns_tx_packet_t *tx_queue_head;
|
mdns_tx_packet_t *tx_queue_head;
|
||||||
|
Reference in New Issue
Block a user