xref: /aosp_15_r20/external/webrtc/rtc_base/network.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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