Skip to content

Commit 3235b32

Browse files
committed
feat(mdns): Querier-search stuff, Responder-pcb stuff
1 parent dffede9 commit 3235b32

File tree

18 files changed

+1242
-1068
lines changed

18 files changed

+1242
-1068
lines changed

components/mdns/mdns.c

Lines changed: 134 additions & 515 deletions
Large diffs are not rendered by default.

components/mdns/mdns_browser.c

Lines changed: 105 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,49 @@
1313
#include "mdns_querier.h"
1414
#include "esp_log.h"
1515

16-
static const char *TAG = "mdns_send";
16+
static const char *TAG = "mdns_browser";
1717

18+
static mdns_browse_t *s_browse;
19+
20+
void mdns_browse_send_all(mdns_if_t mdns_if)
21+
{
22+
mdns_browse_t *browse = s_browse;
23+
while (browse) {
24+
_mdns_browse_send(browse, mdns_if);
25+
browse = browse->next;
26+
}
27+
}
28+
29+
void mdns_browse_free(void)
30+
{
31+
while (s_browse) {
32+
mdns_browse_t *b = s_browse;
33+
s_browse = s_browse->next;
34+
_mdns_browse_item_free(b);
35+
}
36+
}
37+
38+
/**
39+
* @brief Mark browse as finished, remove and free it from browse chain
40+
*/
41+
void _mdns_browse_finish(mdns_browse_t *browse)
42+
{
43+
browse->state = BROWSE_OFF;
44+
mdns_browse_t *b = s_browse;
45+
mdns_browse_t *target_free = NULL;
46+
while (b) {
47+
if (strlen(b->service) == strlen(browse->service) && memcmp(b->service, browse->service, strlen(b->service)) == 0 &&
48+
strlen(b->proto) == strlen(browse->proto) && memcmp(b->proto, browse->proto, strlen(b->proto)) == 0) {
49+
target_free = b;
50+
b = b->next;
51+
queueDetach(mdns_browse_t, s_browse, target_free);
52+
_mdns_browse_item_free(target_free);
53+
} else {
54+
b = b->next;
55+
}
56+
}
57+
_mdns_browse_item_free(browse);
58+
}
1859

1960
/**
2061
* @brief Send PTR query packet to all available interfaces for browsing.
@@ -125,3 +166,66 @@ esp_err_t mdns_browse_delete(const char *service, const char *proto)
125166
}
126167
return ESP_OK;
127168
}
169+
170+
/**
171+
* @brief Add new browse to the browse chain
172+
*/
173+
void _mdns_browse_add(mdns_browse_t *browse)
174+
{
175+
browse->state = BROWSE_RUNNING;
176+
mdns_browse_t *queue = s_browse;
177+
bool found = false;
178+
// looking for this browse in active browses
179+
while (queue) {
180+
if (strlen(queue->service) == strlen(browse->service) && memcmp(queue->service, browse->service, strlen(queue->service)) == 0 &&
181+
strlen(queue->proto) == strlen(browse->proto) && memcmp(queue->proto, browse->proto, strlen(queue->proto)) == 0) {
182+
found = true;
183+
break;
184+
}
185+
queue = queue->next;
186+
}
187+
if (!found) {
188+
browse->next = s_browse;
189+
s_browse = browse;
190+
}
191+
for (uint8_t interface_idx = 0; interface_idx < MDNS_MAX_INTERFACES; interface_idx++) {
192+
_mdns_browse_send(browse, (mdns_if_t)interface_idx);
193+
}
194+
if (found) {
195+
_mdns_browse_item_free(browse);
196+
}
197+
}
198+
199+
/**
200+
* @brief Called from packet parser to find matching running search
201+
*/
202+
mdns_browse_t *_mdns_browse_find(mdns_name_t *name, uint16_t type, mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol)
203+
{
204+
mdns_browse_t *b = s_browse;
205+
// For browse, we only care about the SRV, TXT, A and AAAA
206+
if (type != MDNS_TYPE_SRV && type != MDNS_TYPE_A && type != MDNS_TYPE_AAAA && type != MDNS_TYPE_TXT) {
207+
return NULL;
208+
}
209+
mdns_result_t *r = NULL;
210+
while (b) {
211+
if (type == MDNS_TYPE_SRV || type == MDNS_TYPE_TXT) {
212+
if (strcasecmp(name->service, b->service)
213+
|| strcasecmp(name->proto, b->proto)) {
214+
b = b->next;
215+
continue;
216+
}
217+
return b;
218+
} else if (type == MDNS_TYPE_A || type == MDNS_TYPE_AAAA) {
219+
r = b->result;
220+
while (r) {
221+
if (r->esp_netif == _mdns_get_esp_netif(tcpip_if) && r->ip_protocol == ip_protocol && !mdns_utils_str_null_or_empty(r->hostname) && !strcasecmp(name->host, r->hostname)) {
222+
return b;
223+
}
224+
r = r->next;
225+
}
226+
b = b->next;
227+
continue;
228+
}
229+
}
230+
return b;
231+
}

