diff --git a/p2p/base/port_unittest.cc b/p2p/base/port_unittest.cc index 0bae3ece13..8043606d21 100644 --- a/p2p/base/port_unittest.cc +++ b/p2p/base/port_unittest.cc @@ -1759,7 +1759,8 @@ TEST_F(PortTest, TestUdpSingleAddressV6CrossTypePorts) { TEST_F(PortTest, TestUdpMultipleAddressesV6CrossTypePorts) { webrtc::test::ScopedKeyValueConfig field_trials( - "WebRTC-IPv6NetworkResolutionFixes/Enabled/"); + "WebRTC-IPv6NetworkResolutionFixes/" + "Enabled,PreferGlobalIPv6Address:true/"); FakePacketSocketFactory factory; std::unique_ptr ports[5]; SocketAddress addresses[5] = { diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn index b7a9ec4a26..72c40fc0e2 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -1118,6 +1118,7 @@ rtc_library("rtc_base") { "../api/task_queue:pending_task_safety_flag", "../api/transport:field_trial_based_config", "../api/units:time_delta", + "../rtc_base/experiments:field_trial_parser", "../system_wrappers:field_trial", "memory:always_valid_pointer", "network:sent_packet", diff --git a/rtc_base/network.cc b/rtc_base/network.cc index c9d497e8a5..673a11300a 100644 --- a/rtc_base/network.cc +++ b/rtc_base/network.cc @@ -11,6 +11,7 @@ #include "rtc_base/network.h" #include "absl/strings/string_view.h" +#include "rtc_base/experiments/field_trial_parser.h" #if defined(WEBRTC_POSIX) #include @@ -180,6 +181,21 @@ bool ShouldAdapterChangeTriggerNetworkChange(rtc::AdapterType old_type, return true; } +bool PreferGlobalIPv6Address(const webrtc::FieldTrialsView* field_trials) { + // Bug fix to prefer global IPv6 address over link local. + // Field trial key reserved in bugs.webrtc.org/14334 + if (field_trials && + field_trials->IsEnabled("WebRTC-IPv6NetworkResolutionFixes")) { + webrtc::FieldTrialParameter prefer_global_ipv6_address_enabled( + "PreferGlobalIPv6Address", false); + webrtc::ParseFieldTrial( + {&prefer_global_ipv6_address_enabled}, + field_trials->Lookup("WebRTC-IPv6NetworkResolutionFixes")); + return prefer_global_ipv6_address_enabled; + } + return false; +} + } // namespace // These addresses are used as the targets to find out the default local address @@ -1111,12 +1127,9 @@ IPAddress Network::GetBestIP() const { } InterfaceAddress selected_ip, link_local_ip, ula_ip; - // Bug fix to prefer global IPv6 address over link local. - // Field trial key reserved in bugs.webrtc.org/14334 const bool prefer_global_ipv6_to_link_local = - field_trials_ - ? field_trials_->IsEnabled("WebRTC-IPv6NetworkResolutionFixes") - : false; + PreferGlobalIPv6Address(field_trials_); + for (const InterfaceAddress& ip : ips_) { // Ignore any address which has been deprecated already. if (ip.ipv6_flags() & IPV6_ADDRESS_FLAG_DEPRECATED) diff --git a/rtc_base/network_unittest.cc b/rtc_base/network_unittest.cc index 8b2a5cf66a..93ed6172d1 100644 --- a/rtc_base/network_unittest.cc +++ b/rtc_base/network_unittest.cc @@ -1160,7 +1160,8 @@ TEST_F(NetworkTest, TestIPv6Selection) { // Test that the filtering logic follows the defined ruleset in network.h. TEST_F(NetworkTest, TestGetBestIPWithPreferGlobalIPv6ToLinkLocalEnabled) { webrtc::test::ScopedKeyValueConfig field_trials( - "WebRTC-IPv6NetworkResolutionFixes/Enabled/"); + "WebRTC-IPv6NetworkResolutionFixes/" + "Enabled,PreferGlobalIPv6Address:true/"); InterfaceAddress ip, link_local; std::string ipstr;