1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef RTC_BASE_NETWORK_H_ 12*d9f75844SAndroid Build Coastguard Worker #define RTC_BASE_NETWORK_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <stdint.h> 15*d9f75844SAndroid Build Coastguard Worker 16*d9f75844SAndroid Build Coastguard Worker #include <deque> 17*d9f75844SAndroid Build Coastguard Worker #include <map> 18*d9f75844SAndroid Build Coastguard Worker #include <memory> 19*d9f75844SAndroid Build Coastguard Worker #include <string> 20*d9f75844SAndroid Build Coastguard Worker #include <vector> 21*d9f75844SAndroid Build Coastguard Worker 22*d9f75844SAndroid Build Coastguard Worker #include "absl/base/attributes.h" 23*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/string_view.h" 24*d9f75844SAndroid Build Coastguard Worker #include "api/array_view.h" 25*d9f75844SAndroid Build Coastguard Worker #include "api/field_trials_view.h" 26*d9f75844SAndroid Build Coastguard Worker #include "api/sequence_checker.h" 27*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/pending_task_safety_flag.h" 28*d9f75844SAndroid Build Coastguard Worker #include "api/transport/field_trial_based_config.h" 29*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ip_address.h" 30*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/mdns_responder_interface.h" 31*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/memory/always_valid_pointer.h" 32*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/network_monitor.h" 33*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/network_monitor_factory.h" 34*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/socket_factory.h" 35*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/system/rtc_export.h" 36*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/third_party/sigslot/sigslot.h" 37*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread_annotations.h" 38*d9f75844SAndroid Build Coastguard Worker 39*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_POSIX) 40*d9f75844SAndroid Build Coastguard Worker struct ifaddrs; 41*d9f75844SAndroid Build Coastguard Worker #endif // defined(WEBRTC_POSIX) 42*d9f75844SAndroid Build Coastguard Worker 43*d9f75844SAndroid Build Coastguard Worker namespace rtc { 44*d9f75844SAndroid Build Coastguard Worker 45*d9f75844SAndroid Build Coastguard Worker extern const char kPublicIPv4Host[]; 46*d9f75844SAndroid Build Coastguard Worker extern const char kPublicIPv6Host[]; 47*d9f75844SAndroid Build Coastguard Worker 48*d9f75844SAndroid Build Coastguard Worker class IfAddrsConverter; 49*d9f75844SAndroid Build Coastguard Worker class Network; 50*d9f75844SAndroid Build Coastguard Worker class NetworkMonitorInterface; 51*d9f75844SAndroid Build Coastguard Worker class Thread; 52*d9f75844SAndroid Build Coastguard Worker 53*d9f75844SAndroid Build Coastguard Worker // By default, ignore loopback interfaces on the host. 54*d9f75844SAndroid Build Coastguard Worker const int kDefaultNetworkIgnoreMask = ADAPTER_TYPE_LOOPBACK; 55*d9f75844SAndroid Build Coastguard Worker 56*d9f75844SAndroid Build Coastguard Worker namespace webrtc_network_internal { 57*d9f75844SAndroid Build Coastguard Worker bool CompareNetworks(const std::unique_ptr<Network>& a, 58*d9f75844SAndroid Build Coastguard Worker const std::unique_ptr<Network>& b); 59*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc_network_internal 60*d9f75844SAndroid Build Coastguard Worker 61*d9f75844SAndroid Build Coastguard Worker // Makes a string key for this network. Used in the network manager's maps. 62*d9f75844SAndroid Build Coastguard Worker // Network objects are keyed on interface name, network prefix and the 63*d9f75844SAndroid Build Coastguard Worker // length of that prefix. 64*d9f75844SAndroid Build Coastguard Worker std::string MakeNetworkKey(absl::string_view name, 65*d9f75844SAndroid Build Coastguard Worker const IPAddress& prefix, 66*d9f75844SAndroid Build Coastguard Worker int prefix_length); 67*d9f75844SAndroid Build Coastguard Worker 68*d9f75844SAndroid Build Coastguard Worker // Utility function that attempts to determine an adapter type by an interface 69*d9f75844SAndroid Build Coastguard Worker // name (e.g., "wlan0"). Can be used by NetworkManager subclasses when other 70*d9f75844SAndroid Build Coastguard Worker // mechanisms fail to determine the type. 71*d9f75844SAndroid Build Coastguard Worker RTC_EXPORT AdapterType GetAdapterTypeFromName(absl::string_view network_name); 72*d9f75844SAndroid Build Coastguard Worker 73*d9f75844SAndroid Build Coastguard Worker class DefaultLocalAddressProvider { 74*d9f75844SAndroid Build Coastguard Worker public: 75*d9f75844SAndroid Build Coastguard Worker virtual ~DefaultLocalAddressProvider() = default; 76*d9f75844SAndroid Build Coastguard Worker 77*d9f75844SAndroid Build Coastguard Worker // The default local address is the local address used in multi-homed endpoint 78*d9f75844SAndroid Build Coastguard Worker // when the any address (0.0.0.0 or ::) is used as the local address. It's 79*d9f75844SAndroid Build Coastguard Worker // important to check the return value as a IP family may not be enabled. 80*d9f75844SAndroid Build Coastguard Worker virtual bool GetDefaultLocalAddress(int family, IPAddress* ipaddr) const = 0; 81*d9f75844SAndroid Build Coastguard Worker }; 82*d9f75844SAndroid Build Coastguard Worker 83*d9f75844SAndroid Build Coastguard Worker class MdnsResponderProvider { 84*d9f75844SAndroid Build Coastguard Worker public: 85*d9f75844SAndroid Build Coastguard Worker virtual ~MdnsResponderProvider() = default; 86*d9f75844SAndroid Build Coastguard Worker 87*d9f75844SAndroid Build Coastguard Worker // Returns the mDNS responder that can be used to obfuscate the local IP 88*d9f75844SAndroid Build Coastguard Worker // addresses of ICE host candidates by mDNS hostnames. 89*d9f75844SAndroid Build Coastguard Worker // 90*d9f75844SAndroid Build Coastguard Worker // The provider MUST outlive the mDNS responder. 91*d9f75844SAndroid Build Coastguard Worker virtual webrtc::MdnsResponderInterface* GetMdnsResponder() const = 0; 92*d9f75844SAndroid Build Coastguard Worker }; 93*d9f75844SAndroid Build Coastguard Worker 94*d9f75844SAndroid Build Coastguard Worker // Network/mask in CIDR representation. 95*d9f75844SAndroid Build Coastguard Worker class NetworkMask { 96*d9f75844SAndroid Build Coastguard Worker public: NetworkMask(const IPAddress & addr,int prefix_length)97*d9f75844SAndroid Build Coastguard Worker NetworkMask(const IPAddress& addr, int prefix_length) 98*d9f75844SAndroid Build Coastguard Worker : address_(addr), prefix_length_(prefix_length) {} 99*d9f75844SAndroid Build Coastguard Worker address()100*d9f75844SAndroid Build Coastguard Worker const IPAddress& address() const { return address_; } prefix_length()101*d9f75844SAndroid Build Coastguard Worker int prefix_length() const { return prefix_length_; } 102*d9f75844SAndroid Build Coastguard Worker 103*d9f75844SAndroid Build Coastguard Worker bool operator==(const NetworkMask& o) const { 104*d9f75844SAndroid Build Coastguard Worker return address_ == o.address_ && prefix_length_ == o.prefix_length_; 105*d9f75844SAndroid Build Coastguard Worker } 106*d9f75844SAndroid Build Coastguard Worker 107*d9f75844SAndroid Build Coastguard Worker private: 108*d9f75844SAndroid Build Coastguard Worker IPAddress address_; 109*d9f75844SAndroid Build Coastguard Worker // Length of valid bits in address_ (for ipv4 valid range is 0-32) 110*d9f75844SAndroid Build Coastguard Worker int prefix_length_; 111*d9f75844SAndroid Build Coastguard Worker }; 112*d9f75844SAndroid Build Coastguard Worker 113*d9f75844SAndroid Build Coastguard Worker // Generic network manager interface. It provides list of local 114*d9f75844SAndroid Build Coastguard Worker // networks. 115*d9f75844SAndroid Build Coastguard Worker // 116*d9f75844SAndroid Build Coastguard Worker // Every method of NetworkManager (including the destructor) must be called on 117*d9f75844SAndroid Build Coastguard Worker // the same thread, except for the constructor which may be called on any 118*d9f75844SAndroid Build Coastguard Worker // thread. 119*d9f75844SAndroid Build Coastguard Worker // 120*d9f75844SAndroid Build Coastguard Worker // This allows constructing a NetworkManager subclass on one thread and 121*d9f75844SAndroid Build Coastguard Worker // passing it into an object that uses it on a different thread. 122*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT NetworkManager : public DefaultLocalAddressProvider, 123*d9f75844SAndroid Build Coastguard Worker public MdnsResponderProvider { 124*d9f75844SAndroid Build Coastguard Worker public: 125*d9f75844SAndroid Build Coastguard Worker // This enum indicates whether adapter enumeration is allowed. 126*d9f75844SAndroid Build Coastguard Worker enum EnumerationPermission { 127*d9f75844SAndroid Build Coastguard Worker ENUMERATION_ALLOWED, // Adapter enumeration is allowed. Getting 0 network 128*d9f75844SAndroid Build Coastguard Worker // from GetNetworks means that there is no network 129*d9f75844SAndroid Build Coastguard Worker // available. 130*d9f75844SAndroid Build Coastguard Worker ENUMERATION_BLOCKED, // Adapter enumeration is disabled. 131*d9f75844SAndroid Build Coastguard Worker // GetAnyAddressNetworks() should be used instead. 132*d9f75844SAndroid Build Coastguard Worker }; 133*d9f75844SAndroid Build Coastguard Worker 134*d9f75844SAndroid Build Coastguard Worker // Called when network list is updated. 135*d9f75844SAndroid Build Coastguard Worker sigslot::signal0<> SignalNetworksChanged; 136*d9f75844SAndroid Build Coastguard Worker 137*d9f75844SAndroid Build Coastguard Worker // Indicates a failure when getting list of network interfaces. 138*d9f75844SAndroid Build Coastguard Worker sigslot::signal0<> SignalError; 139*d9f75844SAndroid Build Coastguard Worker 140*d9f75844SAndroid Build Coastguard Worker // This should be called on the NetworkManager's thread before the 141*d9f75844SAndroid Build Coastguard Worker // NetworkManager is used. Subclasses may override this if necessary. Initialize()142*d9f75844SAndroid Build Coastguard Worker virtual void Initialize() {} 143*d9f75844SAndroid Build Coastguard Worker 144*d9f75844SAndroid Build Coastguard Worker // Start/Stop monitoring of network interfaces 145*d9f75844SAndroid Build Coastguard Worker // list. SignalNetworksChanged or SignalError is emitted immediately 146*d9f75844SAndroid Build Coastguard Worker // after StartUpdating() is called. After that SignalNetworksChanged 147*d9f75844SAndroid Build Coastguard Worker // is emitted whenever list of networks changes. 148*d9f75844SAndroid Build Coastguard Worker virtual void StartUpdating() = 0; 149*d9f75844SAndroid Build Coastguard Worker virtual void StopUpdating() = 0; 150*d9f75844SAndroid Build Coastguard Worker 151*d9f75844SAndroid Build Coastguard Worker // Returns the current list of networks available on this machine. 152*d9f75844SAndroid Build Coastguard Worker // StartUpdating() must be called before this method is called. 153*d9f75844SAndroid Build Coastguard Worker // It makes sure that repeated calls return the same object for a 154*d9f75844SAndroid Build Coastguard Worker // given network, so that quality is tracked appropriately. Does not 155*d9f75844SAndroid Build Coastguard Worker // include ignored networks. 156*d9f75844SAndroid Build Coastguard Worker // The returned vector of Network* is valid as long as the NetworkManager is 157*d9f75844SAndroid Build Coastguard Worker // alive. 158*d9f75844SAndroid Build Coastguard Worker virtual std::vector<const Network*> GetNetworks() const = 0; 159*d9f75844SAndroid Build Coastguard Worker 160*d9f75844SAndroid Build Coastguard Worker // Returns the current permission state of GetNetworks(). 161*d9f75844SAndroid Build Coastguard Worker virtual EnumerationPermission enumeration_permission() const; 162*d9f75844SAndroid Build Coastguard Worker 163*d9f75844SAndroid Build Coastguard Worker // "AnyAddressNetwork" is a network which only contains single "any address" 164*d9f75844SAndroid Build Coastguard Worker // IP address. (i.e. INADDR_ANY for IPv4 or in6addr_any for IPv6). This is 165*d9f75844SAndroid Build Coastguard Worker // useful as binding to such interfaces allow default routing behavior like 166*d9f75844SAndroid Build Coastguard Worker // http traffic. 167*d9f75844SAndroid Build Coastguard Worker // 168*d9f75844SAndroid Build Coastguard Worker // This method appends the "any address" networks to the list, such that this 169*d9f75844SAndroid Build Coastguard Worker // can optionally be called after GetNetworks. 170*d9f75844SAndroid Build Coastguard Worker virtual std::vector<const Network*> GetAnyAddressNetworks() = 0; 171*d9f75844SAndroid Build Coastguard Worker 172*d9f75844SAndroid Build Coastguard Worker // Dumps the current list of networks in the network manager. DumpNetworks()173*d9f75844SAndroid Build Coastguard Worker virtual void DumpNetworks() {} 174*d9f75844SAndroid Build Coastguard Worker bool GetDefaultLocalAddress(int family, IPAddress* ipaddr) const override; 175*d9f75844SAndroid Build Coastguard Worker 176*d9f75844SAndroid Build Coastguard Worker struct Stats { 177*d9f75844SAndroid Build Coastguard Worker int ipv4_network_count; 178*d9f75844SAndroid Build Coastguard Worker int ipv6_network_count; StatsStats179*d9f75844SAndroid Build Coastguard Worker Stats() { 180*d9f75844SAndroid Build Coastguard Worker ipv4_network_count = 0; 181*d9f75844SAndroid Build Coastguard Worker ipv6_network_count = 0; 182*d9f75844SAndroid Build Coastguard Worker } 183*d9f75844SAndroid Build Coastguard Worker }; 184*d9f75844SAndroid Build Coastguard Worker 185*d9f75844SAndroid Build Coastguard Worker // MdnsResponderProvider interface. 186*d9f75844SAndroid Build Coastguard Worker webrtc::MdnsResponderInterface* GetMdnsResponder() const override; 187*d9f75844SAndroid Build Coastguard Worker set_vpn_list(const std::vector<NetworkMask> & vpn)188*d9f75844SAndroid Build Coastguard Worker virtual void set_vpn_list(const std::vector<NetworkMask>& vpn) {} 189*d9f75844SAndroid Build Coastguard Worker }; 190*d9f75844SAndroid Build Coastguard Worker 191*d9f75844SAndroid Build Coastguard Worker // Base class for NetworkManager implementations. 192*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT NetworkManagerBase : public NetworkManager { 193*d9f75844SAndroid Build Coastguard Worker public: 194*d9f75844SAndroid Build Coastguard Worker NetworkManagerBase(const webrtc::FieldTrialsView* field_trials = nullptr); 195*d9f75844SAndroid Build Coastguard Worker 196*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> GetNetworks() const override; 197*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> GetAnyAddressNetworks() override; 198*d9f75844SAndroid Build Coastguard Worker 199*d9f75844SAndroid Build Coastguard Worker EnumerationPermission enumeration_permission() const override; 200*d9f75844SAndroid Build Coastguard Worker 201*d9f75844SAndroid Build Coastguard Worker bool GetDefaultLocalAddress(int family, IPAddress* ipaddr) const override; 202*d9f75844SAndroid Build Coastguard Worker 203*d9f75844SAndroid Build Coastguard Worker // Check if MAC address in |bytes| is one of the pre-defined 204*d9f75844SAndroid Build Coastguard Worker // MAC addresses for know VPNs. 205*d9f75844SAndroid Build Coastguard Worker static bool IsVpnMacAddress(rtc::ArrayView<const uint8_t> address); 206*d9f75844SAndroid Build Coastguard Worker 207*d9f75844SAndroid Build Coastguard Worker protected: 208*d9f75844SAndroid Build Coastguard Worker // Updates `networks_` with the networks listed in `list`. If 209*d9f75844SAndroid Build Coastguard Worker // `networks_map_` already has a Network object for a network listed 210*d9f75844SAndroid Build Coastguard Worker // in the `list` then it is reused. Accept ownership of the Network 211*d9f75844SAndroid Build Coastguard Worker // objects in the `list`. `changed` will be set to true if there is 212*d9f75844SAndroid Build Coastguard Worker // any change in the network list. 213*d9f75844SAndroid Build Coastguard Worker void MergeNetworkList(std::vector<std::unique_ptr<Network>> list, 214*d9f75844SAndroid Build Coastguard Worker bool* changed); 215*d9f75844SAndroid Build Coastguard Worker 216*d9f75844SAndroid Build Coastguard Worker // `stats` will be populated even if |*changed| is false. 217*d9f75844SAndroid Build Coastguard Worker void MergeNetworkList(std::vector<std::unique_ptr<Network>> list, 218*d9f75844SAndroid Build Coastguard Worker bool* changed, 219*d9f75844SAndroid Build Coastguard Worker NetworkManager::Stats* stats); 220*d9f75844SAndroid Build Coastguard Worker set_enumeration_permission(EnumerationPermission state)221*d9f75844SAndroid Build Coastguard Worker void set_enumeration_permission(EnumerationPermission state) { 222*d9f75844SAndroid Build Coastguard Worker enumeration_permission_ = state; 223*d9f75844SAndroid Build Coastguard Worker } 224*d9f75844SAndroid Build Coastguard Worker 225*d9f75844SAndroid Build Coastguard Worker void set_default_local_addresses(const IPAddress& ipv4, 226*d9f75844SAndroid Build Coastguard Worker const IPAddress& ipv6); 227*d9f75844SAndroid Build Coastguard Worker 228*d9f75844SAndroid Build Coastguard Worker Network* GetNetworkFromAddress(const rtc::IPAddress& ip) const; 229*d9f75844SAndroid Build Coastguard Worker 230*d9f75844SAndroid Build Coastguard Worker // To enable subclasses to get the networks list, without interfering with 231*d9f75844SAndroid Build Coastguard Worker // refactoring of the interface GetNetworks method. GetNetworksInternal()232*d9f75844SAndroid Build Coastguard Worker const std::vector<Network*>& GetNetworksInternal() const { return networks_; } 233*d9f75844SAndroid Build Coastguard Worker 234*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<Network> CreateNetwork(absl::string_view name, 235*d9f75844SAndroid Build Coastguard Worker absl::string_view description, 236*d9f75844SAndroid Build Coastguard Worker const IPAddress& prefix, 237*d9f75844SAndroid Build Coastguard Worker int prefix_length, 238*d9f75844SAndroid Build Coastguard Worker AdapterType type) const; 239*d9f75844SAndroid Build Coastguard Worker field_trials()240*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView* field_trials() const { 241*d9f75844SAndroid Build Coastguard Worker return field_trials_.get(); 242*d9f75844SAndroid Build Coastguard Worker } 243*d9f75844SAndroid Build Coastguard Worker 244*d9f75844SAndroid Build Coastguard Worker private: 245*d9f75844SAndroid Build Coastguard Worker friend class NetworkTest; 246*d9f75844SAndroid Build Coastguard Worker webrtc::AlwaysValidPointer<const webrtc::FieldTrialsView, 247*d9f75844SAndroid Build Coastguard Worker webrtc::FieldTrialBasedConfig> 248*d9f75844SAndroid Build Coastguard Worker field_trials_; 249*d9f75844SAndroid Build Coastguard Worker EnumerationPermission enumeration_permission_; 250*d9f75844SAndroid Build Coastguard Worker 251*d9f75844SAndroid Build Coastguard Worker std::vector<Network*> networks_; 252*d9f75844SAndroid Build Coastguard Worker 253*d9f75844SAndroid Build Coastguard Worker std::map<std::string, std::unique_ptr<Network>> networks_map_; 254*d9f75844SAndroid Build Coastguard Worker 255*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<rtc::Network> ipv4_any_address_network_; 256*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<rtc::Network> ipv6_any_address_network_; 257*d9f75844SAndroid Build Coastguard Worker 258*d9f75844SAndroid Build Coastguard Worker IPAddress default_local_ipv4_address_; 259*d9f75844SAndroid Build Coastguard Worker IPAddress default_local_ipv6_address_; 260*d9f75844SAndroid Build Coastguard Worker // We use 16 bits to save the bandwidth consumption when sending the network 261*d9f75844SAndroid Build Coastguard Worker // id over the Internet. It is OK that the 16-bit integer overflows to get a 262*d9f75844SAndroid Build Coastguard Worker // network id 0 because we only compare the network ids in the old and the new 263*d9f75844SAndroid Build Coastguard Worker // best connections in the transport channel. 264*d9f75844SAndroid Build Coastguard Worker uint16_t next_available_network_id_ = 1; 265*d9f75844SAndroid Build Coastguard Worker 266*d9f75844SAndroid Build Coastguard Worker // True if calling network_preference() with a changed value 267*d9f75844SAndroid Build Coastguard Worker // should result in firing the SignalNetworkChanged signal. 268*d9f75844SAndroid Build Coastguard Worker bool signal_network_preference_change_ = false; 269*d9f75844SAndroid Build Coastguard Worker }; 270*d9f75844SAndroid Build Coastguard Worker 271*d9f75844SAndroid Build Coastguard Worker // Basic implementation of the NetworkManager interface that gets list 272*d9f75844SAndroid Build Coastguard Worker // of networks using OS APIs. 273*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT BasicNetworkManager : public NetworkManagerBase, 274*d9f75844SAndroid Build Coastguard Worker public NetworkBinderInterface, 275*d9f75844SAndroid Build Coastguard Worker public sigslot::has_slots<> { 276*d9f75844SAndroid Build Coastguard Worker public: 277*d9f75844SAndroid Build Coastguard Worker // This is used by lots of downstream code. 278*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager(SocketFactory* socket_factory, 279*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView* field_trials = nullptr) BasicNetworkManager(nullptr,socket_factory,field_trials)280*d9f75844SAndroid Build Coastguard Worker : BasicNetworkManager(/* network_monitor_factory= */ nullptr, 281*d9f75844SAndroid Build Coastguard Worker socket_factory, 282*d9f75844SAndroid Build Coastguard Worker field_trials) {} 283*d9f75844SAndroid Build Coastguard Worker 284*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager(NetworkMonitorFactory* network_monitor_factory, 285*d9f75844SAndroid Build Coastguard Worker SocketFactory* socket_factory, 286*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView* field_trials = nullptr); 287*d9f75844SAndroid Build Coastguard Worker ~BasicNetworkManager() override; 288*d9f75844SAndroid Build Coastguard Worker 289*d9f75844SAndroid Build Coastguard Worker void StartUpdating() override; 290*d9f75844SAndroid Build Coastguard Worker void StopUpdating() override; 291*d9f75844SAndroid Build Coastguard Worker 292*d9f75844SAndroid Build Coastguard Worker void DumpNetworks() override; 293*d9f75844SAndroid Build Coastguard Worker started()294*d9f75844SAndroid Build Coastguard Worker bool started() { return start_count_ > 0; } 295*d9f75844SAndroid Build Coastguard Worker 296*d9f75844SAndroid Build Coastguard Worker // Sets the network ignore list, which is empty by default. Any network on the 297*d9f75844SAndroid Build Coastguard Worker // ignore list will be filtered from network enumeration results. 298*d9f75844SAndroid Build Coastguard Worker // Should be called only before initialization. set_network_ignore_list(const std::vector<std::string> & list)299*d9f75844SAndroid Build Coastguard Worker void set_network_ignore_list(const std::vector<std::string>& list) { 300*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(thread_ == nullptr); 301*d9f75844SAndroid Build Coastguard Worker network_ignore_list_ = list; 302*d9f75844SAndroid Build Coastguard Worker } 303*d9f75844SAndroid Build Coastguard Worker 304*d9f75844SAndroid Build Coastguard Worker // Set a list of manually configured VPN's. 305*d9f75844SAndroid Build Coastguard Worker void set_vpn_list(const std::vector<NetworkMask>& vpn) override; 306*d9f75844SAndroid Build Coastguard Worker 307*d9f75844SAndroid Build Coastguard Worker // Check if |prefix| is configured as VPN. 308*d9f75844SAndroid Build Coastguard Worker bool IsConfiguredVpn(IPAddress prefix, int prefix_length) const; 309*d9f75844SAndroid Build Coastguard Worker 310*d9f75844SAndroid Build Coastguard Worker // Bind a socket to interface that ip address belong to. 311*d9f75844SAndroid Build Coastguard Worker // Implementation look up interface name and calls 312*d9f75844SAndroid Build Coastguard Worker // BindSocketToNetwork on NetworkMonitor. 313*d9f75844SAndroid Build Coastguard Worker // The interface name is needed as e.g ipv4 over ipv6 addresses 314*d9f75844SAndroid Build Coastguard Worker // are not exposed using Android functions, but it is possible 315*d9f75844SAndroid Build Coastguard Worker // bind an ipv4 address to the interface. 316*d9f75844SAndroid Build Coastguard Worker NetworkBindingResult BindSocketToNetwork(int socket_fd, 317*d9f75844SAndroid Build Coastguard Worker const IPAddress& address) override; 318*d9f75844SAndroid Build Coastguard Worker 319*d9f75844SAndroid Build Coastguard Worker protected: 320*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_POSIX) 321*d9f75844SAndroid Build Coastguard Worker // Separated from CreateNetworks for tests. 322*d9f75844SAndroid Build Coastguard Worker void ConvertIfAddrs(ifaddrs* interfaces, 323*d9f75844SAndroid Build Coastguard Worker IfAddrsConverter* converter, 324*d9f75844SAndroid Build Coastguard Worker bool include_ignored, 325*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>>* networks) const 326*d9f75844SAndroid Build Coastguard Worker RTC_RUN_ON(thread_); 327*d9f75844SAndroid Build Coastguard Worker NetworkMonitorInterface::InterfaceInfo GetInterfaceInfo( 328*d9f75844SAndroid Build Coastguard Worker struct ifaddrs* cursor) const RTC_RUN_ON(thread_); 329*d9f75844SAndroid Build Coastguard Worker #endif // defined(WEBRTC_POSIX) 330*d9f75844SAndroid Build Coastguard Worker 331*d9f75844SAndroid Build Coastguard Worker // Creates a network object for each network available on the machine. 332*d9f75844SAndroid Build Coastguard Worker bool CreateNetworks(bool include_ignored, 333*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>>* networks) const 334*d9f75844SAndroid Build Coastguard Worker RTC_RUN_ON(thread_); 335*d9f75844SAndroid Build Coastguard Worker 336*d9f75844SAndroid Build Coastguard Worker // Determines if a network should be ignored. This should only be determined 337*d9f75844SAndroid Build Coastguard Worker // based on the network's property instead of any individual IP. 338*d9f75844SAndroid Build Coastguard Worker bool IsIgnoredNetwork(const Network& network) const RTC_RUN_ON(thread_); 339*d9f75844SAndroid Build Coastguard Worker 340*d9f75844SAndroid Build Coastguard Worker // This function connects a UDP socket to a public address and returns the 341*d9f75844SAndroid Build Coastguard Worker // local address associated it. Since it binds to the "any" address 342*d9f75844SAndroid Build Coastguard Worker // internally, it returns the default local address on a multi-homed endpoint. 343*d9f75844SAndroid Build Coastguard Worker IPAddress QueryDefaultLocalAddress(int family) const RTC_RUN_ON(thread_); 344*d9f75844SAndroid Build Coastguard Worker 345*d9f75844SAndroid Build Coastguard Worker private: 346*d9f75844SAndroid Build Coastguard Worker friend class NetworkTest; 347*d9f75844SAndroid Build Coastguard Worker 348*d9f75844SAndroid Build Coastguard Worker // Creates a network monitor and listens for network updates. 349*d9f75844SAndroid Build Coastguard Worker void StartNetworkMonitor() RTC_RUN_ON(thread_); 350*d9f75844SAndroid Build Coastguard Worker // Stops and removes the network monitor. 351*d9f75844SAndroid Build Coastguard Worker void StopNetworkMonitor() RTC_RUN_ON(thread_); 352*d9f75844SAndroid Build Coastguard Worker // Called when it receives updates from the network monitor. 353*d9f75844SAndroid Build Coastguard Worker void OnNetworksChanged(); 354*d9f75844SAndroid Build Coastguard Worker 355*d9f75844SAndroid Build Coastguard Worker // Updates the networks and reschedules the next update. 356*d9f75844SAndroid Build Coastguard Worker void UpdateNetworksContinually() RTC_RUN_ON(thread_); 357*d9f75844SAndroid Build Coastguard Worker // Only updates the networks; does not reschedule the next update. 358*d9f75844SAndroid Build Coastguard Worker void UpdateNetworksOnce() RTC_RUN_ON(thread_); 359*d9f75844SAndroid Build Coastguard Worker 360*d9f75844SAndroid Build Coastguard Worker Thread* thread_ = nullptr; 361*d9f75844SAndroid Build Coastguard Worker bool sent_first_update_ = true; 362*d9f75844SAndroid Build Coastguard Worker int start_count_ = 0; 363*d9f75844SAndroid Build Coastguard Worker 364*d9f75844SAndroid Build Coastguard Worker std::vector<std::string> network_ignore_list_; 365*d9f75844SAndroid Build Coastguard Worker NetworkMonitorFactory* const network_monitor_factory_; 366*d9f75844SAndroid Build Coastguard Worker SocketFactory* const socket_factory_; 367*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<NetworkMonitorInterface> network_monitor_ 368*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(thread_); 369*d9f75844SAndroid Build Coastguard Worker bool allow_mac_based_ipv6_ RTC_GUARDED_BY(thread_) = false; 370*d9f75844SAndroid Build Coastguard Worker bool bind_using_ifname_ RTC_GUARDED_BY(thread_) = false; 371*d9f75844SAndroid Build Coastguard Worker 372*d9f75844SAndroid Build Coastguard Worker std::vector<NetworkMask> vpn_; 373*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::PendingTaskSafetyFlag> task_safety_flag_; 374*d9f75844SAndroid Build Coastguard Worker }; 375*d9f75844SAndroid Build Coastguard Worker 376*d9f75844SAndroid Build Coastguard Worker // Represents a Unix-type network interface, with a name and single address. 377*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT Network { 378*d9f75844SAndroid Build Coastguard Worker public: 379*d9f75844SAndroid Build Coastguard Worker Network(absl::string_view name, 380*d9f75844SAndroid Build Coastguard Worker absl::string_view description, 381*d9f75844SAndroid Build Coastguard Worker const IPAddress& prefix, 382*d9f75844SAndroid Build Coastguard Worker int prefix_length, 383*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView* field_trials = nullptr) Network(name,description,prefix,prefix_length,rtc::ADAPTER_TYPE_UNKNOWN,field_trials)384*d9f75844SAndroid Build Coastguard Worker : Network(name, 385*d9f75844SAndroid Build Coastguard Worker description, 386*d9f75844SAndroid Build Coastguard Worker prefix, 387*d9f75844SAndroid Build Coastguard Worker prefix_length, 388*d9f75844SAndroid Build Coastguard Worker rtc::ADAPTER_TYPE_UNKNOWN, 389*d9f75844SAndroid Build Coastguard Worker field_trials) {} 390*d9f75844SAndroid Build Coastguard Worker 391*d9f75844SAndroid Build Coastguard Worker Network(absl::string_view name, 392*d9f75844SAndroid Build Coastguard Worker absl::string_view description, 393*d9f75844SAndroid Build Coastguard Worker const IPAddress& prefix, 394*d9f75844SAndroid Build Coastguard Worker int prefix_length, 395*d9f75844SAndroid Build Coastguard Worker AdapterType type, 396*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView* field_trials = nullptr); 397*d9f75844SAndroid Build Coastguard Worker 398*d9f75844SAndroid Build Coastguard Worker Network(const Network&); 399*d9f75844SAndroid Build Coastguard Worker ~Network(); 400*d9f75844SAndroid Build Coastguard Worker 401*d9f75844SAndroid Build Coastguard Worker // This signal is fired whenever type() or underlying_type_for_vpn() changes. 402*d9f75844SAndroid Build Coastguard Worker // Mutable, to support connecting on the const Network passed to cricket::Port 403*d9f75844SAndroid Build Coastguard Worker // constructor. 404*d9f75844SAndroid Build Coastguard Worker mutable sigslot::signal1<const Network*> SignalTypeChanged; 405*d9f75844SAndroid Build Coastguard Worker 406*d9f75844SAndroid Build Coastguard Worker // This signal is fired whenever network preference changes. 407*d9f75844SAndroid Build Coastguard Worker sigslot::signal1<const Network*> SignalNetworkPreferenceChanged; 408*d9f75844SAndroid Build Coastguard Worker default_local_address_provider()409*d9f75844SAndroid Build Coastguard Worker const DefaultLocalAddressProvider* default_local_address_provider() const { 410*d9f75844SAndroid Build Coastguard Worker return default_local_address_provider_; 411*d9f75844SAndroid Build Coastguard Worker } set_default_local_address_provider(const DefaultLocalAddressProvider * provider)412*d9f75844SAndroid Build Coastguard Worker void set_default_local_address_provider( 413*d9f75844SAndroid Build Coastguard Worker const DefaultLocalAddressProvider* provider) { 414*d9f75844SAndroid Build Coastguard Worker default_local_address_provider_ = provider; 415*d9f75844SAndroid Build Coastguard Worker } 416*d9f75844SAndroid Build Coastguard Worker set_mdns_responder_provider(const MdnsResponderProvider * provider)417*d9f75844SAndroid Build Coastguard Worker void set_mdns_responder_provider(const MdnsResponderProvider* provider) { 418*d9f75844SAndroid Build Coastguard Worker mdns_responder_provider_ = provider; 419*d9f75844SAndroid Build Coastguard Worker } 420*d9f75844SAndroid Build Coastguard Worker 421*d9f75844SAndroid Build Coastguard Worker // Returns the name of the interface this network is associated with. name()422*d9f75844SAndroid Build Coastguard Worker const std::string& name() const { return name_; } 423*d9f75844SAndroid Build Coastguard Worker 424*d9f75844SAndroid Build Coastguard Worker // Returns the OS-assigned name for this network. This is useful for 425*d9f75844SAndroid Build Coastguard Worker // debugging but should not be sent over the wire (for privacy reasons). description()426*d9f75844SAndroid Build Coastguard Worker const std::string& description() const { return description_; } 427*d9f75844SAndroid Build Coastguard Worker 428*d9f75844SAndroid Build Coastguard Worker // Returns the prefix for this network. prefix()429*d9f75844SAndroid Build Coastguard Worker const IPAddress& prefix() const { return prefix_; } 430*d9f75844SAndroid Build Coastguard Worker // Returns the length, in bits, of this network's prefix. prefix_length()431*d9f75844SAndroid Build Coastguard Worker int prefix_length() const { return prefix_length_; } 432*d9f75844SAndroid Build Coastguard Worker 433*d9f75844SAndroid Build Coastguard Worker // Returns the family for the network prefix. family()434*d9f75844SAndroid Build Coastguard Worker int family() const { return prefix_.family(); } 435*d9f75844SAndroid Build Coastguard Worker 436*d9f75844SAndroid Build Coastguard Worker // `key_` has unique value per network interface. Used in sorting network 437*d9f75844SAndroid Build Coastguard Worker // interfaces. Key is derived from interface name and it's prefix. key()438*d9f75844SAndroid Build Coastguard Worker std::string key() const { return key_; } 439*d9f75844SAndroid Build Coastguard Worker 440*d9f75844SAndroid Build Coastguard Worker // Returns the Network's current idea of the 'best' IP it has. 441*d9f75844SAndroid Build Coastguard Worker // Or return an unset IP if this network has no active addresses. 442*d9f75844SAndroid Build Coastguard Worker // Here is the rule on how we mark the IPv6 address as ignorable for WebRTC. 443*d9f75844SAndroid Build Coastguard Worker // 1) return all global temporary dynamic and non-deprecated ones. 444*d9f75844SAndroid Build Coastguard Worker // 2) if #1 not available, return global ones. 445*d9f75844SAndroid Build Coastguard Worker // 3) if #2 not available and WebRTC-IPv6NetworkResolutionFixes enabled, 446*d9f75844SAndroid Build Coastguard Worker // return local link ones. 447*d9f75844SAndroid Build Coastguard Worker // 4) if #3 not available, use ULA ipv6 as last resort. (ULA stands for 448*d9f75844SAndroid Build Coastguard Worker // unique local address, which is not route-able in open internet but might 449*d9f75844SAndroid Build Coastguard Worker // be useful for a close WebRTC deployment. 450*d9f75844SAndroid Build Coastguard Worker 451*d9f75844SAndroid Build Coastguard Worker // TODO(guoweis): rule #3 actually won't happen at current 452*d9f75844SAndroid Build Coastguard Worker // implementation. The reason being that ULA address starting with 453*d9f75844SAndroid Build Coastguard Worker // 0xfc 0r 0xfd will be grouped into its own Network. The result of 454*d9f75844SAndroid Build Coastguard Worker // that is WebRTC will have one extra Network to generate candidates 455*d9f75844SAndroid Build Coastguard Worker // but the lack of rule #3 shouldn't prevent turning on IPv6 since 456*d9f75844SAndroid Build Coastguard Worker // ULA should only be tried in a close deployment anyway. 457*d9f75844SAndroid Build Coastguard Worker 458*d9f75844SAndroid Build Coastguard Worker // Note that when not specifying any flag, it's treated as case global 459*d9f75844SAndroid Build Coastguard Worker // IPv6 address 460*d9f75844SAndroid Build Coastguard Worker IPAddress GetBestIP() const; 461*d9f75844SAndroid Build Coastguard Worker 462*d9f75844SAndroid Build Coastguard Worker // Adds an active IP address to this network. Does not check for duplicates. AddIP(const InterfaceAddress & ip)463*d9f75844SAndroid Build Coastguard Worker void AddIP(const InterfaceAddress& ip) { ips_.push_back(ip); } AddIP(const IPAddress & ip)464*d9f75844SAndroid Build Coastguard Worker void AddIP(const IPAddress& ip) { ips_.push_back(rtc::InterfaceAddress(ip)); } 465*d9f75844SAndroid Build Coastguard Worker 466*d9f75844SAndroid Build Coastguard Worker // Sets the network's IP address list. Returns true if new IP addresses were 467*d9f75844SAndroid Build Coastguard Worker // detected. Passing true to already_changed skips this check. 468*d9f75844SAndroid Build Coastguard Worker bool SetIPs(const std::vector<InterfaceAddress>& ips, bool already_changed); 469*d9f75844SAndroid Build Coastguard Worker // Get the list of IP Addresses associated with this network. GetIPs()470*d9f75844SAndroid Build Coastguard Worker const std::vector<InterfaceAddress>& GetIPs() const { return ips_; } 471*d9f75844SAndroid Build Coastguard Worker // Clear the network's list of addresses. ClearIPs()472*d9f75844SAndroid Build Coastguard Worker void ClearIPs() { ips_.clear(); } 473*d9f75844SAndroid Build Coastguard Worker // Returns the mDNS responder that can be used to obfuscate the local IP 474*d9f75844SAndroid Build Coastguard Worker // addresses of host candidates by mDNS names in ICE gathering. After a 475*d9f75844SAndroid Build Coastguard Worker // name-address mapping is created by the mDNS responder, queries for the 476*d9f75844SAndroid Build Coastguard Worker // created name will be resolved by the responder. 477*d9f75844SAndroid Build Coastguard Worker webrtc::MdnsResponderInterface* GetMdnsResponder() const; 478*d9f75844SAndroid Build Coastguard Worker 479*d9f75844SAndroid Build Coastguard Worker // Returns the scope-id of the network's address. 480*d9f75844SAndroid Build Coastguard Worker // Should only be relevant for link-local IPv6 addresses. scope_id()481*d9f75844SAndroid Build Coastguard Worker int scope_id() const { return scope_id_; } set_scope_id(int id)482*d9f75844SAndroid Build Coastguard Worker void set_scope_id(int id) { scope_id_ = id; } 483*d9f75844SAndroid Build Coastguard Worker 484*d9f75844SAndroid Build Coastguard Worker // Indicates whether this network should be ignored, perhaps because 485*d9f75844SAndroid Build Coastguard Worker // the IP is 0, or the interface is one we know is invalid. ignored()486*d9f75844SAndroid Build Coastguard Worker bool ignored() const { return ignored_; } set_ignored(bool ignored)487*d9f75844SAndroid Build Coastguard Worker void set_ignored(bool ignored) { ignored_ = ignored; } 488*d9f75844SAndroid Build Coastguard Worker type()489*d9f75844SAndroid Build Coastguard Worker AdapterType type() const { return type_; } 490*d9f75844SAndroid Build Coastguard Worker // When type() is ADAPTER_TYPE_VPN, this returns the type of the underlying 491*d9f75844SAndroid Build Coastguard Worker // network interface used by the VPN, typically the preferred network type 492*d9f75844SAndroid Build Coastguard Worker // (see for example, the method setUnderlyingNetworks(android.net.Network[]) 493*d9f75844SAndroid Build Coastguard Worker // on https://developer.android.com/reference/android/net/VpnService.html). 494*d9f75844SAndroid Build Coastguard Worker // When this information is unavailable from the OS, ADAPTER_TYPE_UNKNOWN is 495*d9f75844SAndroid Build Coastguard Worker // returned. underlying_type_for_vpn()496*d9f75844SAndroid Build Coastguard Worker AdapterType underlying_type_for_vpn() const { 497*d9f75844SAndroid Build Coastguard Worker return underlying_type_for_vpn_; 498*d9f75844SAndroid Build Coastguard Worker } set_type(AdapterType type)499*d9f75844SAndroid Build Coastguard Worker void set_type(AdapterType type) { 500*d9f75844SAndroid Build Coastguard Worker if (type_ == type) { 501*d9f75844SAndroid Build Coastguard Worker return; 502*d9f75844SAndroid Build Coastguard Worker } 503*d9f75844SAndroid Build Coastguard Worker type_ = type; 504*d9f75844SAndroid Build Coastguard Worker if (type != ADAPTER_TYPE_VPN) { 505*d9f75844SAndroid Build Coastguard Worker underlying_type_for_vpn_ = ADAPTER_TYPE_UNKNOWN; 506*d9f75844SAndroid Build Coastguard Worker } 507*d9f75844SAndroid Build Coastguard Worker SignalTypeChanged(this); 508*d9f75844SAndroid Build Coastguard Worker } 509*d9f75844SAndroid Build Coastguard Worker set_underlying_type_for_vpn(AdapterType type)510*d9f75844SAndroid Build Coastguard Worker void set_underlying_type_for_vpn(AdapterType type) { 511*d9f75844SAndroid Build Coastguard Worker if (underlying_type_for_vpn_ == type) { 512*d9f75844SAndroid Build Coastguard Worker return; 513*d9f75844SAndroid Build Coastguard Worker } 514*d9f75844SAndroid Build Coastguard Worker underlying_type_for_vpn_ = type; 515*d9f75844SAndroid Build Coastguard Worker SignalTypeChanged(this); 516*d9f75844SAndroid Build Coastguard Worker } 517*d9f75844SAndroid Build Coastguard Worker IsVpn()518*d9f75844SAndroid Build Coastguard Worker bool IsVpn() const { return type_ == ADAPTER_TYPE_VPN; } 519*d9f75844SAndroid Build Coastguard Worker IsCellular()520*d9f75844SAndroid Build Coastguard Worker bool IsCellular() const { return IsCellular(type_); } 521*d9f75844SAndroid Build Coastguard Worker IsCellular(AdapterType type)522*d9f75844SAndroid Build Coastguard Worker static bool IsCellular(AdapterType type) { 523*d9f75844SAndroid Build Coastguard Worker switch (type) { 524*d9f75844SAndroid Build Coastguard Worker case ADAPTER_TYPE_CELLULAR: 525*d9f75844SAndroid Build Coastguard Worker case ADAPTER_TYPE_CELLULAR_2G: 526*d9f75844SAndroid Build Coastguard Worker case ADAPTER_TYPE_CELLULAR_3G: 527*d9f75844SAndroid Build Coastguard Worker case ADAPTER_TYPE_CELLULAR_4G: 528*d9f75844SAndroid Build Coastguard Worker case ADAPTER_TYPE_CELLULAR_5G: 529*d9f75844SAndroid Build Coastguard Worker return true; 530*d9f75844SAndroid Build Coastguard Worker default: 531*d9f75844SAndroid Build Coastguard Worker return false; 532*d9f75844SAndroid Build Coastguard Worker } 533*d9f75844SAndroid Build Coastguard Worker } 534*d9f75844SAndroid Build Coastguard Worker 535*d9f75844SAndroid Build Coastguard Worker // Note: This function is called "rarely". 536*d9f75844SAndroid Build Coastguard Worker // Twice per Network in BasicPortAllocator if 537*d9f75844SAndroid Build Coastguard Worker // PORTALLOCATOR_DISABLE_COSTLY_NETWORKS. Once in Port::Construct() (and when 538*d9f75844SAndroid Build Coastguard Worker // Port::OnNetworkTypeChanged is called). 539*d9f75844SAndroid Build Coastguard Worker ABSL_DEPRECATED( 540*d9f75844SAndroid Build Coastguard Worker "Use the version with field trials, see bugs.webrtc.org/webrtc:10335") 541*d9f75844SAndroid Build Coastguard Worker uint16_t GetCost(const webrtc::FieldTrialsView* field_trials = nullptr) const; 542*d9f75844SAndroid Build Coastguard Worker uint16_t GetCost(const webrtc::FieldTrialsView& field_trials) const; 543*d9f75844SAndroid Build Coastguard Worker 544*d9f75844SAndroid Build Coastguard Worker // A unique id assigned by the network manager, which may be signaled 545*d9f75844SAndroid Build Coastguard Worker // to the remote side in the candidate. id()546*d9f75844SAndroid Build Coastguard Worker uint16_t id() const { return id_; } set_id(uint16_t id)547*d9f75844SAndroid Build Coastguard Worker void set_id(uint16_t id) { id_ = id; } 548*d9f75844SAndroid Build Coastguard Worker preference()549*d9f75844SAndroid Build Coastguard Worker int preference() const { return preference_; } set_preference(int preference)550*d9f75844SAndroid Build Coastguard Worker void set_preference(int preference) { preference_ = preference; } 551*d9f75844SAndroid Build Coastguard Worker 552*d9f75844SAndroid Build Coastguard Worker // When we enumerate networks and find a previously-seen network is missing, 553*d9f75844SAndroid Build Coastguard Worker // we do not remove it (because it may be used elsewhere). Instead, we mark 554*d9f75844SAndroid Build Coastguard Worker // it inactive, so that we can detect network changes properly. active()555*d9f75844SAndroid Build Coastguard Worker bool active() const { return active_; } set_active(bool active)556*d9f75844SAndroid Build Coastguard Worker void set_active(bool active) { 557*d9f75844SAndroid Build Coastguard Worker if (active_ != active) { 558*d9f75844SAndroid Build Coastguard Worker active_ = active; 559*d9f75844SAndroid Build Coastguard Worker } 560*d9f75844SAndroid Build Coastguard Worker } 561*d9f75844SAndroid Build Coastguard Worker 562*d9f75844SAndroid Build Coastguard Worker // Property set by operating system/firmware that has information 563*d9f75844SAndroid Build Coastguard Worker // about connection strength to e.g WIFI router or CELL base towers. network_preference()564*d9f75844SAndroid Build Coastguard Worker NetworkPreference network_preference() const { return network_preference_; } set_network_preference(NetworkPreference val)565*d9f75844SAndroid Build Coastguard Worker void set_network_preference(NetworkPreference val) { 566*d9f75844SAndroid Build Coastguard Worker if (network_preference_ == val) { 567*d9f75844SAndroid Build Coastguard Worker return; 568*d9f75844SAndroid Build Coastguard Worker } 569*d9f75844SAndroid Build Coastguard Worker network_preference_ = val; 570*d9f75844SAndroid Build Coastguard Worker SignalNetworkPreferenceChanged(this); 571*d9f75844SAndroid Build Coastguard Worker } 572*d9f75844SAndroid Build Coastguard Worker 573*d9f75844SAndroid Build Coastguard Worker static std::pair<rtc::AdapterType, bool /* vpn */> 574*d9f75844SAndroid Build Coastguard Worker GuessAdapterFromNetworkCost(int network_cost); 575*d9f75844SAndroid Build Coastguard Worker 576*d9f75844SAndroid Build Coastguard Worker // Debugging description of this network 577*d9f75844SAndroid Build Coastguard Worker std::string ToString() const; 578*d9f75844SAndroid Build Coastguard Worker 579*d9f75844SAndroid Build Coastguard Worker private: 580*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView* field_trials_ = nullptr; 581*d9f75844SAndroid Build Coastguard Worker const DefaultLocalAddressProvider* default_local_address_provider_ = nullptr; 582*d9f75844SAndroid Build Coastguard Worker const MdnsResponderProvider* mdns_responder_provider_ = nullptr; 583*d9f75844SAndroid Build Coastguard Worker std::string name_; 584*d9f75844SAndroid Build Coastguard Worker std::string description_; 585*d9f75844SAndroid Build Coastguard Worker IPAddress prefix_; 586*d9f75844SAndroid Build Coastguard Worker int prefix_length_; 587*d9f75844SAndroid Build Coastguard Worker std::string key_; 588*d9f75844SAndroid Build Coastguard Worker std::vector<InterfaceAddress> ips_; 589*d9f75844SAndroid Build Coastguard Worker int scope_id_; 590*d9f75844SAndroid Build Coastguard Worker bool ignored_; 591*d9f75844SAndroid Build Coastguard Worker AdapterType type_; 592*d9f75844SAndroid Build Coastguard Worker AdapterType underlying_type_for_vpn_ = ADAPTER_TYPE_UNKNOWN; 593*d9f75844SAndroid Build Coastguard Worker int preference_; 594*d9f75844SAndroid Build Coastguard Worker bool active_ = true; 595*d9f75844SAndroid Build Coastguard Worker uint16_t id_ = 0; 596*d9f75844SAndroid Build Coastguard Worker NetworkPreference network_preference_ = NetworkPreference::NEUTRAL; 597*d9f75844SAndroid Build Coastguard Worker 598*d9f75844SAndroid Build Coastguard Worker friend class NetworkManager; 599*d9f75844SAndroid Build Coastguard Worker }; 600*d9f75844SAndroid Build Coastguard Worker 601*d9f75844SAndroid Build Coastguard Worker } // namespace rtc 602*d9f75844SAndroid Build Coastguard Worker 603*d9f75844SAndroid Build Coastguard Worker #endif // RTC_BASE_NETWORK_H_ 604