Reland "Pass NetworkMonitorFactory through PeerConnectionFactory."
This is a reland of 003c9be817817ed0e3aef3f50c78ae5cb31bc0ff
Found some downstream code that relies on
NetworkMonitorFactory::SetFactory, so I'm adding those methods back
temporarily. BasicNetworkManager will fall back to the static factory
if the one passed into PeerConnectionFactory is null.
Original change's description:
> Pass NetworkMonitorFactory through PeerConnectionFactory.
>
> Previously the instance was set through a static method, which was
> really only done because it was difficult to add new
> PeerConnectionFactory construction arguments at the time.
>
> Now that we have PeerConnectionFactoryDependencies it's easy to clean
> this up.
>
> I'm doing this because I plan to add a NetworkMonitor implementation
> for iOS, and don't want to inherit this ugliness.
>
> Bug: webrtc:9883
> Change-Id: Id94dc061ab1c7186b81af8547393a6e336ff04c2
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/180241
> Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
> Commit-Queue: Taylor <deadbeef@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#31815}
TBR=hta@webrtc.org, sakal@webrtc.org
Bug: webrtc:9883
Change-Id: I2e817c423f21936f87532a9694eb9a0a1b70c212
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/180722
Reviewed-by: Taylor <deadbeef@webrtc.org>
Commit-Queue: Taylor <deadbeef@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31824}
diff --git a/api/DEPS b/api/DEPS
index 4fc132b..4b93438 100644
--- a/api/DEPS
+++ b/api/DEPS
@@ -128,7 +128,7 @@
"+media/base/media_config.h",
"+media/base/media_engine.h",
"+p2p/base/port_allocator.h",
- "+rtc_base/network.h",
+ "+rtc_base/network_monitor_factory.h",
"+rtc_base/rtc_certificate.h",
"+rtc_base/rtc_certificate_generator.h",
"+rtc_base/socket_address.h",
diff --git a/api/peer_connection_interface.h b/api/peer_connection_interface.h
index 52d0d87..b1beb84 100644
--- a/api/peer_connection_interface.h
+++ b/api/peer_connection_interface.h
@@ -113,7 +113,7 @@
// inject a PacketSocketFactory and/or NetworkManager, and not expose
// PortAllocator in the PeerConnection api.
#include "p2p/base/port_allocator.h" // nogncheck
-#include "rtc_base/network.h"
+#include "rtc_base/network_monitor_factory.h"
#include "rtc_base/rtc_certificate.h"
#include "rtc_base/rtc_certificate_generator.h"
#include "rtc_base/socket_address.h"
@@ -1326,6 +1326,10 @@
std::unique_ptr<NetworkStatePredictorFactoryInterface>
network_state_predictor_factory;
std::unique_ptr<NetworkControllerFactoryInterface> network_controller_factory;
+ // This will only be used if CreatePeerConnection is called without a
+ // |port_allocator|, causing the default allocator and network manager to be
+ // used.
+ std::unique_ptr<rtc::NetworkMonitorFactory> network_monitor_factory;
std::unique_ptr<NetEqFactory> neteq_factory;
std::unique_ptr<WebRtcKeyValueConfig> trials;
};
diff --git a/pc/peer_connection_factory.cc b/pc/peer_connection_factory.cc
index d3b7fcd..d79e438 100644
--- a/pc/peer_connection_factory.cc
+++ b/pc/peer_connection_factory.cc
@@ -74,6 +74,7 @@
worker_thread_(dependencies.worker_thread),
signaling_thread_(dependencies.signaling_thread),
task_queue_factory_(std::move(dependencies.task_queue_factory)),
+ network_monitor_factory_(std::move(dependencies.network_monitor_factory)),
media_engine_(std::move(dependencies.media_engine)),
call_factory_(std::move(dependencies.call_factory)),
event_log_factory_(std::move(dependencies.event_log_factory)),
@@ -131,7 +132,10 @@
RTC_DCHECK(signaling_thread_->IsCurrent());
rtc::InitRandom(rtc::Time32());
- default_network_manager_.reset(new rtc::BasicNetworkManager());
+ // If network_monitor_factory_ is non-null, it will be used to create a
+ // network monitor while on the network thread.
+ default_network_manager_.reset(
+ new rtc::BasicNetworkManager(network_monitor_factory_.get()));
if (!default_network_manager_) {
return false;
}
diff --git a/pc/peer_connection_factory.h b/pc/peer_connection_factory.h
index 58859a0..3932562 100644
--- a/pc/peer_connection_factory.h
+++ b/pc/peer_connection_factory.h
@@ -113,6 +113,7 @@
const std::unique_ptr<TaskQueueFactory> task_queue_factory_;
Options options_;
std::unique_ptr<cricket::ChannelManager> channel_manager_;
+ const std::unique_ptr<rtc::NetworkMonitorFactory> network_monitor_factory_;
std::unique_ptr<rtc::BasicNetworkManager> default_network_manager_;
std::unique_ptr<rtc::BasicPacketSocketFactory> default_socket_factory_;
std::unique_ptr<cricket::MediaEngineInterface> media_engine_;
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index 73bca85..64548e6 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -705,6 +705,8 @@
# "message_handler.h",
# "network_monitor.cc",
# "network_monitor.h",
+ # "network_monitor_factory.cc",
+ # "network_monitor_factory.h",
# "physical_socket_server.cc",
# "physical_socket_server.h",
# "signal_thread.cc",
@@ -853,6 +855,8 @@
"network_constants.h",
"network_monitor.cc",
"network_monitor.h",
+ "network_monitor_factory.cc",
+ "network_monitor_factory.h",
"network_route.cc",
"network_route.h",
"null_socket_server.cc",
diff --git a/rtc_base/network.cc b/rtc_base/network.cc
index 64aee4b..7b4124c 100644
--- a/rtc_base/network.cc
+++ b/rtc_base/network.cc
@@ -470,12 +470,16 @@
return nullptr;
}
-BasicNetworkManager::BasicNetworkManager()
- : thread_(nullptr), sent_first_update_(false), start_count_(0) {}
+BasicNetworkManager::BasicNetworkManager() {}
+
+BasicNetworkManager::BasicNetworkManager(
+ NetworkMonitorFactory* network_monitor_factory)
+ : network_monitor_factory_(network_monitor_factory) {}
BasicNetworkManager::~BasicNetworkManager() {}
void BasicNetworkManager::OnNetworksChanged() {
+ RTC_DCHECK_RUN_ON(thread_);
RTC_LOG(LS_INFO) << "Network change was observed";
UpdateNetworksOnce();
}
@@ -799,6 +803,8 @@
void BasicNetworkManager::StartUpdating() {
thread_ = Thread::Current();
+ // Redundant but necessary for thread annotations.
+ RTC_DCHECK_RUN_ON(thread_);
if (start_count_) {
// If network interfaces are already discovered and signal is sent,
// we should trigger network signal immediately for the new clients
@@ -813,7 +819,7 @@
}
void BasicNetworkManager::StopUpdating() {
- RTC_DCHECK(Thread::Current() == thread_);
+ RTC_DCHECK_RUN_ON(thread_);
if (!start_count_)
return;
@@ -826,9 +832,12 @@
}
void BasicNetworkManager::StartNetworkMonitor() {
- NetworkMonitorFactory* factory = NetworkMonitorFactory::GetFactory();
+ NetworkMonitorFactory* factory = network_monitor_factory_;
if (factory == nullptr) {
- return;
+ factory = NetworkMonitorFactory::GetFactory();
+ if (factory == nullptr) {
+ return;
+ }
}
if (!network_monitor_) {
network_monitor_.reset(factory->CreateNetworkMonitor());
@@ -849,6 +858,7 @@
}
void BasicNetworkManager::OnMessage(Message* msg) {
+ RTC_DCHECK_RUN_ON(thread_);
switch (msg->message_id) {
case kUpdateNetworksMessage: {
UpdateNetworksContinually();
@@ -864,7 +874,6 @@
}
IPAddress BasicNetworkManager::QueryDefaultLocalAddress(int family) const {
- RTC_DCHECK(thread_ == Thread::Current());
RTC_DCHECK(thread_->socketserver() != nullptr);
RTC_DCHECK(family == AF_INET || family == AF_INET6);
@@ -893,8 +902,6 @@
if (!start_count_)
return;
- RTC_DCHECK(Thread::Current() == thread_);
-
NetworkList list;
if (!CreateNetworks(false, &list)) {
SignalError();
@@ -918,6 +925,7 @@
}
void BasicNetworkManager::DumpNetworks() {
+ RTC_DCHECK_RUN_ON(thread_);
NetworkList list;
GetNetworks(&list);
RTC_LOG(LS_INFO) << "NetworkManager detected " << list.size() << " networks:";
diff --git a/rtc_base/network.h b/rtc_base/network.h
index a67d2a2..26ef628 100644
--- a/rtc_base/network.h
+++ b/rtc_base/network.h
@@ -23,8 +23,11 @@
#include "rtc_base/mdns_responder_interface.h"
#include "rtc_base/message_handler.h"
#include "rtc_base/network_monitor.h"
+#include "rtc_base/network_monitor_factory.h"
+#include "rtc_base/synchronization/sequence_checker.h"
#include "rtc_base/system/rtc_export.h"
#include "rtc_base/third_party/sigslot/sigslot.h"
+#include "rtc_base/thread_annotations.h"
#if defined(WEBRTC_POSIX)
struct ifaddrs;
@@ -221,6 +224,7 @@
public sigslot::has_slots<> {
public:
BasicNetworkManager();
+ explicit BasicNetworkManager(NetworkMonitorFactory* network_monitor_factory);
~BasicNetworkManager() override;
void StartUpdating() override;
@@ -234,7 +238,9 @@
// Sets the network ignore list, which is empty by default. Any network on the
// ignore list will be filtered from network enumeration results.
+ // Should be called only before initialization.
void set_network_ignore_list(const std::vector<std::string>& list) {
+ RTC_DCHECK(thread_ == nullptr);
network_ignore_list_ = list;
}
@@ -244,41 +250,45 @@
void ConvertIfAddrs(ifaddrs* interfaces,
IfAddrsConverter* converter,
bool include_ignored,
- NetworkList* networks) const;
+ NetworkList* networks) const RTC_RUN_ON(thread_);
#endif // defined(WEBRTC_POSIX)
// Creates a network object for each network available on the machine.
- bool CreateNetworks(bool include_ignored, NetworkList* networks) const;
+ bool CreateNetworks(bool include_ignored, NetworkList* networks) const
+ RTC_RUN_ON(thread_);
// Determines if a network should be ignored. This should only be determined
// based on the network's property instead of any individual IP.
- bool IsIgnoredNetwork(const Network& network) const;
+ bool IsIgnoredNetwork(const Network& network) const RTC_RUN_ON(thread_);
// This function connects a UDP socket to a public address and returns the
// local address associated it. Since it binds to the "any" address
// internally, it returns the default local address on a multi-homed endpoint.
- IPAddress QueryDefaultLocalAddress(int family) const;
+ IPAddress QueryDefaultLocalAddress(int family) const RTC_RUN_ON(thread_);
private:
friend class NetworkTest;
// Creates a network monitor and listens for network updates.
- void StartNetworkMonitor();
+ void StartNetworkMonitor() RTC_RUN_ON(thread_);
// Stops and removes the network monitor.
- void StopNetworkMonitor();
+ void StopNetworkMonitor() RTC_RUN_ON(thread_);
// Called when it receives updates from the network monitor.
void OnNetworksChanged();
// Updates the networks and reschedules the next update.
- void UpdateNetworksContinually();
+ void UpdateNetworksContinually() RTC_RUN_ON(thread_);
// Only updates the networks; does not reschedule the next update.
- void UpdateNetworksOnce();
+ void UpdateNetworksOnce() RTC_RUN_ON(thread_);
- Thread* thread_;
- bool sent_first_update_;
- int start_count_;
+ Thread* thread_ = nullptr;
+ bool sent_first_update_ = true;
+ int start_count_ = 0;
std::vector<std::string> network_ignore_list_;
- std::unique_ptr<NetworkMonitorInterface> network_monitor_;
+ NetworkMonitorFactory* network_monitor_factory_ RTC_GUARDED_BY(thread_) =
+ nullptr;
+ std::unique_ptr<NetworkMonitorInterface> network_monitor_
+ RTC_GUARDED_BY(thread_);
};
// Represents a Unix-type network interface, with a name and single address.
diff --git a/rtc_base/network_monitor.cc b/rtc_base/network_monitor.cc
index 4eb5290..8fd5f78 100644
--- a/rtc_base/network_monitor.cc
+++ b/rtc_base/network_monitor.cc
@@ -18,11 +18,6 @@
namespace {
const uint32_t UPDATE_NETWORKS_MESSAGE = 1;
-
-// This is set by NetworkMonitorFactory::SetFactory and the caller of
-// NetworkMonitorFactory::SetFactory must be responsible for calling
-// ReleaseFactory to destroy the factory.
-rtc::NetworkMonitorFactory* network_monitor_factory = nullptr;
} // namespace
namespace rtc {
@@ -48,24 +43,4 @@
return ADAPTER_TYPE_UNKNOWN;
}
-NetworkMonitorFactory::NetworkMonitorFactory() {}
-NetworkMonitorFactory::~NetworkMonitorFactory() {}
-
-void NetworkMonitorFactory::SetFactory(NetworkMonitorFactory* factory) {
- if (network_monitor_factory != nullptr) {
- delete network_monitor_factory;
- }
- network_monitor_factory = factory;
-}
-
-void NetworkMonitorFactory::ReleaseFactory(NetworkMonitorFactory* factory) {
- if (factory == network_monitor_factory) {
- SetFactory(nullptr);
- }
-}
-
-NetworkMonitorFactory* NetworkMonitorFactory::GetFactory() {
- return network_monitor_factory;
-}
-
} // namespace rtc
diff --git a/rtc_base/network_monitor.h b/rtc_base/network_monitor.h
index ed4464d..5d44b62 100644
--- a/rtc_base/network_monitor.h
+++ b/rtc_base/network_monitor.h
@@ -12,6 +12,9 @@
#define RTC_BASE_NETWORK_MONITOR_H_
#include "rtc_base/network_constants.h"
+// TODO(deadbeef): Remove this include when downstream code stops using
+// NetworkMonitorFactory::SetFactory.
+#include "rtc_base/network_monitor_factory.h"
#include "rtc_base/third_party/sigslot/sigslot.h"
#include "rtc_base/thread.h"
@@ -98,26 +101,6 @@
Thread* worker_thread_;
};
-/*
- * NetworkMonitorFactory creates NetworkMonitors.
- */
-class NetworkMonitorFactory {
- public:
- // This is not thread-safe; it should be called once (or once per audio/video
- // call) during the call initialization.
- static void SetFactory(NetworkMonitorFactory* factory);
-
- static void ReleaseFactory(NetworkMonitorFactory* factory);
- static NetworkMonitorFactory* GetFactory();
-
- virtual NetworkMonitorInterface* CreateNetworkMonitor() = 0;
-
- virtual ~NetworkMonitorFactory();
-
- protected:
- NetworkMonitorFactory();
-};
-
} // namespace rtc
#endif // RTC_BASE_NETWORK_MONITOR_H_
diff --git a/rtc_base/network_monitor_factory.cc b/rtc_base/network_monitor_factory.cc
new file mode 100644
index 0000000..915f2e3
--- /dev/null
+++ b/rtc_base/network_monitor_factory.cc
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2020 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/network_monitor_factory.h"
+
+namespace {
+// This is set by NetworkMonitorFactory::SetFactory and the caller of
+// NetworkMonitorFactory::SetFactory must be responsible for calling
+// ReleaseFactory to destroy the factory.
+rtc::NetworkMonitorFactory* network_monitor_factory = nullptr;
+} // namespace
+
+namespace rtc {
+
+NetworkMonitorFactory::NetworkMonitorFactory() {}
+NetworkMonitorFactory::~NetworkMonitorFactory() {}
+
+void NetworkMonitorFactory::SetFactory(NetworkMonitorFactory* factory) {
+ if (network_monitor_factory != nullptr) {
+ delete network_monitor_factory;
+ }
+ network_monitor_factory = factory;
+}
+
+void NetworkMonitorFactory::ReleaseFactory(NetworkMonitorFactory* factory) {
+ if (factory == network_monitor_factory) {
+ SetFactory(nullptr);
+ }
+}
+
+NetworkMonitorFactory* NetworkMonitorFactory::GetFactory() {
+ return network_monitor_factory;
+}
+
+} // namespace rtc
diff --git a/rtc_base/network_monitor_factory.h b/rtc_base/network_monitor_factory.h
new file mode 100644
index 0000000..ac463d8
--- /dev/null
+++ b/rtc_base/network_monitor_factory.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2020 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.
+ */
+
+#ifndef RTC_BASE_NETWORK_MONITOR_FACTORY_H_
+#define RTC_BASE_NETWORK_MONITOR_FACTORY_H_
+
+namespace rtc {
+
+// Forward declaring this so it's not part of the API surface; it's only
+// expected to be used by Android/iOS SDK code.
+class NetworkMonitorInterface;
+
+/*
+ * NetworkMonitorFactory creates NetworkMonitors.
+ * Note that CreateNetworkMonitor is expected to be called on the network
+ * thread with the returned object only being used on that thread thereafter.
+ */
+class NetworkMonitorFactory {
+ public:
+ // This is not thread-safe; it should be called once (or once per audio/video
+ // call) during the call initialization.
+ // DEPRECATED: Should pass NetworkMonitorFactory through
+ // PeerConnectionFactoryDependencies instead.
+ static void SetFactory(NetworkMonitorFactory* factory);
+
+ static void ReleaseFactory(NetworkMonitorFactory* factory);
+ static NetworkMonitorFactory* GetFactory();
+
+ virtual NetworkMonitorInterface* CreateNetworkMonitor() = 0;
+
+ virtual ~NetworkMonitorFactory();
+
+ protected:
+ NetworkMonitorFactory();
+};
+
+} // namespace rtc
+
+#endif // RTC_BASE_NETWORK_MONITOR_FACTORY_H_
diff --git a/rtc_base/network_unittest.cc b/rtc_base/network_unittest.cc
index cd69356..29a89ba 100644
--- a/rtc_base/network_unittest.cc
+++ b/rtc_base/network_unittest.cc
@@ -19,6 +19,7 @@
#include "rtc_base/checks.h"
#include "rtc_base/net_helpers.h"
#include "rtc_base/network_monitor.h"
+#include "rtc_base/network_monitor_factory.h"
#if defined(WEBRTC_POSIX)
#include <net/if.h>
#include <sys/types.h>
@@ -100,18 +101,27 @@
bool IsIgnoredNetwork(BasicNetworkManager& network_manager,
const Network& network) {
+ RTC_DCHECK_RUN_ON(network_manager.thread_);
return network_manager.IsIgnoredNetwork(network);
}
+ IPAddress QueryDefaultLocalAddress(BasicNetworkManager& network_manager,
+ int family) {
+ RTC_DCHECK_RUN_ON(network_manager.thread_);
+ return network_manager.QueryDefaultLocalAddress(family);
+ }
+
NetworkManager::NetworkList GetNetworks(
const BasicNetworkManager& network_manager,
bool include_ignored) {
+ RTC_DCHECK_RUN_ON(network_manager.thread_);
NetworkManager::NetworkList list;
network_manager.CreateNetworks(include_ignored, &list);
return list;
}
FakeNetworkMonitor* GetNetworkMonitor(BasicNetworkManager& network_manager) {
+ RTC_DCHECK_RUN_ON(network_manager.thread_);
return static_cast<FakeNetworkMonitor*>(
network_manager.network_monitor_.get());
}
@@ -136,6 +146,7 @@
struct ifaddrs* interfaces,
bool include_ignored,
NetworkManager::NetworkList* networks) {
+ RTC_DCHECK_RUN_ON(network_manager.thread_);
// Use the base IfAddrsConverter for test cases.
std::unique_ptr<IfAddrsConverter> ifaddrs_converter(new IfAddrsConverter());
network_manager.ConvertIfAddrs(interfaces, ifaddrs_converter.get(),
@@ -247,6 +258,8 @@
class TestBasicNetworkManager : public BasicNetworkManager {
public:
+ TestBasicNetworkManager(NetworkMonitorFactory* network_monitor_factory)
+ : BasicNetworkManager(network_monitor_factory) {}
using BasicNetworkManager::QueryDefaultLocalAddress;
using BasicNetworkManager::set_default_local_addresses;
};
@@ -268,6 +281,7 @@
Network ipv4_network2("test_eth1", "Test Network Adapter 2",
IPAddress(0x010000U), 24, ADAPTER_TYPE_ETHERNET);
BasicNetworkManager network_manager;
+ network_manager.StartUpdating();
EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1));
EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2));
}
@@ -278,14 +292,18 @@
24);
Network include_me("include_me", "Include me please!", IPAddress(0x12345600U),
24);
- BasicNetworkManager network_manager;
- EXPECT_FALSE(IsIgnoredNetwork(network_manager, ignore_me));
- EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
+ BasicNetworkManager default_network_manager;
+ default_network_manager.StartUpdating();
+ EXPECT_FALSE(IsIgnoredNetwork(default_network_manager, ignore_me));
+ EXPECT_FALSE(IsIgnoredNetwork(default_network_manager, include_me));
+
+ BasicNetworkManager ignoring_network_manager;
std::vector<std::string> ignore_list;
ignore_list.push_back("ignore_me");
- network_manager.set_network_ignore_list(ignore_list);
- EXPECT_TRUE(IsIgnoredNetwork(network_manager, ignore_me));
- EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
+ ignoring_network_manager.set_network_ignore_list(ignore_list);
+ ignoring_network_manager.StartUpdating();
+ EXPECT_TRUE(IsIgnoredNetwork(ignoring_network_manager, ignore_me));
+ EXPECT_FALSE(IsIgnoredNetwork(ignoring_network_manager, include_me));
}
// Test is failing on Windows opt: b/11288214
@@ -649,6 +667,7 @@
// Test that DumpNetworks does not crash.
TEST_F(NetworkTest, TestCreateAndDumpNetworks) {
BasicNetworkManager manager;
+ manager.StartUpdating();
NetworkManager::NetworkList list = GetNetworks(manager, true);
bool changed;
MergeNetworkList(manager, list, &changed);
@@ -657,6 +676,7 @@
TEST_F(NetworkTest, TestIPv6Toggle) {
BasicNetworkManager manager;
+ manager.StartUpdating();
bool ipv6_found = false;
NetworkManager::NetworkList list;
list = GetNetworks(manager, true);
@@ -753,6 +773,7 @@
NetworkManager::NetworkList result;
BasicNetworkManager manager;
+ manager.StartUpdating();
CallConvertIfAddrs(manager, &list, true, &result);
EXPECT_TRUE(result.empty());
}
@@ -768,6 +789,7 @@
"FFFF:FFFF:FFFF:FFFF::", 0);
NetworkManager::NetworkList result;
BasicNetworkManager manager;
+ manager.StartUpdating();
CallConvertIfAddrs(manager, list, true, &result);
EXPECT_EQ(1U, result.size());
bool changed;
@@ -787,46 +809,35 @@
NetworkManager::NetworkList result;
BasicNetworkManager manager;
+ manager.StartUpdating();
CallConvertIfAddrs(manager, &list, true, &result);
EXPECT_TRUE(result.empty());
}
-// Tests that the network type can be updated after the network monitor is
-// started.
+// Tests that the network type can be determined from the network monitor when
+// it would otherwise be unknown.
TEST_F(NetworkTest, TestGetAdapterTypeFromNetworkMonitor) {
- char if_name1[20] = "wifi0";
- std::string ipv6_address1 = "1000:2000:3000:4000:0:0:0:1";
- std::string ipv6_address2 = "1000:2000:3000:8000:0:0:0:1";
+ char if_name[20] = "wifi0";
+ std::string ipv6_address = "1000:2000:3000:4000:0:0:0:1";
std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
- BasicNetworkManager manager;
- // A network created before the network monitor is started will get
- // UNKNOWN type.
- ifaddrs* addr_list =
- InstallIpv6Network(if_name1, ipv6_address1, ipv6_mask, manager);
- EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, GetAdapterType(manager));
+ BasicNetworkManager manager_without_monitor;
+ manager_without_monitor.StartUpdating();
+ // A network created without a network monitor will get UNKNOWN type.
+ ifaddrs* addr_list = InstallIpv6Network(if_name, ipv6_address, ipv6_mask,
+ manager_without_monitor);
+ EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, GetAdapterType(manager_without_monitor));
ReleaseIfAddrs(addr_list);
- // Note: Do not call ClearNetworks here in order to test that the type
- // of an existing network can be changed after the network monitor starts
- // and detects the network type correctly.
- // After the network monitor starts, the type will be updated.
- FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
- NetworkMonitorFactory::SetFactory(factory);
- // This brings up the hook with the network monitor.
- manager.StartUpdating();
+ // With the fake network monitor the type should be correctly determined.
+ FakeNetworkMonitorFactory factory;
+ BasicNetworkManager manager_with_monitor(&factory);
+ manager_with_monitor.StartUpdating();
// Add the same ipv6 address as before but it has the right network type
// detected by the network monitor now.
- addr_list = InstallIpv6Network(if_name1, ipv6_address1, ipv6_mask, manager);
- EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
+ addr_list = InstallIpv6Network(if_name, ipv6_address, ipv6_mask,
+ manager_with_monitor);
+ EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager_with_monitor));
ReleaseIfAddrs(addr_list);
- ClearNetworks(manager);
-
- // Add another network with the type inferred from the network monitor.
- char if_name2[20] = "cellular0";
- addr_list = InstallIpv6Network(if_name2, ipv6_address2, ipv6_mask, manager);
- EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
- ReleaseIfAddrs(addr_list);
- ClearNetworks(manager);
}
// Test that the network type can be determined based on name matching in
@@ -839,6 +850,7 @@
std::string ipv6_address2 = "1000:2000:3000:8000:0:0:0:1";
std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
BasicNetworkManager manager;
+ manager.StartUpdating();
// IPSec interface; name is in form "ipsec<index>".
char if_name[20] = "ipsec11";
@@ -1022,11 +1034,10 @@
}
TEST_F(NetworkTest, TestNetworkMonitoring) {
- BasicNetworkManager manager;
+ FakeNetworkMonitorFactory factory;
+ BasicNetworkManager manager(&factory);
manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
&NetworkTest::OnNetworksChanged);
- FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
- NetworkMonitorFactory::SetFactory(factory);
manager.StartUpdating();
FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
EXPECT_TRUE(network_monitor && network_monitor->started());
@@ -1043,8 +1054,6 @@
// Network manager is stopped.
manager.StopUpdating();
EXPECT_FALSE(GetNetworkMonitor(manager)->started());
-
- NetworkMonitorFactory::ReleaseFactory(factory);
}
// Fails on Android: https://bugs.chromium.org/p/webrtc/issues/detail?id=4364.
@@ -1055,11 +1064,10 @@
#endif
TEST_F(NetworkTest, MAYBE_DefaultLocalAddress) {
IPAddress ip;
- TestBasicNetworkManager manager;
+ FakeNetworkMonitorFactory factory;
+ TestBasicNetworkManager manager(&factory);
manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
&NetworkTest::OnNetworksChanged);
- FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
- NetworkMonitorFactory::SetFactory(factory);
manager.StartUpdating();
EXPECT_TRUE_WAIT(callback_called_, 1000);
@@ -1070,12 +1078,12 @@
EXPECT_TRUE(!networks.empty());
for (const auto* network : networks) {
if (network->GetBestIP().family() == AF_INET) {
- EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET) != IPAddress());
+ EXPECT_TRUE(QueryDefaultLocalAddress(manager, AF_INET) != IPAddress());
} else if (network->GetBestIP().family() == AF_INET6 &&
!IPIsLoopback(network->GetBestIP())) {
// Existence of an IPv6 loopback address doesn't mean it has IPv6 network
// enabled.
- EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET6) != IPAddress());
+ EXPECT_TRUE(QueryDefaultLocalAddress(manager, AF_INET6) != IPAddress());
}
}
diff --git a/sdk/android/native_api/base/network_monitor.h b/sdk/android/native_api/base/network_monitor.h
index 135ebb1..d0d3549 100644
--- a/sdk/android/native_api/base/network_monitor.h
+++ b/sdk/android/native_api/base/network_monitor.h
@@ -15,7 +15,7 @@
#include <memory>
-#include "rtc_base/network_monitor.h"
+#include "rtc_base/network_monitor_factory.h"
namespace webrtc {
diff --git a/sdk/android/native_api/peerconnection/peer_connection_factory.cc b/sdk/android/native_api/peerconnection/peer_connection_factory.cc
index e683975..4e742d1 100644
--- a/sdk/android/native_api/peerconnection/peer_connection_factory.cc
+++ b/sdk/android/native_api/peerconnection/peer_connection_factory.cc
@@ -23,11 +23,10 @@
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> pcf,
std::unique_ptr<rtc::Thread> network_thread,
std::unique_ptr<rtc::Thread> worker_thread,
- std::unique_ptr<rtc::Thread> signaling_thread,
- rtc::NetworkMonitorFactory* network_monitor_factory) {
+ std::unique_ptr<rtc::Thread> signaling_thread) {
return webrtc::jni::NativeToJavaPeerConnectionFactory(
jni, pcf, std::move(network_thread), std::move(worker_thread),
- std::move(signaling_thread), network_monitor_factory);
+ std::move(signaling_thread));
}
} // namespace webrtc
diff --git a/sdk/android/native_api/peerconnection/peer_connection_factory.h b/sdk/android/native_api/peerconnection/peer_connection_factory.h
index 889d609..00550a9 100644
--- a/sdk/android/native_api/peerconnection/peer_connection_factory.h
+++ b/sdk/android/native_api/peerconnection/peer_connection_factory.h
@@ -26,8 +26,7 @@
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> pcf,
std::unique_ptr<rtc::Thread> network_thread,
std::unique_ptr<rtc::Thread> worker_thread,
- std::unique_ptr<rtc::Thread> signaling_thread,
- rtc::NetworkMonitorFactory* network_monitor_factory = nullptr);
+ std::unique_ptr<rtc::Thread> signaling_thread);
} // namespace webrtc
diff --git a/sdk/android/native_unittests/peerconnection/peer_connection_factory_unittest.cc b/sdk/android/native_unittests/peerconnection/peer_connection_factory_unittest.cc
index 54613f9..75535d0 100644
--- a/sdk/android/native_unittests/peerconnection/peer_connection_factory_unittest.cc
+++ b/sdk/android/native_unittests/peerconnection/peer_connection_factory_unittest.cc
@@ -100,7 +100,7 @@
jobject java_factory = NativeToJavaPeerConnectionFactory(
jni, factory, std::move(network_thread), std::move(worker_thread),
- std::move(signaling_thread), nullptr /* network_monitor_factory */);
+ std::move(signaling_thread));
RTC_LOG(INFO) << java_factory;
diff --git a/sdk/android/src/jni/android_network_monitor.h b/sdk/android/src/jni/android_network_monitor.h
index 1d795df..815b72d 100644
--- a/sdk/android/src/jni/android_network_monitor.h
+++ b/sdk/android/src/jni/android_network_monitor.h
@@ -18,6 +18,7 @@
#include "absl/types/optional.h"
#include "rtc_base/network_monitor.h"
+#include "rtc_base/network_monitor_factory.h"
#include "rtc_base/thread_checker.h"
#include "sdk/android/src/jni/jni_helpers.h"
diff --git a/sdk/android/src/jni/pc/owned_factory_and_threads.cc b/sdk/android/src/jni/pc/owned_factory_and_threads.cc
index e42b117..5e00ece 100644
--- a/sdk/android/src/jni/pc/owned_factory_and_threads.cc
+++ b/sdk/android/src/jni/pc/owned_factory_and_threads.cc
@@ -19,19 +19,11 @@
std::unique_ptr<rtc::Thread> network_thread,
std::unique_ptr<rtc::Thread> worker_thread,
std::unique_ptr<rtc::Thread> signaling_thread,
- rtc::NetworkMonitorFactory* network_monitor_factory,
const rtc::scoped_refptr<PeerConnectionFactoryInterface>& factory)
: network_thread_(std::move(network_thread)),
worker_thread_(std::move(worker_thread)),
signaling_thread_(std::move(signaling_thread)),
- network_monitor_factory_(network_monitor_factory),
factory_(factory) {}
-OwnedFactoryAndThreads::~OwnedFactoryAndThreads() {
- if (network_monitor_factory_ != nullptr) {
- rtc::NetworkMonitorFactory::ReleaseFactory(network_monitor_factory_);
- }
-}
-
} // namespace jni
} // namespace webrtc
diff --git a/sdk/android/src/jni/pc/owned_factory_and_threads.h b/sdk/android/src/jni/pc/owned_factory_and_threads.h
index 845d4db..e87879c 100644
--- a/sdk/android/src/jni/pc/owned_factory_and_threads.h
+++ b/sdk/android/src/jni/pc/owned_factory_and_threads.h
@@ -33,25 +33,19 @@
std::unique_ptr<rtc::Thread> network_thread,
std::unique_ptr<rtc::Thread> worker_thread,
std::unique_ptr<rtc::Thread> signaling_thread,
- rtc::NetworkMonitorFactory* network_monitor_factory,
const rtc::scoped_refptr<PeerConnectionFactoryInterface>& factory);
- ~OwnedFactoryAndThreads();
+ ~OwnedFactoryAndThreads() = default;
PeerConnectionFactoryInterface* factory() { return factory_.get(); }
rtc::Thread* network_thread() { return network_thread_.get(); }
rtc::Thread* signaling_thread() { return signaling_thread_.get(); }
rtc::Thread* worker_thread() { return worker_thread_.get(); }
- rtc::NetworkMonitorFactory* network_monitor_factory() {
- return network_monitor_factory_;
- }
- void clear_network_monitor_factory() { network_monitor_factory_ = nullptr; }
private:
const std::unique_ptr<rtc::Thread> network_thread_;
const std::unique_ptr<rtc::Thread> worker_thread_;
const std::unique_ptr<rtc::Thread> signaling_thread_;
- rtc::NetworkMonitorFactory* network_monitor_factory_;
const rtc::scoped_refptr<PeerConnectionFactoryInterface> factory_;
};
diff --git a/sdk/android/src/jni/pc/peer_connection_factory.cc b/sdk/android/src/jni/pc/peer_connection_factory.cc
index 9a42a80..2392db2 100644
--- a/sdk/android/src/jni/pc/peer_connection_factory.cc
+++ b/sdk/android/src/jni/pc/peer_connection_factory.cc
@@ -138,11 +138,10 @@
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> pcf,
std::unique_ptr<rtc::Thread> network_thread,
std::unique_ptr<rtc::Thread> worker_thread,
- std::unique_ptr<rtc::Thread> signaling_thread,
- rtc::NetworkMonitorFactory* network_monitor_factory) {
+ std::unique_ptr<rtc::Thread> signaling_thread) {
OwnedFactoryAndThreads* owned_factory = new OwnedFactoryAndThreads(
std::move(network_thread), std::move(worker_thread),
- std::move(signaling_thread), network_monitor_factory, pcf);
+ std::move(signaling_thread), pcf);
ScopedJavaLocalRef<jobject> j_pcf = Java_PeerConnectionFactory_Constructor(
env, NativeToJavaPointer(owned_factory));
@@ -172,17 +171,15 @@
// Set in PeerConnectionFactory_initializeAndroidGlobals().
static bool factory_static_initialized = false;
-
jobject NativeToJavaPeerConnectionFactory(
JNIEnv* jni,
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> pcf,
std::unique_ptr<rtc::Thread> network_thread,
std::unique_ptr<rtc::Thread> worker_thread,
- std::unique_ptr<rtc::Thread> signaling_thread,
- rtc::NetworkMonitorFactory* network_monitor_factory) {
+ std::unique_ptr<rtc::Thread> signaling_thread) {
return NativeToScopedJavaPeerConnectionFactory(
jni, pcf, std::move(network_thread), std::move(worker_thread),
- std::move(signaling_thread), network_monitor_factory)
+ std::move(signaling_thread))
.Release();
}
@@ -284,18 +281,9 @@
signaling_thread->SetName("signaling_thread", NULL);
RTC_CHECK(signaling_thread->Start()) << "Failed to start thread";
- rtc::NetworkMonitorFactory* network_monitor_factory = nullptr;
-
const absl::optional<PeerConnectionFactoryInterface::Options> options =
JavaToNativePeerConnectionFactoryOptions(jni, joptions);
- // Do not create network_monitor_factory only if the options are
- // provided and disable_network_monitor therein is set to true.
- if (!(options && options->disable_network_monitor)) {
- network_monitor_factory = new AndroidNetworkMonitorFactory();
- rtc::NetworkMonitorFactory::SetFactory(network_monitor_factory);
- }
-
PeerConnectionFactoryDependencies dependencies;
dependencies.network_thread = network_thread.get();
dependencies.worker_thread = worker_thread.get();
@@ -310,6 +298,10 @@
dependencies.network_state_predictor_factory =
std::move(network_state_predictor_factory);
dependencies.neteq_factory = std::move(neteq_factory);
+ if (!(options && options->disable_network_monitor)) {
+ dependencies.network_monitor_factory =
+ std::make_unique<AndroidNetworkMonitorFactory>();
+ }
cricket::MediaEngineDependencies media_dependencies;
media_dependencies.task_queue_factory = dependencies.task_queue_factory.get();
@@ -336,7 +328,7 @@
return NativeToScopedJavaPeerConnectionFactory(
jni, factory, std::move(network_thread), std::move(worker_thread),
- std::move(signaling_thread), network_monitor_factory);
+ std::move(signaling_thread));
}
static ScopedJavaLocalRef<jobject>
diff --git a/sdk/android/src/jni/pc/peer_connection_factory.h b/sdk/android/src/jni/pc/peer_connection_factory.h
index 904352f..5bfdb7a 100644
--- a/sdk/android/src/jni/pc/peer_connection_factory.h
+++ b/sdk/android/src/jni/pc/peer_connection_factory.h
@@ -24,8 +24,7 @@
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> pcf,
std::unique_ptr<rtc::Thread> network_thread,
std::unique_ptr<rtc::Thread> worker_thread,
- std::unique_ptr<rtc::Thread> signaling_thread,
- rtc::NetworkMonitorFactory* network_monitor_factory = nullptr);
+ std::unique_ptr<rtc::Thread> signaling_thread);
} // namespace jni
} // namespace webrtc