From 56c0b204901082376b84b2836227bfebbea97aeb Mon Sep 17 00:00:00 2001 From: Honghai Zhang Date: Sun, 26 Jun 2016 22:11:12 -0700 Subject: [PATCH] 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} --- webrtc/base/nethelpers.cc | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/webrtc/base/nethelpers.cc b/webrtc/base/nethelpers.cc index fddfdaf58b..1f6bb8df7b 100644 --- a/webrtc/base/nethelpers.cc +++ b/webrtc/base/nethelpers.cc @@ -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) {