mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 13:50:40 +01:00
Pass a SocketFactory to BasicNetworkManager constructor
Used by QueryDefaultLocalAddress, instead of relying on the update thread's associated socket server. This is not the only use of rtc::Thread::socketserver() in the BasicNetworkManager class. It also interacts with the thread's socket server to call set_network_binder. That is unchanged by this cl, perhaps those calls can be moved to the caller of StartNetworkMonitor and StopNetworkMonitor. Bug: webrtc:13145 Change-Id: If109c2dcb0e74b183e10bb3db7a5aefcc95d1a8c Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/232613 Commit-Queue: Niels Moller <nisse@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/main@{#35118}
This commit is contained in:
parent
15a0c880cf
commit
aa373166f7
5 changed files with 45 additions and 16 deletions
|
@ -119,7 +119,7 @@ ConnectionContext::ConnectionContext(
|
||||||
// If network_monitor_factory_ is non-null, it will be used to create a
|
// If network_monitor_factory_ is non-null, it will be used to create a
|
||||||
// network monitor while on the network thread.
|
// network monitor while on the network thread.
|
||||||
default_network_manager_ = std::make_unique<rtc::BasicNetworkManager>(
|
default_network_manager_ = std::make_unique<rtc::BasicNetworkManager>(
|
||||||
network_monitor_factory_.get());
|
network_monitor_factory_.get(), network_thread()->socketserver());
|
||||||
|
|
||||||
// TODO(bugs.webrtc.org/13145): Either require that a PacketSocketFactory
|
// TODO(bugs.webrtc.org/13145): Either require that a PacketSocketFactory
|
||||||
// always is injected (with no need to construct this default factory), or get
|
// always is injected (with no need to construct this default factory), or get
|
||||||
|
|
|
@ -219,7 +219,8 @@ bool TestConnectivity(const SocketAddress& src, const IPAddress& dst) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestPhysicalInternal(const SocketAddress& int_addr) {
|
void TestPhysicalInternal(const SocketAddress& int_addr) {
|
||||||
BasicNetworkManager network_manager;
|
PhysicalSocketServer socket_server;
|
||||||
|
BasicNetworkManager network_manager(nullptr, &socket_server);
|
||||||
network_manager.StartUpdating();
|
network_manager.StartUpdating();
|
||||||
// Process pending messages so the network list is updated.
|
// Process pending messages so the network list is updated.
|
||||||
Thread::Current()->ProcessMessages(0);
|
Thread::Current()->ProcessMessages(0);
|
||||||
|
|
|
@ -508,11 +508,18 @@ bool NetworkManagerBase::IsVpnMacAddress(
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
BasicNetworkManager::BasicNetworkManager() : BasicNetworkManager(nullptr) {}
|
BasicNetworkManager::BasicNetworkManager()
|
||||||
|
: BasicNetworkManager(nullptr, nullptr) {}
|
||||||
|
|
||||||
BasicNetworkManager::BasicNetworkManager(
|
BasicNetworkManager::BasicNetworkManager(
|
||||||
NetworkMonitorFactory* network_monitor_factory)
|
NetworkMonitorFactory* network_monitor_factory)
|
||||||
|
: BasicNetworkManager(network_monitor_factory, nullptr) {}
|
||||||
|
|
||||||
|
BasicNetworkManager::BasicNetworkManager(
|
||||||
|
NetworkMonitorFactory* network_monitor_factory,
|
||||||
|
SocketFactory* socket_factory)
|
||||||
: network_monitor_factory_(network_monitor_factory),
|
: network_monitor_factory_(network_monitor_factory),
|
||||||
|
socket_factory_(socket_factory),
|
||||||
allow_mac_based_ipv6_(
|
allow_mac_based_ipv6_(
|
||||||
webrtc::field_trial::IsEnabled("WebRTC-AllowMACBasedIPv6")),
|
webrtc::field_trial::IsEnabled("WebRTC-AllowMACBasedIPv6")),
|
||||||
bind_using_ifname_(
|
bind_using_ifname_(
|
||||||
|
@ -963,11 +970,18 @@ void BasicNetworkManager::OnMessage(Message* msg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
IPAddress BasicNetworkManager::QueryDefaultLocalAddress(int family) const {
|
IPAddress BasicNetworkManager::QueryDefaultLocalAddress(int family) const {
|
||||||
RTC_DCHECK(thread_->socketserver() != nullptr);
|
|
||||||
RTC_DCHECK(family == AF_INET || family == AF_INET6);
|
RTC_DCHECK(family == AF_INET || family == AF_INET6);
|
||||||
|
|
||||||
|
// TODO(bugs.webrtc.org/13145): Delete support for null `socket_factory_`,
|
||||||
|
// require socket factory to be provided to constructor.
|
||||||
|
SocketFactory* socket_factory = socket_factory_;
|
||||||
|
if (!socket_factory) {
|
||||||
|
socket_factory = thread_->socketserver();
|
||||||
|
}
|
||||||
|
RTC_DCHECK(socket_factory);
|
||||||
|
|
||||||
std::unique_ptr<Socket> socket(
|
std::unique_ptr<Socket> socket(
|
||||||
thread_->socketserver()->CreateSocket(family, SOCK_DGRAM));
|
socket_factory->CreateSocket(family, SOCK_DGRAM));
|
||||||
if (!socket) {
|
if (!socket) {
|
||||||
RTC_LOG_ERR(LERROR) << "Socket creation failed";
|
RTC_LOG_ERR(LERROR) << "Socket creation failed";
|
||||||
return IPAddress();
|
return IPAddress();
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include "rtc_base/message_handler.h"
|
#include "rtc_base/message_handler.h"
|
||||||
#include "rtc_base/network_monitor.h"
|
#include "rtc_base/network_monitor.h"
|
||||||
#include "rtc_base/network_monitor_factory.h"
|
#include "rtc_base/network_monitor_factory.h"
|
||||||
|
#include "rtc_base/socket_factory.h"
|
||||||
#include "rtc_base/system/rtc_export.h"
|
#include "rtc_base/system/rtc_export.h"
|
||||||
#include "rtc_base/third_party/sigslot/sigslot.h"
|
#include "rtc_base/third_party/sigslot/sigslot.h"
|
||||||
#include "rtc_base/thread_annotations.h"
|
#include "rtc_base/thread_annotations.h"
|
||||||
|
@ -255,7 +256,12 @@ class RTC_EXPORT BasicNetworkManager : public NetworkManagerBase,
|
||||||
public sigslot::has_slots<> {
|
public sigslot::has_slots<> {
|
||||||
public:
|
public:
|
||||||
BasicNetworkManager();
|
BasicNetworkManager();
|
||||||
|
|
||||||
|
ABSL_DEPRECATED(
|
||||||
|
"Use the version with socket_factory, see bugs.webrtc.org/13145")
|
||||||
explicit BasicNetworkManager(NetworkMonitorFactory* network_monitor_factory);
|
explicit BasicNetworkManager(NetworkMonitorFactory* network_monitor_factory);
|
||||||
|
BasicNetworkManager(NetworkMonitorFactory* network_monitor_factory,
|
||||||
|
SocketFactory* socket_factory);
|
||||||
~BasicNetworkManager() override;
|
~BasicNetworkManager() override;
|
||||||
|
|
||||||
void StartUpdating() override;
|
void StartUpdating() override;
|
||||||
|
@ -331,8 +337,8 @@ class RTC_EXPORT BasicNetworkManager : public NetworkManagerBase,
|
||||||
bool sent_first_update_ = true;
|
bool sent_first_update_ = true;
|
||||||
int start_count_ = 0;
|
int start_count_ = 0;
|
||||||
std::vector<std::string> network_ignore_list_;
|
std::vector<std::string> network_ignore_list_;
|
||||||
NetworkMonitorFactory* network_monitor_factory_ RTC_GUARDED_BY(thread_) =
|
NetworkMonitorFactory* const network_monitor_factory_;
|
||||||
nullptr;
|
SocketFactory* const socket_factory_;
|
||||||
std::unique_ptr<NetworkMonitorInterface> network_monitor_
|
std::unique_ptr<NetworkMonitorInterface> network_monitor_
|
||||||
RTC_GUARDED_BY(thread_);
|
RTC_GUARDED_BY(thread_);
|
||||||
bool allow_mac_based_ipv6_ RTC_GUARDED_BY(thread_) = false;
|
bool allow_mac_based_ipv6_ RTC_GUARDED_BY(thread_) = false;
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "rtc_base/net_helpers.h"
|
#include "rtc_base/net_helpers.h"
|
||||||
#include "rtc_base/network_monitor.h"
|
#include "rtc_base/network_monitor.h"
|
||||||
#include "rtc_base/network_monitor_factory.h"
|
#include "rtc_base/network_monitor_factory.h"
|
||||||
|
#include "rtc_base/physical_socket_server.h"
|
||||||
#if defined(WEBRTC_POSIX)
|
#if defined(WEBRTC_POSIX)
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -313,8 +314,9 @@ class NetworkTest : public ::testing::Test, public sigslot::has_slots<> {
|
||||||
|
|
||||||
class TestBasicNetworkManager : public BasicNetworkManager {
|
class TestBasicNetworkManager : public BasicNetworkManager {
|
||||||
public:
|
public:
|
||||||
TestBasicNetworkManager(NetworkMonitorFactory* network_monitor_factory)
|
TestBasicNetworkManager(NetworkMonitorFactory* network_monitor_factory,
|
||||||
: BasicNetworkManager(network_monitor_factory) {}
|
SocketFactory* socket_factory)
|
||||||
|
: BasicNetworkManager(network_monitor_factory, socket_factory) {}
|
||||||
using BasicNetworkManager::QueryDefaultLocalAddress;
|
using BasicNetworkManager::QueryDefaultLocalAddress;
|
||||||
using BasicNetworkManager::set_default_local_addresses;
|
using BasicNetworkManager::set_default_local_addresses;
|
||||||
};
|
};
|
||||||
|
@ -398,7 +400,8 @@ TEST_F(NetworkTest, DISABLED_TestCreateNetworks) {
|
||||||
// Test StartUpdating() and StopUpdating(). network_permission_state starts with
|
// Test StartUpdating() and StopUpdating(). network_permission_state starts with
|
||||||
// ALLOWED.
|
// ALLOWED.
|
||||||
TEST_F(NetworkTest, TestUpdateNetworks) {
|
TEST_F(NetworkTest, TestUpdateNetworks) {
|
||||||
BasicNetworkManager manager;
|
PhysicalSocketServer socket_server;
|
||||||
|
BasicNetworkManager manager(nullptr, &socket_server);
|
||||||
manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
|
manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
|
||||||
&NetworkTest::OnNetworksChanged);
|
&NetworkTest::OnNetworksChanged);
|
||||||
EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
|
EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
|
||||||
|
@ -875,7 +878,8 @@ TEST_F(NetworkTest, TestGetAdapterTypeFromNetworkMonitor) {
|
||||||
char if_name[20] = "wifi0";
|
char if_name[20] = "wifi0";
|
||||||
std::string ipv6_address = "1000:2000:3000:4000:0:0:0:1";
|
std::string ipv6_address = "1000:2000:3000:4000:0:0:0:1";
|
||||||
std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
|
std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
|
||||||
BasicNetworkManager manager_without_monitor;
|
PhysicalSocketServer socket_server;
|
||||||
|
BasicNetworkManager manager_without_monitor(nullptr, &socket_server);
|
||||||
manager_without_monitor.StartUpdating();
|
manager_without_monitor.StartUpdating();
|
||||||
// A network created without a network monitor will get UNKNOWN type.
|
// A network created without a network monitor will get UNKNOWN type.
|
||||||
ifaddrs* addr_list = InstallIpv6Network(if_name, ipv6_address, ipv6_mask,
|
ifaddrs* addr_list = InstallIpv6Network(if_name, ipv6_address, ipv6_mask,
|
||||||
|
@ -885,7 +889,7 @@ TEST_F(NetworkTest, TestGetAdapterTypeFromNetworkMonitor) {
|
||||||
|
|
||||||
// With the fake network monitor the type should be correctly determined.
|
// With the fake network monitor the type should be correctly determined.
|
||||||
FakeNetworkMonitorFactory factory;
|
FakeNetworkMonitorFactory factory;
|
||||||
BasicNetworkManager manager_with_monitor(&factory);
|
BasicNetworkManager manager_with_monitor(&factory, &socket_server);
|
||||||
manager_with_monitor.StartUpdating();
|
manager_with_monitor.StartUpdating();
|
||||||
// Add the same ipv6 address as before but it has the right network type
|
// Add the same ipv6 address as before but it has the right network type
|
||||||
// detected by the network monitor now.
|
// detected by the network monitor now.
|
||||||
|
@ -981,7 +985,8 @@ TEST_F(NetworkTest, TestNetworkMonitorIsAdapterAvailable) {
|
||||||
|
|
||||||
// Sanity check that both interfaces are included by default.
|
// Sanity check that both interfaces are included by default.
|
||||||
FakeNetworkMonitorFactory factory;
|
FakeNetworkMonitorFactory factory;
|
||||||
BasicNetworkManager manager(&factory);
|
PhysicalSocketServer socket_server;
|
||||||
|
BasicNetworkManager manager(&factory, &socket_server);
|
||||||
manager.StartUpdating();
|
manager.StartUpdating();
|
||||||
CallConvertIfAddrs(manager, list, /*include_ignored=*/false, &result);
|
CallConvertIfAddrs(manager, list, /*include_ignored=*/false, &result);
|
||||||
EXPECT_EQ(2u, result.size());
|
EXPECT_EQ(2u, result.size());
|
||||||
|
@ -1125,7 +1130,8 @@ TEST_F(NetworkTest, TestIPv6Selection) {
|
||||||
|
|
||||||
TEST_F(NetworkTest, TestNetworkMonitoring) {
|
TEST_F(NetworkTest, TestNetworkMonitoring) {
|
||||||
FakeNetworkMonitorFactory factory;
|
FakeNetworkMonitorFactory factory;
|
||||||
BasicNetworkManager manager(&factory);
|
PhysicalSocketServer socket_server;
|
||||||
|
BasicNetworkManager manager(&factory, &socket_server);
|
||||||
manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
|
manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
|
||||||
&NetworkTest::OnNetworksChanged);
|
&NetworkTest::OnNetworksChanged);
|
||||||
manager.StartUpdating();
|
manager.StartUpdating();
|
||||||
|
@ -1155,7 +1161,8 @@ TEST_F(NetworkTest, TestNetworkMonitoring) {
|
||||||
TEST_F(NetworkTest, MAYBE_DefaultLocalAddress) {
|
TEST_F(NetworkTest, MAYBE_DefaultLocalAddress) {
|
||||||
IPAddress ip;
|
IPAddress ip;
|
||||||
FakeNetworkMonitorFactory factory;
|
FakeNetworkMonitorFactory factory;
|
||||||
TestBasicNetworkManager manager(&factory);
|
PhysicalSocketServer socket_server;
|
||||||
|
TestBasicNetworkManager manager(&factory, &socket_server);
|
||||||
manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
|
manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
|
||||||
&NetworkTest::OnNetworksChanged);
|
&NetworkTest::OnNetworksChanged);
|
||||||
manager.StartUpdating();
|
manager.StartUpdating();
|
||||||
|
@ -1327,7 +1334,8 @@ TEST_F(NetworkTest, WebRTC_BindUsingInterfaceName) {
|
||||||
|
|
||||||
// Sanity check that both interfaces are included by default.
|
// Sanity check that both interfaces are included by default.
|
||||||
FakeNetworkMonitorFactory factory;
|
FakeNetworkMonitorFactory factory;
|
||||||
BasicNetworkManager manager(&factory);
|
PhysicalSocketServer socket_server;
|
||||||
|
BasicNetworkManager manager(&factory, &socket_server);
|
||||||
manager.StartUpdating();
|
manager.StartUpdating();
|
||||||
CallConvertIfAddrs(manager, list, /*include_ignored=*/false, &result);
|
CallConvertIfAddrs(manager, list, /*include_ignored=*/false, &result);
|
||||||
EXPECT_EQ(2u, result.size());
|
EXPECT_EQ(2u, result.size());
|
||||||
|
|
Loading…
Reference in a new issue