diff --git a/sdk/android/native_unittests/android_network_monitor_unittest.cc b/sdk/android/native_unittests/android_network_monitor_unittest.cc index b596123d86..de54d24a4d 100644 --- a/sdk/android/native_unittests/android_network_monitor_unittest.cc +++ b/sdk/android/native_unittests/android_network_monitor_unittest.cc @@ -149,5 +149,19 @@ TEST_F(AndroidNetworkMonitorTest, TestFindNetworkHandleUsingIfName) { EXPECT_EQ(ipv6_handle, *network_handle2); } +TEST_F(AndroidNetworkMonitorTest, TestUnderlyingVpnType) { + ScopedFieldTrials field_trials("WebRTC-BindUsingInterfaceName/Enabled/"); + jni::NetworkHandle ipv4_handle = 100; + rtc::IPAddress ipv4_address(kTestIpv4Address); + jni::NetworkInformation net_info = + CreateNetworkInformation("wlan0", ipv4_handle, ipv4_address); + net_info.type = jni::NETWORK_VPN; + net_info.underlying_type_for_vpn = jni::NETWORK_WIFI; + network_monitor_->SetNetworkInfos({net_info}); + + EXPECT_EQ(rtc::ADAPTER_TYPE_WIFI, + network_monitor_->GetVpnUnderlyingAdapterType("v4-wlan0")); +} + } // namespace test } // namespace webrtc diff --git a/sdk/android/src/jni/android_network_monitor.cc b/sdk/android/src/jni/android_network_monitor.cc index 7f71ec7f0e..0780a442c7 100644 --- a/sdk/android/src/jni/android_network_monitor.cc +++ b/sdk/android/src/jni/android_network_monitor.cc @@ -436,6 +436,8 @@ AndroidNetworkMonitor::FindNetworkHandleFromIfname( if (bind_using_ifname_) { for (auto const& iter : network_info_by_handle_) { if (if_name.find(iter.second.interface_name) != std::string::npos) { + // Use partial match so that e.g if_name="v4-wlan0" is matched + // agains iter.first="wlan0" return absl::make_optional(iter.first); } } @@ -490,6 +492,8 @@ rtc::AdapterType AndroidNetworkMonitor::GetAdapterType( if (type == rtc::ADAPTER_TYPE_UNKNOWN && bind_using_ifname_) { for (auto const& iter : adapter_type_by_name_) { + // Use partial match so that e.g if_name="v4-wlan0" is matched + // agains iter.first="wlan0" if (if_name.find(iter.first) != std::string::npos) { type = iter.second; break; @@ -511,7 +515,9 @@ rtc::AdapterType AndroidNetworkMonitor::GetVpnUnderlyingAdapterType( ? rtc::ADAPTER_TYPE_UNKNOWN : iter->second; if (type == rtc::ADAPTER_TYPE_UNKNOWN && bind_using_ifname_) { - for (auto const& iter : adapter_type_by_name_) { + // Use partial match so that e.g if_name="v4-wlan0" is matched + // agains iter.first="wlan0" + for (auto const& iter : vpn_underlying_adapter_type_by_name_) { if (if_name.find(iter.first) != std::string::npos) { type = iter.second; break; diff --git a/sdk/android/src/jni/android_network_monitor.h b/sdk/android/src/jni/android_network_monitor.h index 5549f3171d..70e8e2e4a7 100644 --- a/sdk/android/src/jni/android_network_monitor.h +++ b/sdk/android/src/jni/android_network_monitor.h @@ -139,6 +139,13 @@ class AndroidNetworkMonitor : public rtc::NetworkMonitorInterface { bool find_network_handle_without_ipv6_temporary_part_ RTC_GUARDED_BY(network_thread_) = false; bool surface_cellular_types_ RTC_GUARDED_BY(network_thread_) = false; + + // NOTE: if bind_using_ifname_ is TRUE + // then the adapter name is used with substring matching as follows: + // An adapater name repored by android as 'wlan0' + // will be matched with 'v4-wlan0' ("v4-wlan0".find("wlan0") != npos). + // This applies to adapter_type_by_name_, vpn_underlying_adapter_type_by_name_ + // and FindNetworkHandleFromIfname. bool bind_using_ifname_ RTC_GUARDED_BY(network_thread_) = true; };