Merge branch 'fix_bug_for_ipv6_example' into 'master'
Modify IPv6 functionality compatible with lwip2.1.2 See merge request espressif/esp-idf!5495
This commit is contained in:
commit
eab3edf3d4
5 changed files with 29 additions and 12 deletions
|
@ -1 +1 @@
|
||||||
Subproject commit bafc54f69b671f368d7b996d1668b7bd4be55193
|
Subproject commit 61d840ff4778f4946c8743f7e412345abcd537f1
|
|
@ -740,6 +740,14 @@ esp_err_t tcpip_adapter_set_default_wifi_handlers();
|
||||||
*/
|
*/
|
||||||
esp_err_t tcpip_adapter_clear_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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "lwip/netif.h"
|
#include "lwip/netif.h"
|
||||||
#if LWIP_DNS /* don't build if not configured for use in lwipopts.h */
|
#if LWIP_DNS /* don't build if not configured for use in lwipopts.h */
|
||||||
#include "lwip/dns.h"
|
#include "lwip/dns.h"
|
||||||
|
#include "lwip/netif.h"
|
||||||
#endif
|
#endif
|
||||||
#include "netif/wlanif.h"
|
#include "netif/wlanif.h"
|
||||||
#include "netif/ethernetif.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 */
|
#endif /* CONFIG_TCPIP_LWIP */
|
||||||
|
|
|
@ -71,7 +71,8 @@ menu "Example Configuration"
|
||||||
Multicast socket can bind to default interface, or all interfaces.
|
Multicast socket can bind to default interface, or all interfaces.
|
||||||
|
|
||||||
config EXAMPLE_MULTICAST_LISTEN_ALL_IF
|
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
|
config EXAMPLE_MULTICAST_LISTEN_DEFAULT_IF
|
||||||
bool "Default interface"
|
bool "Default interface"
|
||||||
|
|
|
@ -170,7 +170,7 @@ err:
|
||||||
static int create_multicast_ipv6_socket()
|
static int create_multicast_ipv6_socket()
|
||||||
{
|
{
|
||||||
struct sockaddr_in6 saddr = { 0 };
|
struct sockaddr_in6 saddr = { 0 };
|
||||||
u8_t netif_index = EXAMPLE_INTERFACE;
|
int netif_index;
|
||||||
struct in6_addr if_inaddr = { 0 };
|
struct in6_addr if_inaddr = { 0 };
|
||||||
struct ip6_addr if_ipaddr = { 0 };
|
struct ip6_addr if_ipaddr = { 0 };
|
||||||
struct ipv6_mreq v6imreq = { 0 };
|
struct ipv6_mreq v6imreq = { 0 };
|
||||||
|
@ -211,6 +211,12 @@ static int create_multicast_ipv6_socket()
|
||||||
}
|
}
|
||||||
#endif // LISTEN_ALL_IF
|
#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
|
// Assign the multicast source interface, via its IP
|
||||||
err = setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_IF, &netif_index,sizeof(uint8_t));
|
err = setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_IF, &netif_index,sizeof(uint8_t));
|
||||||
if (err < 0) {
|
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
|
// this is also a listening socket, so add it to the multicast
|
||||||
// group for listening...
|
// 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
|
#ifdef CONFIG_EXAMPLE_IPV6
|
||||||
// Configure multicast address to listen to
|
// Configure multicast address to listen to
|
||||||
err = inet6_aton(MULTICAST_IPV6_ADDR, &v6imreq.ipv6mr_multiaddr);
|
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)) {
|
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);
|
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,
|
err = setsockopt(sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP,
|
||||||
&v6imreq, sizeof(struct ipv6_mreq));
|
&v6imreq, sizeof(struct ipv6_mreq));
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
|
|
Loading…
Reference in a new issue