From f29ff2c5520b941e0e9b874b32bb1a7cda5fa48b Mon Sep 17 00:00:00 2001 From: xueyunfei Date: Wed, 10 Jul 2019 03:29:32 -0400 Subject: [PATCH] Modify IPv6 functionality compatible with lwip2.1.2 --- components/lwip/lwip | 2 +- .../tcpip_adapter/include/tcpip_adapter.h | 8 ++++++++ components/tcpip_adapter/tcpip_adapter_lwip.c | 9 +++++++++ .../udp_multicast/main/Kconfig.projbuild | 3 ++- .../main/udp_multicast_example_main.c | 19 +++++++++---------- 5 files changed, 29 insertions(+), 12 deletions(-) diff --git a/components/lwip/lwip b/components/lwip/lwip index bafc54f69..61d840ff4 160000 --- a/components/lwip/lwip +++ b/components/lwip/lwip @@ -1 +1 @@ -Subproject commit bafc54f69b671f368d7b996d1668b7bd4be55193 +Subproject commit 61d840ff4778f4946c8743f7e412345abcd537f1 diff --git a/components/tcpip_adapter/include/tcpip_adapter.h b/components/tcpip_adapter/include/tcpip_adapter.h index 11f2daaa4..4c0a4af4f 100644 --- a/components/tcpip_adapter/include/tcpip_adapter.h +++ b/components/tcpip_adapter/include/tcpip_adapter.h @@ -740,6 +740,14 @@ esp_err_t tcpip_adapter_set_default_wifi_handlers(); */ esp_err_t tcpip_adapter_clear_default_wifi_handlers(); +/** + * @brief Search nefit index through netif interface + * @param[in] tcpip_if Interface to search for netif index + * @return + * - netif_index on success + * - -1 if an invalid parameter is supplied + */ +int tcpip_adapter_get_netif_index(tcpip_adapter_if_t tcpip_if); #ifdef __cplusplus } diff --git a/components/tcpip_adapter/tcpip_adapter_lwip.c b/components/tcpip_adapter/tcpip_adapter_lwip.c index 88413d3a9..237b082a3 100644 --- a/components/tcpip_adapter/tcpip_adapter_lwip.c +++ b/components/tcpip_adapter/tcpip_adapter_lwip.c @@ -29,6 +29,7 @@ #include "lwip/netif.h" #if LWIP_DNS /* don't build if not configured for use in lwipopts.h */ #include "lwip/dns.h" +#include "lwip/netif.h" #endif #include "netif/wlanif.h" #include "netif/ethernetif.h" @@ -1258,4 +1259,12 @@ bool tcpip_adapter_is_netif_up(tcpip_adapter_if_t tcpip_if) } } +int tcpip_adapter_get_netif_index(tcpip_adapter_if_t tcpip_if) +{ + if (tcpip_if >= TCPIP_ADAPTER_IF_MAX || esp_netif[tcpip_if] == NULL) { + return -1; + } + return netif_get_index(esp_netif[tcpip_if]); +} + #endif /* CONFIG_TCPIP_LWIP */ diff --git a/examples/protocols/sockets/udp_multicast/main/Kconfig.projbuild b/examples/protocols/sockets/udp_multicast/main/Kconfig.projbuild index 99e01387b..dcf9b0f4e 100644 --- a/examples/protocols/sockets/udp_multicast/main/Kconfig.projbuild +++ b/examples/protocols/sockets/udp_multicast/main/Kconfig.projbuild @@ -71,7 +71,8 @@ menu "Example Configuration" Multicast socket can bind to default interface, or all interfaces. config EXAMPLE_MULTICAST_LISTEN_ALL_IF - bool "All interfaces" + bool "All interfaces (IPV4 only)" + depends on !EXAMPLE_IPV6_ONLY config EXAMPLE_MULTICAST_LISTEN_DEFAULT_IF bool "Default interface" diff --git a/examples/protocols/sockets/udp_multicast/main/udp_multicast_example_main.c b/examples/protocols/sockets/udp_multicast/main/udp_multicast_example_main.c index ea438991a..bd2a4cbed 100644 --- a/examples/protocols/sockets/udp_multicast/main/udp_multicast_example_main.c +++ b/examples/protocols/sockets/udp_multicast/main/udp_multicast_example_main.c @@ -170,7 +170,7 @@ err: static int create_multicast_ipv6_socket() { struct sockaddr_in6 saddr = { 0 }; - u8_t netif_index = EXAMPLE_INTERFACE; + int netif_index; struct in6_addr if_inaddr = { 0 }; struct ip6_addr if_ipaddr = { 0 }; struct ipv6_mreq v6imreq = { 0 }; @@ -211,6 +211,12 @@ static int create_multicast_ipv6_socket() } #endif // LISTEN_ALL_IF + // search for netif index + netif_index = tcpip_adapter_get_netif_index(EXAMPLE_INTERFACE); + if(netif_index < 0) { + ESP_LOGE(V6TAG, "Failed to get netif index"); + goto err; + } // Assign the multicast source interface, via its IP err = setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_IF, &netif_index,sizeof(uint8_t)); if (err < 0) { @@ -240,14 +246,6 @@ static int create_multicast_ipv6_socket() // this is also a listening socket, so add it to the multicast // group for listening... - - // Configure source interface -#if LISTEN_ALL_IF - v6imreq.imr_interface.s_addr = IPADDR_ANY; -#else - v6imreq.ipv6mr_interface = EXAMPLE_INTERFACE; - /* inet6_addr_from_ip6addr(&v6imreq.ipv6mr_interface, &if_ipaddr);*/ -#endif // LISTEN_ALL_IF #ifdef CONFIG_EXAMPLE_IPV6 // Configure multicast address to listen to err = inet6_aton(MULTICAST_IPV6_ADDR, &v6imreq.ipv6mr_multiaddr); @@ -261,7 +259,8 @@ static int create_multicast_ipv6_socket() if (!ip6_addr_ismulticast(&multi_addr)) { ESP_LOGW(V6TAG, "Configured IPV6 multicast address '%s' is not a valid multicast address. This will probably not work.", MULTICAST_IPV6_ADDR); } - + // Configure source interface + v6imreq.ipv6mr_interface = (unsigned int)netif_index; err = setsockopt(sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &v6imreq, sizeof(struct ipv6_mreq)); if (err < 0) {