2014-05-13 18:00:26 +00:00
|
|
|
/*
|
|
|
|
|
* Copyright 2008 The WebRTC Project Authors. All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* Use of this source code is governed by a BSD-style license
|
|
|
|
|
* that can be found in the LICENSE file in the root of the source
|
|
|
|
|
* tree. An additional intellectual property rights grant can be found
|
|
|
|
|
* in the file PATENTS. All contributing project authors may
|
|
|
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
|
|
|
*/
|
|
|
|
|
|
2017-09-15 06:47:31 +02:00
|
|
|
#include "rtc_base/nethelpers.h"
|
2014-05-13 18:00:26 +00:00
|
|
|
|
2016-04-26 03:13:22 -07:00
|
|
|
#include <memory>
|
|
|
|
|
|
2014-05-13 18:00:26 +00:00
|
|
|
#if defined(WEBRTC_WIN)
|
|
|
|
|
#include <ws2spi.h>
|
|
|
|
|
#include <ws2tcpip.h>
|
2017-09-15 06:47:31 +02:00
|
|
|
#include "rtc_base/win32.h"
|
2014-05-13 18:00:26 +00:00
|
|
|
#endif
|
2016-05-19 14:57:31 -07:00
|
|
|
#if defined(WEBRTC_POSIX) && !defined(__native_client__)
|
|
|
|
|
#if defined(WEBRTC_ANDROID)
|
2017-09-15 06:47:31 +02:00
|
|
|
#include "rtc_base/ifaddrs-android.h"
|
2016-05-19 14:57:31 -07:00
|
|
|
#else
|
|
|
|
|
#include <ifaddrs.h>
|
|
|
|
|
#endif
|
|
|
|
|
#endif // defined(WEBRTC_POSIX) && !defined(__native_client__)
|
2014-05-13 18:00:26 +00:00
|
|
|
|
2017-09-15 06:47:31 +02:00
|
|
|
#include "rtc_base/byteorder.h"
|
|
|
|
|
#include "rtc_base/checks.h"
|
|
|
|
|
#include "rtc_base/logging.h"
|
|
|
|
|
#include "rtc_base/signalthread.h"
|
2014-05-13 18:00:26 +00:00
|
|
|
|
|
|
|
|
namespace rtc {
|
|
|
|
|
|
|
|
|
|
int ResolveHostname(const std::string& hostname, int family,
|
|
|
|
|
std::vector<IPAddress>* addresses) {
|
|
|
|
|
#ifdef __native_client__
|
2017-01-11 05:56:46 -08:00
|
|
|
RTC_NOTREACHED();
|
2014-05-13 18:00:26 +00:00
|
|
|
LOG(LS_WARNING) << "ResolveHostname() is not implemented for NaCl";
|
|
|
|
|
return -1;
|
|
|
|
|
#else // __native_client__
|
|
|
|
|
if (!addresses) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
addresses->clear();
|
2017-02-27 14:06:41 -08:00
|
|
|
struct addrinfo* result = nullptr;
|
2014-05-13 18:00:26 +00:00
|
|
|
struct addrinfo hints = {0};
|
2016-06-26 22:11:12 -07:00
|
|
|
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
|
2014-05-13 18:00:26 +00:00
|
|
|
hints.ai_flags = AI_ADDRCONFIG;
|
2017-02-27 14:06:41 -08:00
|
|
|
int ret = getaddrinfo(hostname.c_str(), nullptr, &hints, &result);
|
2014-05-13 18:00:26 +00:00
|
|
|
if (ret != 0) {
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
struct addrinfo* cursor = result;
|
|
|
|
|
for (; cursor; cursor = cursor->ai_next) {
|
|
|
|
|
if (family == AF_UNSPEC || cursor->ai_family == family) {
|
|
|
|
|
IPAddress ip;
|
|
|
|
|
if (IPFromAddrInfo(cursor, &ip)) {
|
|
|
|
|
addresses->push_back(ip);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
freeaddrinfo(result);
|
|
|
|
|
return 0;
|
|
|
|
|
#endif // !__native_client__
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// AsyncResolver
|
2017-07-11 16:56:05 -07:00
|
|
|
AsyncResolver::AsyncResolver()
|
Revert of Add logging of host lookups made by TurnPort to the RtcEventLog. (patchset #11 id:200001 of https://codereview.webrtc.org/2996933003/ )
Reason for revert:
Breaks Chromium build due to the changed constructor in webrtc/p2p/client/basicportallocator.h.
Build (example): https://build.chromium.org/p/chromium.webrtc.fyi/builders/Linux%20Builder/builds/19739.
Log:
FAILED: obj/remoting/protocol/protocol/port_allocator.o
/b/c/goma_client/gomacc ../../third_party/llvm-build/Release+Asserts/bin/clang++ -MMD -MF obj/remoting/protocol/protocol/port_allocator.o.d -DV8_DEPRECATION_WARNINGS -DUSE_UDEV -DUSE_AURA=1 -DUSE_PANGO=1 -DUSE_CAIRO=1 -DUSE_GLIB=1 -DUSE_NSS_CERTS=1 -DUSE_X11=1 -DFULL_SAFE_BROWSING -DSAFE_BROWSING_CSD -DSAFE_BROWSING_DB_LOCAL -DCHROMIUM_BUILD -DFIELDTRIAL_TESTING_ENABLED -DCR_CLANG_REVISION=\"310694-2\" -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -DCOMPONENT_BUILD -D_DEBUG -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DWTF_USE_DYNAMIC_ANNOTATIONS=1 -D_GLIBCXX_DEBUG=1 -DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_32 -DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_26 -DEXPAT_RELATIVE_PATH -DGL_GLEXT_PROTOTYPES -DUSE_GLX -DUSE_EGL -DGOOGLE_PROTOBUF_NO_RTTI -DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER -DHAVE_PTHREAD -DPROTOBUF_USE_DLLS -DWEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=0 -DFEATURE_ENABLE_VOICEMAIL -DGTEST_RELATIVE_PATH -DWEBRTC_CHROMIUM_BUILD -DWEBRTC_POSIX -DWEBRTC_LINUX -DBORINGSSL_SHARED_LIBRARY -I../.. -Igen -I../../build/linux/debian_jessie_amd64-sysroot/usr/include/glib-2.0 -I../../build/linux/debian_jessie_amd64-sysroot/usr/lib/x86_64-linux-gnu/glib-2.0/include -I../../third_party/libwebp/src -I../../third_party/khronos -I../../gpu -I../../third_party/protobuf/src -Igen/protoc_out -I../../third_party/protobuf/src -I../../third_party/webrtc_overrides -I../../testing/gtest/include -I../../third_party -I../../third_party/webrtc_overrides -I../../third_party -I../../third_party/boringssl/src/include -I../../build/linux/debian_jessie_amd64-sysroot/usr/include/nss -I../../build/linux/debian_jessie_amd64-sysroot/usr/include/nspr -I../../third_party/libyuv/include -fno-strict-aliasing --param=ssp-buffer-size=4 -fstack-protector -Wno-builtin-macro-redefined -D__DATE__= -D__TIME__= -D__TIMESTAMP__= -funwind-tables -fPIC -pipe -B../../third_party/binutils/Linux_x64/Release/bin -pthread -fcolor-diagnostics -fdebug-prefix-map=/b/c/b/Linux_Builder__dbg_/src=. -m64 -march=x86-64 -Wall -Werror -Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wno-c++11-narrowing -Wno-covered-switch-default -Wno-unneeded-internal-declaration -Wno-inconsistent-missing-override -Wno-undefined-var-template -Wno-nonportable-include-path -Wno-address-of-packed-member -Wno-unused-lambda-capture -Wno-user-defined-warnings -Wno-enum-compare-switch -O0 -fno-omit-frame-pointer -g2 -gsplit-dwarf -fvisibility=hidden -Xclang -load -Xclang ../../third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.so -Xclang -add-plugin -Xclang find-bad-constructs -Xclang -plugin-arg-find-bad-constructs -Xclang check-auto-raw-pointer -Xclang -plugin-arg-find-bad-constructs -Xclang check-ipc -Wheader-hygiene -Wstring-conversion -Wtautological-overlap-compare -Wexit-time-destructors -Wno-header-guard -Wno-undefined-bool-conversion -Wno-tautological-undefined-compare -std=gnu++14 -fno-rtti -nostdinc++ -isystem../../buildtools/third_party/libc++/trunk/include -isystem../../buildtools/third_party/libc++abi/trunk/include --sysroot=../../build/linux/debian_jessie_amd64-sysroot -fno-exceptions -fvisibility-inlines-hidden -c ../../remoting/protocol/port_allocator.cc -o obj/remoting/protocol/protocol/port_allocator.o
../../remoting/protocol/port_allocator.cc:48:7: error: no matching constructor for initialization of 'cricket::BasicPortAllocator'
: BasicPortAllocator(network_manager.get(), socket_factory.get()),
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../../third_party/webrtc/p2p/client/basicportallocator.h:35:12: note: candidate constructor not viable: requires single argument 'network_manager', but 2 arguments were provided
explicit BasicPortAllocator(rtc::NetworkManager* network_manager);
^
../../third_party/webrtc/p2p/client/basicportallocator.h:30:7: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided
class BasicPortAllocator : public PortAllocator {
^
../../third_party/webrtc/p2p/client/basicportallocator.h:32:3: note: candidate constructor not viable: requires 3 arguments, but 2 were provided
BasicPortAllocator(rtc::NetworkManager* network_manager,
^
../../third_party/webrtc/p2p/client/basicportallocator.h:36:3: note: candidate constructor not viable: requires 3 arguments, but 2 were provided
BasicPortAllocator(rtc::NetworkManager* network_manager,
^
../../third_party/webrtc/p2p/client/basicportallocator.h:39:3: note: candidate constructor not viable: requires 5 arguments, but 2 were provided
BasicPortAllocator(rtc::NetworkManager* network_manager,
^
1 error generated.
Original issue's description:
> Add logging host lookups made by TurnPort to the RtcEventLog.
>
> The following fields are logged:
> - error, if there was an error.
> - elapsed time in milliseconds
>
> BUG=webrtc:8100
>
> Review-Url: https://codereview.webrtc.org/2996933003
> Cr-Commit-Position: refs/heads/master@{#19574}
> Committed: https://chromium.googlesource.com/external/webrtc/+/c251cb13c08aba710ba3a12588beb4aa172c7323
TBR=terelius@webrtc.org,pthatcher@webrtc.org,jonaso@google.com,pthatcher@google.com,solenberg@webrtc.org,deadbeef@webrtc.org,jonaso@webrtc.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=webrtc:8100
Review-Url: https://codereview.webrtc.org/3012473002
Cr-Commit-Position: refs/heads/master@{#19578}
2017-08-29 04:49:00 -07:00
|
|
|
: SignalThread(false /* use_socket_server */), error_(-1) {}
|
2014-05-13 18:00:26 +00:00
|
|
|
|
2017-07-11 16:56:05 -07:00
|
|
|
AsyncResolver::~AsyncResolver() = default;
|
2015-03-09 22:21:53 +00:00
|
|
|
|
2014-05-13 18:00:26 +00:00
|
|
|
void AsyncResolver::Start(const SocketAddress& addr) {
|
|
|
|
|
addr_ = addr;
|
2017-07-11 16:56:05 -07:00
|
|
|
// SignalThred Start will kickoff the resolve process.
|
|
|
|
|
SignalThread::Start();
|
2014-05-13 18:00:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool AsyncResolver::GetResolvedAddress(int family, SocketAddress* addr) const {
|
|
|
|
|
if (error_ != 0 || addresses_.empty())
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
*addr = addr_;
|
|
|
|
|
for (size_t i = 0; i < addresses_.size(); ++i) {
|
|
|
|
|
if (family == addresses_[i].family()) {
|
|
|
|
|
addr->SetResolvedIP(addresses_[i]);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-09 22:21:53 +00:00
|
|
|
int AsyncResolver::GetError() const {
|
|
|
|
|
return error_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AsyncResolver::Destroy(bool wait) {
|
2017-07-11 16:56:05 -07:00
|
|
|
SignalThread::Destroy(wait);
|
2014-05-13 18:00:26 +00:00
|
|
|
}
|
|
|
|
|
|
2017-07-11 16:56:05 -07:00
|
|
|
void AsyncResolver::DoWork() {
|
|
|
|
|
error_ = ResolveHostname(addr_.hostname().c_str(), addr_.family(),
|
|
|
|
|
&addresses_);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AsyncResolver::OnWorkDone() {
|
|
|
|
|
SignalDone(this);
|
2014-05-13 18:00:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char* inet_ntop(int af, const void *src, char* dst, socklen_t size) {
|
|
|
|
|
#if defined(WEBRTC_WIN)
|
|
|
|
|
return win32_inet_ntop(af, src, dst, size);
|
|
|
|
|
#else
|
|
|
|
|
return ::inet_ntop(af, src, dst, size);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int inet_pton(int af, const char* src, void *dst) {
|
|
|
|
|
#if defined(WEBRTC_WIN)
|
|
|
|
|
return win32_inet_pton(af, src, dst);
|
|
|
|
|
#else
|
|
|
|
|
return ::inet_pton(af, src, dst);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-15 19:43:33 -07:00
|
|
|
bool HasIPv4Enabled() {
|
|
|
|
|
#if defined(WEBRTC_POSIX) && !defined(__native_client__)
|
|
|
|
|
bool has_ipv4 = false;
|
|
|
|
|
struct ifaddrs* ifa;
|
|
|
|
|
if (getifaddrs(&ifa) < 0) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
for (struct ifaddrs* cur = ifa; cur != nullptr; cur = cur->ifa_next) {
|
|
|
|
|
if (cur->ifa_addr->sa_family == AF_INET) {
|
|
|
|
|
has_ipv4 = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
freeifaddrs(ifa);
|
|
|
|
|
return has_ipv4;
|
|
|
|
|
#else
|
|
|
|
|
return true;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-13 18:00:26 +00:00
|
|
|
bool HasIPv6Enabled() {
|
2016-05-19 14:57:31 -07:00
|
|
|
#if defined(WEBRTC_WIN)
|
2014-05-13 18:00:26 +00:00
|
|
|
if (IsWindowsVistaOrLater()) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
if (!IsWindowsXpOrLater()) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
DWORD protbuff_size = 4096;
|
2016-04-26 03:13:22 -07:00
|
|
|
std::unique_ptr<char[]> protocols;
|
2017-02-27 14:06:41 -08:00
|
|
|
LPWSAPROTOCOL_INFOW protocol_infos = nullptr;
|
2014-05-13 18:00:26 +00:00
|
|
|
int requested_protocols[2] = {AF_INET6, 0};
|
|
|
|
|
|
|
|
|
|
int err = 0;
|
|
|
|
|
int ret = 0;
|
|
|
|
|
// Check for protocols in a do-while loop until we provide a buffer large
|
|
|
|
|
// enough. (WSCEnumProtocols sets protbuff_size to its desired value).
|
|
|
|
|
// It is extremely unlikely that this will loop more than once.
|
|
|
|
|
do {
|
|
|
|
|
protocols.reset(new char[protbuff_size]);
|
|
|
|
|
protocol_infos = reinterpret_cast<LPWSAPROTOCOL_INFOW>(protocols.get());
|
|
|
|
|
ret = WSCEnumProtocols(requested_protocols, protocol_infos,
|
|
|
|
|
&protbuff_size, &err);
|
|
|
|
|
} while (ret == SOCKET_ERROR && err == WSAENOBUFS);
|
|
|
|
|
|
|
|
|
|
if (ret == SOCKET_ERROR) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Even if ret is positive, check specifically for IPv6.
|
|
|
|
|
// Non-IPv6 enabled WinXP will still return a RAW protocol.
|
|
|
|
|
for (int i = 0; i < ret; ++i) {
|
|
|
|
|
if (protocol_infos[i].iAddressFamily == AF_INET6) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
2016-05-19 14:57:31 -07:00
|
|
|
#elif defined(WEBRTC_POSIX) && !defined(__native_client__)
|
|
|
|
|
bool has_ipv6 = false;
|
|
|
|
|
struct ifaddrs* ifa;
|
|
|
|
|
if (getifaddrs(&ifa) < 0) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
for (struct ifaddrs* cur = ifa; cur != nullptr; cur = cur->ifa_next) {
|
|
|
|
|
if (cur->ifa_addr->sa_family == AF_INET6) {
|
|
|
|
|
has_ipv6 = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
freeifaddrs(ifa);
|
|
|
|
|
return has_ipv6;
|
|
|
|
|
#else
|
|
|
|
|
return true;
|
2014-05-13 18:00:26 +00:00
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
} // namespace rtc
|