components/mdns/mdns_netif.c

Lines changed: 3 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ esp_netif_t *_mdns_get_esp_netif(mdns_if_t tcpip_if)
143143
/*
144144
* @brief Clean internal mdns interface's pointer
145145
*/
146-
static inline void _mdns_clean_netif_ptr(mdns_if_t tcpip_if)
146+
void _mdns_clean_netif_ptr(mdns_if_t tcpip_if)
147147
{
148148
if (tcpip_if < MDNS_MAX_INTERFACES) {
149149
s_esp_netifs[tcpip_if].netif = NULL;
@@ -168,125 +168,7 @@ static mdns_if_t _mdns_get_if_from_esp_netif(esp_netif_t *esp_netif)
168168
}
169169
return MDNS_MAX_INTERFACES;
170170
}
171-
/**
172-
* @brief Check if interface is duplicate (two interfaces on the same subnet)
173-
*/
174-
bool _mdns_if_is_dup(mdns_if_t tcpip_if)
175-
{
176-
mdns_if_t other_if = _mdns_get_other_if(tcpip_if);
177-
if (other_if == MDNS_MAX_INTERFACES) {
178-
return false;
179-
}
180-
mdns_pcb_state_t state_v4 = mdns_utils_get_pcb(tcpip_if, MDNS_IP_PROTOCOL_V4)->state;
181-
mdns_pcb_state_t state_v6 = mdns_utils_get_pcb(tcpip_if, MDNS_IP_PROTOCOL_V6)->state;
182-
mdns_pcb_state_t other_state_v4 = mdns_utils_get_pcb(other_if, MDNS_IP_PROTOCOL_V4)->state;
183-
mdns_pcb_state_t other_state_v6 = mdns_utils_get_pcb(other_if, MDNS_IP_PROTOCOL_V6)->state;
184-
185-
if (state_v4 == PCB_DUP || state_v6 == PCB_DUP || other_state_v4 == PCB_DUP || other_state_v6 == PCB_DUP) {
186-
return true;
187-
}
188-
return false;
189-
}
190-
191-
static esp_err_t mdns_pcb_deinit_local(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_proto)
192-
{
193-
esp_err_t err = _mdns_pcb_deinit(tcpip_if, ip_proto);
194-
mdns_pcb_t *_pcb = mdns_utils_get_pcb(tcpip_if, ip_proto);
195-
if (_pcb == NULL || err != ESP_OK) {
196-
return err;
197-
}
198-
mdns_mem_free(_pcb->probe_services);
199-
_pcb->state = PCB_OFF;
200-
_pcb->probe_ip = false;
201-
_pcb->probe_services = NULL;
202-
_pcb->probe_services_len = 0;
203-
_pcb->probe_running = false;
204-
_pcb->failed_probes = 0;
205-
return ESP_OK;
206-
}
207-
208-
/**
209-
* @brief Restart the responder on particular PCB
210-
*/
211-
static void _mdns_restart_pcb(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol)
212-
{
213-
size_t srv_count = 0;
214-
mdns_srv_item_t *a = mdns_utils_get_services();
215-
while (a) {
216-
srv_count++;
217-
a = a->next;
218-
}
219-
if (srv_count == 0) {
220-
// proble only IP
221-
_mdns_init_pcb_probe(tcpip_if, ip_protocol, NULL, 0, true);
222-
return;
223-
}
224-
mdns_srv_item_t *services[srv_count];
225-
size_t i = 0;
226-
a = mdns_utils_get_services();
227-
while (a) {
228-
services[i++] = a;
229-
a = a->next;
230-
}
231-
_mdns_init_pcb_probe(tcpip_if, ip_protocol, services, srv_count, true);
232-
}
233-
234-
/**
235-
* @brief Disable mDNS interface
236-
*/
237-
void _mdns_disable_pcb(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol)
238-
{
239-
_mdns_clean_netif_ptr(tcpip_if);
240-
241-
if (mdns_is_netif_ready(tcpip_if, ip_protocol)) {
242-
_mdns_clear_pcb_tx_queue_head(tcpip_if, ip_protocol);
243-
mdns_pcb_deinit_local(tcpip_if, ip_protocol);
244-
mdns_if_t other_if = _mdns_get_other_if(tcpip_if);
245-
if (other_if != MDNS_MAX_INTERFACES && mdns_utils_get_pcb(other_if, ip_protocol)->state == PCB_DUP) {
246-
mdns_utils_get_pcb(other_if, ip_protocol)->state = PCB_OFF;
247-
_mdns_enable_pcb(other_if, ip_protocol);
248-
}
249-
}
250-
mdns_utils_get_pcb(tcpip_if, ip_protocol)->state = PCB_OFF;
251-
}
252171

