Skip to content

Commit 48b819b

Browse files
mdns: update mdns to use esp-netif for mdns supported services such as STA, AP, ETH
removes also include dependency on lwip to use esp_netif defined address fields and structures * Original commit: espressif/esp-idf@19e24fe
1 parent dfcefc3 commit 48b819b

File tree

8 files changed

+226
-164
lines changed

8 files changed

+226
-164
lines changed

components/mdns/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ idf_component_register(SRCS "mdns.c"
33
"mdns_networking.c"
44
INCLUDE_DIRS "include"
55
PRIV_INCLUDE_DIRS "private_include"
6-
REQUIRES lwip mbedtls console tcpip_adapter)
6+
REQUIRES lwip mbedtls console esp_netif)
77

components/mdns/include/mdns.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
extern "C" {
1919
#endif
2020

21-
#include <tcpip_adapter.h>
21+
#include <esp_netif.h>
2222
#include "esp_event.h"
2323

2424
#define MDNS_TYPE_A 0x0001
@@ -52,17 +52,25 @@ typedef struct {
5252
* @brief mDNS query linked list IP item
5353
*/
5454
typedef struct mdns_ip_addr_s {
55-
ip_addr_t addr; /*!< IP address */
55+
esp_ip_addr_t addr; /*!< IP address */
5656
struct mdns_ip_addr_s * next; /*!< next IP, or NULL for the last IP in the list */
5757
} mdns_ip_addr_t;
5858

59+
typedef enum mdns_if_internal {
60+
MDNS_IF_STA = 0,
61+
MDNS_IF_AP = 1,
62+
MDNS_IF_ETH = 2,
63+
MDNS_IF_MAX
64+
} mdns_if_t;
65+
5966
/**
6067
* @brief mDNS query result structure
6168
*/
6269
typedef struct mdns_result_s {
6370
struct mdns_result_s * next; /*!< next result, or NULL for the last result in the list */
6471

65-
tcpip_adapter_if_t tcpip_if; /*!< interface on which the result came (AP/STA/ETH) */
72+
mdns_if_t tcpip_if; /*!< interface index */
73+
6674
mdns_ip_protocol_t ip_protocol; /*!< ip_protocol type of the interface (v4/v6) */
6775
// PTR
6876
char * instance_name; /*!< instance name */
@@ -329,7 +337,7 @@ esp_err_t mdns_query_txt(const char * instance_name, const char * service_type,
329337
* - ESP_ERR_NO_MEM memory error
330338
* - ESP_ERR_INVALID_ARG parameter error
331339
*/
332-
esp_err_t mdns_query_a(const char * host_name, uint32_t timeout, ip4_addr_t * addr);
340+
esp_err_t mdns_query_a(const char * host_name, uint32_t timeout, esp_ip4_addr_t * addr);
333341

334342
/**
335343
* @brief Query mDNS for A record
@@ -344,7 +352,7 @@ esp_err_t mdns_query_a(const char * host_name, uint32_t timeout, ip4_addr_t * ad
344352
* - ESP_ERR_NO_MEM memory error
345353
* - ESP_ERR_INVALID_ARG parameter error
346354
*/
347-
esp_err_t mdns_query_aaaa(const char * host_name, uint32_t timeout, ip6_addr_t * addr);
355+
esp_err_t mdns_query_aaaa(const char * host_name, uint32_t timeout, esp_ip6_addr_t * addr);
348356

349357
/**
350358
* @brief System event handler

components/mdns/mdns.c

Lines changed: 159 additions & 110 deletions
Large diffs are not rendered by default.

components/mdns/mdns_console.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ static void mdns_print_results(mdns_result_t * results)
4242
}
4343
a = r->addr;
4444
while (a) {
45-
if (a->addr.type == IPADDR_TYPE_V6) {
45+
if (a->addr.type == ESP_IPADDR_TYPE_V6) {
4646
printf(" AAAA: " IPV6STR "\n", IPV62STR(a->addr.u_addr.ip6));
4747
} else {
4848
printf(" A : " IPSTR "\n", IP2STR(&(a->addr.u_addr.ip4)));
@@ -81,7 +81,7 @@ static int cmd_mdns_query_a(int argc, char** argv)
8181

8282
printf("Query A: %s.local, Timeout: %d\n", hostname, timeout);
8383

84-
struct ip4_addr addr;
84+
struct esp_ip4_addr addr;
8585
addr.addr = 0;
8686

8787
esp_err_t err = mdns_query_a(hostname, timeout, &addr);
@@ -138,7 +138,7 @@ static int cmd_mdns_query_aaaa(int argc, char** argv)
138138

139139
printf("Query AAAA: %s.local, Timeout: %d\n", hostname, timeout);
140140

141-
struct ip6_addr addr;
141+
struct esp_ip6_addr addr;
142142
memset(addr.addr, 0, 16);
143143

144144
esp_err_t err = mdns_query_aaaa(hostname, timeout, &addr);

components/mdns/mdns_networking.c

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <string.h>
77
#include "mdns_networking.h"
88
#include "esp_log.h"
9+
#include "esp_netif_net_stack.h"
910

1011

1112
extern mdns_server_t * _mdns_server;
@@ -60,21 +61,18 @@ static void _udp_pcb_main_deinit(void)
6061
/**
6162
* @brief Low level UDP Multicast membership control
6263
*/
63-
static esp_err_t _udp_join_group(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_protocol, bool join)
64+
static esp_err_t _udp_join_group(mdns_if_t if_inx, mdns_ip_protocol_t ip_protocol, bool join)
6465
{
6566
struct netif * netif = NULL;
66-
void * nif = NULL;
67+
esp_netif_t *tcpip_if = _mdns_get_esp_netif(if_inx);
6768

68-
if (!tcpip_adapter_is_netif_up(tcpip_if)) {
69+
if (!esp_netif_is_netif_up(tcpip_if)) {
6970
// Network interface went down before event propagated, skipping IGMP config
7071
return ESP_ERR_INVALID_STATE;
7172
}
7273

73-
esp_err_t err = tcpip_adapter_get_netif(tcpip_if, &nif);
74-
if (err) {
75-
return ESP_ERR_INVALID_ARG;
76-
}
77-
netif = (struct netif *)nif;
74+
netif = esp_netif_get_netif_impl(tcpip_if);
75+
assert(netif);
7876

7977
if (ip_protocol == MDNS_IP_PROTOCOL_V4) {
8078
ip_addr_t multicast_addr;
@@ -126,7 +124,7 @@ static void _udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *pb, const ip
126124
continue;
127125
}
128126

129-
packet->tcpip_if = TCPIP_ADAPTER_IF_MAX;
127+
packet->tcpip_if = MDNS_IF_MAX;
130128
packet->pb = this_pb;
131129
packet->src_port = rport;
132130
memcpy(&packet->src, raddr, sizeof(ip_addr_t));
@@ -145,12 +143,10 @@ static void _udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *pb, const ip
145143

146144
//lwip does not return the proper pcb if you have more than one for the same multicast address (but different interfaces)
147145
struct netif * netif = NULL;
148-
void * nif = NULL;
149146
struct udp_pcb * pcb = NULL;
150-
for (i=0; i<TCPIP_ADAPTER_IF_MAX; i++) {
147+
for (i=0; i<MDNS_IF_MAX; i++) {
151148
pcb = _mdns_server->interfaces[i].pcbs[packet->ip_protocol].pcb;
152-
tcpip_adapter_get_netif (i, &nif);
153-
netif = (struct netif *)nif;
149+
netif = esp_netif_get_netif_impl(_mdns_get_esp_netif(i));
154150
if (pcb && netif && netif == ip_current_input_netif ()) {
155151
if (packet->src.type == IPADDR_TYPE_V4) {
156152
if ((packet->src.u_addr.ip4.addr & netif->netmask.u_addr.ip4.addr) != (netif->ip_addr.u_addr.ip4.addr & netif->netmask.u_addr.ip4.addr)) {
@@ -179,7 +175,7 @@ static void _udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *pb, const ip
179175
*/
180176
static bool _udp_pcb_is_in_use(void){
181177
int i, p;
182-
for (i=0; i<TCPIP_ADAPTER_IF_MAX; i++) {
178+
for (i=0; i<MDNS_IF_MAX; i++) {
183179
for (p=0; p<MDNS_IP_PROTOCOL_MAX; p++) {
184180
if(_mdns_server->interfaces[i].pcbs[p].pcb){
185181
return true;
@@ -192,7 +188,7 @@ static bool _udp_pcb_is_in_use(void){
192188
/**
193189
* @brief Stop PCB Main code
194190
*/
195-
static void _udp_pcb_deinit(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_protocol)
191+
static void _udp_pcb_deinit(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol)
196192
{
197193
if (!_mdns_server) {
198194
return;
@@ -217,7 +213,7 @@ static void _udp_pcb_deinit(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_p
217213
/**
218214
* @brief Start PCB Main code
219215
*/
220-
static esp_err_t _udp_pcb_init(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_protocol)
216+
static esp_err_t _udp_pcb_init(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol)
221217
{
222218
if (!_mdns_server || _mdns_server->interfaces[tcpip_if].pcbs[ip_protocol].pcb) {
223219
return ESP_ERR_INVALID_STATE;
@@ -240,7 +236,7 @@ static esp_err_t _udp_pcb_init(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t i
240236

241237
typedef struct {
242238
struct tcpip_api_call_data call;
243-
tcpip_adapter_if_t tcpip_if;
239+
mdns_if_t tcpip_if;
244240
mdns_ip_protocol_t ip_protocol;
245241
struct pbuf *pbt;
246242
const ip_addr_t *ip;
@@ -274,7 +270,7 @@ static err_t _mdns_pcb_deinit_api(struct tcpip_api_call_data *api_call_msg)
274270
* - _mdns prefixed
275271
* - commented in mdns_networking.h header
276272
*/
277-
esp_err_t _mdns_pcb_init(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_protocol)
273+
esp_err_t _mdns_pcb_init(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol)
278274
{
279275
mdns_api_call_t msg = {
280276
.tcpip_if = tcpip_if,
@@ -284,7 +280,7 @@ esp_err_t _mdns_pcb_init(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_prot
284280
return msg.err;
285281
}
286282

287-
esp_err_t _mdns_pcb_deinit(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_protocol)
283+
esp_err_t _mdns_pcb_deinit(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol)
288284
{
289285
mdns_api_call_t msg = {
290286
.tcpip_if = tcpip_if,
@@ -299,19 +295,19 @@ static err_t _mdns_udp_pcb_write_api(struct tcpip_api_call_data *api_call_msg)
299295
void * nif = NULL;
300296
mdns_api_call_t * msg = (mdns_api_call_t *)api_call_msg;
301297
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);
303-
if (err) {
298+
nif = esp_netif_get_netif_impl(_mdns_get_esp_netif(msg->tcpip_if));
299+
if (!nif) {
304300
pbuf_free(msg->pbt);
305-
msg->err = err;
306-
return err;
301+
msg->err = ERR_IF;
302+
return ERR_IF;
307303
}
308-
err = udp_sendto_if (_pcb->pcb, msg->pbt, msg->ip, msg->port, (struct netif *)nif);
304+
esp_err_t err = udp_sendto_if (_pcb->pcb, msg->pbt, msg->ip, msg->port, (struct netif *)nif);
309305
pbuf_free(msg->pbt);
310306
msg->err = err;
311307
return err;
312308
}
313309

314-
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)
310+
size_t _mdns_udp_pcb_write(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol, const esp_ip_addr_t *ip, uint16_t port, uint8_t * data, size_t len)
315311
{
316312
struct pbuf* pbt = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
317313
if (pbt == NULL) {
@@ -323,7 +319,7 @@ size_t _mdns_udp_pcb_write(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_pr
323319
.tcpip_if = tcpip_if,
324320
.ip_protocol = ip_protocol,
325321
.pbt = pbt,
326-
.ip = ip,
322+
.ip = (ip_addr_t *)ip,
327323
.port = port
328324
};
329325
tcpip_api_call(_mdns_udp_pcb_write_api, &msg.call);

components/mdns/private_include/mdns_networking.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ esp_err_t _mdns_send_rx_action(mdns_rx_packet_t * packet);
3434
/**
3535
* @brief Start PCB
3636
*/
37-
esp_err_t _mdns_pcb_init(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_protocol);
37+
esp_err_t _mdns_pcb_init(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol);
3838

3939
/**
4040
* @brief Stop PCB
4141
*/
42-
esp_err_t _mdns_pcb_deinit(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_protocol);
42+
esp_err_t _mdns_pcb_deinit(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol);
4343

4444
/**
4545
* @brief send packet over UDP
@@ -50,6 +50,6 @@ esp_err_t _mdns_pcb_deinit(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_pr
5050
*
5151
* @return length of sent packet or 0 on error
5252
*/
53-
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);
53+
size_t _mdns_udp_pcb_write(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol, const esp_ip_addr_t *ip, uint16_t port, uint8_t * data, size_t len);
5454

5555
#endif /* ESP_MDNS_NETWORKING_H_ */

components/mdns/private_include/mdns_private.h

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -214,10 +214,10 @@ typedef struct mdns_parsed_record_s {
214214
} mdns_parsed_record_t;
215215

216216
typedef struct {
217-
tcpip_adapter_if_t tcpip_if;
217+
mdns_if_t tcpip_if;
218218
mdns_ip_protocol_t ip_protocol;
219219
//struct udp_pcb *pcb;
220-
ip_addr_t src;
220+
esp_ip_addr_t src;
221221
uint16_t src_port;
222222
uint8_t multicast;
223223
uint8_t authoritative;
@@ -229,11 +229,11 @@ typedef struct {
229229
} mdns_parsed_packet_t;
230230

231231
typedef struct {
232-
tcpip_adapter_if_t tcpip_if;
232+
mdns_if_t tcpip_if;
233233
mdns_ip_protocol_t ip_protocol;
234234
struct pbuf *pb;
235-
ip_addr_t src;
236-
ip_addr_t dest;
235+
esp_ip_addr_t src;
236+
esp_ip_addr_t dest;
237237
uint16_t src_port;
238238
uint8_t multicast;
239239
} mdns_rx_packet_t;
@@ -283,9 +283,9 @@ typedef struct mdns_out_answer_s {
283283
typedef struct mdns_tx_packet_s {
284284
struct mdns_tx_packet_s * next;
285285
uint32_t send_at;
286-
tcpip_adapter_if_t tcpip_if;
286+
mdns_if_t tcpip_if;
287287
mdns_ip_protocol_t ip_protocol;
288-
ip_addr_t dst;
288+
esp_ip_addr_t dst;
289289
uint16_t port;
290290
uint16_t flags;
291291
uint8_t distributed;
@@ -333,7 +333,7 @@ typedef struct mdns_search_once_s {
333333
typedef struct mdns_server_s {
334334
struct {
335335
mdns_pcb_t pcbs[MDNS_IP_PROTOCOL_MAX];
336-
} interfaces[TCPIP_ADAPTER_IF_MAX];
336+
} interfaces[MDNS_IF_MAX];
337337
const char * hostname;
338338
const char * instance;
339339
mdns_srv_item_t * services;
@@ -352,7 +352,7 @@ typedef struct {
352352
struct {
353353
esp_event_base_t event_base;
354354
int32_t event_id;
355-
tcpip_adapter_if_t interface;
355+
esp_netif_t* interface;
356356
} sys_event;
357357
struct {
358358
mdns_srv_item_t * service;
@@ -393,4 +393,16 @@ typedef struct {
393393
} data;
394394
} mdns_action_t;
395395

396+
/*
397+
* @brief Convert mnds if to esp-netif handle
398+
*
399+
* @param tcpip_if mdns supported interface as internal enum
400+
*
401+
* @return
402+
* - ptr to esp-netif on success
403+
* - NULL if no available netif for current interface index
404+
*/
405+
esp_netif_t *_mdns_get_esp_netif(mdns_if_t tcpip_if);
406+
407+
396408
#endif /* MDNS_PRIVATE_H_ */

examples/protocols/mdns/main/mdns_example_main.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,15 @@
99
#include <string.h>
1010
#include "freertos/FreeRTOS.h"
1111
#include "freertos/task.h"
12-
#include "freertos/event_groups.h"
1312
#include "esp_system.h"
14-
#include "esp_wifi.h"
1513
#include "esp_event.h"
1614
#include "esp_log.h"
1715
#include "nvs_flash.h"
18-
#include "tcpip_adapter.h"
16+
#include "esp_netif.h"
1917
#include "protocol_examples_common.h"
2018
#include "mdns.h"
2119
#include "driver/gpio.h"
22-
#include <sys/socket.h>
23-
#include <netdb.h>
20+
#include "netdb.h"
2421

2522

2623
#define EXAMPLE_MDNS_INSTANCE CONFIG_MDNS_INSTANCE
@@ -88,7 +85,7 @@ static void mdns_print_results(mdns_result_t * results){
8885
}
8986
a = r->addr;
9087
while(a){
91-
if(a->addr.type == IPADDR_TYPE_V6){
88+
if(a->addr.type == ESP_IPADDR_TYPE_V6){
9289
printf(" AAAA: " IPV6STR "\n", IPV62STR(a->addr.u_addr.ip6));
9390
} else {
9491
printf(" A : " IPSTR "\n", IP2STR(&(a->addr.u_addr.ip4)));
@@ -123,7 +120,7 @@ static void query_mdns_host(const char * host_name)
123120
{
124121
ESP_LOGI(TAG, "Query A: %s.local", host_name);
125122

126-
struct ip4_addr addr;
123+
struct esp_ip4_addr addr;
127124
addr.addr = 0;
128125

129126
esp_err_t err = mdns_query_a(host_name, 2000, &addr);

0 commit comments

Comments
 (0)