From eda5d72acf5a8e8f50b2b8e4593907c95feb0182 Mon Sep 17 00:00:00 2001 From: yuanjm Date: Mon, 18 Jan 2021 19:16:06 +0800 Subject: [PATCH] examples: Strip IPv6 function in example and use sockaddr_storage to replace sockaddr_in6 * Original commit: espressif/esp-idf@821eea45b33bcd99b1889ef55d5c25effac83ddc --- .../protocol_examples_common/Kconfig.projbuild | 1 + .../protocol_examples_common/addr_from_stdin.c | 11 +++++++---- .../include/addr_from_stdin.h | 6 +++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/examples/common_components/protocol_examples_common/Kconfig.projbuild b/examples/common_components/protocol_examples_common/Kconfig.projbuild index e3275ec3f..5e2af8b8c 100644 --- a/examples/common_components/protocol_examples_common/Kconfig.projbuild +++ b/examples/common_components/protocol_examples_common/Kconfig.projbuild @@ -189,6 +189,7 @@ menu "Example Connection Configuration" bool "Obtain IPv6 address" default y depends on EXAMPLE_CONNECT_WIFI || EXAMPLE_CONNECT_ETHERNET + select LWIP_IPV6 help By default, examples will wait until IPv4 and IPv6 local link addresses are obtained. Disable this option if the network does not support IPv6. diff --git a/examples/common_components/protocol_examples_common/addr_from_stdin.c b/examples/common_components/protocol_examples_common/addr_from_stdin.c index 0320a27bf..c907ffd96 100644 --- a/examples/common_components/protocol_examples_common/addr_from_stdin.c +++ b/examples/common_components/protocol_examples_common/addr_from_stdin.c @@ -10,7 +10,7 @@ #define HOST_IP_SIZE 128 -esp_err_t get_addr_from_stdin(int port, int sock_type, int *ip_protocol, int *addr_family, struct sockaddr_in6 *dest_addr) +esp_err_t get_addr_from_stdin(int port, int sock_type, int *ip_protocol, int *addr_family, struct sockaddr_storage *dest_addr) { char host_ip[HOST_IP_SIZE]; int len; @@ -49,15 +49,18 @@ esp_err_t get_addr_from_stdin(int port, int sock_type, int *ip_protocol, int *ad freeaddrinfo( addr_list ); return ESP_OK; - } else if (cur->ai_family == AF_INET6) { + } +#if CONFIG_LWIP_IPV6 + else if (cur->ai_family == AF_INET6) { *ip_protocol = IPPROTO_IPV6; *addr_family = AF_INET6; // add port and interface number and return on first IPv6 match - dest_addr->sin6_port = htons(port); - dest_addr->sin6_scope_id = esp_netif_get_netif_impl_index(EXAMPLE_INTERFACE); + ((struct sockaddr_in6*)dest_addr)->sin6_port = htons(port); + ((struct sockaddr_in6*)dest_addr)->sin6_scope_id = esp_netif_get_netif_impl_index(EXAMPLE_INTERFACE); freeaddrinfo( addr_list ); return ESP_OK; } +#endif } // no match found freeaddrinfo( addr_list ); diff --git a/examples/common_components/protocol_examples_common/include/addr_from_stdin.h b/examples/common_components/protocol_examples_common/include/addr_from_stdin.h index 959a7ed09..9a059c149 100644 --- a/examples/common_components/protocol_examples_common/include/addr_from_stdin.h +++ b/examples/common_components/protocol_examples_common/include/addr_from_stdin.h @@ -24,20 +24,20 @@ extern "C" { * @brief Read and evaluate IP address from stdin * * This API reads stdin and parses the input address using getaddrinfo() - * to fill in struct sockaddr_in6 (for both IPv4 and IPv6) used to open + * to fill in struct sockaddr_storage (for both IPv4 and IPv6) used to open * a socket. IP protocol is guessed from the IP address string. * * @param[in] port port number of expected connection * @param[in] sock_type expected protocol: SOCK_STREAM or SOCK_DGRAM * @param[out] ip_protocol resultant IP protocol: IPPROTO_IP or IPPROTO_IP6 * @param[out] addr_family resultant address family: AF_INET or AF_INET6 - * @param[out] dest_addr sockaddr_in6 structure (for both IPv4 and IPv6) + * @param[out] dest_addr sockaddr_storage structure (for both IPv4 and IPv6) * @return ESP_OK on success, ESP_FAIL otherwise */ esp_err_t get_addr_from_stdin(int port, int sock_type, int *ip_protocol, int *addr_family, - struct sockaddr_in6 *dest_addr); + struct sockaddr_storage *dest_addr); #ifdef __cplusplus }