253-
/**
254-
* @brief Enable mDNS interface
255-
*/
256-
void _mdns_enable_pcb(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol)
257-
{
258-
if (!mdns_is_netif_ready(tcpip_if, ip_protocol)) {
259-
if (_mdns_pcb_init(tcpip_if, ip_protocol)) {
260-
mdns_utils_get_pcb(tcpip_if, ip_protocol)->failed_probes = 0;
261-
return;
262-
}
263-
}
264-
_mdns_restart_pcb(tcpip_if, ip_protocol);
265-
}
266-
267-
/**
268-
* @brief Set interface as duplicate if another is found on the same subnet
269-
*/
270-
void _mdns_dup_interface(mdns_if_t tcpip_if)
271-
{
272-
uint8_t i;
273-
mdns_if_t other_if = _mdns_get_other_if(tcpip_if);
274-
if (other_if == MDNS_MAX_INTERFACES) {
275-
return; // no other interface found
276-
}
277-
for (i = 0; i < MDNS_IP_PROTOCOL_MAX; i++) {
278-
if (mdns_is_netif_ready(other_if, i)) {
279-
//stop this interface and mark as dup
280-
if (mdns_is_netif_ready(tcpip_if, i)) {
281-
_mdns_clear_pcb_tx_queue_head(tcpip_if, i);
282-
mdns_pcb_deinit_local(tcpip_if, i);
283-
}
284-
mdns_utils_get_pcb(tcpip_if, i)->state = PCB_DUP;
285-
// _mdns_server->interfaces[tcpip_if].pcbs[i].state = PCB_DUP;
286-
_mdns_announce_pcb(other_if, i, NULL, 0, true);
287-
}
288-
}
289-
}
290172

291173
/**
292174
* @brief Dispatch interface changes based on system events
@@ -379,11 +261,8 @@ void mdns_preset_if_handle_system_event(void *arg, esp_event_base_t event_base,
379261
}
380262
post_mdns_enable_pcb(mdns_if, MDNS_IP_PROTOCOL_V6);
381263
post_mdns_announce_pcb(mdns_if, MDNS_IP_PROTOCOL_V4);
382-
mdns_browse_t *browse = mdns_utils_get_browse();
383-
while (browse) {
384-
_mdns_browse_send(browse, mdns_if);
385-
browse = browse->next;
386-
}
264+
mdns_browse_send_all(mdns_if);
265+
387266
}
388267
break;
389268
default:
@@ -543,14 +422,3 @@ esp_err_t mdns_netif_deinit(void)
543422
}
544423
return ESP_OK;
545424
}
546-
547-
esp_err_t mdns_netif_free(void)
548-
{
549-
for (int i = 0; i < MDNS_MAX_INTERFACES; i++) {
550-
for (int j = 0; j < MDNS_IP_PROTOCOL_MAX; j++) {
551-
mdns_pcb_deinit_local(i, j);
552-
}
553-
}
554-
return ESP_OK;
555-
556-
}

0 commit comments

Comments
 (0)