examples: Strip IPv6 function in example and use sockaddr_storage to replace sockaddr_in6

* Original commit: espressif/esp-idf@821eea45b3
This commit is contained in:
yuanjm
2021-01-18 19:16:06 +08:00
committed by suren-gabrielyan-espressif
parent 1623c0e729
commit eda5d72acf
3 changed files with 11 additions and 7 deletions

View File

@ -189,6 +189,7 @@ menu "Example Connection Configuration"
bool "Obtain IPv6 address" bool "Obtain IPv6 address"
default y default y
depends on EXAMPLE_CONNECT_WIFI || EXAMPLE_CONNECT_ETHERNET depends on EXAMPLE_CONNECT_WIFI || EXAMPLE_CONNECT_ETHERNET
select LWIP_IPV6
help help
By default, examples will wait until IPv4 and IPv6 local link addresses are obtained. By default, examples will wait until IPv4 and IPv6 local link addresses are obtained.
Disable this option if the network does not support IPv6. Disable this option if the network does not support IPv6.

View File

@ -10,7 +10,7 @@
#define HOST_IP_SIZE 128 #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]; char host_ip[HOST_IP_SIZE];
int len; 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 ); freeaddrinfo( addr_list );
return ESP_OK; 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; *ip_protocol = IPPROTO_IPV6;
*addr_family = AF_INET6; *addr_family = AF_INET6;
// add port and interface number and return on first IPv6 match // add port and interface number and return on first IPv6 match
dest_addr->sin6_port = htons(port); ((struct sockaddr_in6*)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_scope_id = esp_netif_get_netif_impl_index(EXAMPLE_INTERFACE);
freeaddrinfo( addr_list ); freeaddrinfo( addr_list );
return ESP_OK; return ESP_OK;
} }
#endif
} }
// no match found // no match found
freeaddrinfo( addr_list ); freeaddrinfo( addr_list );

View File

@ -24,20 +24,20 @@ extern "C" {
* @brief Read and evaluate IP address from stdin * @brief Read and evaluate IP address from stdin
* *
* This API reads stdin and parses the input address using getaddrinfo() * 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. * a socket. IP protocol is guessed from the IP address string.
* *
* @param[in] port port number of expected connection * @param[in] port port number of expected connection
* @param[in] sock_type expected protocol: SOCK_STREAM or SOCK_DGRAM * @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] ip_protocol resultant IP protocol: IPPROTO_IP or IPPROTO_IP6
* @param[out] addr_family resultant address family: AF_INET or AF_INET6 * @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 * @return ESP_OK on success, ESP_FAIL otherwise
*/ */
esp_err_t get_addr_from_stdin(int port, int sock_type, esp_err_t get_addr_from_stdin(int port, int sock_type,
int *ip_protocol, int *ip_protocol,
int *addr_family, int *addr_family,
struct sockaddr_in6 *dest_addr); struct sockaddr_storage *dest_addr);
#ifdef __cplusplus #ifdef __cplusplus
} }