[rtc] Adjust the sequence of rtc::Network definition

rtc::Network must be defined before classes that
use it as an instance variable.

Bug: webrtc:360158397
Change-Id: I5ca0acbc70cb5c27318d0ad01081b10b0b4dbff5
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/360440
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Auto-Submit: Ho Cheung <hocheung@chromium.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42843}
This commit is contained in:
Ho Cheung 2024-08-23 23:27:29 +08:00 committed by WebRTC LUCI CQ
parent 4f1dcd9d00
commit 5b47a7a149

View File

@ -188,183 +188,6 @@ class RTC_EXPORT NetworkManager : public DefaultLocalAddressProvider,
virtual void set_vpn_list(const std::vector<NetworkMask>& vpn) {}
};
// Base class for NetworkManager implementations.
class RTC_EXPORT NetworkManagerBase : public NetworkManager {
public:
NetworkManagerBase();
std::vector<const Network*> GetNetworks() const override;
std::vector<const Network*> GetAnyAddressNetworks() override;
EnumerationPermission enumeration_permission() const override;
bool GetDefaultLocalAddress(int family, IPAddress* ipaddr) const override;
// Check if MAC address in |bytes| is one of the pre-defined
// MAC addresses for know VPNs.
static bool IsVpnMacAddress(rtc::ArrayView<const uint8_t> address);
protected:
// Updates `networks_` with the networks listed in `list`. If
// `networks_map_` already has a Network object for a network listed
// in the `list` then it is reused. Accept ownership of the Network
// objects in the `list`. `changed` will be set to true if there is
// any change in the network list.
void MergeNetworkList(std::vector<std::unique_ptr<Network>> list,
bool* changed);
// `stats` will be populated even if |*changed| is false.
void MergeNetworkList(std::vector<std::unique_ptr<Network>> list,
bool* changed,
NetworkManager::Stats* stats);
void set_enumeration_permission(EnumerationPermission state) {
enumeration_permission_ = state;
}
void set_default_local_addresses(const IPAddress& ipv4,
const IPAddress& ipv6);
Network* GetNetworkFromAddress(const rtc::IPAddress& ip) const;
// To enable subclasses to get the networks list, without interfering with
// refactoring of the interface GetNetworks method.
const std::vector<Network*>& GetNetworksInternal() const { return networks_; }
std::unique_ptr<Network> CreateNetwork(absl::string_view name,
absl::string_view description,
const IPAddress& prefix,
int prefix_length,
AdapterType type) const;
private:
friend class NetworkTest;
EnumerationPermission enumeration_permission_;
std::vector<Network*> networks_;
std::map<std::string, std::unique_ptr<Network>> networks_map_;
std::unique_ptr<rtc::Network> ipv4_any_address_network_;
std::unique_ptr<rtc::Network> ipv6_any_address_network_;
IPAddress default_local_ipv4_address_;
IPAddress default_local_ipv6_address_;
// We use 16 bits to save the bandwidth consumption when sending the network
// id over the Internet. It is OK that the 16-bit integer overflows to get a
// network id 0 because we only compare the network ids in the old and the new
// best connections in the transport channel.
uint16_t next_available_network_id_ = 1;
};
// Basic implementation of the NetworkManager interface that gets list
// of networks using OS APIs.
class RTC_EXPORT BasicNetworkManager : public NetworkManagerBase,
public NetworkBinderInterface,
public sigslot::has_slots<> {
public:
// This is used by lots of downstream code.
BasicNetworkManager(SocketFactory* socket_factory,
const webrtc::FieldTrialsView* field_trials = nullptr)
: BasicNetworkManager(/* network_monitor_factory= */ nullptr,
socket_factory,
field_trials) {}
BasicNetworkManager(NetworkMonitorFactory* network_monitor_factory,
SocketFactory* socket_factory,
const webrtc::FieldTrialsView* field_trials = nullptr);
~BasicNetworkManager() override;
void StartUpdating() override;
void StopUpdating() override;
void DumpNetworks() override;
bool started() { return start_count_ > 0; }
// 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;
}
// Set a list of manually configured VPN's.
void set_vpn_list(const std::vector<NetworkMask>& vpn) override;
// Check if |prefix| is configured as VPN.
bool IsConfiguredVpn(IPAddress prefix, int prefix_length) const;
// Bind a socket to interface that ip address belong to.
// Implementation look up interface name and calls
// BindSocketToNetwork on NetworkMonitor.
// The interface name is needed as e.g ipv4 over ipv6 addresses
// are not exposed using Android functions, but it is possible
// bind an ipv4 address to the interface.
NetworkBindingResult BindSocketToNetwork(int socket_fd,
const IPAddress& address) override;
protected:
#if defined(WEBRTC_POSIX)
// Separated from CreateNetworks for tests.
void ConvertIfAddrs(ifaddrs* interfaces,
IfAddrsConverter* converter,
bool include_ignored,
std::vector<std::unique_ptr<Network>>* networks) const
RTC_RUN_ON(thread_);
NetworkMonitorInterface::InterfaceInfo GetInterfaceInfo(
struct ifaddrs* cursor) 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,
std::vector<std::unique_ptr<Network>>* 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 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 RTC_RUN_ON(thread_);
private:
friend class NetworkTest;
// Creates a network monitor and listens for network updates.
void StartNetworkMonitor() RTC_RUN_ON(thread_);
// Stops and removes the network monitor.
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() RTC_RUN_ON(thread_);
// Only updates the networks; does not reschedule the next update.
void UpdateNetworksOnce() RTC_RUN_ON(thread_);
Thread* thread_ = nullptr;
bool sent_first_update_ = true;
int start_count_ = 0;
webrtc::AlwaysValidPointer<const webrtc::FieldTrialsView,
webrtc::FieldTrialBasedConfig>
field_trials_;
std::vector<std::string> network_ignore_list_;
NetworkMonitorFactory* const network_monitor_factory_;
SocketFactory* const socket_factory_;
std::unique_ptr<NetworkMonitorInterface> network_monitor_
RTC_GUARDED_BY(thread_);
bool allow_mac_based_ipv6_ RTC_GUARDED_BY(thread_) = false;
bool bind_using_ifname_ RTC_GUARDED_BY(thread_) = false;
std::vector<NetworkMask> vpn_;
rtc::scoped_refptr<webrtc::PendingTaskSafetyFlag> task_safety_flag_;
};
// Represents a Unix-type network interface, with a name and single address.
class RTC_EXPORT Network {
public:
@ -582,6 +405,183 @@ class RTC_EXPORT Network {
friend class NetworkManager;
};
// Base class for NetworkManager implementations.
class RTC_EXPORT NetworkManagerBase : public NetworkManager {
public:
NetworkManagerBase();
std::vector<const Network*> GetNetworks() const override;
std::vector<const Network*> GetAnyAddressNetworks() override;
EnumerationPermission enumeration_permission() const override;
bool GetDefaultLocalAddress(int family, IPAddress* ipaddr) const override;
// Check if MAC address in |bytes| is one of the pre-defined
// MAC addresses for know VPNs.
static bool IsVpnMacAddress(rtc::ArrayView<const uint8_t> address);
protected:
// Updates `networks_` with the networks listed in `list`. If
// `networks_map_` already has a Network object for a network listed
// in the `list` then it is reused. Accept ownership of the Network
// objects in the `list`. `changed` will be set to true if there is
// any change in the network list.
void MergeNetworkList(std::vector<std::unique_ptr<Network>> list,
bool* changed);
// `stats` will be populated even if |*changed| is false.
void MergeNetworkList(std::vector<std::unique_ptr<Network>> list,
bool* changed,
NetworkManager::Stats* stats);
void set_enumeration_permission(EnumerationPermission state) {
enumeration_permission_ = state;
}
void set_default_local_addresses(const IPAddress& ipv4,
const IPAddress& ipv6);
Network* GetNetworkFromAddress(const rtc::IPAddress& ip) const;
// To enable subclasses to get the networks list, without interfering with
// refactoring of the interface GetNetworks method.
const std::vector<Network*>& GetNetworksInternal() const { return networks_; }
std::unique_ptr<Network> CreateNetwork(absl::string_view name,
absl::string_view description,
const IPAddress& prefix,
int prefix_length,
AdapterType type) const;
private:
friend class NetworkTest;
EnumerationPermission enumeration_permission_;
std::vector<Network*> networks_;
std::map<std::string, std::unique_ptr<Network>> networks_map_;
std::unique_ptr<rtc::Network> ipv4_any_address_network_;
std::unique_ptr<rtc::Network> ipv6_any_address_network_;
IPAddress default_local_ipv4_address_;
IPAddress default_local_ipv6_address_;
// We use 16 bits to save the bandwidth consumption when sending the network
// id over the Internet. It is OK that the 16-bit integer overflows to get a
// network id 0 because we only compare the network ids in the old and the new
// best connections in the transport channel.
uint16_t next_available_network_id_ = 1;
};
// Basic implementation of the NetworkManager interface that gets list
// of networks using OS APIs.
class RTC_EXPORT BasicNetworkManager : public NetworkManagerBase,
public NetworkBinderInterface,
public sigslot::has_slots<> {
public:
// This is used by lots of downstream code.
BasicNetworkManager(SocketFactory* socket_factory,
const webrtc::FieldTrialsView* field_trials = nullptr)
: BasicNetworkManager(/* network_monitor_factory= */ nullptr,
socket_factory,
field_trials) {}
BasicNetworkManager(NetworkMonitorFactory* network_monitor_factory,
SocketFactory* socket_factory,
const webrtc::FieldTrialsView* field_trials = nullptr);
~BasicNetworkManager() override;
void StartUpdating() override;
void StopUpdating() override;
void DumpNetworks() override;
bool started() { return start_count_ > 0; }
// 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;
}
// Set a list of manually configured VPN's.
void set_vpn_list(const std::vector<NetworkMask>& vpn) override;
// Check if |prefix| is configured as VPN.
bool IsConfiguredVpn(IPAddress prefix, int prefix_length) const;
// Bind a socket to interface that ip address belong to.
// Implementation look up interface name and calls
// BindSocketToNetwork on NetworkMonitor.
// The interface name is needed as e.g ipv4 over ipv6 addresses
// are not exposed using Android functions, but it is possible
// bind an ipv4 address to the interface.
NetworkBindingResult BindSocketToNetwork(int socket_fd,
const IPAddress& address) override;
protected:
#if defined(WEBRTC_POSIX)
// Separated from CreateNetworks for tests.
void ConvertIfAddrs(ifaddrs* interfaces,
IfAddrsConverter* converter,
bool include_ignored,
std::vector<std::unique_ptr<Network>>* networks) const
RTC_RUN_ON(thread_);
NetworkMonitorInterface::InterfaceInfo GetInterfaceInfo(
struct ifaddrs* cursor) 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,
std::vector<std::unique_ptr<Network>>* 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 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 RTC_RUN_ON(thread_);
private:
friend class NetworkTest;
// Creates a network monitor and listens for network updates.
void StartNetworkMonitor() RTC_RUN_ON(thread_);
// Stops and removes the network monitor.
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() RTC_RUN_ON(thread_);
// Only updates the networks; does not reschedule the next update.
void UpdateNetworksOnce() RTC_RUN_ON(thread_);
Thread* thread_ = nullptr;
bool sent_first_update_ = true;
int start_count_ = 0;
webrtc::AlwaysValidPointer<const webrtc::FieldTrialsView,
webrtc::FieldTrialBasedConfig>
field_trials_;
std::vector<std::string> network_ignore_list_;
NetworkMonitorFactory* const network_monitor_factory_;
SocketFactory* const socket_factory_;
std::unique_ptr<NetworkMonitorInterface> network_monitor_
RTC_GUARDED_BY(thread_);
bool allow_mac_based_ipv6_ RTC_GUARDED_BY(thread_) = false;
bool bind_using_ifname_ RTC_GUARDED_BY(thread_) = false;
std::vector<NetworkMask> vpn_;
rtc::scoped_refptr<webrtc::PendingTaskSafetyFlag> task_safety_flag_;
};
} // namespace rtc
#endif // RTC_BASE_NETWORK_H_