1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-06 05:21:22 +03:00

UdpContext::setMulticastInterface(): fix for IPv6 (#5743)

Per 'udp_set_multicast_netif_addr()' signature and comments in lwIP sources:
An IPv4 address designating a specific interface must be used.
When an IPv6 address is given, the matching IPv4 in the same interface must be selected.

fix e3bc3c226b (r32235572)
This commit is contained in:
david gauchard 2019-02-08 15:23:08 +01:00 committed by GitHub
parent 82487e5d96
commit 1959311180
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 0 deletions

View File

@ -118,6 +118,7 @@ struct netifWrapper
String toString() const { return addr().toString(); }
// related to legacy address (_num=0, ipv4)
IPAddress ipv4 () const { return _netif->ip_addr; }
IPAddress netmask () const { return _netif->netmask; }
IPAddress gw () const { return _netif->gw; }

View File

@ -30,6 +30,8 @@ void esp_schedule();
#include <assert.h>
}
#include <AddrList.h>
#define GET_UDP_HDR(pb) (reinterpret_cast<udp_hdr*>(((uint8_t*)((pb)->payload)) - UDP_HLEN))
class UdpContext
@ -107,6 +109,33 @@ public:
udp_disconnect(_pcb);
}
#if LWIP_IPV6
void setMulticastInterface(IPAddress addr)
{
// Per 'udp_set_multicast_netif_addr()' signature and comments
// in lwIP sources:
// An IPv4 address designating a specific interface must be used.
// When an IPv6 address is given, the matching IPv4 in the same
// interface must be selected.
if (!addr.isV4())
{
for (auto a: addrList)
if (a.addr() == addr)
{
// found the IPv6 address,
// redirect parameter to IPv4 address in this interface
addr = a.ipv4();
break;
}
assert(addr.isV4());
}
udp_set_multicast_netif_addr(_pcb, ip_2_ip4((const ip_addr_t*)addr));
}
#else // !LWIP_IPV6
void setMulticastInterface(const IPAddress& addr)
{
#if LWIP_VERSION_MAJOR == 1
@ -116,6 +145,8 @@ public:
#endif
}
#endif // !LWIP_IPV6
void setMulticastTTL(int ttl)
{
#ifdef LWIP_MAYBE_XCC