@@ -3059,6 +3059,29 @@ static bool _mdns_name_is_discovery(mdns_name_t *name, uint16_t type)
30593059 );
30603060}
30613061
3062+ /**
3063+ * @brief Check if the parsed name is self-hosted, i.e. we should resolve conflicts
3064+ */
3065+ static bool _mdns_name_is_selfhosted (mdns_name_t * name )
3066+ {
3067+ if (_str_null_or_empty (_mdns_server -> hostname )) { // self-hostname needs to be defined
3068+ return false;
3069+ }
3070+
3071+ // hostname only -- check if selfhosted name
3072+ if (_str_null_or_empty (name -> service ) && _str_null_or_empty (name -> proto ) &&
3073+ strcasecmp (name -> host , _mdns_server -> hostname ) == 0 ) {
3074+ return true;
3075+ }
3076+
3077+ // service -- check if selfhosted service
3078+ mdns_srv_item_t * srv = _mdns_get_service_item (name -> service , name -> proto , NULL );
3079+ if (srv && strcasecmp (_mdns_server -> hostname , srv -> service -> hostname ) == 0 ) {
3080+ return true;
3081+ }
3082+ return false;
3083+ }
3084+
30623085/**
30633086 * @brief Check if the parsed name is ours (matches service or host name)
30643087 */
@@ -3667,7 +3690,7 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
36673690 }
36683691 }
36693692 }
3670-
3693+ bool is_selfhosted = _mdns_name_is_selfhosted ( name );
36713694 if (!_mdns_parse_fqdn (data , data_ptr + MDNS_SRV_FQDN_OFFSET , name , len )) {
36723695 continue ;//error
36733696 }
@@ -3695,6 +3718,9 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
36953718 _mdns_remove_scheduled_answer (packet -> tcpip_if , packet -> ip_protocol , type , service );
36963719 continue ;
36973720 }
3721+ if (!is_selfhosted ) {
3722+ continue ;
3723+ }
36983724 //detect collision (-1=won, 0=none, 1=lost)
36993725 int col = 0 ;
37003726 if (mdns_class > 1 ) {
@@ -3785,6 +3811,9 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
37853811 _mdns_remove_parsed_question (parsed_packet , type , service );
37863812 continue ;
37873813 }
3814+ if (!_mdns_name_is_selfhosted (name )) {
3815+ continue ;
3816+ }
37883817 //detect collision (-1=won, 0=none, 1=lost)
37893818 int col = 0 ;
37903819 if (mdns_class > 1 ) {
@@ -3819,6 +3848,9 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
38193848 _mdns_remove_parsed_question (parsed_packet , type , NULL );
38203849 continue ;
38213850 }
3851+ if (!_mdns_name_is_selfhosted (name )) {
3852+ continue ;
3853+ }
38223854 //detect collision (-1=won, 0=none, 1=lost)
38233855 int col = 0 ;
38243856 if (mdns_class > 1 ) {
@@ -3869,6 +3901,9 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
38693901 _mdns_remove_parsed_question (parsed_packet , type , NULL );
38703902 continue ;
38713903 }
3904+ if (!_mdns_name_is_selfhosted (name )) {
3905+ continue ;
3906+ }
38723907 //detect collision (-1=won, 0=none, 1=lost)
38733908 int col = 0 ;
38743909 if (mdns_class > 1 ) {
@@ -5349,16 +5384,10 @@ esp_err_t mdns_init(void)
53495384 s_esp_netifs [i ].netif = NULL ;
53505385 }
53515386
5352- _mdns_server -> lock = xSemaphoreCreateMutex ();
5353- if (!_mdns_server -> lock ) {
5354- err = ESP_ERR_NO_MEM ;
5355- goto free_server ;
5356- }
5357-
53585387 _mdns_server -> action_queue = xQueueCreate (MDNS_ACTION_QUEUE_LEN , sizeof (mdns_action_t * ));
53595388 if (!_mdns_server -> action_queue ) {
53605389 err = ESP_ERR_NO_MEM ;
5361- goto free_lock ;
5390+ goto free_server ;
53625391 }
53635392
53645393 _mdns_server -> action_sema = xSemaphoreCreateBinary ();
@@ -5425,8 +5454,6 @@ esp_err_t mdns_init(void)
54255454 vSemaphoreDelete (_mdns_server -> action_sema );
54265455free_queue :
54275456 vQueueDelete (_mdns_server -> action_queue );
5428- free_lock :
5429- vSemaphoreDelete (_mdns_server -> lock );
54305457free_server :
54315458 free (_mdns_server );
54325459 _mdns_server = NULL ;
@@ -5474,7 +5501,6 @@ void mdns_free(void)
54745501 free (h );
54755502 }
54765503 vSemaphoreDelete (_mdns_server -> action_sema );
5477- vSemaphoreDelete (_mdns_server -> lock );
54785504 free (_mdns_server );
54795505 _mdns_server = NULL ;
54805506}
0 commit comments