From f9892f77b88ba77dc6608ba746175f6dc64a7607 Mon Sep 17 00:00:00 2001 From: Suren Gabrielyan Date: Thu, 19 Aug 2021 15:47:28 +0400 Subject: [PATCH 01/10] mdns: Prepare for dynamic esp-netif support --- components/mdns/include/mdns.h | 13 +- components/mdns/mdns.c | 115 +++- .../mdns/main/mdns_example_wifi_main.c | 495 ++++++++++++++++++ 3 files changed, 599 insertions(+), 24 deletions(-) create mode 100644 examples/protocols/mdns/main/mdns_example_wifi_main.c diff --git a/components/mdns/include/mdns.h b/components/mdns/include/mdns.h index 55de0dbab7..758010c7fb 100644 --- a/components/mdns/include/mdns.h +++ b/components/mdns/include/mdns.h @@ -21,6 +21,13 @@ extern "C" { #define MDNS_TYPE_NSEC 0x002F #define MDNS_TYPE_ANY 0x00FF +#define CONFIG_MDNS_IF_MAX 4 +#define ACTION_ENABLE 1 +#define ACTION_ENABLE_WITH_DHCP_CHECK 2 +#define ACTION_ANNOUNCE 3 +#define ACTION_ENABLE_ANNOUNCE 4 +#define ACTION_DISABLE 5 + /** * @brief Asynchronous query handle */ @@ -53,10 +60,8 @@ typedef struct mdns_ip_addr_s { } mdns_ip_addr_t; typedef enum mdns_if_internal { - MDNS_IF_STA = 0, - MDNS_IF_AP = 1, - MDNS_IF_ETH = 2, - MDNS_IF_MAX + MDNS_IF_INVALID = -1, + MDNS_IF_MAX = CONFIG_MDNS_IF_MAX } mdns_if_t; /** diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index 8b47b3c35a..28d0545632 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -58,31 +58,43 @@ static bool _mdns_append_host_list_in_services(mdns_out_answer_t ** destination, static bool _mdns_append_host_list(mdns_out_answer_t ** destination, bool flush, bool bye); static void _mdns_remap_self_service_hostname(const char *old_hostname, const char *new_hostname); + +typedef struct mdns_event_action { + esp_event_base_t event_base; + int32_t event_id; + uint32_t action; +} mdns_event_action_t; + +typedef struct mdns_interfaces { + esp_netif_t * netif; + mdns_event_action_t actions[5]; +} mdns_interfaces_t; + /* * @brief Internal collection of mdns supported interfaces * */ -static esp_netif_t * s_esp_netifs[MDNS_IF_MAX] = {}; +static mdns_interfaces_t s_esp_netifs[MDNS_IF_MAX] = {}; /* * @brief Convert mdns if to esp-netif handle */ esp_netif_t *_mdns_get_esp_netif(mdns_if_t tcpip_if) { - if (tcpip_if < MDNS_IF_MAX) { - if (s_esp_netifs[tcpip_if] == NULL) { + if (tcpip_if > MDNS_IF_INVALID && tcpip_if < MDNS_IF_MAX) { + if (s_esp_netifs[tcpip_if].netif == NULL) { // if local netif copy is NULL, try to search for the default interface key - if (tcpip_if == MDNS_IF_STA) { - s_esp_netifs[MDNS_IF_STA] = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); - } else if (tcpip_if == MDNS_IF_AP) { - s_esp_netifs[MDNS_IF_AP] = esp_netif_get_handle_from_ifkey("WIFI_AP_DEF"); -#if CONFIG_ETH_ENABLED - } else if (tcpip_if == MDNS_IF_ETH) { - s_esp_netifs[MDNS_IF_ETH] = esp_netif_get_handle_from_ifkey("ETH_DEF"); -#endif - } +// if (tcpip_if == MDNS_IF_STA) { +// s_esp_netifs[MDNS_IF_STA] = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); +// } else if (tcpip_if == MDNS_IF_AP) { +// s_esp_netifs[MDNS_IF_AP] = esp_netif_get_handle_from_ifkey("WIFI_AP_DEF"); +//#if CONFIG_ETH_ENABLED +// } else if (tcpip_if == MDNS_IF_ETH) { +// s_esp_netifs[MDNS_IF_ETH] = esp_netif_get_handle_from_ifkey("ETH_DEF"); +//#endif +// } } - return s_esp_netifs[tcpip_if]; + return s_esp_netifs[tcpip_if].netif; } return NULL; } @@ -93,7 +105,7 @@ esp_netif_t *_mdns_get_esp_netif(mdns_if_t tcpip_if) */ static inline void _mdns_clean_netif_ptr(mdns_if_t tcpip_if) { if (tcpip_if < MDNS_IF_MAX) { - s_esp_netifs[tcpip_if] = NULL; + s_esp_netifs[tcpip_if].netif = NULL; } } @@ -104,7 +116,7 @@ static inline void _mdns_clean_netif_ptr(mdns_if_t tcpip_if) { static mdns_if_t _mdns_get_if_from_esp_netif(esp_netif_t *interface) { for (int i=0; i MDNS_IF_MAX) { + return; + } + + for (int i = 0; i < CONFIG_MDNS_EVENT_ACTIONS; ++i) { // TO-DO + if (s_esp_netifs[mdns_if].actions[i].event_id == event_id) { + if (s_esp_netifs[mdns_if].actions[i].action == ACTION_ENABLE) { + _action_enable_pcb(mdns_if); + } + if (s_esp_netifs[mdns_if].actions[i].action == ACTION_ENABLE_WITH_DHCP_CHECK) { + _action_enable_pcb_dhcps_status_check(interface, mdns_if); + } + if (s_esp_netifs[mdns_if].actions[i].action == ACTION_ENABLE_ANNOUNCE) { + _action_enable_announce_pcb(mdns_if); + } + if (s_esp_netifs[mdns_if].actions[i].action == ACTION_DISABLE) { + _action_disable_pcb(mdns_if); + } + } + } +} +#if 0 static void _mdns_handle_system_event(esp_event_base_t event_base, int32_t event_id, esp_netif_t* interface) { @@ -3856,6 +3930,7 @@ static void _mdns_handle_system_event(esp_event_base_t event_base, } } } +#endif /* * MDNS Search diff --git a/examples/protocols/mdns/main/mdns_example_wifi_main.c b/examples/protocols/mdns/main/mdns_example_wifi_main.c new file mode 100644 index 0000000000..64837b195d --- /dev/null +++ b/examples/protocols/mdns/main/mdns_example_wifi_main.c @@ -0,0 +1,495 @@ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +/* MDNS-SD Query and advertise Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_netif_ip_addr.h" +#include "esp_system.h" +#include "esp_event.h" +#include "esp_log.h" +#include "nvs_flash.h" +#include "esp_netif.h" +#include "protocol_examples_common.h" +#include "mdns.h" +#include "driver/gpio.h" +#include "netdb.h" +#include "esp_wifi.h" + +#include "freertos/event_groups.h" +#include "esp_system.h" +#include "esp_wifi.h" +#include "esp_event.h" +#include "esp_log.h" +#include "nvs_flash.h" + +#include "lwip/err.h" +#include "lwip/sys.h" +// #include "mdns_if_defaults.h" + + +/* FreeRTOS event group to signal when we are connected*/ +// static EventGroupHandle_t s_wifi_event_group; + +#define EXAMPLE_MDNS_INSTANCE CONFIG_MDNS_INSTANCE +#define EXAMPLE_BUTTON_GPIO 0 + +static const char * TAG = "mdns-test"; +static char * generate_hostname(void); + +#if CONFIG_MDNS_RESOLVE_TEST_SERVICES == 1 +static void query_mdns_host_with_gethostbyname(char * host); +static void query_mdns_host_with_getaddrinfo(char * host); +#endif + +static int s_retry_num = 0; + +// #define EXAMPLE_ESP_WIFI_SSID "Coworking" +#define EXAMPLE_ESP_WIFI_SSID "Coworking" +#define EXAMPLE_ESP_WIFI_PASS "Coworkers" + +#define EXAMPLE_ESP_MAXIMUM_RETRY 2 + +#define WIFI_CONNECTED_BIT BIT0 +#define WIFI_FAIL_BIT BIT1 + +static void event_handler(void* arg, esp_event_base_t event_base, + int32_t event_id, void* event_data) +{ + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { + esp_wifi_connect(); + } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { + if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) { + esp_wifi_connect(); + s_retry_num++; + ESP_LOGI(TAG, "retry to connect to the AP"); + } else { + // xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT); + } + ESP_LOGI(TAG,"connect to the AP fail"); + } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { + ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; + ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip)); + s_retry_num = 0; + //xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); + } +} + +static void initialise_mdns(void) +{ + esp_netif_t* netif_wifi = esp_netif_create_default_wifi_sta(); + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + esp_event_handler_instance_t instance_any_id; + esp_event_handler_instance_t instance_got_ip; + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, + ESP_EVENT_ANY_ID, + &event_handler, + NULL, + &instance_any_id)); + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, + IP_EVENT_STA_GOT_IP, + &event_handler, + NULL, + &instance_got_ip)); + + wifi_config_t wifi_config = { + .sta = { + .ssid = EXAMPLE_ESP_WIFI_SSID, + .password = EXAMPLE_ESP_WIFI_PASS, + /* Setting a password implies station will connect to all security modes including WEP/WPA. + * However these modes are deprecated and not advisable to be used. Incase your Access point + * doesn't support WPA2, these mode can be enabled by commenting below line */ + .threshold.authmode = WIFI_AUTH_WPA2_PSK, + + .pmf_cfg = { + .capable = true, + .required = false + }, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config)); + ESP_ERROR_CHECK(esp_wifi_start()); + + ESP_LOGI(TAG, "wifi_init_sta finished."); + + char * hostname = generate_hostname(); + + //initialize mDNS + // mdns_config_t mdns_config = MDNS_NETIF_DEFAULT_WIFI(netif_wifi); + + //_mdns_action_t _actions[] = { + // { + // .event_base = WIFI_EVENT, + // .event_id = WIFI_EVENT_STA_CONNECTED, + // .action = ACTION_ENABLE_WITH_DHCP_CHECK + // }, + // { + // .event_base = WIFI_EVENT, + // .event_id = WIFI_EVENT_STA_DISCONNECTED, + // .action = ACTION_DISABLE + // }, + // { + // .event_base = IP_EVENT, + // .event_id = IP_EVENT_STA_GOT_IP, + // .action = ACTION_ENABLE_ANNOUNCE + // } + // }; + + //mdns_config_t mdns_config = { + // .netif = netif_wifi, + // .num = 3, + // .next = {NULL}, + // .actions = _actions + //}; + + mdns_config_t * mdns_config = calloc(1, sizeof(struct mdns_config_s)); + mdns_config->netif = netif_wifi; + mdns_config->num = 3; + mdns_config->actions = malloc(sizeof(_mdns_action_t) * 3); + //mdns_config->actions = { { .esp_event_base_t = WIFI_EVENT, .event_id = WIFI_EVENT_STA_CONNECTED, .action = ACTION_ENABLE_WITH_DHCP_CHECK}}; + //mdns_config->actionsesp_event_base_t = WIFI_EVENT; + mdns_config->actions[0].event_base = WIFI_EVENT; + mdns_config->actions[0].event_id = WIFI_EVENT_STA_CONNECTED; + mdns_config->actions[0].action = ACTION_ENABLE_WITH_DHCP_CHECK; + + mdns_config->actions[1].event_base = WIFI_EVENT; + mdns_config->actions[1].event_id = WIFI_EVENT_STA_DISCONNECTED; + mdns_config->actions[1].action = ACTION_DISABLE; + + mdns_config->actions[2].event_base = IP_EVENT; + mdns_config->actions[2].event_id = IP_EVENT_STA_GOT_IP; + mdns_config->actions[2].action = ACTION_ENABLE_ANNOUNCE; + + ESP_ERROR_CHECK( mdns_init_cfg(mdns_config) ); // mdns_add_netif + + esp_netif_inherent_config_t esp_netif_config = ESP_NETIF_INHERENT_DEFAULT_ETH(); + char * desc; + asprintf(&desc, "%s: %s", TAG, esp_netif_config.if_desc); + esp_netif_config.if_desc = desc; + esp_netif_config.route_prio = 64; + esp_netif_config_t netif_config = { + .base = &esp_netif_config, + .stack = ESP_NETIF_NETSTACK_DEFAULT_ETH + }; + + + esp_netif_t * netif_eth = esp_netif_new(&netif_config); + mdns_config_t * mdns_config_eth = calloc(1, sizeof(struct mdns_config_s)); + mdns_config_eth->netif = netif_eth; + mdns_config_eth->num = 2; + mdns_config_eth->actions = malloc(sizeof(_mdns_action_t) * 3); + //mdns_config->actions = { { .esp_event_base_t = WIFI_EVENT, .event_id = WIFI_EVENT_STA_CONNECTED, .action = ACTION_ENABLE_WITH_DHCP_CHECK}}; + mdns_config_eth->actions[0].event_base = ETH_EVENT; + mdns_config_eth->actions[0].event_id = ETHERNET_EVENT_CONNECTED; + mdns_config_eth->actions[0].action = ACTION_ENABLE; + + + mdns_config_eth->actions[1].event_base = ETH_EVENT; + mdns_config_eth->actions[1].event_id = ETHERNET_EVENT_DISCONNECTED; + mdns_config_eth->actions[1].action = ACTION_DISABLE; + + mdns_cfg_add_to_list(mdns_config_eth); + + //set mDNS hostname (required if you want to advertise services) + ESP_ERROR_CHECK( mdns_hostname_set(hostname) ); + ESP_LOGI(TAG, "mdns hostname set to: [%s]", hostname); + //set default mDNS instance name + ESP_ERROR_CHECK( mdns_instance_name_set(EXAMPLE_MDNS_INSTANCE) ); + + //structure with TXT records + mdns_txt_item_t serviceTxtData[3] = { + {"board", "esp32"}, + {"u", "user"}, + {"p", "password"} + }; + + //initialize service + ESP_ERROR_CHECK( mdns_service_add("ESP32-WebServer", "_http", "_tcp", 80, serviceTxtData, 3) ); + +#if CONFIG_MDNS_PUBLISH_DELEGATE_HOST + char *delegated_hostname; + if (-1 == asprintf(&delegated_hostname, "%s-delegated", hostname)) { + abort(); + } + + mdns_ip_addr_t addr4, addr6; + esp_netif_str_to_ip4("10.0.0.1", &addr4.addr.u_addr.ip4); + addr4.addr.type = ESP_IPADDR_TYPE_V4; + esp_netif_str_to_ip6("fd11:22::1", &addr6.addr.u_addr.ip6); + addr6.addr.type = ESP_IPADDR_TYPE_V6; + addr4.next = &addr6; + addr6.next = NULL; + ESP_ERROR_CHECK( mdns_delegate_hostname_add(delegated_hostname, &addr4) ); + ESP_ERROR_CHECK( mdns_service_add_for_host("test0", "_http", "_tcp", delegated_hostname, 1234, serviceTxtData, 3) ); + free(delegated_hostname); +#endif // CONFIG_MDNS_PUBLISH_DELEGATE_HOST + + //add another TXT item + ESP_ERROR_CHECK( mdns_service_txt_item_set("_http", "_tcp", "path", "/foobar") ); + //change TXT item value + ESP_ERROR_CHECK( mdns_service_txt_item_set_with_explicit_value_len("_http", "_tcp", "u", "admin", strlen("admin")) ); + free(hostname); +} + +/* these strings match tcpip_adapter_if_t enumeration */ +// static const char * if_str[] = {"STA", "AP", "ETH", "MAX"}; + +/* these strings match mdns_ip_protocol_t enumeration */ +// static const char * ip_protocol_str[] = {"V4", "V6", "MAX"}; + +static void mdns_print_results(mdns_result_t *results) +{ + mdns_result_t *r = results; + mdns_ip_addr_t *a = NULL; + //int i = 1; + int t; + while(r){ + //printf("%d: Interface: %s, Type: %s\n", i++, if_str[r->tcpip_if], ip_protocol_str[r->ip_protocol]); + if(r->instance_name){ + printf(" PTR : %s\n", r->instance_name); + } + if (r->hostname) { + printf(" SRV : %s.local:%u\n", r->hostname, r->port); + } + if (r->txt_count) { + printf(" TXT : [%zu] ", r->txt_count); + for (t = 0; t < r->txt_count; t++) { + printf("%s=%s(%d); ", r->txt[t].key, r->txt[t].value ? r->txt[t].value : "NULL", r->txt_value_len[t]); + } + printf("\n"); + } + a = r->addr; + while (a) { + if (a->addr.type == ESP_IPADDR_TYPE_V6) { + printf(" AAAA: " IPV6STR "\n", IPV62STR(a->addr.u_addr.ip6)); + } else { + printf(" A : " IPSTR "\n", IP2STR(&(a->addr.u_addr.ip4))); + } + a = a->next; + } + r = r->next; + } +} + +static void query_mdns_service(const char * service_name, const char * proto) +{ + ESP_LOGI(TAG, "Query PTR: %s.%s.local", service_name, proto); + + mdns_result_t * results = NULL; + esp_err_t err = mdns_query_ptr(service_name, proto, 3000, 20, &results); + if(err){ + ESP_LOGE(TAG, "Query Failed: %s", esp_err_to_name(err)); + return; + } + if(!results){ + ESP_LOGW(TAG, "No results found!"); + return; + } + + mdns_print_results(results); + mdns_query_results_free(results); +} + +static bool check_and_print_result(mdns_search_once_t *search) +{ + // Check if any result is available + mdns_result_t * result = NULL; + if (!mdns_query_async_get_results(search, 0, &result)) { + return false; + } + + if (!result) { // search timeout, but no result + return true; + } + + // If yes, print the result + mdns_ip_addr_t * a = result->addr; + while (a) { + if(a->addr.type == ESP_IPADDR_TYPE_V6){ + printf(" AAAA: " IPV6STR "\n", IPV62STR(a->addr.u_addr.ip6)); + } else { + printf(" A : " IPSTR "\n", IP2STR(&(a->addr.u_addr.ip4))); + } + a = a->next; + } + // and free the result + mdns_query_results_free(result); + return true; +} + +static void query_mdns_hosts_async(const char * host_name) +{ + ESP_LOGI(TAG, "Query both A and AAA: %s.local", host_name); + + mdns_search_once_t *s_a = mdns_query_async_new(host_name, NULL, NULL, MDNS_TYPE_A, 1000, 1, NULL); + mdns_query_async_delete(s_a); + mdns_search_once_t *s_aaaa = mdns_query_async_new(host_name, NULL, NULL, MDNS_TYPE_AAAA, 1000, 1, NULL); + while (s_a || s_aaaa) { + if (s_a && check_and_print_result(s_a)) { + ESP_LOGI(TAG, "Query A %s.local finished", host_name); + mdns_query_async_delete(s_a); + s_a = NULL; + } + if (s_aaaa && check_and_print_result(s_aaaa)) { + ESP_LOGI(TAG, "Query AAAA %s.local finished", host_name); + mdns_query_async_delete(s_aaaa); + s_aaaa = NULL; + } + } +} + +static void query_mdns_host(const char * host_name) +{ + ESP_LOGI(TAG, "Query A: %s.local", host_name); + + struct esp_ip4_addr addr; + addr.addr = 0; + + esp_err_t err = mdns_query_a(host_name, 2000, &addr); + if(err){ + if(err == ESP_ERR_NOT_FOUND){ + ESP_LOGW(TAG, "%s: Host was not found!", esp_err_to_name(err)); + return; + } + ESP_LOGE(TAG, "Query Failed: %s", esp_err_to_name(err)); + return; + } + + ESP_LOGI(TAG, "Query A: %s.local resolved to: " IPSTR, host_name, IP2STR(&addr)); +} + +static void initialise_button(void) +{ + gpio_config_t io_conf = {0}; + io_conf.intr_type = GPIO_INTR_DISABLE; + io_conf.pin_bit_mask = BIT64(EXAMPLE_BUTTON_GPIO); + io_conf.mode = GPIO_MODE_INPUT; + io_conf.pull_up_en = 1; + io_conf.pull_down_en = 0; + gpio_config(&io_conf); +} + +static void check_button(void) +{ + static bool old_level = true; + bool new_level = gpio_get_level(EXAMPLE_BUTTON_GPIO); + if (!new_level && old_level) { + query_mdns_hosts_async("esp32-mdns"); + query_mdns_host("esp32"); + query_mdns_service("_arduino", "_tcp"); + query_mdns_service("_http", "_tcp"); + query_mdns_service("_printer", "_tcp"); + query_mdns_service("_ipp", "_tcp"); + query_mdns_service("_afpovertcp", "_tcp"); + query_mdns_service("_smb", "_tcp"); + query_mdns_service("_ftp", "_tcp"); + query_mdns_service("_nfs", "_tcp"); + } + old_level = new_level; +} + +static void mdns_example_task(void *pvParameters) +{ +#if CONFIG_MDNS_RESOLVE_TEST_SERVICES == 1 + /* Send initial queries that are started by CI tester */ + query_mdns_host("tinytester"); + query_mdns_host_with_gethostbyname("tinytester-lwip.local"); + query_mdns_host_with_getaddrinfo("tinytester-lwip.local"); +#endif + + while (1) { + check_button(); + vTaskDelay(50 / portTICK_PERIOD_MS); + } +} + +void app_main(void) +{ + ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + initialise_mdns(); + + /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. + * Read "Establishing Wi-Fi or Ethernet Connection" section in + * examples/protocols/README.md for more information about this function. + */ + // ESP_ERROR_CHECK(example_connect()); // To-do, change this to explicitelly register first for wifi interface, then add new one + + initialise_button(); + xTaskCreate(&mdns_example_task, "mdns_example_task", 2048, NULL, 5, NULL); +} + +/** Generate host name based on sdkconfig, optionally adding a portion of MAC address to it. + * @return host name string allocated from the heap + */ +static char* generate_hostname(void) +{ +#ifndef CONFIG_MDNS_ADD_MAC_TO_HOSTNAME + return strdup(CONFIG_MDNS_HOSTNAME); +#else + uint8_t mac[6]; + char *hostname; + esp_read_mac(mac, ESP_MAC_WIFI_STA); + if (-1 == asprintf(&hostname, "%s-%02X%02X%02X", CONFIG_MDNS_HOSTNAME, mac[3], mac[4], mac[5])) { + abort(); + } + return hostname; +#endif +} + +#if CONFIG_MDNS_RESOLVE_TEST_SERVICES == 1 +/** + * @brief Executes gethostbyname and displays list of resolved addresses. + * Note: This function is used only to test advertised mdns hostnames resolution + */ +static void query_mdns_host_with_gethostbyname(char * host) +{ + struct hostent *res = gethostbyname(host); + if (res) { + unsigned int i = 0; + while (res->h_addr_list[i] != NULL) { + ESP_LOGI(TAG, "gethostbyname: %s resolved to: %s", host, inet_ntoa(*(struct in_addr *) (res->h_addr_list[i]))); + i++; + } + } +} + +/** + * @brief Executes getaddrinfo and displays list of resolved addresses. + * Note: This function is used only to test advertised mdns hostnames resolution + */ +static void query_mdns_host_with_getaddrinfo(char * host) +{ + struct addrinfo hints; + struct addrinfo * res; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + if (!getaddrinfo(host, NULL, &hints, &res)) { + while (res) { + ESP_LOGI(TAG, "getaddrinfo: %s resolved to: %s", host, + res->ai_family == AF_INET? + inet_ntoa(((struct sockaddr_in *) res->ai_addr)->sin_addr): + inet_ntoa(((struct sockaddr_in6 *) res->ai_addr)->sin6_addr)); + res = res->ai_next; + } + } +} +#endif From f90b3b798b446382d848f8c55c5e1653c81871cd Mon Sep 17 00:00:00 2001 From: David Cermak Date: Mon, 13 Dec 2021 17:15:54 +0100 Subject: [PATCH 02/10] mdns: Use predefined interfaces to prepare for custom netifs --- components/mdns/include/mdns.h | 15 +- components/mdns/mdns.c | 285 +++++----- .../mdns/private_include/mdns_private.h | 5 +- .../mdns/main/mdns_example_wifi_main.c | 495 ------------------ 4 files changed, 171 insertions(+), 629 deletions(-) delete mode 100644 examples/protocols/mdns/main/mdns_example_wifi_main.c diff --git a/components/mdns/include/mdns.h b/components/mdns/include/mdns.h index 758010c7fb..fb14077b40 100644 --- a/components/mdns/include/mdns.h +++ b/components/mdns/include/mdns.h @@ -22,17 +22,22 @@ extern "C" { #define MDNS_TYPE_ANY 0x00FF #define CONFIG_MDNS_IF_MAX 4 -#define ACTION_ENABLE 1 -#define ACTION_ENABLE_WITH_DHCP_CHECK 2 -#define ACTION_ANNOUNCE 3 -#define ACTION_ENABLE_ANNOUNCE 4 -#define ACTION_DISABLE 5 /** * @brief Asynchronous query handle */ typedef struct mdns_search_once_s mdns_search_once_t; + +typedef enum { + MDNS_EVENT_ENABLE_IP4 = 1 << 1, + MDNS_EVENT_ENABLE_IP6 = 1 << 2, + MDNS_EVENT_ANNOUNCE_IP4 = 1 << 3, + MDNS_EVENT_ANNOUNCE_IP6 = 1 << 4, + MDNS_EVENT_DISABLE_IP4 = 1 << 5, + MDNS_EVENT_DISABLE_IP6 = 1 << 6, +} mdns_event_actions_t; + /** * @brief mDNS enum to specify the ip_protocol type */ diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index 28d0545632..27c6797cd2 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -57,42 +57,74 @@ static mdns_result_t * _mdns_search_result_add_ptr(mdns_search_once_t * search, static bool _mdns_append_host_list_in_services(mdns_out_answer_t ** destination, mdns_srv_item_t * services[], size_t services_len, bool flush, bool bye); static bool _mdns_append_host_list(mdns_out_answer_t ** destination, bool flush, bool bye); static void _mdns_remap_self_service_hostname(const char *old_hostname, const char *new_hostname); +static esp_err_t mdns_post_custom_action_tcpip_if(mdns_if_t mdns_if, mdns_event_actions_t event_action); +typedef enum mdns_netif_predef { + MDNS_USES_PREDEFINED_IF = 0, + MDNS_USES_CUSTOM_IF = 1, +} mdns_netif_predef_t; -typedef struct mdns_event_action { - esp_event_base_t event_base; - int32_t event_id; - uint32_t action; -} mdns_event_action_t; +typedef enum { + MDNS_IF_STA = 0, + MDNS_IF_AP = 1, + MDNS_IF_ETH = 2, +} mdns_predef_if_t; -typedef struct mdns_interfaces { +typedef struct mdns_interfaces mdns_interfaces_t; + +struct mdns_interfaces { + mdns_netif_predef_t predefined; esp_netif_t * netif; - mdns_event_action_t actions[5]; -} mdns_interfaces_t; + mdns_predef_if_t predef_if; + mdns_if_t duplicate; +}; /* * @brief Internal collection of mdns supported interfaces * */ -static mdns_interfaces_t s_esp_netifs[MDNS_IF_MAX] = {}; +static mdns_interfaces_t s_esp_netifs[MDNS_IF_MAX] = { + { .predefined = MDNS_USES_PREDEFINED_IF, .netif = NULL, .predef_if = MDNS_IF_STA, .duplicate = MDNS_IF_MAX }, + { .predefined = MDNS_USES_PREDEFINED_IF, .netif = NULL, .predef_if = MDNS_IF_AP, .duplicate = MDNS_IF_MAX }, + { .predefined = MDNS_USES_PREDEFINED_IF, .netif = NULL, .predef_if = MDNS_IF_ETH, .duplicate = MDNS_IF_MAX }, +}; + /* * @brief Convert mdns if to esp-netif handle */ +static mdns_if_t mdns_if_from_predef_if(mdns_predef_if_t predef_if) +{ + for (int i=0; i MDNS_IF_INVALID && tcpip_if < MDNS_IF_MAX) { - if (s_esp_netifs[tcpip_if].netif == NULL) { - // if local netif copy is NULL, try to search for the default interface key -// if (tcpip_if == MDNS_IF_STA) { -// s_esp_netifs[MDNS_IF_STA] = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); -// } else if (tcpip_if == MDNS_IF_AP) { -// s_esp_netifs[MDNS_IF_AP] = esp_netif_get_handle_from_ifkey("WIFI_AP_DEF"); -//#if CONFIG_ETH_ENABLED -// } else if (tcpip_if == MDNS_IF_ETH) { -// s_esp_netifs[MDNS_IF_ETH] = esp_netif_get_handle_from_ifkey("ETH_DEF"); -//#endif -// } + if (s_esp_netifs[tcpip_if].netif == NULL && s_esp_netifs[tcpip_if].predefined == MDNS_USES_PREDEFINED_IF) { + // if a predefined interface face and used local copy is NULL, try to search for the default interface key + s_esp_netifs[tcpip_if].netif = esp_netif_from_preset_if(s_esp_netifs[tcpip_if].predef_if); } return s_esp_netifs[tcpip_if].netif; } @@ -1069,11 +1101,9 @@ static uint16_t _mdns_append_question(uint8_t * packet, uint16_t * index, mdns_o */ static mdns_if_t _mdns_get_other_if (mdns_if_t tcpip_if) { -// if (tcpip_if == MDNS_IF_STA) { -// return MDNS_IF_ETH; -// } else if (tcpip_if == MDNS_IF_ETH) { -// return MDNS_IF_STA; -// } + if (tcpip_if > MDNS_IF_INVALID && tcpip_if < MDNS_IF_MAX) { + return s_esp_netifs[tcpip_if].duplicate; + } return MDNS_IF_MAX; } @@ -3789,97 +3819,79 @@ void _mdns_disable_pcb(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol) } /** - * @brief Dispatch interface changes based on system events + * @brief Performs interface changes based on system events or custom commands */ -void _action_enable_pcb_dhcps_status_check(esp_netif_t *netif, mdns_if_t interface) { - esp_netif_dhcp_status_t dcst; - - if (!esp_netif_dhcpc_get_status(netif, &dcst)) { - if (dcst == ESP_NETIF_DHCP_STOPPED) { - _mdns_enable_pcb(interface, MDNS_IP_PROTOCOL_V4); - } +static void perform_event_action(mdns_if_t mdns_if, mdns_event_actions_t action) +{ + if (!_mdns_server || mdns_if > MDNS_IF_MAX) { + return; + } + if (action & MDNS_EVENT_ENABLE_IP4) { + _mdns_enable_pcb(mdns_if, MDNS_IP_PROTOCOL_V4); + } + if (action & MDNS_EVENT_ENABLE_IP6) { + _mdns_enable_pcb(mdns_if, MDNS_IP_PROTOCOL_V6); + } + if (action & MDNS_EVENT_DISABLE_IP4) { + _mdns_disable_pcb(mdns_if, MDNS_IP_PROTOCOL_V4); + } + if (action & MDNS_EVENT_DISABLE_IP6) { + _mdns_disable_pcb(mdns_if, MDNS_IP_PROTOCOL_V6); + } + if (action & MDNS_EVENT_ANNOUNCE_IP4) { + _mdns_announce_pcb(mdns_if, MDNS_IP_PROTOCOL_V4, NULL, 0, true); + } + if (action & MDNS_EVENT_ANNOUNCE_IP6) { + _mdns_announce_pcb(mdns_if, MDNS_IP_PROTOCOL_V6, NULL, 0, true); } } -void _action_enable_pcb(mdns_if_t interface) { - _mdns_enable_pcb(interface, MDNS_IP_PROTOCOL_V4); -} - -void _action_announce_pcb(mdns_if_t interface) { - _mdns_enable_pcb(interface, MDNS_IP_PROTOCOL_V4); -} - -void _action_enable_announce_pcb(mdns_if_t interface) { - _mdns_enable_pcb(interface, MDNS_IP_PROTOCOL_V4); - _mdns_announce_pcb(interface, MDNS_IP_PROTOCOL_V6, NULL, 0, true); -} - -void _action_disable_pcb(mdns_if_t interface) { - _mdns_disable_pcb(interface, MDNS_IP_PROTOCOL_V4); - _mdns_disable_pcb(interface, MDNS_IP_PROTOCOL_V6); -} - -#define CONFIG_MDNS_EVENT_ACTIONS 5 /** * @brief Dispatch interface changes based on system events */ -static void _mdns_handle_system_event(esp_event_base_t event_base, - int32_t event_id, esp_netif_t* interface) +static inline void post_mdns_disable_pcb(mdns_predef_if_t preset_if, mdns_ip_protocol_t protocol) { - if (!_mdns_server) { - return; - } - mdns_if_t mdns_if = _mdns_get_if_from_esp_netif(interface); - - if (mdns_if > MDNS_IF_MAX) { - return; - } - - for (int i = 0; i < CONFIG_MDNS_EVENT_ACTIONS; ++i) { // TO-DO - if (s_esp_netifs[mdns_if].actions[i].event_id == event_id) { - if (s_esp_netifs[mdns_if].actions[i].action == ACTION_ENABLE) { - _action_enable_pcb(mdns_if); - } - if (s_esp_netifs[mdns_if].actions[i].action == ACTION_ENABLE_WITH_DHCP_CHECK) { - _action_enable_pcb_dhcps_status_check(interface, mdns_if); - } - if (s_esp_netifs[mdns_if].actions[i].action == ACTION_ENABLE_ANNOUNCE) { - _action_enable_announce_pcb(mdns_if); - } - if (s_esp_netifs[mdns_if].actions[i].action == ACTION_DISABLE) { - _action_disable_pcb(mdns_if); - } - } - } + mdns_post_custom_action_tcpip_if(mdns_if_from_predef_if(preset_if), protocol==MDNS_IP_PROTOCOL_V4 ? MDNS_EVENT_DISABLE_IP4 : MDNS_EVENT_DISABLE_IP6); } -#if 0 -static void _mdns_handle_system_event(esp_event_base_t event_base, - int32_t event_id, esp_netif_t* interface) + +static inline void post_mdns_enable_pcb(mdns_predef_if_t preset_if, mdns_ip_protocol_t protocol) +{ + mdns_post_custom_action_tcpip_if(mdns_if_from_predef_if(preset_if), protocol==MDNS_IP_PROTOCOL_V4 ? MDNS_EVENT_ENABLE_IP4 : MDNS_EVENT_ENABLE_IP6); +} + +static inline void post_mdns_announce_pcb(mdns_predef_if_t preset_if, mdns_ip_protocol_t protocol) +{ + mdns_post_custom_action_tcpip_if(mdns_if_from_predef_if(preset_if), protocol==MDNS_IP_PROTOCOL_V4 ? MDNS_EVENT_ANNOUNCE_IP4 : MDNS_EVENT_ANNOUNCE_IP6); +} + +void mdns_preset_if_handle_system_event(void *arg, esp_event_base_t event_base, + int32_t event_id, void *event_data) { if (!_mdns_server) { return; } + esp_netif_dhcp_status_t dcst; if (event_base == WIFI_EVENT) { switch(event_id) { case WIFI_EVENT_STA_CONNECTED: - if (!esp_netif_dhcpc_get_status(_mdns_get_esp_netif(MDNS_IF_STA), &dcst)) { + if (!esp_netif_dhcpc_get_status(esp_netif_from_preset_if(MDNS_IF_STA), &dcst)) { if (dcst == ESP_NETIF_DHCP_STOPPED) { - _mdns_enable_pcb(MDNS_IF_STA, MDNS_IP_PROTOCOL_V4); + post_mdns_enable_pcb(MDNS_IF_STA, MDNS_IP_PROTOCOL_V4); } } break; case WIFI_EVENT_STA_DISCONNECTED: - _mdns_disable_pcb(MDNS_IF_STA, MDNS_IP_PROTOCOL_V4); - _mdns_disable_pcb(MDNS_IF_STA, MDNS_IP_PROTOCOL_V6); + post_mdns_disable_pcb(MDNS_IF_STA, MDNS_IP_PROTOCOL_V4); + post_mdns_disable_pcb(MDNS_IF_STA, MDNS_IP_PROTOCOL_V6); break; case WIFI_EVENT_AP_START: - _mdns_enable_pcb(MDNS_IF_AP, MDNS_IP_PROTOCOL_V4); + post_mdns_enable_pcb(MDNS_IF_AP, MDNS_IP_PROTOCOL_V4); break; case WIFI_EVENT_AP_STOP: - _mdns_disable_pcb(MDNS_IF_AP, MDNS_IP_PROTOCOL_V4); - _mdns_disable_pcb(MDNS_IF_AP, MDNS_IP_PROTOCOL_V6); + post_mdns_disable_pcb(MDNS_IF_AP, MDNS_IP_PROTOCOL_V4); + post_mdns_disable_pcb(MDNS_IF_AP, MDNS_IP_PROTOCOL_V6); break; default: break; @@ -3889,15 +3901,15 @@ static void _mdns_handle_system_event(esp_event_base_t event_base, else if (event_base == ETH_EVENT) { switch (event_id) { case ETHERNET_EVENT_CONNECTED: - if (!esp_netif_dhcpc_get_status(_mdns_get_esp_netif(MDNS_IF_ETH), &dcst)) { + if (!esp_netif_dhcpc_get_status(esp_netif_from_preset_if(MDNS_IF_ETH), &dcst)) { if (dcst == ESP_NETIF_DHCP_STOPPED) { - _mdns_enable_pcb(MDNS_IF_ETH, MDNS_IP_PROTOCOL_V4); + post_mdns_enable_pcb(MDNS_IF_ETH, MDNS_IP_PROTOCOL_V4); } } break; case ETHERNET_EVENT_DISCONNECTED: - _mdns_disable_pcb(MDNS_IF_ETH, MDNS_IP_PROTOCOL_V4); - _mdns_disable_pcb(MDNS_IF_ETH, MDNS_IP_PROTOCOL_V6); + post_mdns_disable_pcb(MDNS_IF_ETH, MDNS_IP_PROTOCOL_V4); + post_mdns_disable_pcb(MDNS_IF_ETH, MDNS_IP_PROTOCOL_V6); break; default: break; @@ -3907,20 +3919,21 @@ static void _mdns_handle_system_event(esp_event_base_t event_base, else if (event_base == IP_EVENT) { switch (event_id) { case IP_EVENT_STA_GOT_IP: - _mdns_enable_pcb(MDNS_IF_STA, MDNS_IP_PROTOCOL_V4); - _mdns_announce_pcb(MDNS_IF_STA, MDNS_IP_PROTOCOL_V6, NULL, 0, true); + post_mdns_enable_pcb(MDNS_IF_STA, MDNS_IP_PROTOCOL_V4); + post_mdns_announce_pcb(MDNS_IF_STA, MDNS_IP_PROTOCOL_V6); break; #if CONFIG_ETH_ENABLED case IP_EVENT_ETH_GOT_IP: - _mdns_enable_pcb(MDNS_IF_ETH, MDNS_IP_PROTOCOL_V4); + post_mdns_enable_pcb(MDNS_IF_ETH, MDNS_IP_PROTOCOL_V4); break; #endif case IP_EVENT_GOT_IP6: { - mdns_if_t mdns_if = _mdns_get_if_from_esp_netif(interface); + ip_event_got_ip6_t* event = (ip_event_got_ip6_t*) event_data; + mdns_if_t mdns_if = _mdns_get_if_from_esp_netif(event->esp_netif); if (mdns_if != MDNS_IF_MAX) { - _mdns_enable_pcb(mdns_if, MDNS_IP_PROTOCOL_V6); - _mdns_announce_pcb(mdns_if, MDNS_IP_PROTOCOL_V4, NULL, 0, true); + post_mdns_enable_pcb(mdns_if, MDNS_IP_PROTOCOL_V6); + post_mdns_announce_pcb(mdns_if, MDNS_IP_PROTOCOL_V4); } } @@ -3930,7 +3943,6 @@ static void _mdns_handle_system_event(esp_event_base_t event_base, } } } -#endif /* * MDNS Search @@ -4600,8 +4612,7 @@ static void _mdns_execute_action(mdns_action_t * action) switch(action->type) { case ACTION_SYSTEM_EVENT: - _mdns_handle_system_event(action->data.sys_event.event_base, - action->data.sys_event.event_id, action->data.sys_event.interface); + perform_event_action(action->data.sys_event.interface, action->data.sys_event.event_action); break; case ACTION_HOSTNAME_SET: _mdns_send_bye_all_pcbs_no_instance(true); @@ -5014,33 +5025,51 @@ static esp_err_t _mdns_service_task_stop(void) return ESP_OK; } -/* - * Public Methods - * */ - -static void event_handler(void* arg, esp_event_base_t event_base, - int32_t event_id, void* event_data) +static esp_err_t mdns_post_custom_action_tcpip_if(mdns_if_t mdns_if, mdns_event_actions_t event_action) { - if (!_mdns_server) { - return; + if (!_mdns_server || mdns_if >= MDNS_IF_MAX) { + return ESP_FAIL; } mdns_action_t * action = (mdns_action_t *)calloc(1, sizeof(mdns_action_t)); if (!action) { HOOK_MALLOC_FAILED; - return; + return ESP_ERR_NO_MEM; } action->type = ACTION_SYSTEM_EVENT; - action->data.sys_event.event_base = event_base; - action->data.sys_event.event_id = event_id; - if (event_base == IP_EVENT && event_id == IP_EVENT_GOT_IP6) { - ip_event_got_ip6_t* event = (ip_event_got_ip6_t*) event_data; - action->data.sys_event.interface = event->esp_netif; - } + action->data.sys_event.event_action = event_action; + action->data.sys_event.interface = mdns_if; if (xQueueSend(_mdns_server->action_queue, &action, (TickType_t)0) != pdPASS) { free(action); } + return ESP_OK; +} + +static inline void set_default_duplicated_interfaces(void) +{ + mdns_if_t wifi_sta_if = MDNS_IF_MAX, eth_if = MDNS_IF_MAX; + for (mdns_if_t i=0; iaction_queue); free_lock: @@ -5135,10 +5168,10 @@ void mdns_free(void) } // Unregister handlers before destroying the mdns internals to avoid receiving async events while deinit - esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler); - esp_event_handler_unregister(IP_EVENT, ESP_EVENT_ANY_ID, &event_handler); + esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, mdns_preset_if_handle_system_event); + esp_event_handler_unregister(IP_EVENT, ESP_EVENT_ANY_ID, mdns_preset_if_handle_system_event); #if CONFIG_ETH_ENABLED - esp_event_handler_unregister(ETH_EVENT, ESP_EVENT_ANY_ID, &event_handler); + esp_event_handler_unregister(ETH_EVENT, ESP_EVENT_ANY_ID, mdns_preset_if_handle_system_event); #endif mdns_service_remove_all(); diff --git a/components/mdns/private_include/mdns_private.h b/components/mdns/private_include/mdns_private.h index 44535747f1..e766146a7c 100644 --- a/components/mdns/private_include/mdns_private.h +++ b/components/mdns/private_include/mdns_private.h @@ -404,9 +404,8 @@ typedef struct { } hostname_set; char * instance; struct { - esp_event_base_t event_base; - int32_t event_id; - esp_netif_t* interface; + mdns_if_t interface; + mdns_event_actions_t event_action; } sys_event; struct { mdns_srv_item_t * service; diff --git a/examples/protocols/mdns/main/mdns_example_wifi_main.c b/examples/protocols/mdns/main/mdns_example_wifi_main.c deleted file mode 100644 index 64837b195d..0000000000 --- a/examples/protocols/mdns/main/mdns_example_wifi_main.c +++ /dev/null @@ -1,495 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ -/* MDNS-SD Query and advertise Example - - This example code is in the Public Domain (or CC0 licensed, at your option.) - - Unless required by applicable law or agreed to in writing, this - software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - CONDITIONS OF ANY KIND, either express or implied. -*/ -#include -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "esp_netif_ip_addr.h" -#include "esp_system.h" -#include "esp_event.h" -#include "esp_log.h" -#include "nvs_flash.h" -#include "esp_netif.h" -#include "protocol_examples_common.h" -#include "mdns.h" -#include "driver/gpio.h" -#include "netdb.h" -#include "esp_wifi.h" - -#include "freertos/event_groups.h" -#include "esp_system.h" -#include "esp_wifi.h" -#include "esp_event.h" -#include "esp_log.h" -#include "nvs_flash.h" - -#include "lwip/err.h" -#include "lwip/sys.h" -// #include "mdns_if_defaults.h" - - -/* FreeRTOS event group to signal when we are connected*/ -// static EventGroupHandle_t s_wifi_event_group; - -#define EXAMPLE_MDNS_INSTANCE CONFIG_MDNS_INSTANCE -#define EXAMPLE_BUTTON_GPIO 0 - -static const char * TAG = "mdns-test"; -static char * generate_hostname(void); - -#if CONFIG_MDNS_RESOLVE_TEST_SERVICES == 1 -static void query_mdns_host_with_gethostbyname(char * host); -static void query_mdns_host_with_getaddrinfo(char * host); -#endif - -static int s_retry_num = 0; - -// #define EXAMPLE_ESP_WIFI_SSID "Coworking" -#define EXAMPLE_ESP_WIFI_SSID "Coworking" -#define EXAMPLE_ESP_WIFI_PASS "Coworkers" - -#define EXAMPLE_ESP_MAXIMUM_RETRY 2 - -#define WIFI_CONNECTED_BIT BIT0 -#define WIFI_FAIL_BIT BIT1 - -static void event_handler(void* arg, esp_event_base_t event_base, - int32_t event_id, void* event_data) -{ - if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { - esp_wifi_connect(); - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { - if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) { - esp_wifi_connect(); - s_retry_num++; - ESP_LOGI(TAG, "retry to connect to the AP"); - } else { - // xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT); - } - ESP_LOGI(TAG,"connect to the AP fail"); - } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { - ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; - ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip)); - s_retry_num = 0; - //xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); - } -} - -static void initialise_mdns(void) -{ - esp_netif_t* netif_wifi = esp_netif_create_default_wifi_sta(); - wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); - ESP_ERROR_CHECK(esp_wifi_init(&cfg)); - - esp_event_handler_instance_t instance_any_id; - esp_event_handler_instance_t instance_got_ip; - ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, - ESP_EVENT_ANY_ID, - &event_handler, - NULL, - &instance_any_id)); - ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, - IP_EVENT_STA_GOT_IP, - &event_handler, - NULL, - &instance_got_ip)); - - wifi_config_t wifi_config = { - .sta = { - .ssid = EXAMPLE_ESP_WIFI_SSID, - .password = EXAMPLE_ESP_WIFI_PASS, - /* Setting a password implies station will connect to all security modes including WEP/WPA. - * However these modes are deprecated and not advisable to be used. Incase your Access point - * doesn't support WPA2, these mode can be enabled by commenting below line */ - .threshold.authmode = WIFI_AUTH_WPA2_PSK, - - .pmf_cfg = { - .capable = true, - .required = false - }, - }, - }; - ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); - ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config)); - ESP_ERROR_CHECK(esp_wifi_start()); - - ESP_LOGI(TAG, "wifi_init_sta finished."); - - char * hostname = generate_hostname(); - - //initialize mDNS - // mdns_config_t mdns_config = MDNS_NETIF_DEFAULT_WIFI(netif_wifi); - - //_mdns_action_t _actions[] = { - // { - // .event_base = WIFI_EVENT, - // .event_id = WIFI_EVENT_STA_CONNECTED, - // .action = ACTION_ENABLE_WITH_DHCP_CHECK - // }, - // { - // .event_base = WIFI_EVENT, - // .event_id = WIFI_EVENT_STA_DISCONNECTED, - // .action = ACTION_DISABLE - // }, - // { - // .event_base = IP_EVENT, - // .event_id = IP_EVENT_STA_GOT_IP, - // .action = ACTION_ENABLE_ANNOUNCE - // } - // }; - - //mdns_config_t mdns_config = { - // .netif = netif_wifi, - // .num = 3, - // .next = {NULL}, - // .actions = _actions - //}; - - mdns_config_t * mdns_config = calloc(1, sizeof(struct mdns_config_s)); - mdns_config->netif = netif_wifi; - mdns_config->num = 3; - mdns_config->actions = malloc(sizeof(_mdns_action_t) * 3); - //mdns_config->actions = { { .esp_event_base_t = WIFI_EVENT, .event_id = WIFI_EVENT_STA_CONNECTED, .action = ACTION_ENABLE_WITH_DHCP_CHECK}}; - //mdns_config->actionsesp_event_base_t = WIFI_EVENT; - mdns_config->actions[0].event_base = WIFI_EVENT; - mdns_config->actions[0].event_id = WIFI_EVENT_STA_CONNECTED; - mdns_config->actions[0].action = ACTION_ENABLE_WITH_DHCP_CHECK; - - mdns_config->actions[1].event_base = WIFI_EVENT; - mdns_config->actions[1].event_id = WIFI_EVENT_STA_DISCONNECTED; - mdns_config->actions[1].action = ACTION_DISABLE; - - mdns_config->actions[2].event_base = IP_EVENT; - mdns_config->actions[2].event_id = IP_EVENT_STA_GOT_IP; - mdns_config->actions[2].action = ACTION_ENABLE_ANNOUNCE; - - ESP_ERROR_CHECK( mdns_init_cfg(mdns_config) ); // mdns_add_netif - - esp_netif_inherent_config_t esp_netif_config = ESP_NETIF_INHERENT_DEFAULT_ETH(); - char * desc; - asprintf(&desc, "%s: %s", TAG, esp_netif_config.if_desc); - esp_netif_config.if_desc = desc; - esp_netif_config.route_prio = 64; - esp_netif_config_t netif_config = { - .base = &esp_netif_config, - .stack = ESP_NETIF_NETSTACK_DEFAULT_ETH - }; - - - esp_netif_t * netif_eth = esp_netif_new(&netif_config); - mdns_config_t * mdns_config_eth = calloc(1, sizeof(struct mdns_config_s)); - mdns_config_eth->netif = netif_eth; - mdns_config_eth->num = 2; - mdns_config_eth->actions = malloc(sizeof(_mdns_action_t) * 3); - //mdns_config->actions = { { .esp_event_base_t = WIFI_EVENT, .event_id = WIFI_EVENT_STA_CONNECTED, .action = ACTION_ENABLE_WITH_DHCP_CHECK}}; - mdns_config_eth->actions[0].event_base = ETH_EVENT; - mdns_config_eth->actions[0].event_id = ETHERNET_EVENT_CONNECTED; - mdns_config_eth->actions[0].action = ACTION_ENABLE; - - - mdns_config_eth->actions[1].event_base = ETH_EVENT; - mdns_config_eth->actions[1].event_id = ETHERNET_EVENT_DISCONNECTED; - mdns_config_eth->actions[1].action = ACTION_DISABLE; - - mdns_cfg_add_to_list(mdns_config_eth); - - //set mDNS hostname (required if you want to advertise services) - ESP_ERROR_CHECK( mdns_hostname_set(hostname) ); - ESP_LOGI(TAG, "mdns hostname set to: [%s]", hostname); - //set default mDNS instance name - ESP_ERROR_CHECK( mdns_instance_name_set(EXAMPLE_MDNS_INSTANCE) ); - - //structure with TXT records - mdns_txt_item_t serviceTxtData[3] = { - {"board", "esp32"}, - {"u", "user"}, - {"p", "password"} - }; - - //initialize service - ESP_ERROR_CHECK( mdns_service_add("ESP32-WebServer", "_http", "_tcp", 80, serviceTxtData, 3) ); - -#if CONFIG_MDNS_PUBLISH_DELEGATE_HOST - char *delegated_hostname; - if (-1 == asprintf(&delegated_hostname, "%s-delegated", hostname)) { - abort(); - } - - mdns_ip_addr_t addr4, addr6; - esp_netif_str_to_ip4("10.0.0.1", &addr4.addr.u_addr.ip4); - addr4.addr.type = ESP_IPADDR_TYPE_V4; - esp_netif_str_to_ip6("fd11:22::1", &addr6.addr.u_addr.ip6); - addr6.addr.type = ESP_IPADDR_TYPE_V6; - addr4.next = &addr6; - addr6.next = NULL; - ESP_ERROR_CHECK( mdns_delegate_hostname_add(delegated_hostname, &addr4) ); - ESP_ERROR_CHECK( mdns_service_add_for_host("test0", "_http", "_tcp", delegated_hostname, 1234, serviceTxtData, 3) ); - free(delegated_hostname); -#endif // CONFIG_MDNS_PUBLISH_DELEGATE_HOST - - //add another TXT item - ESP_ERROR_CHECK( mdns_service_txt_item_set("_http", "_tcp", "path", "/foobar") ); - //change TXT item value - ESP_ERROR_CHECK( mdns_service_txt_item_set_with_explicit_value_len("_http", "_tcp", "u", "admin", strlen("admin")) ); - free(hostname); -} - -/* these strings match tcpip_adapter_if_t enumeration */ -// static const char * if_str[] = {"STA", "AP", "ETH", "MAX"}; - -/* these strings match mdns_ip_protocol_t enumeration */ -// static const char * ip_protocol_str[] = {"V4", "V6", "MAX"}; - -static void mdns_print_results(mdns_result_t *results) -{ - mdns_result_t *r = results; - mdns_ip_addr_t *a = NULL; - //int i = 1; - int t; - while(r){ - //printf("%d: Interface: %s, Type: %s\n", i++, if_str[r->tcpip_if], ip_protocol_str[r->ip_protocol]); - if(r->instance_name){ - printf(" PTR : %s\n", r->instance_name); - } - if (r->hostname) { - printf(" SRV : %s.local:%u\n", r->hostname, r->port); - } - if (r->txt_count) { - printf(" TXT : [%zu] ", r->txt_count); - for (t = 0; t < r->txt_count; t++) { - printf("%s=%s(%d); ", r->txt[t].key, r->txt[t].value ? r->txt[t].value : "NULL", r->txt_value_len[t]); - } - printf("\n"); - } - a = r->addr; - while (a) { - if (a->addr.type == ESP_IPADDR_TYPE_V6) { - printf(" AAAA: " IPV6STR "\n", IPV62STR(a->addr.u_addr.ip6)); - } else { - printf(" A : " IPSTR "\n", IP2STR(&(a->addr.u_addr.ip4))); - } - a = a->next; - } - r = r->next; - } -} - -static void query_mdns_service(const char * service_name, const char * proto) -{ - ESP_LOGI(TAG, "Query PTR: %s.%s.local", service_name, proto); - - mdns_result_t * results = NULL; - esp_err_t err = mdns_query_ptr(service_name, proto, 3000, 20, &results); - if(err){ - ESP_LOGE(TAG, "Query Failed: %s", esp_err_to_name(err)); - return; - } - if(!results){ - ESP_LOGW(TAG, "No results found!"); - return; - } - - mdns_print_results(results); - mdns_query_results_free(results); -} - -static bool check_and_print_result(mdns_search_once_t *search) -{ - // Check if any result is available - mdns_result_t * result = NULL; - if (!mdns_query_async_get_results(search, 0, &result)) { - return false; - } - - if (!result) { // search timeout, but no result - return true; - } - - // If yes, print the result - mdns_ip_addr_t * a = result->addr; - while (a) { - if(a->addr.type == ESP_IPADDR_TYPE_V6){ - printf(" AAAA: " IPV6STR "\n", IPV62STR(a->addr.u_addr.ip6)); - } else { - printf(" A : " IPSTR "\n", IP2STR(&(a->addr.u_addr.ip4))); - } - a = a->next; - } - // and free the result - mdns_query_results_free(result); - return true; -} - -static void query_mdns_hosts_async(const char * host_name) -{ - ESP_LOGI(TAG, "Query both A and AAA: %s.local", host_name); - - mdns_search_once_t *s_a = mdns_query_async_new(host_name, NULL, NULL, MDNS_TYPE_A, 1000, 1, NULL); - mdns_query_async_delete(s_a); - mdns_search_once_t *s_aaaa = mdns_query_async_new(host_name, NULL, NULL, MDNS_TYPE_AAAA, 1000, 1, NULL); - while (s_a || s_aaaa) { - if (s_a && check_and_print_result(s_a)) { - ESP_LOGI(TAG, "Query A %s.local finished", host_name); - mdns_query_async_delete(s_a); - s_a = NULL; - } - if (s_aaaa && check_and_print_result(s_aaaa)) { - ESP_LOGI(TAG, "Query AAAA %s.local finished", host_name); - mdns_query_async_delete(s_aaaa); - s_aaaa = NULL; - } - } -} - -static void query_mdns_host(const char * host_name) -{ - ESP_LOGI(TAG, "Query A: %s.local", host_name); - - struct esp_ip4_addr addr; - addr.addr = 0; - - esp_err_t err = mdns_query_a(host_name, 2000, &addr); - if(err){ - if(err == ESP_ERR_NOT_FOUND){ - ESP_LOGW(TAG, "%s: Host was not found!", esp_err_to_name(err)); - return; - } - ESP_LOGE(TAG, "Query Failed: %s", esp_err_to_name(err)); - return; - } - - ESP_LOGI(TAG, "Query A: %s.local resolved to: " IPSTR, host_name, IP2STR(&addr)); -} - -static void initialise_button(void) -{ - gpio_config_t io_conf = {0}; - io_conf.intr_type = GPIO_INTR_DISABLE; - io_conf.pin_bit_mask = BIT64(EXAMPLE_BUTTON_GPIO); - io_conf.mode = GPIO_MODE_INPUT; - io_conf.pull_up_en = 1; - io_conf.pull_down_en = 0; - gpio_config(&io_conf); -} - -static void check_button(void) -{ - static bool old_level = true; - bool new_level = gpio_get_level(EXAMPLE_BUTTON_GPIO); - if (!new_level && old_level) { - query_mdns_hosts_async("esp32-mdns"); - query_mdns_host("esp32"); - query_mdns_service("_arduino", "_tcp"); - query_mdns_service("_http", "_tcp"); - query_mdns_service("_printer", "_tcp"); - query_mdns_service("_ipp", "_tcp"); - query_mdns_service("_afpovertcp", "_tcp"); - query_mdns_service("_smb", "_tcp"); - query_mdns_service("_ftp", "_tcp"); - query_mdns_service("_nfs", "_tcp"); - } - old_level = new_level; -} - -static void mdns_example_task(void *pvParameters) -{ -#if CONFIG_MDNS_RESOLVE_TEST_SERVICES == 1 - /* Send initial queries that are started by CI tester */ - query_mdns_host("tinytester"); - query_mdns_host_with_gethostbyname("tinytester-lwip.local"); - query_mdns_host_with_getaddrinfo("tinytester-lwip.local"); -#endif - - while (1) { - check_button(); - vTaskDelay(50 / portTICK_PERIOD_MS); - } -} - -void app_main(void) -{ - ESP_ERROR_CHECK(nvs_flash_init()); - ESP_ERROR_CHECK(esp_netif_init()); - ESP_ERROR_CHECK(esp_event_loop_create_default()); - - initialise_mdns(); - - /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. - * Read "Establishing Wi-Fi or Ethernet Connection" section in - * examples/protocols/README.md for more information about this function. - */ - // ESP_ERROR_CHECK(example_connect()); // To-do, change this to explicitelly register first for wifi interface, then add new one - - initialise_button(); - xTaskCreate(&mdns_example_task, "mdns_example_task", 2048, NULL, 5, NULL); -} - -/** Generate host name based on sdkconfig, optionally adding a portion of MAC address to it. - * @return host name string allocated from the heap - */ -static char* generate_hostname(void) -{ -#ifndef CONFIG_MDNS_ADD_MAC_TO_HOSTNAME - return strdup(CONFIG_MDNS_HOSTNAME); -#else - uint8_t mac[6]; - char *hostname; - esp_read_mac(mac, ESP_MAC_WIFI_STA); - if (-1 == asprintf(&hostname, "%s-%02X%02X%02X", CONFIG_MDNS_HOSTNAME, mac[3], mac[4], mac[5])) { - abort(); - } - return hostname; -#endif -} - -#if CONFIG_MDNS_RESOLVE_TEST_SERVICES == 1 -/** - * @brief Executes gethostbyname and displays list of resolved addresses. - * Note: This function is used only to test advertised mdns hostnames resolution - */ -static void query_mdns_host_with_gethostbyname(char * host) -{ - struct hostent *res = gethostbyname(host); - if (res) { - unsigned int i = 0; - while (res->h_addr_list[i] != NULL) { - ESP_LOGI(TAG, "gethostbyname: %s resolved to: %s", host, inet_ntoa(*(struct in_addr *) (res->h_addr_list[i]))); - i++; - } - } -} - -/** - * @brief Executes getaddrinfo and displays list of resolved addresses. - * Note: This function is used only to test advertised mdns hostnames resolution - */ -static void query_mdns_host_with_getaddrinfo(char * host) -{ - struct addrinfo hints; - struct addrinfo * res; - - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - - if (!getaddrinfo(host, NULL, &hints, &res)) { - while (res) { - ESP_LOGI(TAG, "getaddrinfo: %s resolved to: %s", host, - res->ai_family == AF_INET? - inet_ntoa(((struct sockaddr_in *) res->ai_addr)->sin_addr): - inet_ntoa(((struct sockaddr_in6 *) res->ai_addr)->sin6_addr)); - res = res->ai_next; - } - } -} -#endif From f8495f1e86de9a8e7d046bf13d0ca04775041b4c Mon Sep 17 00:00:00 2001 From: David Cermak Date: Tue, 14 Dec 2021 16:14:21 +0100 Subject: [PATCH 03/10] mdns: Indicate interface using esp_netif in search results --- components/mdns/Kconfig | 33 ++++ components/mdns/include/mdns.h | 9 +- components/mdns/mdns.c | 147 ++++++++++-------- components/mdns/mdns_console.c | 26 ++-- components/mdns/mdns_networking_lwip.c | 6 +- components/mdns/mdns_networking_socket.c | 6 +- .../mdns/private_include/mdns_private.h | 25 ++- .../protocols/mdns/main/mdns_example_main.c | 5 +- tools/ci/check_copyright_ignore.txt | 1 - 9 files changed, 156 insertions(+), 102 deletions(-) diff --git a/components/mdns/Kconfig b/components/mdns/Kconfig index 5607afac84..7ceefd88d0 100644 --- a/components/mdns/Kconfig +++ b/components/mdns/Kconfig @@ -1,5 +1,13 @@ menu "mDNS" + config MDNS_MAX_INTERFACES + int "Max number of interfaces" + range 1 9 + default 3 + help + Number of network interfaces to be served by the mdns library. + Lowering this number helps to reduce some static RAM usage. + config MDNS_MAX_SERVICES int "Max number of services" range 1 64 @@ -90,4 +98,29 @@ menu "mDNS" help Enables adding multiple service instances under the same service type. + menu "MDNS Predefined interfaces" + + config MDNS_PREDEF_NETIF_STA + bool "Use predefined interface for WiFi Station" + default y + help + Set up mdns for the default WiFi station. + Disable this option if you do not need mDNS on default WiFi STA. + + config MDNS_PREDEF_NETIF_AP + bool "Use predefined interface for WiFi Access Point" + default y + help + Set up mdns for the default WiFi Access Point. + Disable this option if you do not need mDNS on default WiFi AP. + + config MDNS_PREDEF_NETIF_ETH + bool "Use predefined interface for Ethernet" + default y + help + Set up mdns for the default Ethernet interface. + Disable this option if you do not need mDNS on default Ethernet. + + endmenu # MDNS Predefined interfaces + endmenu diff --git a/components/mdns/include/mdns.h b/components/mdns/include/mdns.h index fb14077b40..ab4e97ac3e 100644 --- a/components/mdns/include/mdns.h +++ b/components/mdns/include/mdns.h @@ -21,8 +21,6 @@ extern "C" { #define MDNS_TYPE_NSEC 0x002F #define MDNS_TYPE_ANY 0x00FF -#define CONFIG_MDNS_IF_MAX 4 - /** * @brief Asynchronous query handle */ @@ -64,11 +62,6 @@ typedef struct mdns_ip_addr_s { struct mdns_ip_addr_s * next; /*!< next IP, or NULL for the last IP in the list */ } mdns_ip_addr_t; -typedef enum mdns_if_internal { - MDNS_IF_INVALID = -1, - MDNS_IF_MAX = CONFIG_MDNS_IF_MAX -} mdns_if_t; - /** * @brief mDNS query type to be explicitly set to either Unicast or Multicast */ @@ -83,7 +76,7 @@ typedef enum { typedef struct mdns_result_s { struct mdns_result_s * next; /*!< next result, or NULL for the last result in the list */ - mdns_if_t tcpip_if; /*!< interface index */ + esp_netif_t* esp_netif; /*!< ptr to corresponding esp-netif */ uint32_t ttl; /*!< time to live */ mdns_ip_protocol_t ip_protocol; /*!< ip_protocol type of the interface (v4/v6) */ diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index 27c6797cd2..50996cf7fe 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -59,11 +59,6 @@ static bool _mdns_append_host_list(mdns_out_answer_t ** destination, bool flush, static void _mdns_remap_self_service_hostname(const char *old_hostname, const char *new_hostname); static esp_err_t mdns_post_custom_action_tcpip_if(mdns_if_t mdns_if, mdns_event_actions_t event_action); -typedef enum mdns_netif_predef { - MDNS_USES_PREDEFINED_IF = 0, - MDNS_USES_CUSTOM_IF = 1, -} mdns_netif_predef_t; - typedef enum { MDNS_IF_STA = 0, MDNS_IF_AP = 1, @@ -73,7 +68,7 @@ typedef enum { typedef struct mdns_interfaces mdns_interfaces_t; struct mdns_interfaces { - mdns_netif_predef_t predefined; + bool predefined; esp_netif_t * netif; mdns_predef_if_t predef_if; mdns_if_t duplicate; @@ -83,10 +78,16 @@ struct mdns_interfaces { * @brief Internal collection of mdns supported interfaces * */ -static mdns_interfaces_t s_esp_netifs[MDNS_IF_MAX] = { - { .predefined = MDNS_USES_PREDEFINED_IF, .netif = NULL, .predef_if = MDNS_IF_STA, .duplicate = MDNS_IF_MAX }, - { .predefined = MDNS_USES_PREDEFINED_IF, .netif = NULL, .predef_if = MDNS_IF_AP, .duplicate = MDNS_IF_MAX }, - { .predefined = MDNS_USES_PREDEFINED_IF, .netif = NULL, .predef_if = MDNS_IF_ETH, .duplicate = MDNS_IF_MAX }, +static mdns_interfaces_t s_esp_netifs[MDNS_MAX_INTERFACES] = { +#if CONFIG_MDNS_PREDEF_NETIF_STA + { .predefined = true, .netif = NULL, .predef_if = MDNS_IF_STA, .duplicate = MDNS_MAX_INTERFACES }, +#endif +#if CONFIG_MDNS_PREDEF_NETIF_AP + { .predefined = true, .netif = NULL, .predef_if = MDNS_IF_AP, .duplicate = MDNS_MAX_INTERFACES }, +#endif +#if CONFIG_MDNS_PREDEF_NETIF_ETH + { .predefined = true, .netif = NULL, .predef_if = MDNS_IF_ETH, .duplicate = MDNS_MAX_INTERFACES }, +#endif }; @@ -95,12 +96,12 @@ static mdns_interfaces_t s_esp_netifs[MDNS_IF_MAX] = { */ static mdns_if_t mdns_if_from_predef_if(mdns_predef_if_t predef_if) { - for (int i=0; i MDNS_IF_INVALID && tcpip_if < MDNS_IF_MAX) { - if (s_esp_netifs[tcpip_if].netif == NULL && s_esp_netifs[tcpip_if].predefined == MDNS_USES_PREDEFINED_IF) { + if (tcpip_if < MDNS_MAX_INTERFACES) { + if (s_esp_netifs[tcpip_if].netif == NULL && s_esp_netifs[tcpip_if].predefined) { // if a predefined interface face and used local copy is NULL, try to search for the default interface key s_esp_netifs[tcpip_if].netif = esp_netif_from_preset_if(s_esp_netifs[tcpip_if].predef_if); } @@ -136,7 +137,7 @@ esp_netif_t *_mdns_get_esp_netif(mdns_if_t tcpip_if) * @brief Clean internal mdns interface's pointer */ static inline void _mdns_clean_netif_ptr(mdns_if_t tcpip_if) { - if (tcpip_if < MDNS_IF_MAX) { + if (tcpip_if < MDNS_MAX_INTERFACES) { s_esp_netifs[tcpip_if].netif = NULL; } } @@ -147,11 +148,11 @@ static inline void _mdns_clean_netif_ptr(mdns_if_t tcpip_if) { */ static mdns_if_t _mdns_get_if_from_esp_netif(esp_netif_t *interface) { - for (int i=0; i MDNS_IF_INVALID && tcpip_if < MDNS_IF_MAX) { + if (tcpip_if < MDNS_MAX_INTERFACES) { return s_esp_netifs[tcpip_if].duplicate; } - return MDNS_IF_MAX; + return MDNS_MAX_INTERFACES; } /** @@ -1113,7 +1114,7 @@ static mdns_if_t _mdns_get_other_if (mdns_if_t tcpip_if) static bool _mdns_if_is_dup(mdns_if_t tcpip_if) { mdns_if_t other_if = _mdns_get_other_if (tcpip_if); - if (other_if == MDNS_IF_MAX) { + if (other_if == MDNS_MAX_INTERFACES) { return false; } if (_mdns_server->interfaces[tcpip_if].pcbs[MDNS_IP_PROTOCOL_V4].state == PCB_DUP @@ -2119,7 +2120,7 @@ static void _mdns_send_bye(mdns_srv_item_t ** services, size_t len, bool include return; } - for (i=0; iinterfaces[i].pcbs[j].pcb && _mdns_server->interfaces[i].pcbs[j].state == PCB_RUNNING) { _mdns_pcb_send_bye((mdns_if_t)i, (mdns_ip_protocol_t)j, services, len, include_ip); @@ -2177,7 +2178,7 @@ static void _mdns_announce_pcb(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protoco static void _mdns_probe_all_pcbs(mdns_srv_item_t ** services, size_t len, bool probe_ip, bool clear_old_probe) { uint8_t i, j; - for (i=0; iinterfaces[i].pcbs[j].pcb) { mdns_pcb_t * _pcb = &_mdns_server->interfaces[i].pcbs[j]; @@ -2199,7 +2200,7 @@ static void _mdns_probe_all_pcbs(mdns_srv_item_t ** services, size_t len, bool p static void _mdns_announce_all_pcbs(mdns_srv_item_t ** services, size_t len, bool include_ip) { uint8_t i, j; - for (i=0; itype == MDNS_TYPE_PTR) { result = search_result->result; while (result) { - if (packet->tcpip_if == result->tcpip_if + if (_mdns_get_esp_netif(packet->tcpip_if) == result->esp_netif && packet->ip_protocol == result->ip_protocol && result->instance_name && !strcmp(name->host, result->instance_name)) { break; @@ -3602,7 +3603,7 @@ void mdns_parse_packet(mdns_rx_packet_t * packet) if (search_result->type == MDNS_TYPE_PTR) { result = search_result->result; while (result) { - if (packet->tcpip_if == result->tcpip_if + if (_mdns_get_esp_netif(packet->tcpip_if) == result->esp_netif && packet->ip_protocol == result->ip_protocol && result->instance_name && !strcmp(name->host, result->instance_name)) { break; @@ -3810,7 +3811,7 @@ void _mdns_disable_pcb(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol) _mdns_clear_pcb_tx_queue_head(tcpip_if, ip_protocol); _mdns_pcb_deinit(tcpip_if, ip_protocol); mdns_if_t other_if = _mdns_get_other_if (tcpip_if); - if (other_if != MDNS_IF_MAX && _mdns_server->interfaces[other_if].pcbs[ip_protocol].state == PCB_DUP) { + if (other_if != MDNS_MAX_INTERFACES && _mdns_server->interfaces[other_if].pcbs[ip_protocol].state == PCB_DUP) { _mdns_server->interfaces[other_if].pcbs[ip_protocol].state = PCB_OFF; _mdns_enable_pcb(other_if, ip_protocol); } @@ -3823,7 +3824,7 @@ void _mdns_disable_pcb(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol) */ static void perform_event_action(mdns_if_t mdns_if, mdns_event_actions_t action) { - if (!_mdns_server || mdns_if > MDNS_IF_MAX) { + if (!_mdns_server || mdns_if > MDNS_MAX_INTERFACES) { return; } if (action & MDNS_EVENT_ENABLE_IP4) { @@ -3871,7 +3872,6 @@ void mdns_preset_if_handle_system_event(void *arg, esp_event_base_t event_base, return; } - esp_netif_dhcp_status_t dcst; if (event_base == WIFI_EVENT) { switch(event_id) { @@ -3931,7 +3931,7 @@ void mdns_preset_if_handle_system_event(void *arg, esp_event_base_t event_base, { ip_event_got_ip6_t* event = (ip_event_got_ip6_t*) event_data; mdns_if_t mdns_if = _mdns_get_if_from_esp_netif(event->esp_netif); - if (mdns_if != MDNS_IF_MAX) { + if (mdns_if < MDNS_MAX_INTERFACES) { post_mdns_enable_pcb(mdns_if, MDNS_IP_PROTOCOL_V6); post_mdns_announce_pcb(mdns_if, MDNS_IP_PROTOCOL_V4); } @@ -4120,7 +4120,7 @@ static void _mdns_search_result_add_ip(mdns_search_once_t * search, const char * || search->type == MDNS_TYPE_ANY) { r = search->result; while (r) { - if (r->tcpip_if == tcpip_if && r->ip_protocol == ip_protocol) { + if (r->esp_netif == _mdns_get_esp_netif(tcpip_if) && r->ip_protocol == ip_protocol) { _mdns_result_add_ip(r, ip); _mdns_result_update_ttl(r, ttl); return; @@ -4144,7 +4144,7 @@ static void _mdns_search_result_add_ip(mdns_search_once_t * search, const char * a->next = r->addr; r->hostname = strdup(hostname); r->addr = a; - r->tcpip_if = tcpip_if; + r->esp_netif = _mdns_get_esp_netif(tcpip_if); r->ip_protocol = ip_protocol; r->next = search->result; r->ttl = ttl; @@ -4154,7 +4154,7 @@ static void _mdns_search_result_add_ip(mdns_search_once_t * search, const char * } else if (search->type == MDNS_TYPE_PTR || search->type == MDNS_TYPE_SRV) { r = search->result; while (r) { - if (r->tcpip_if == tcpip_if && r->ip_protocol == ip_protocol && !_str_null_or_empty(r->hostname) && !strcasecmp(hostname, r->hostname)) { + if (r->esp_netif == _mdns_get_esp_netif(tcpip_if) && r->ip_protocol == ip_protocol && !_str_null_or_empty(r->hostname) && !strcasecmp(hostname, r->hostname)) { _mdns_result_add_ip(r, ip); _mdns_result_update_ttl(r, ttl); break; @@ -4173,7 +4173,7 @@ static mdns_result_t * _mdns_search_result_add_ptr(mdns_search_once_t * search, { mdns_result_t * r = search->result; while (r) { - if (r->tcpip_if == tcpip_if && r->ip_protocol == ip_protocol && !_str_null_or_empty(r->instance_name) && !strcasecmp(instance, r->instance_name)) { + if (r->esp_netif == _mdns_get_esp_netif(tcpip_if) && r->ip_protocol == ip_protocol && !_str_null_or_empty(r->instance_name) && !strcasecmp(instance, r->instance_name)) { _mdns_result_update_ttl(r, ttl); return r; } @@ -4195,7 +4195,7 @@ static mdns_result_t * _mdns_search_result_add_ptr(mdns_search_once_t * search, return NULL; } - r->tcpip_if = tcpip_if; + r->esp_netif = _mdns_get_esp_netif(tcpip_if); r->ip_protocol = ip_protocol; r->ttl = ttl; r->next = search->result; @@ -4214,7 +4214,7 @@ static void _mdns_search_result_add_srv(mdns_search_once_t *search, const char * { mdns_result_t * r = search->result; while (r) { - if (r->tcpip_if == tcpip_if && r->ip_protocol == ip_protocol && !_str_null_or_empty(r->hostname) && !strcasecmp(hostname, r->hostname)) { + if (r->esp_netif == _mdns_get_esp_netif(tcpip_if) && r->ip_protocol == ip_protocol && !_str_null_or_empty(r->hostname) && !strcasecmp(hostname, r->hostname)) { _mdns_result_update_ttl(r, ttl); return; } @@ -4239,7 +4239,7 @@ static void _mdns_search_result_add_srv(mdns_search_once_t *search, const char * r->service_type = strdup(search->service); r->proto = strdup(search->proto); r->port = port; - r->tcpip_if = tcpip_if; + r->esp_netif = _mdns_get_esp_netif(tcpip_if); r->ip_protocol = ip_protocol; r->ttl = ttl; r->next = search->result; @@ -4257,7 +4257,7 @@ static void _mdns_search_result_add_txt(mdns_search_once_t *search, mdns_txt_ite { mdns_result_t * r = search->result; while (r) { - if (r->tcpip_if == tcpip_if && r->ip_protocol == ip_protocol) { + if (r->esp_netif == _mdns_get_esp_netif(tcpip_if) && r->ip_protocol == ip_protocol) { if (r->txt) { goto free_txt; } @@ -4280,7 +4280,7 @@ static void _mdns_search_result_add_txt(mdns_search_once_t *search, mdns_txt_ite r->txt = txt; r->txt_value_len = txt_value_len; r->txt_count = txt_count; - r->tcpip_if = tcpip_if; + r->esp_netif = _mdns_get_esp_netif(tcpip_if); r->ip_protocol = ip_protocol; r->ttl = ttl; r->next = search->result; @@ -4325,7 +4325,7 @@ static mdns_search_once_t * _mdns_search_find_from(mdns_search_once_t * s, mdns_ } r = s->result; while (r) { - if (r->tcpip_if == tcpip_if && r->ip_protocol == ip_protocol && !_str_null_or_empty(r->hostname) && !strcasecmp(name->host, r->hostname)) { + if (r->esp_netif == _mdns_get_esp_netif(tcpip_if) && r->ip_protocol == ip_protocol && !_str_null_or_empty(r->hostname) && !strcasecmp(name->host, r->hostname)) { return s; } r = r->next; @@ -4398,7 +4398,7 @@ static mdns_tx_packet_t * _mdns_create_search_packet(mdns_search_once_t * search r = search->result; while (r) { //full record on the same interface is available - if (r->tcpip_if != tcpip_if || r->ip_protocol != ip_protocol || r->instance_name == NULL || r->hostname == NULL || r->addr == NULL) { + if (r->esp_netif != _mdns_get_esp_netif(tcpip_if) || r->ip_protocol != ip_protocol || r->instance_name == NULL || r->hostname == NULL || r->addr == NULL) { r = r->next; continue; } @@ -4462,7 +4462,7 @@ static void _mdns_search_send(mdns_search_once_t * search) } uint8_t i, j; - for (i=0; i= MDNS_IF_MAX) { + if (!_mdns_server || mdns_if >= MDNS_MAX_INTERFACES) { return ESP_FAIL; } @@ -5048,21 +5048,35 @@ static esp_err_t mdns_post_custom_action_tcpip_if(mdns_if_t mdns_if, mdns_event_ static inline void set_default_duplicated_interfaces(void) { - mdns_if_t wifi_sta_if = MDNS_IF_MAX, eth_if = MDNS_IF_MAX; - for (mdns_if_t i=0; ilock = xSemaphoreCreateMutex(); if (!_mdns_server->lock) { @@ -5100,13 +5116,18 @@ esp_err_t mdns_init(void) err = ESP_ERR_NO_MEM; goto free_lock; } + +#if CONFIG_MDNS_PREDEF_NETIF_STA || CONFIG_MDNS_PREDEF_NETIF_AP if ((err = esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, mdns_preset_if_handle_system_event, NULL)) != ESP_OK) { goto free_event_handlers; } +#endif +#if CONFIG_MDNS_PREDEF_NETIF_STA || CONFIG_MDNS_PREDEF_NETIF_AP || CONFIG_MDNS_PREDEF_NETIF_ETH if ((err = esp_event_handler_register(IP_EVENT, ESP_EVENT_ANY_ID, mdns_preset_if_handle_system_event, NULL)) != ESP_OK) { goto free_event_handlers; } -#if CONFIG_ETH_ENABLED +#endif +#if defined(CONFIG_ETH_ENABLED) && CONFIG_MDNS_PREDEF_NETIF_ETH if ((err = esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, mdns_preset_if_handle_system_event, NULL)) != ESP_OK) { goto free_event_handlers; } @@ -5120,7 +5141,7 @@ esp_err_t mdns_init(void) #endif esp_netif_ip_info_t if_ip_info; - for (i=0; iaction_queue); free_lock: vSemaphoreDelete(_mdns_server->lock); @@ -5168,16 +5185,12 @@ void mdns_free(void) } // Unregister handlers before destroying the mdns internals to avoid receiving async events while deinit - esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, mdns_preset_if_handle_system_event); - esp_event_handler_unregister(IP_EVENT, ESP_EVENT_ANY_ID, mdns_preset_if_handle_system_event); -#if CONFIG_ETH_ENABLED - esp_event_handler_unregister(ETH_EVENT, ESP_EVENT_ANY_ID, mdns_preset_if_handle_system_event); -#endif + unregister_predefined_handlers(); mdns_service_remove_all(); free_delegated_hostnames(); _mdns_service_task_stop(); - for (i=0; i #include #include "esp_console.h" #include "argtable3/argtable3.h" #include "mdns.h" -static const char * if_str[] = {"STA", "AP", "ETH", "MAX"}; static const char * ip_protocol_str[] = {"V4", "V6", "MAX"}; +static const char * if_str(esp_netif_t *netif) +{ + return esp_netif_get_ifkey(netif); +} + static void mdns_print_results(mdns_result_t * results) { mdns_result_t * r = results; mdns_ip_addr_t * a = NULL; int i = 1; while (r) { - printf("%d: Interface: %s, Type: %s\n", i++, if_str[r->tcpip_if], ip_protocol_str[r->ip_protocol]); + printf("%d: Interface: %s, Type: %s\n", i++, if_str(r->esp_netif), ip_protocol_str[r->ip_protocol]); if (r->instance_name) { printf(" PTR : %s\n", r->instance_name); } diff --git a/components/mdns/mdns_networking_lwip.c b/components/mdns/mdns_networking_lwip.c index 5f7a6673fb..370661d122 100644 --- a/components/mdns/mdns_networking_lwip.c +++ b/components/mdns/mdns_networking_lwip.c @@ -134,7 +134,7 @@ static void _udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *pb, const ip continue; } - packet->tcpip_if = MDNS_IF_MAX; + packet->tcpip_if = MDNS_MAX_INTERFACES; packet->pb = this_pb; packet->src_port = rport; #if CONFIG_LWIP_IPV6 @@ -164,7 +164,7 @@ static void _udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *pb, const ip //lwip does not return the proper pcb if you have more than one for the same multicast address (but different interfaces) struct netif * netif = NULL; struct udp_pcb * pcb = NULL; - for (i=0; iinterfaces[i].pcbs[packet->ip_protocol].pcb; netif = esp_netif_get_netif_impl(_mdns_get_esp_netif(i)); if (pcb && netif && netif == ip_current_input_netif ()) { @@ -198,7 +198,7 @@ static void _udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *pb, const ip */ static bool _udp_pcb_is_in_use(void){ int i, p; - for (i=0; iinterfaces[i].pcbs[p].pcb){ return true; diff --git a/components/mdns/mdns_networking_socket.c b/components/mdns/mdns_networking_socket.c index 45ad83dec3..f4341d4f63 100644 --- a/components/mdns/mdns_networking_socket.c +++ b/components/mdns/mdns_networking_socket.c @@ -101,7 +101,7 @@ esp_err_t _mdns_pcb_deinit(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol) } } - for (int i=0; iinterfaces[i].pcbs[j].pcb) // If any of the interfaces/protocol initialized @@ -247,7 +247,7 @@ void sock_recv_task(void* arg) fd_set rfds; FD_ZERO(&rfds); int max_sock = -1; - for (int i=0; iinterfaces[i].pcbs[j].pcb); if (sock >= 0) { @@ -267,7 +267,7 @@ void sock_recv_task(void* arg) ESP_LOGE(TAG, "Select failed. errno=%d: %s", errno, strerror(errno)); break; } else if (s > 0) { - for (int tcpip_if=0; tcpip_ifinterfaces[tcpip_if].pcbs[MDNS_IP_PROTOCOL_V4].pcb); if (sock < 0) { diff --git a/components/mdns/private_include/mdns_private.h b/components/mdns/private_include/mdns_private.h index e766146a7c..bf1d6d8bff 100644 --- a/components/mdns/private_include/mdns_private.h +++ b/components/mdns/private_include/mdns_private.h @@ -41,6 +41,27 @@ * any item in question field */ #define MDNS_REPEAT_QUERY_IN_RESPONSE 1 #endif + +/** Number of predefined interfaces */ +#ifndef CONFIG_MDNS_PREDEF_NETIF_STA +#define CONFIG_MDNS_PREDEF_NETIF_STA 0 +#endif +#ifndef CONFIG_MDNS_PREDEF_NETIF_AP +#define CONFIG_MDNS_PREDEF_NETIF_AP 0 +#endif +#ifndef CONFIG_MDNS_PREDEF_NETIF_ETH +#define CONFIG_MDNS_PREDEF_NETIF_ETH 0 +#endif +#define MDNS_MAX_PREDEF_INTERFACES (CONFIG_MDNS_PREDEF_NETIF_STA + CONFIG_MDNS_PREDEF_NETIF_AP + CONFIG_MDNS_PREDEF_NETIF_ETH) + +/** Number of configured interfaces */ +#if MDNS_MAX_PREDEF_INTERFACES > CONFIG_MDNS_MAX_INTERFACES +#warning Number of configured interfaces is less then number of predefined interfaces. Please update CONFIG_MDNS_MAX_INTERFACES. +#define MDNS_MAX_INTERFACES (MDNS_MAX_PREDEF_INTERFACES) +#else +#define MDNS_MAX_INTERFACES (CONFIG_MDNS_MAX_INTERFACES) +#endif + /** The maximum number of services */ #define MDNS_MAX_SERVICES CONFIG_MDNS_MAX_SERVICES @@ -150,6 +171,8 @@ #define HOOK_MALLOC_FAILED ESP_LOGE(TAG, "Cannot allocate memory (line: %d, free heap: %d bytes)", __LINE__, esp_get_free_heap_size()); #endif +typedef size_t mdns_if_t; + typedef enum { PCB_OFF, PCB_DUP, PCB_INIT, PCB_PROBE_1, PCB_PROBE_2, PCB_PROBE_3, @@ -384,7 +407,7 @@ typedef struct mdns_search_once_s { typedef struct mdns_server_s { struct { mdns_pcb_t pcbs[MDNS_IP_PROTOCOL_MAX]; - } interfaces[MDNS_IF_MAX]; + } interfaces[MDNS_MAX_INTERFACES]; const char * hostname; const char * instance; mdns_srv_item_t * services; diff --git a/examples/protocols/mdns/main/mdns_example_main.c b/examples/protocols/mdns/main/mdns_example_main.c index c1db88ba09..5a90b51653 100644 --- a/examples/protocols/mdns/main/mdns_example_main.c +++ b/examples/protocols/mdns/main/mdns_example_main.c @@ -83,9 +83,6 @@ static void initialise_mdns(void) free(hostname); } -/* these strings match tcpip_adapter_if_t enumeration */ -static const char * if_str[] = {"STA", "AP", "ETH", "MAX"}; - /* these strings match mdns_ip_protocol_t enumeration */ static const char * ip_protocol_str[] = {"V4", "V6", "MAX"}; @@ -95,7 +92,7 @@ static void mdns_print_results(mdns_result_t *results) mdns_ip_addr_t *a = NULL; int i = 1, t; while (r) { - printf("%d: Interface: %s, Type: %s, TTL: %u\n", i++, if_str[r->tcpip_if], ip_protocol_str[r->ip_protocol], + printf("%d: Interface: %s, Type: %s, TTL: %u\n", i++, esp_netif_get_ifkey(r->esp_netif), ip_protocol_str[r->ip_protocol], r->ttl); if (r->instance_name) { printf(" PTR : %s.%s.%s\n", r->instance_name, r->service_type, r->proto); diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index b49059cd30..2f3229f475 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -1140,7 +1140,6 @@ components/mdns/host_test/components/freertos_linux/queue_unique_ptr.cpp components/mdns/host_test/components/freertos_linux/queue_unique_ptr.hpp components/mdns/host_test/main/main.c components/mdns/include/mdns_console.h -components/mdns/mdns_console.c components/mdns/mdns_networking_lwip.c components/mdns/private_include/mdns_networking.h components/mdns/test/test_mdns.c From bec42ff85d5091d71e1cb1063bea20d7c6ac8c76 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Tue, 14 Dec 2021 18:07:23 +0100 Subject: [PATCH 04/10] mdns: Add support for registering custom netif --- components/mdns/include/mdns.h | 5 ++ components/mdns/mdns.c | 50 +++++++++++++++++++ .../protocols/mdns/main/Kconfig.projbuild | 9 ++++ .../protocols/mdns/main/mdns_example_main.c | 8 +++ 4 files changed, 72 insertions(+) diff --git a/components/mdns/include/mdns.h b/components/mdns/include/mdns.h index ab4e97ac3e..58121135a5 100644 --- a/components/mdns/include/mdns.h +++ b/components/mdns/include/mdns.h @@ -719,6 +719,11 @@ esp_err_t mdns_query_a(const char * host_name, uint32_t timeout, esp_ip4_addr_t esp_err_t mdns_query_aaaa(const char * host_name, uint32_t timeout, esp_ip6_addr_t * addr); #endif + +esp_err_t mdns_add_custom_netif(esp_netif_t *esp_netif); +esp_err_t mdns_post_custom_action(esp_netif_t *esp_netif, mdns_event_actions_t event_action); +esp_err_t mdns_delete_custom_netif(esp_netif_t *esp_netif); + #ifdef __cplusplus } #endif diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index 50996cf7fe..519365397c 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -5086,6 +5086,52 @@ esp_err_t mdns_post_custom_action(esp_netif_t *esp_netif, mdns_event_actions_t e return mdns_post_custom_action_tcpip_if(_mdns_get_if_from_esp_netif(esp_netif), event_action); } +esp_err_t mdns_add_custom_netif(esp_netif_t *esp_netif) +{ + if (!_mdns_server) { + return ESP_ERR_INVALID_STATE; + } + + esp_err_t err = ESP_ERR_NO_MEM; + MDNS_SERVICE_LOCK(); + for (mdns_if_t i=0; iaction_queue); free_lock: vSemaphoreDelete(_mdns_server->lock); diff --git a/examples/protocols/mdns/main/Kconfig.projbuild b/examples/protocols/mdns/main/Kconfig.projbuild index bc4b1a055c..b66e6f867a 100644 --- a/examples/protocols/mdns/main/Kconfig.projbuild +++ b/examples/protocols/mdns/main/Kconfig.projbuild @@ -48,4 +48,13 @@ menu "Example Configuration" help Set the GPIO number used as mDNS test button + config MDNS_ADD_CUSTOM_NETIF + bool "Add user netif to mdns service" + default n + help + If enabled, we try to add a custom netif to mdns service. + Note that for using with common connection example code, we have to disable + all predefined interfaces in mdns component setup (since we're adding one + of the default interfaces) + endmenu diff --git a/examples/protocols/mdns/main/mdns_example_main.c b/examples/protocols/mdns/main/mdns_example_main.c index 5a90b51653..c1a9ba8686 100644 --- a/examples/protocols/mdns/main/mdns_example_main.c +++ b/examples/protocols/mdns/main/mdns_example_main.c @@ -266,6 +266,14 @@ void app_main(void) */ ESP_ERROR_CHECK(example_connect()); +#if defined(CONFIG_MDNS_ADD_CUSTOM_NETIF) && !defined(CONFIG_MDNS_PREDEF_NETIF_STA) && !defined(CONFIG_MDNS_PREDEF_NETIF_ETH) + /* Demonstration of adding a custom netif to mdns service, but we're adding the default example one, + * so we must disable all predefined interfaces (PREDEF_NETIF_STA, AP and ETH) first + */ + ESP_ERROR_CHECK(mdns_add_custom_netif(EXAMPLE_INTERFACE)); + ESP_ERROR_CHECK(mdns_post_custom_action(EXAMPLE_INTERFACE, MDNS_EVENT_ENABLE_IP4)); + ESP_ERROR_CHECK(mdns_post_custom_action(EXAMPLE_INTERFACE, MDNS_EVENT_ANNOUNCE_IP4)); +#endif initialise_button(); xTaskCreate(&mdns_example_task, "mdns_example_task", 2048, NULL, 5, NULL); } From d1b809e6a1807687e772cee819534634ed1378de Mon Sep 17 00:00:00 2001 From: David Cermak Date: Tue, 14 Dec 2021 18:34:04 +0100 Subject: [PATCH 05/10] CI/mdns: Extend example test for sockets, netifs --- examples/protocols/mdns/mdns_example_test.py | 29 ++++++++++++++----- .../protocols/mdns/sdkconfig.ci.custom_netif | 8 +++++ examples/protocols/mdns/sdkconfig.ci.socket | 5 ++++ 3 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 examples/protocols/mdns/sdkconfig.ci.custom_netif create mode 100644 examples/protocols/mdns/sdkconfig.ci.socket diff --git a/examples/protocols/mdns/mdns_example_test.py b/examples/protocols/mdns/mdns_example_test.py index f067077182..4307b9972e 100644 --- a/examples/protocols/mdns/mdns_example_test.py +++ b/examples/protocols/mdns/mdns_example_test.py @@ -34,7 +34,7 @@ def get_dns_answer_to_mdns(tester_host): arr.type = dpkt.dns.DNS_A arr.name = tester_host arr.ip = socket.inet_aton('127.0.0.1') - dns. an.append(arr) + dns.an.append(arr) console_log('Created answer to mdns query: {} '.format(dns.__repr__())) return dns.pack() @@ -64,7 +64,7 @@ def mdns_server(esp_host): sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) sock.setblocking(False) - sock.bind((UDP_IP,UDP_PORT)) + sock.bind((UDP_IP, UDP_PORT)) mreq = struct.pack('4sl', socket.inet_aton(MCAST_GRP), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) last_query_timepoint = time.time() @@ -74,9 +74,9 @@ def mdns_server(esp_host): if current_time - last_query_timepoint > QUERY_TIMEOUT: last_query_timepoint = current_time if not esp_answered.is_set(): - sock.sendto(get_dns_query_for_esp(esp_host), (MCAST_GRP,UDP_PORT)) + sock.sendto(get_dns_query_for_esp(esp_host), (MCAST_GRP, UDP_PORT)) if not esp_delegated_answered.is_set(): - sock.sendto(get_dns_query_for_esp(esp_host + '-delegated'), (MCAST_GRP,UDP_PORT)) + sock.sendto(get_dns_query_for_esp(esp_host + '-delegated'), (MCAST_GRP, UDP_PORT)) timeout = max(0, QUERY_TIMEOUT - (current_time - last_query_timepoint)) read_socks, _, _ = select.select([sock], [], [], timeout) if not read_socks: @@ -86,7 +86,7 @@ def mdns_server(esp_host): if len(dns.qd) > 0 and dns.qd[0].type == dpkt.dns.DNS_A: if dns.qd[0].name == TESTER_NAME: console_log('Received query: {} '.format(dns.__repr__())) - sock.sendto(get_dns_answer_to_mdns(TESTER_NAME), (MCAST_GRP,UDP_PORT)) + sock.sendto(get_dns_answer_to_mdns(TESTER_NAME), (MCAST_GRP, UDP_PORT)) elif dns.qd[0].name == TESTER_NAME_LWIP: console_log('Received query: {} '.format(dns.__repr__())) sock.sendto(get_dns_answer_to_mdns_lwip(TESTER_NAME_LWIP, dns.id), addr) @@ -105,7 +105,7 @@ def mdns_server(esp_host): @ttfw_idf.idf_example_test(env_tag='Example_EthKitV1') -def test_examples_protocol_mdns(env, extra_data): +def test_examples_protocol_mdns(env, config): global stop_mdns_server """ steps: | @@ -152,5 +152,20 @@ def test_examples_protocol_mdns(env, extra_data): mdns_responder.join() +@ttfw_idf.idf_example_test(env_tag='Example_WIFI_Protocols') +def test_examples_protocol_mdns_default(env, _): + test_examples_protocol_mdns(env, None) + + +@ttfw_idf.idf_example_test(env_tag='Example_WIFI_Protocols') +def test_examples_protocol_mdns_socket(env, _): + test_examples_protocol_mdns(env, 'socket') + + +@ttfw_idf.idf_example_test(env_tag='Example_WIFI_Protocols') +def test_examples_protocol_mdns_custom_netif(env, _): + test_examples_protocol_mdns(env, 'custom_netif') + + if __name__ == '__main__': - test_examples_protocol_mdns() + test_examples_protocol_mdns_default() diff --git a/examples/protocols/mdns/sdkconfig.ci.custom_netif b/examples/protocols/mdns/sdkconfig.ci.custom_netif new file mode 100644 index 0000000000..3550c5204d --- /dev/null +++ b/examples/protocols/mdns/sdkconfig.ci.custom_netif @@ -0,0 +1,8 @@ +CONFIG_MDNS_RESOLVE_TEST_SERVICES=y +CONFIG_MDNS_ADD_MAC_TO_HOSTNAME=y +CONFIG_MDNS_PUBLISH_DELEGATE_HOST=y +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +CONFIG_MDNS_PREDEF_NETIF_STA=n +CONFIG_MDNS_PREDEF_NETIF_AP=n +CONFIG_MDNS_PREDEF_NETIF_ETH=n +CONFIG_MDNS_ADD_CUSTOM_NETIF=y diff --git a/examples/protocols/mdns/sdkconfig.ci.socket b/examples/protocols/mdns/sdkconfig.ci.socket new file mode 100644 index 0000000000..dc1884f11f --- /dev/null +++ b/examples/protocols/mdns/sdkconfig.ci.socket @@ -0,0 +1,5 @@ +CONFIG_MDNS_RESOLVE_TEST_SERVICES=y +CONFIG_MDNS_ADD_MAC_TO_HOSTNAME=y +CONFIG_MDNS_PUBLISH_DELEGATE_HOST=y +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +CONFIG_MDNS_NETWORKING_SOCKET=y From 98e9426b660a6e825f811cccd45a0722cc801ccd Mon Sep 17 00:00:00 2001 From: David Cermak Date: Tue, 14 Dec 2021 21:35:27 +0100 Subject: [PATCH 06/10] CI/mdns: Fix fuzzer build --- components/mdns/test_afl_fuzz_host/sdkconfig.h | 1 + components/mdns/test_afl_fuzz_host/test.c | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/components/mdns/test_afl_fuzz_host/sdkconfig.h b/components/mdns/test_afl_fuzz_host/sdkconfig.h index d17d4f5e8f..fe207b001e 100644 --- a/components/mdns/test_afl_fuzz_host/sdkconfig.h +++ b/components/mdns/test_afl_fuzz_host/sdkconfig.h @@ -284,6 +284,7 @@ #define CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED 1 #define CONFIG_MBEDTLS_ECP_NIST_OPTIM 1 #define CONFIG_MDNS_MAX_SERVICES 25 +#define CONFIG_MDNS_MAX_INTERFACES 3 #define CONFIG_MDNS_TASK_PRIORITY 1 #define CONFIG_MDNS_TASK_STACK_SIZE 4096 #define CONFIG_MDNS_TASK_AFFINITY_CPU0 1 diff --git a/components/mdns/test_afl_fuzz_host/test.c b/components/mdns/test_afl_fuzz_host/test.c index b48d904e3f..568c7eee19 100644 --- a/components/mdns/test_afl_fuzz_host/test.c +++ b/components/mdns/test_afl_fuzz_host/test.c @@ -34,8 +34,10 @@ extern mdns_server_t * _mdns_server; // mdns function wrappers for mdns setup in test mode static int mdns_test_hostname_set(const char * mdns_hostname) { - _mdns_server->interfaces[MDNS_IF_STA].pcbs[MDNS_IP_PROTOCOL_V4].state = PCB_RUNNING; // mark the PCB running to exercise mdns in fully operational mode - _mdns_server->interfaces[MDNS_IF_STA].pcbs[MDNS_IP_PROTOCOL_V6].state = PCB_RUNNING; + for (int i=0; iinterfaces[i].pcbs[MDNS_IP_PROTOCOL_V4].state = PCB_RUNNING; // mark the PCB running to exercise mdns in fully operational mode + _mdns_server->interfaces[i].pcbs[MDNS_IP_PROTOCOL_V6].state = PCB_RUNNING; + } int ret = mdns_hostname_set(mdns_hostname); mdns_action_t * a = NULL; GetLastItem(&a); From dd3cd52fd6c04c6ed078247f47963fbc3f216608 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Wed, 15 Dec 2021 15:48:59 +0100 Subject: [PATCH 07/10] CI/mdns: Reworked example test to be run repeatably --- examples/protocols/mdns/mdns_example_test.py | 43 ++++++++----------- .../protocols/mdns/sdkconfig.ci.custom_netif | 8 ---- .../mdns/sdkconfig.ci.eth_custom_netif | 19 ++++++++ ...config.ci.eth_kit => sdkconfig.ci.eth_def} | 0 .../protocols/mdns/sdkconfig.ci.eth_socket | 16 +++++++ examples/protocols/mdns/sdkconfig.ci.socket | 5 --- 6 files changed, 54 insertions(+), 37 deletions(-) delete mode 100644 examples/protocols/mdns/sdkconfig.ci.custom_netif create mode 100644 examples/protocols/mdns/sdkconfig.ci.eth_custom_netif rename examples/protocols/mdns/{sdkconfig.ci.eth_kit => sdkconfig.ci.eth_def} (100%) create mode 100644 examples/protocols/mdns/sdkconfig.ci.eth_socket delete mode 100644 examples/protocols/mdns/sdkconfig.ci.socket diff --git a/examples/protocols/mdns/mdns_example_test.py b/examples/protocols/mdns/mdns_example_test.py index 4307b9972e..83763634eb 100644 --- a/examples/protocols/mdns/mdns_example_test.py +++ b/examples/protocols/mdns/mdns_example_test.py @@ -13,10 +13,6 @@ import ttfw_idf from tiny_test_fw import DUT from tiny_test_fw.Utility import console_log -stop_mdns_server = Event() -esp_answered = Event() -esp_delegated_answered = Event() - def get_dns_query_for_esp(esp_host): dns = dpkt.dns.DNS(b'\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01') @@ -52,8 +48,7 @@ def get_dns_answer_to_mdns_lwip(tester_host, id): return dns.pack() -def mdns_server(esp_host): - global esp_answered +def mdns_server(esp_host, events): UDP_IP = '0.0.0.0' UDP_PORT = 5353 MCAST_GRP = '224.0.0.251' @@ -68,14 +63,14 @@ def mdns_server(esp_host): mreq = struct.pack('4sl', socket.inet_aton(MCAST_GRP), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) last_query_timepoint = time.time() - while not stop_mdns_server.is_set(): + while not events['stop'].is_set(): try: current_time = time.time() if current_time - last_query_timepoint > QUERY_TIMEOUT: last_query_timepoint = current_time - if not esp_answered.is_set(): + if not events['esp_answered'].is_set(): sock.sendto(get_dns_query_for_esp(esp_host), (MCAST_GRP, UDP_PORT)) - if not esp_delegated_answered.is_set(): + if not events['esp_delegated_answered'].is_set(): sock.sendto(get_dns_query_for_esp(esp_host + '-delegated'), (MCAST_GRP, UDP_PORT)) timeout = max(0, QUERY_TIMEOUT - (current_time - last_query_timepoint)) read_socks, _, _ = select.select([sock], [], [], timeout) @@ -94,19 +89,17 @@ def mdns_server(esp_host): console_log('Received answer from {}'.format(dns.an[0].name)) if dns.an[0].name == esp_host + u'.local': console_log('Received answer to esp32-mdns query: {}'.format(dns.__repr__())) - esp_answered.set() + events['esp_answered'].set() if dns.an[0].name == esp_host + u'-delegated.local': console_log('Received answer to esp32-mdns-delegate query: {}'.format(dns.__repr__())) - esp_delegated_answered.set() + events['esp_delegated_answered'].set() except socket.timeout: break except dpkt.UnpackError: continue -@ttfw_idf.idf_example_test(env_tag='Example_EthKitV1') def test_examples_protocol_mdns(env, config): - global stop_mdns_server """ steps: | 1. obtain IP address + init mdns example @@ -114,7 +107,7 @@ def test_examples_protocol_mdns(env, config): 3. check the mdns name is accessible 4. check DUT output if mdns advertized host is resolved """ - dut1 = env.get_dut('mdns-test', 'examples/protocols/mdns', dut_class=ttfw_idf.ESP32DUT, app_config_name='eth_kit') + dut1 = env.get_dut('mdns-test', 'examples/protocols/mdns', dut_class=ttfw_idf.ESP32DUT, app_config_name=config) # check and log bin size binary_file = os.path.join(dut1.app.binary_path, 'mdns_test.bin') bin_size = os.path.getsize(binary_file) @@ -123,7 +116,9 @@ def test_examples_protocol_mdns(env, config): dut1.start_app() # 2. get the dut host name (and IP address) specific_host = dut1.expect(re.compile(r'mdns hostname set to: \[([^\]]+)\]'), timeout=30)[0] - mdns_responder = Thread(target=mdns_server, args=(str(specific_host),)) + + mdns_server_events = {'stop': Event(), 'esp_answered': Event(), 'esp_delegated_answered': Event()} + mdns_responder = Thread(target=mdns_server, args=(str(specific_host), mdns_server_events)) try: ip_address = dut1.expect(re.compile(r' eth ip: ([^,]+),'), timeout=30)[0] console_log('Connected to AP with IP: {}'.format(ip_address)) @@ -132,9 +127,9 @@ def test_examples_protocol_mdns(env, config): try: # 3. check the mdns name is accessible mdns_responder.start() - if not esp_answered.wait(timeout=30): + if not mdns_server_events['esp_answered'].wait(timeout=30): raise ValueError('Test has failed: did not receive mdns answer within timeout') - if not esp_delegated_answered.wait(timeout=30): + if not mdns_server_events['esp_delegated_answered'].wait(timeout=30): raise ValueError('Test has failed: did not receive mdns answer for delegated host within timeout') # 4. check DUT output if mdns advertized host is resolved dut1.expect(re.compile(r'mdns-test: Query A: tinytester.local resolved to: 127.0.0.1'), timeout=30) @@ -148,23 +143,23 @@ def test_examples_protocol_mdns(env, config): raise ValueError('Test has failed: Incorrectly resolved DUT hostname using dig' "Output should've contained DUT's IP address:{}".format(ip_address)) finally: - stop_mdns_server.set() + mdns_server_events['stop'].set() mdns_responder.join() -@ttfw_idf.idf_example_test(env_tag='Example_WIFI_Protocols') +@ttfw_idf.idf_example_test(env_tag='Example_EthKitV1') def test_examples_protocol_mdns_default(env, _): - test_examples_protocol_mdns(env, None) + test_examples_protocol_mdns(env, 'eth_def') -@ttfw_idf.idf_example_test(env_tag='Example_WIFI_Protocols') +@ttfw_idf.idf_example_test(env_tag='Example_EthKitV1') def test_examples_protocol_mdns_socket(env, _): - test_examples_protocol_mdns(env, 'socket') + test_examples_protocol_mdns(env, 'eth_socket') -@ttfw_idf.idf_example_test(env_tag='Example_WIFI_Protocols') +@ttfw_idf.idf_example_test(env_tag='Example_EthKitV1') def test_examples_protocol_mdns_custom_netif(env, _): - test_examples_protocol_mdns(env, 'custom_netif') + test_examples_protocol_mdns(env, 'eth_custom_netif') if __name__ == '__main__': diff --git a/examples/protocols/mdns/sdkconfig.ci.custom_netif b/examples/protocols/mdns/sdkconfig.ci.custom_netif deleted file mode 100644 index 3550c5204d..0000000000 --- a/examples/protocols/mdns/sdkconfig.ci.custom_netif +++ /dev/null @@ -1,8 +0,0 @@ -CONFIG_MDNS_RESOLVE_TEST_SERVICES=y -CONFIG_MDNS_ADD_MAC_TO_HOSTNAME=y -CONFIG_MDNS_PUBLISH_DELEGATE_HOST=y -CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y -CONFIG_MDNS_PREDEF_NETIF_STA=n -CONFIG_MDNS_PREDEF_NETIF_AP=n -CONFIG_MDNS_PREDEF_NETIF_ETH=n -CONFIG_MDNS_ADD_CUSTOM_NETIF=y diff --git a/examples/protocols/mdns/sdkconfig.ci.eth_custom_netif b/examples/protocols/mdns/sdkconfig.ci.eth_custom_netif new file mode 100644 index 0000000000..56499bd433 --- /dev/null +++ b/examples/protocols/mdns/sdkconfig.ci.eth_custom_netif @@ -0,0 +1,19 @@ +CONFIG_IDF_TARGET="esp32" +CONFIG_MDNS_RESOLVE_TEST_SERVICES=y +CONFIG_MDNS_ADD_MAC_TO_HOSTNAME=y +CONFIG_MDNS_PUBLISH_DELEGATE_HOST=y +CONFIG_MDNS_PREDEF_NETIF_STA=n +CONFIG_MDNS_PREDEF_NETIF_AP=n +CONFIG_MDNS_PREDEF_NETIF_ETH=n +CONFIG_MDNS_ADD_CUSTOM_NETIF=y +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +CONFIG_EXAMPLE_CONNECT_ETHERNET=y +CONFIG_EXAMPLE_CONNECT_WIFI=n +CONFIG_EXAMPLE_USE_INTERNAL_ETHERNET=y +CONFIG_EXAMPLE_ETH_PHY_IP101=y +CONFIG_EXAMPLE_ETH_MDC_GPIO=23 +CONFIG_EXAMPLE_ETH_MDIO_GPIO=18 +CONFIG_EXAMPLE_ETH_PHY_RST_GPIO=5 +CONFIG_EXAMPLE_ETH_PHY_ADDR=1 +CONFIG_EXAMPLE_CONNECT_IPV6=y +CONFIG_MDNS_BUTTON_GPIO=32 diff --git a/examples/protocols/mdns/sdkconfig.ci.eth_kit b/examples/protocols/mdns/sdkconfig.ci.eth_def similarity index 100% rename from examples/protocols/mdns/sdkconfig.ci.eth_kit rename to examples/protocols/mdns/sdkconfig.ci.eth_def diff --git a/examples/protocols/mdns/sdkconfig.ci.eth_socket b/examples/protocols/mdns/sdkconfig.ci.eth_socket new file mode 100644 index 0000000000..5d92405260 --- /dev/null +++ b/examples/protocols/mdns/sdkconfig.ci.eth_socket @@ -0,0 +1,16 @@ +CONFIG_IDF_TARGET="esp32" +CONFIG_MDNS_RESOLVE_TEST_SERVICES=y +CONFIG_MDNS_ADD_MAC_TO_HOSTNAME=y +CONFIG_MDNS_PUBLISH_DELEGATE_HOST=y +CONFIG_MDNS_NETWORKING_SOCKET=y +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +CONFIG_EXAMPLE_CONNECT_ETHERNET=y +CONFIG_EXAMPLE_CONNECT_WIFI=n +CONFIG_EXAMPLE_USE_INTERNAL_ETHERNET=y +CONFIG_EXAMPLE_ETH_PHY_IP101=y +CONFIG_EXAMPLE_ETH_MDC_GPIO=23 +CONFIG_EXAMPLE_ETH_MDIO_GPIO=18 +CONFIG_EXAMPLE_ETH_PHY_RST_GPIO=5 +CONFIG_EXAMPLE_ETH_PHY_ADDR=1 +CONFIG_EXAMPLE_CONNECT_IPV6=y +CONFIG_MDNS_BUTTON_GPIO=32 diff --git a/examples/protocols/mdns/sdkconfig.ci.socket b/examples/protocols/mdns/sdkconfig.ci.socket deleted file mode 100644 index dc1884f11f..0000000000 --- a/examples/protocols/mdns/sdkconfig.ci.socket +++ /dev/null @@ -1,5 +0,0 @@ -CONFIG_MDNS_RESOLVE_TEST_SERVICES=y -CONFIG_MDNS_ADD_MAC_TO_HOSTNAME=y -CONFIG_MDNS_PUBLISH_DELEGATE_HOST=y -CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y -CONFIG_MDNS_NETWORKING_SOCKET=y From b02468dc98d614f931d14cd8b5e2373ca51fb18d Mon Sep 17 00:00:00 2001 From: David Cermak Date: Mon, 20 Dec 2021 13:59:11 +0100 Subject: [PATCH 08/10] mdns: Add API to control custom network interfaces --- components/mdns/include/mdns.h | 40 +++++++++++++++++-- components/mdns/mdns.c | 10 ++--- components/mdns/mdns_console.c | 7 +--- .../protocols/mdns/main/mdns_example_main.c | 6 +-- 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/components/mdns/include/mdns.h b/components/mdns/include/mdns.h index 58121135a5..28cd2f2b4f 100644 --- a/components/mdns/include/mdns.h +++ b/components/mdns/include/mdns.h @@ -720,9 +720,43 @@ esp_err_t mdns_query_aaaa(const char * host_name, uint32_t timeout, esp_ip6_addr #endif -esp_err_t mdns_add_custom_netif(esp_netif_t *esp_netif); -esp_err_t mdns_post_custom_action(esp_netif_t *esp_netif, mdns_event_actions_t event_action); -esp_err_t mdns_delete_custom_netif(esp_netif_t *esp_netif); +/** + * @brief Register custom esp_netif with mDNS functionality + * mDNS service runs by on default interfaces (STA, AP, ETH). This API enables running the service + * on any customized interface, either using standard WiFi or Ethernet driver or any kind of user + * defined driver. + * + * @param esp_netif Pointer to esp-netif interface + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_STATE mDNS is not running or this netif is already registered + * - ESP_ERR_NO_MEM not enough memory for this in interface in the netif list (see CONFIG_MDNS_MAX_INTERFACES) + */ +esp_err_t mdns_register_esp_netif(esp_netif_t *esp_netif); + +/** + * @brief Unregister esp-netif already registered in mDNS service + * + * @param esp_netif Pointer to esp-netif interface + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_STATE mDNS is not running + * - ESP_ERR_NOT_FOUND this esp-netif was not registered in mDNS service + */ +esp_err_t mdns_unregister_esp_netif(esp_netif_t *esp_netif); + +/** + * @brief Set esp_netif to a desired state, or perform a desired action, such as enable/disable this interface + * or send announcement packets to this netif + * @param esp_netif Pointer to esp-netif interface + * @param event_action Disable/Enable/Announce on this interface over IPv4/IPv6 protocol. + * Actions enumerated in mdns_event_actions_t type. + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_STATE mDNS is not running or this netif is not registered + * - ESP_ERR_NO_MEM memory error + */ +esp_err_t mdns_set_esp_netif_action(esp_netif_t *esp_netif, mdns_event_actions_t event_action); #ifdef __cplusplus } diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index 519365397c..aad3538113 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -3824,7 +3824,7 @@ void _mdns_disable_pcb(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol) */ static void perform_event_action(mdns_if_t mdns_if, mdns_event_actions_t action) { - if (!_mdns_server || mdns_if > MDNS_MAX_INTERFACES) { + if (!_mdns_server || mdns_if >= MDNS_MAX_INTERFACES) { return; } if (action & MDNS_EVENT_ENABLE_IP4) { @@ -5028,7 +5028,7 @@ static esp_err_t _mdns_service_task_stop(void) static esp_err_t mdns_post_custom_action_tcpip_if(mdns_if_t mdns_if, mdns_event_actions_t event_action) { if (!_mdns_server || mdns_if >= MDNS_MAX_INTERFACES) { - return ESP_FAIL; + return ESP_ERR_INVALID_STATE; } mdns_action_t * action = (mdns_action_t *)calloc(1, sizeof(mdns_action_t)); @@ -5081,12 +5081,12 @@ static inline void unregister_predefined_handlers(void) * Public Methods * */ -esp_err_t mdns_post_custom_action(esp_netif_t *esp_netif, mdns_event_actions_t event_action) +esp_err_t mdns_set_esp_netif_action(esp_netif_t *esp_netif, mdns_event_actions_t event_action) { return mdns_post_custom_action_tcpip_if(_mdns_get_if_from_esp_netif(esp_netif), event_action); } -esp_err_t mdns_add_custom_netif(esp_netif_t *esp_netif) +esp_err_t mdns_register_esp_netif(esp_netif_t *esp_netif) { if (!_mdns_server) { return ESP_ERR_INVALID_STATE; @@ -5112,7 +5112,7 @@ esp_err_t mdns_add_custom_netif(esp_netif_t *esp_netif) return err; } -esp_err_t mdns_delete_custom_netif(esp_netif_t *esp_netif) +esp_err_t mdns_unregister_esp_netif(esp_netif_t *esp_netif) { if (!_mdns_server) { return ESP_ERR_INVALID_STATE; diff --git a/components/mdns/mdns_console.c b/components/mdns/mdns_console.c index 16379fadee..f677e337c6 100644 --- a/components/mdns/mdns_console.c +++ b/components/mdns/mdns_console.c @@ -11,18 +11,13 @@ static const char * ip_protocol_str[] = {"V4", "V6", "MAX"}; -static const char * if_str(esp_netif_t *netif) -{ - return esp_netif_get_ifkey(netif); -} - static void mdns_print_results(mdns_result_t * results) { mdns_result_t * r = results; mdns_ip_addr_t * a = NULL; int i = 1; while (r) { - printf("%d: Interface: %s, Type: %s\n", i++, if_str(r->esp_netif), ip_protocol_str[r->ip_protocol]); + printf("%d: Interface: %s, Type: %s\n", i++, esp_netif_get_ifkey(r->esp_netif), ip_protocol_str[r->ip_protocol]); if (r->instance_name) { printf(" PTR : %s\n", r->instance_name); } diff --git a/examples/protocols/mdns/main/mdns_example_main.c b/examples/protocols/mdns/main/mdns_example_main.c index c1a9ba8686..ee8c77519e 100644 --- a/examples/protocols/mdns/main/mdns_example_main.c +++ b/examples/protocols/mdns/main/mdns_example_main.c @@ -270,9 +270,9 @@ void app_main(void) /* Demonstration of adding a custom netif to mdns service, but we're adding the default example one, * so we must disable all predefined interfaces (PREDEF_NETIF_STA, AP and ETH) first */ - ESP_ERROR_CHECK(mdns_add_custom_netif(EXAMPLE_INTERFACE)); - ESP_ERROR_CHECK(mdns_post_custom_action(EXAMPLE_INTERFACE, MDNS_EVENT_ENABLE_IP4)); - ESP_ERROR_CHECK(mdns_post_custom_action(EXAMPLE_INTERFACE, MDNS_EVENT_ANNOUNCE_IP4)); + ESP_ERROR_CHECK(mdns_register_esp_netif(EXAMPLE_INTERFACE)); + ESP_ERROR_CHECK(mdns_set_esp_netif_action(EXAMPLE_INTERFACE, MDNS_EVENT_ENABLE_IP4)); + ESP_ERROR_CHECK(mdns_set_esp_netif_action(EXAMPLE_INTERFACE, MDNS_EVENT_ANNOUNCE_IP4)); #endif initialise_button(); xTaskCreate(&mdns_example_task, "mdns_example_task", 2048, NULL, 5, NULL); From 42ba8a8338fd5efd82498a5989fc5c105938d447 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Mon, 3 Jan 2022 16:36:08 +0100 Subject: [PATCH 09/10] mdns: Fix copyright messages, update API descrition * Impove docs and comments on custom netifs * Make predef interfaces const, minor docs fixes --- components/mdns/Kconfig | 15 +++--- components/mdns/include/mdns.h | 20 ++++--- components/mdns/mdns.c | 54 +++++++++++++------ components/mdns/mdns_console.c | 2 +- components/mdns/mdns_networking_socket.c | 2 +- .../protocols/mdns/main/mdns_example_main.c | 10 ++-- 6 files changed, 69 insertions(+), 34 deletions(-) diff --git a/components/mdns/Kconfig b/components/mdns/Kconfig index 7ceefd88d0..def0d850d6 100644 --- a/components/mdns/Kconfig +++ b/components/mdns/Kconfig @@ -5,7 +5,7 @@ menu "mDNS" range 1 9 default 3 help - Number of network interfaces to be served by the mdns library. + Number of network interfaces to be served by the mDNS library. Lowering this number helps to reduce some static RAM usage. config MDNS_MAX_SERVICES @@ -72,7 +72,7 @@ menu "mDNS" Currently the only strict feature: Do not repeat original questions in response packets (defined in RFC6762 sec. 6). Default configuration is 0, i.e. non-strict mode, since some implementations, - such as lwIP mdns resolver (used by standard POSIX API like getaddrinfo, gethostbyname) + such as lwIP mDNS resolver (used by standard POSIX API like getaddrinfo, gethostbyname) could not correctly resolve advertised names. config MDNS_TIMER_PERIOD_MS @@ -84,10 +84,10 @@ menu "mDNS" and schedules mDNS searches. config MDNS_NETWORKING_SOCKET - bool "Use BSD sockets for mdns networking" + bool "Use BSD sockets for mDNS networking" default n help - Enables optional mdns networking implementation using BSD sockets + Enables optional mDNS networking implementation using BSD sockets in UDP multicast mode. This option creates a new thread to serve receiving packets (TODO). This option uses additional N sockets, where N is number of interfaces. @@ -104,21 +104,22 @@ menu "mDNS" bool "Use predefined interface for WiFi Station" default y help - Set up mdns for the default WiFi station. + Set up mDNS for the default WiFi station. Disable this option if you do not need mDNS on default WiFi STA. config MDNS_PREDEF_NETIF_AP bool "Use predefined interface for WiFi Access Point" default y help - Set up mdns for the default WiFi Access Point. + Set up mDNS for the default WiFi Access Point. Disable this option if you do not need mDNS on default WiFi AP. config MDNS_PREDEF_NETIF_ETH bool "Use predefined interface for Ethernet" + depends on ETH_ENABLED default y help - Set up mdns for the default Ethernet interface. + Set up mDNS for the default Ethernet interface. Disable this option if you do not need mDNS on default Ethernet. endmenu # MDNS Predefined interfaces diff --git a/components/mdns/include/mdns.h b/components/mdns/include/mdns.h index 28cd2f2b4f..7f81d0af82 100644 --- a/components/mdns/include/mdns.h +++ b/components/mdns/include/mdns.h @@ -722,9 +722,9 @@ esp_err_t mdns_query_aaaa(const char * host_name, uint32_t timeout, esp_ip6_addr /** * @brief Register custom esp_netif with mDNS functionality - * mDNS service runs by on default interfaces (STA, AP, ETH). This API enables running the service - * on any customized interface, either using standard WiFi or Ethernet driver or any kind of user - * defined driver. + * mDNS service runs by default on preconfigured interfaces (STA, AP, ETH). + * This API enables running the service on any customized interface, + * either using standard WiFi or Ethernet driver or any kind of user defined driver. * * @param esp_netif Pointer to esp-netif interface * @return @@ -732,7 +732,7 @@ esp_err_t mdns_query_aaaa(const char * host_name, uint32_t timeout, esp_ip6_addr * - ESP_ERR_INVALID_STATE mDNS is not running or this netif is already registered * - ESP_ERR_NO_MEM not enough memory for this in interface in the netif list (see CONFIG_MDNS_MAX_INTERFACES) */ -esp_err_t mdns_register_esp_netif(esp_netif_t *esp_netif); +esp_err_t mdns_register_netif(esp_netif_t *esp_netif); /** * @brief Unregister esp-netif already registered in mDNS service @@ -743,11 +743,19 @@ esp_err_t mdns_register_esp_netif(esp_netif_t *esp_netif); * - ESP_ERR_INVALID_STATE mDNS is not running * - ESP_ERR_NOT_FOUND this esp-netif was not registered in mDNS service */ -esp_err_t mdns_unregister_esp_netif(esp_netif_t *esp_netif); +esp_err_t mdns_unregister_netif(esp_netif_t *esp_netif); /** * @brief Set esp_netif to a desired state, or perform a desired action, such as enable/disable this interface * or send announcement packets to this netif + * + * * This function is used to enable (probe, resolve conflicts and announce), announce, or disable (send bye) mDNS + * services on the specified network interface. + * * This function must be called if users registers a specific interface using mdns_register_netif() + * to enable mDNS services on that interface. + * * This function could be used in IP/connection event handlers to automatically enable/announce mDNS services + * when network properties change and/or disable them on disconnection. + * * @param esp_netif Pointer to esp-netif interface * @param event_action Disable/Enable/Announce on this interface over IPv4/IPv6 protocol. * Actions enumerated in mdns_event_actions_t type. @@ -756,7 +764,7 @@ esp_err_t mdns_unregister_esp_netif(esp_netif_t *esp_netif); * - ESP_ERR_INVALID_STATE mDNS is not running or this netif is not registered * - ESP_ERR_NO_MEM memory error */ -esp_err_t mdns_set_esp_netif_action(esp_netif_t *esp_netif, mdns_event_actions_t event_action); +esp_err_t mdns_netif_action(esp_netif_t *esp_netif, mdns_event_actions_t event_action); #ifdef __cplusplus } diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index aad3538113..15b32e3388 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -68,9 +68,9 @@ typedef enum { typedef struct mdns_interfaces mdns_interfaces_t; struct mdns_interfaces { - bool predefined; + const bool predefined; esp_netif_t * netif; - mdns_predef_if_t predef_if; + const mdns_predef_if_t predef_if; mdns_if_t duplicate; }; @@ -91,10 +91,13 @@ static mdns_interfaces_t s_esp_netifs[MDNS_MAX_INTERFACES] = { }; -/* - * @brief Convert mdns if to esp-netif handle +/** + * @brief Convert Predefined interface to the netif id from the internal netif list + * @param predef_if Predefined interface enum + * @return Ordinal number of internal list of mdns network interface. + * Returns MDNS_MAX_INTERFACES if the predefined interface wasn't found in the list */ -static mdns_if_t mdns_if_from_predef_if(mdns_predef_if_t predef_if) +static mdns_if_t mdns_if_from_preset_if(mdns_predef_if_t predef_if) { for (int i=0; i "STA", "AP", "ETH" + * - if no entry in the list (NULL) -> check if the system added this netif + * - point to a custom netif -> just return the entry in the list + * - users is responsible for the lifetime of this netif (to be valid between mdns-init -> deinit) + * + * @param tcpip_if Ordinal number of the interface + * @return Pointer ot the esp_netif object if the interface is available, NULL otherwise + */ esp_netif_t *_mdns_get_esp_netif(mdns_if_t tcpip_if) { if (tcpip_if < MDNS_MAX_INTERFACES) { if (s_esp_netifs[tcpip_if].netif == NULL && s_esp_netifs[tcpip_if].predefined) { - // if a predefined interface face and used local copy is NULL, try to search for the default interface key + // If the local copy is NULL and this netif is predefined -> we can find it in the global netif list s_esp_netifs[tcpip_if].netif = esp_netif_from_preset_if(s_esp_netifs[tcpip_if].predef_if); + // failing to find it means that the netif is *not* available -> return NULL } return s_esp_netifs[tcpip_if].netif; } @@ -146,11 +167,12 @@ static inline void _mdns_clean_netif_ptr(mdns_if_t tcpip_if) { /* * @brief Convert esp-netif handle to mdns if */ -static mdns_if_t _mdns_get_if_from_esp_netif(esp_netif_t *interface) +static mdns_if_t _mdns_get_if_from_esp_netif(esp_netif_t *esp_netif) { for (int i=0; i Date: Wed, 9 Mar 2022 10:44:30 +0100 Subject: [PATCH 10/10] CI: Increase parallel count for eth-runners --- .gitlab/ci/target-test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab/ci/target-test.yml b/.gitlab/ci/target-test.yml index b884ad3ffb..ce1a166675 100644 --- a/.gitlab/ci/target-test.yml +++ b/.gitlab/ci/target-test.yml @@ -309,6 +309,7 @@ example_test_001A: example_test_001B: extends: .example_test_esp32_template + parallel: 2 tags: - ESP32 - Example_EthKitV1