diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /third_party/libwebrtc/rtc_base/net_test_helpers.cc | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/libwebrtc/rtc_base/net_test_helpers.cc')
-rw-r--r-- | third_party/libwebrtc/rtc_base/net_test_helpers.cc | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/third_party/libwebrtc/rtc_base/net_test_helpers.cc b/third_party/libwebrtc/rtc_base/net_test_helpers.cc new file mode 100644 index 0000000000..806d7dee60 --- /dev/null +++ b/third_party/libwebrtc/rtc_base/net_test_helpers.cc @@ -0,0 +1,111 @@ +/* + * Copyright 2023 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. + */ + +#include "rtc_base/net_test_helpers.h" + +#include <memory> +#include <string> + +#if defined(WEBRTC_WIN) +#include <ws2spi.h> +#include <ws2tcpip.h> + +#include "rtc_base/win/windows_version.h" +#endif +#if defined(WEBRTC_POSIX) && !defined(__native_client__) +#include <arpa/inet.h> +#if defined(WEBRTC_ANDROID) +#include "rtc_base/ifaddrs_android.h" +#else +#include <ifaddrs.h> +#endif +#endif // defined(WEBRTC_POSIX) && !defined(__native_client__) + +namespace rtc { + +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 != nullptr && cur->ifa_addr->sa_family == AF_INET) { + has_ipv4 = true; + break; + } + } + freeifaddrs(ifa); + return has_ipv4; +#else + return true; +#endif +} + +bool HasIPv6Enabled() { +#if defined(WINUWP) + // WinUWP always has IPv6 capability. + return true; +#elif defined(WEBRTC_WIN) + if (rtc::rtc_win::GetVersion() >= rtc::rtc_win::Version::VERSION_VISTA) { + return true; + } + if (rtc::rtc_win::GetVersion() < rtc::rtc_win::Version::VERSION_XP) { + return false; + } + DWORD protbuff_size = 4096; + std::unique_ptr<char[]> protocols; + LPWSAPROTOCOL_INFOW protocol_infos = nullptr; + 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; +#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 != nullptr && cur->ifa_addr->sa_family == AF_INET6) { + has_ipv6 = true; + break; + } + } + freeifaddrs(ifa); + return has_ipv6; +#else + return true; +#endif +} +} // namespace rtc |