From 7e2aa7d70afd9bd8605303050cb006a14e339d6b Mon Sep 17 00:00:00 2001 From: Diep Bui Date: Mon, 8 May 2023 14:46:09 +0000 Subject: [PATCH] Add logs to see if network is ignored because flag IFF_RUNNING is not set. Some chrome os endpoints get ICE NEVER CONNECTED because their wireless interfaces are ignored. One possible explanation is that result from getifaddrs is incorrect because some interfaces can work even if IFF_RUNNING is not set. Comparing to chromium code, not all messages with IFF_RUNNING on wireless interface are considered (https://chromium.googlesource.com/chromium/src/+/refs/heads/main/net/base/address_tracker_linux.cc#539). Thus the log print helps us to verify our explanation. Chrome log: https://screenshot.googleplex.com/8SnDn66F56HAKfQ Webrtc log: https://screenshot.googleplex.com/4jKxPsTHxExNBgz Bug: webrtc:14334 Change-Id: Icd67dbe4e8ddcaed8b583f2fdb5f1fadfd7bac60 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/304460 Reviewed-by: Mirko Bonadei Commit-Queue: Diep Bui Cr-Commit-Position: refs/heads/main@{#40020} --- rtc_base/network.cc | 10 ++++++---- rtc_base/network_unittest.cc | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/rtc_base/network.cc b/rtc_base/network.cc index a59574303d..4be6eed759 100644 --- a/rtc_base/network.cc +++ b/rtc_base/network.cc @@ -619,10 +619,6 @@ void BasicNetworkManager::ConvertIfAddrs( if (!cursor->ifa_addr || !cursor->ifa_netmask) { continue; } - // Skip ones which are down. - if (!(cursor->ifa_flags & IFF_RUNNING)) { - continue; - } // Skip unknown family. if (cursor->ifa_addr->sa_family != AF_INET && cursor->ifa_addr->sa_family != AF_INET6) { @@ -633,6 +629,12 @@ void BasicNetworkManager::ConvertIfAddrs( if (!ifaddrs_converter->ConvertIfAddrsToIPAddress(cursor, &ip, &mask)) { continue; } + // Skip ones which are down. + if (!(cursor->ifa_flags & IFF_RUNNING)) { + RTC_LOG(LS_INFO) << "Skip interface because of not IFF_RUNNING: " + << ip.ToSensitiveString(); + continue; + } // Special case for IPv6 address. if (cursor->ifa_addr->sa_family == AF_INET6) { diff --git a/rtc_base/network_unittest.cc b/rtc_base/network_unittest.cc index 9f76d5b442..1579f800b6 100644 --- a/rtc_base/network_unittest.cc +++ b/rtc_base/network_unittest.cc @@ -879,6 +879,7 @@ TEST_F(NetworkTest, TestConvertIfAddrsNotRunning) { memset(&list, 0, sizeof(list)); list.ifa_name = const_cast("test_iface"); sockaddr ifa_addr; + ifa_addr.sa_family = AF_UNSPEC; sockaddr ifa_netmask; list.ifa_addr = &ifa_addr; list.ifa_netmask = &ifa_netmask; @@ -891,6 +892,21 @@ TEST_F(NetworkTest, TestConvertIfAddrsNotRunning) { EXPECT_TRUE(result.empty()); } +TEST_F(NetworkTest, TestConvertIfAddrsGetsNullAddr) { + ifaddrs list; + memset(&list, 0, sizeof(list)); + list.ifa_name = const_cast("test_iface"); + list.ifa_addr = nullptr; + list.ifa_netmask = nullptr; + + std::vector> result; + PhysicalSocketServer socket_server; + BasicNetworkManager manager(&socket_server); + manager.StartUpdating(); + CallConvertIfAddrs(manager, &list, true, &result); + EXPECT_TRUE(result.empty()); +} + // Tests that the network type can be determined from the network monitor when // it would otherwise be unknown. TEST_F(NetworkTest, TestGetAdapterTypeFromNetworkMonitor) {