From c956b6ff67036b9671afb09a0c3caeec34274348 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Mon, 8 Jul 2024 10:25:24 +0200 Subject: [PATCH] fix(examples): Make multi-netif example working with DNS_PER_DEFAULT_NETIF feature --- examples/esp_netif/multiple_netifs/README.md | 3 +++ .../multiple_netifs/main/ethernet_connect.c | 2 +- .../multiple_netifs/main/multi_netif_main.c | 24 +++++++++++++------ .../multiple_netifs/main/ppp_connect.c | 2 +- .../multiple_netifs/main/wifi_connect.c | 2 +- .../multiple_netifs/sdkconfig.defaults | 3 +++ 6 files changed, 26 insertions(+), 10 deletions(-) diff --git a/examples/esp_netif/multiple_netifs/README.md b/examples/esp_netif/multiple_netifs/README.md index 09ba1a1b9e..44e3014add 100644 --- a/examples/esp_netif/multiple_netifs/README.md +++ b/examples/esp_netif/multiple_netifs/README.md @@ -19,6 +19,9 @@ This example demonstrates working with multiple different interfaces with differ * It tries to reconfigure DNS server if host name resolution fails * It tries to manually change the default interface if connection fails +This example demonstrate how DNS servers could be handled on network interface level, as lwIP used global DNS server information. All network interfaces store the DNS info upon acquiring an IP in the internal structure and the DNS servers are restored if host name resolution fails. +If `CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF` is supported and enabled, the DNS server update per network interface is handled automatically in IDF. + ### Hardware Required To run this example, it's recommended that you have an official ESP32 Ethernet development board - [ESP32-Ethernet-Kit](https://docs.espressif.com/projects/esp-idf/en/latest/hw-reference/get-started-ethernet-kit.html). diff --git a/examples/esp_netif/multiple_netifs/main/ethernet_connect.c b/examples/esp_netif/multiple_netifs/main/ethernet_connect.c index 53ec398f56..35703c9586 100644 --- a/examples/esp_netif/multiple_netifs/main/ethernet_connect.c +++ b/examples/esp_netif/multiple_netifs/main/ethernet_connect.c @@ -95,7 +95,7 @@ static void eth_destroy(iface_info_t *info) free(eth_info); } -iface_info_t *eth_init(int prio) +iface_info_t *example_eth_init(int prio) { struct eth_info_t *eth_info = malloc(sizeof(struct eth_info_t)); assert(eth_info); diff --git a/examples/esp_netif/multiple_netifs/main/multi_netif_main.c b/examples/esp_netif/multiple_netifs/main/multi_netif_main.c index 26f8dab443..d23882846e 100644 --- a/examples/esp_netif/multiple_netifs/main/multi_netif_main.c +++ b/examples/esp_netif/multiple_netifs/main/multi_netif_main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -23,9 +23,9 @@ #include "nvs_flash.h" #include "iface_info.h" -iface_info_t *eth_init(int prio); -iface_info_t *wifi_init(int prio); -iface_info_t *ppp_init(int prio); +iface_info_t *example_eth_init(int prio); +iface_info_t *example_wifi_init(int prio); +iface_info_t *example_ppp_init(int prio); esp_err_t check_connectivity(const char *host); #define HOST "www.espressif.com" @@ -69,13 +69,15 @@ void app_main(void) // all interfaces iface_info_t *ifaces[] = { - eth_init(ETH_PRIO), - wifi_init(WIFI_PRIO), - ppp_init(PPP_PRIO), + example_eth_init(ETH_PRIO), + example_wifi_init(WIFI_PRIO), + example_ppp_init(PPP_PRIO), }; size_t num_of_ifaces = sizeof(ifaces) / sizeof(ifaces[0]); while (true) { + // For demonstration purposes we clear DNS table every iteration to exercise + // a condition of DNS servers being misconfigured dns_clear_cache(); vTaskDelay(pdMS_TO_TICKS(2000)); ssize_t i = get_default(ifaces, num_of_ifaces); @@ -91,7 +93,9 @@ void app_main(void) continue; } if (connect_status == ESP_ERR_NOT_FOUND) { +#ifndef CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF // set the default DNS info to global DNS server list + // manually if DNS_PER_DEFAULT_NETIF if OFF or not-supported for (int j = 0; j < 2; ++j) { esp_netif_dns_info_t dns_info; esp_netif_get_dns_info(ifaces[i]->netif, j, &dns_info); @@ -102,6 +106,12 @@ void app_main(void) ESP_LOGI(TAG, "Reconfigured DNS%i=" IPSTR, j, IP2STR(&ifaces[i]->dns[j].ip.u_addr.ip4)); } } +#else + // simulate that the (default) netif is brought UP + // this is only needed, since we explicitly clear DNS servers every iteration using dns_clear_cache() + // (for demonstration purpose only, won't be needed in your project, unless you delete DNS info for some reasons) + esp_netif_action_connected(ifaces[i]->netif, NULL, 0, NULL); +#endif } if (connect_status == ESP_FAIL) { ESP_LOGE(TAG, "No connection via the default netif!"); diff --git a/examples/esp_netif/multiple_netifs/main/ppp_connect.c b/examples/esp_netif/multiple_netifs/main/ppp_connect.c index b1f2dcf05d..d7740510ad 100644 --- a/examples/esp_netif/multiple_netifs/main/ppp_connect.c +++ b/examples/esp_netif/multiple_netifs/main/ppp_connect.c @@ -85,7 +85,7 @@ static void ppp_destroy(iface_info_t *info) free(info); } -iface_info_t *init_ppp(int prio) +iface_info_t *example_ppp_init(int prio) { struct ppp_info_t *ppp_info = calloc(1, sizeof(struct ppp_info_t)); assert(ppp_info); diff --git a/examples/esp_netif/multiple_netifs/main/wifi_connect.c b/examples/esp_netif/multiple_netifs/main/wifi_connect.c index 523c773568..155f3daa5c 100644 --- a/examples/esp_netif/multiple_netifs/main/wifi_connect.c +++ b/examples/esp_netif/multiple_netifs/main/wifi_connect.c @@ -75,7 +75,7 @@ static void wifi_destroy(iface_info_t *info) free(info); } -iface_info_t *wifi_init(int prio) +iface_info_t *example_wifi_init(int prio) { struct iface_info_t *wifi_info = malloc(sizeof(iface_info_t)); assert(wifi_info); diff --git a/examples/esp_netif/multiple_netifs/sdkconfig.defaults b/examples/esp_netif/multiple_netifs/sdkconfig.defaults index 3c08a9a30d..84966ec347 100644 --- a/examples/esp_netif/multiple_netifs/sdkconfig.defaults +++ b/examples/esp_netif/multiple_netifs/sdkconfig.defaults @@ -1,2 +1,5 @@ +# You can use CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF +# to perform DNS server updates automatically in esp_netif layers +# instead of manually as it is demonstrated in this example CONFIG_LWIP_PPP_SUPPORT=y CONFIG_LWIP_PPP_NOTIFY_PHASE_SUPPORT=y