Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 3a0dd1c

Browse filesBrowse files
authored
fix(dns): Fix IPv6-only network, by checking IPv6 first if you have public address (#9443)
Work around because AF_UNSPEC does not check available addresses when determining result. If you have a global scope IPv6 address, then first check for IPv6 DNS result; if you don't have an IPv6, or there is no IPv6 result, then check IPv4. This allows IPv6-only networks to connect to dual-stack destinations, as they will get the IPv6 address (rather than the unusable IPv4). It also means a dual-stack host to a dual-stack destination will preference IPv6. There is no effect if you are on an IPv4-only network, or it is an IPv4-only destination.
1 parent 04b70bb commit 3a0dd1c
Copy full SHA for 3a0dd1c

File tree

1 file changed

+23
-1
lines changed
Filter options

1 file changed

+23
-1
lines changed

‎libraries/Network/src/NetworkManager.cpp

Copy file name to clipboardExpand all lines: libraries/Network/src/NetworkManager.cpp
+23-1Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,32 @@ int NetworkManager::hostByName(const char* aHostname, IPAddress& aResult)
8888

8989
struct addrinfo hints;
9090
memset(&hints, 0, sizeof(hints));
91-
hints.ai_family = AF_UNSPEC;
9291
hints.ai_socktype = SOCK_STREAM;
9392

93+
// **Workaround**
94+
// LWIP AF_UNSPEC always prefers IPv4 and doesn't check what network is
95+
// available. See https://github.com/espressif/esp-idf/issues/13255
96+
// Until that is fixed, as a work around if we have a global scope IPv6,
97+
// then we check IPv6 only first.
98+
if (hasGlobalV6) {
99+
hints.ai_family = AF_INET6;
100+
err = lwip_getaddrinfo(aHostname, servname, &hints, &res);
101+
102+
if (err == ERR_OK)
103+
{
104+
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)res->ai_addr;
105+
// As an array of u8_t
106+
aResult = IPAddress(IPv6, ipv6->sin6_addr.s6_addr);
107+
log_d("DNS found IPv6 first %s", aResult.toString().c_str());
108+
lwip_freeaddrinfo(res);
109+
return 1;
110+
}
111+
}
112+
// **End Workaround**
113+
114+
hints.ai_family = AF_UNSPEC;
94115
err = lwip_getaddrinfo(aHostname, servname, &hints, &res);
116+
95117
if (err == ERR_OK)
96118
{
97119
if (res->ai_family == AF_INET6)

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.