Return both IPv6 and IPv4 address from the lookup.

We currently only return IPv4 address, which may cause issues in IPv6 networks
if we provide host name as the turn servers.

BUG=webrt:5871
R=juberti@google.com, pthatcher@webrtc.org

Review URL: https://codereview.webrtc.org/2083013008 .

Cr-Commit-Position: refs/heads/master@{#13291}
This commit is contained in:
Honghai Zhang 2016-06-26 22:11:12 -07:00
parent ff4def7eb7
commit 56c0b20490

View File

@ -44,8 +44,24 @@ int ResolveHostname(const std::string& hostname, int family,
addresses->clear();
struct addrinfo* result = NULL;
struct addrinfo hints = {0};
// TODO(djw): For now this is IPv4 only so existing users remain unaffected.
hints.ai_family = AF_INET;
hints.ai_family = family;
// |family| here will almost always be AF_UNSPEC, because |family| comes from
// AsyncResolver::addr_.family(), which comes from a SocketAddress constructed
// with a hostname. When a SocketAddress is constructed with a hostname, its
// family is AF_UNSPEC. However, if someday in the future we construct
// a SocketAddress with both a hostname and a family other than AF_UNSPEC,
// then it would be possible to get a specific family value here.
// The behavior of AF_UNSPEC is roughly "get both ipv4 and ipv6", as
// documented by the various operating systems:
// Linux: http://man7.org/linux/man-pages/man3/getaddrinfo.3.html
// Windows: https://msdn.microsoft.com/en-us/library/windows/desktop/
// ms738520(v=vs.85).aspx
// Mac: https://developer.apple.com/legacy/library/documentation/Darwin/
// Reference/ManPages/man3/getaddrinfo.3.html
// Android (source code, not documentation):
// https://android.googlesource.com/platform/bionic/+/
// 7e0bfb511e85834d7c6cb9631206b62f82701d60/libc/netbsd/net/getaddrinfo.c#1657
hints.ai_flags = AI_ADDRCONFIG;
int ret = getaddrinfo(hostname.c_str(), NULL, &hints, &result);
if (ret != 0) {