1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_BASE_ADDRESS_TRACKER_LINUX_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_BASE_ADDRESS_TRACKER_LINUX_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <sys/socket.h> // Needed to include netlink. 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker // Mask superfluous definition of |struct net|. This is fixed in Linux 2.6.38. 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #define net net_kernel 13*6777b538SAndroid Build Coastguard Worker #include <linux/rtnetlink.h> 14*6777b538SAndroid Build Coastguard Worker #undef net 15*6777b538SAndroid Build Coastguard Worker #include <stddef.h> 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker #include <map> 18*6777b538SAndroid Build Coastguard Worker #include <memory> 19*6777b538SAndroid Build Coastguard Worker #include <string> 20*6777b538SAndroid Build Coastguard Worker #include <unordered_set> 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h" 23*6777b538SAndroid Build Coastguard Worker #include "base/files/file_descriptor_watcher_posix.h" 24*6777b538SAndroid Build Coastguard Worker #include "base/files/scoped_file.h" 25*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 26*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h" 27*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ref.h" 28*6777b538SAndroid Build Coastguard Worker #include "base/sequence_checker.h" 29*6777b538SAndroid Build Coastguard Worker #include "base/synchronization/condition_variable.h" 30*6777b538SAndroid Build Coastguard Worker #include "base/synchronization/lock.h" 31*6777b538SAndroid Build Coastguard Worker #include "base/task/sequenced_task_runner.h" 32*6777b538SAndroid Build Coastguard Worker #include "base/thread_annotations.h" 33*6777b538SAndroid Build Coastguard Worker #include "net/base/address_map_linux.h" 34*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_address.h" 35*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 36*6777b538SAndroid Build Coastguard Worker #include "net/base/network_change_notifier.h" 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker namespace net::test { 39*6777b538SAndroid Build Coastguard Worker class AddressTrackerLinuxTest; 40*6777b538SAndroid Build Coastguard Worker } 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker namespace net::internal { 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker // Keeps track of network interface addresses using rtnetlink. Used by 45*6777b538SAndroid Build Coastguard Worker // NetworkChangeNotifier to provide signals to registered IPAddressObservers. 46*6777b538SAndroid Build Coastguard Worker // 47*6777b538SAndroid Build Coastguard Worker // In tracking mode, this class should mostly be used on a single sequence, 48*6777b538SAndroid Build Coastguard Worker // except GetAddressMap() and GetOnlineLinks() (AddressMapOwnerLinux overrides) 49*6777b538SAndroid Build Coastguard Worker // which can be called on any thread. The main sequence should be able to block 50*6777b538SAndroid Build Coastguard Worker // (e.g. use a base::SequencedTaskRunner with base::MayBlock()). 51*6777b538SAndroid Build Coastguard Worker // 52*6777b538SAndroid Build Coastguard Worker // In non-tracking mode this should be used on a single thread. 53*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE AddressTrackerLinux : public AddressMapOwnerLinux { 54*6777b538SAndroid Build Coastguard Worker public: 55*6777b538SAndroid Build Coastguard Worker // Non-tracking version constructor: it takes a snapshot of the 56*6777b538SAndroid Build Coastguard Worker // current system configuration. Once Init() returns, the 57*6777b538SAndroid Build Coastguard Worker // configuration is available through GetOnlineLinks() and 58*6777b538SAndroid Build Coastguard Worker // GetAddressMap(). 59*6777b538SAndroid Build Coastguard Worker AddressTrackerLinux(); 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker // Tracking version constructor: it will run |address_callback| when 62*6777b538SAndroid Build Coastguard Worker // the AddressMap changes, |link_callback| when the list of online 63*6777b538SAndroid Build Coastguard Worker // links changes, and |tunnel_callback| when the list of online 64*6777b538SAndroid Build Coastguard Worker // tunnels changes. 65*6777b538SAndroid Build Coastguard Worker // |ignored_interfaces| is the list of interfaces to ignore. Changes to an 66*6777b538SAndroid Build Coastguard Worker // ignored interface will not cause any callback to be run. An ignored 67*6777b538SAndroid Build Coastguard Worker // interface will not have entries in GetAddressMap() and GetOnlineLinks(). 68*6777b538SAndroid Build Coastguard Worker // NOTE: Only ignore interfaces not used to connect to the internet. Adding 69*6777b538SAndroid Build Coastguard Worker // interfaces used to connect to the internet can cause critical network 70*6777b538SAndroid Build Coastguard Worker // changed signals to be lost allowing incorrect stale state to persist. 71*6777b538SAndroid Build Coastguard Worker // 72*6777b538SAndroid Build Coastguard Worker // |blocking_thread_runner| is the sequence on which this AddressTrackerLinux 73*6777b538SAndroid Build Coastguard Worker // will run. The AddressTrackerLinux can block in tracking mode and so it 74*6777b538SAndroid Build Coastguard Worker // should run on a sequence that can block, e.g. a base::SequencedTaskRunner 75*6777b538SAndroid Build Coastguard Worker // with base::MayBlock(). If nullptr, SetDiffCallback() cannot be used off of 76*6777b538SAndroid Build Coastguard Worker // the AddressTrackerLinux's sequence. 77*6777b538SAndroid Build Coastguard Worker AddressTrackerLinux(const base::RepeatingClosure& address_callback, 78*6777b538SAndroid Build Coastguard Worker const base::RepeatingClosure& link_callback, 79*6777b538SAndroid Build Coastguard Worker const base::RepeatingClosure& tunnel_callback, 80*6777b538SAndroid Build Coastguard Worker const std::unordered_set<std::string>& ignored_interfaces, 81*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::SequencedTaskRunner> 82*6777b538SAndroid Build Coastguard Worker blocking_thread_runner = nullptr); 83*6777b538SAndroid Build Coastguard Worker ~AddressTrackerLinux() override; 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker // In tracking mode, it starts watching the system configuration for 86*6777b538SAndroid Build Coastguard Worker // changes. The current thread must have a MessageLoopForIO. In 87*6777b538SAndroid Build Coastguard Worker // non-tracking mode, once Init() returns, a snapshot of the system 88*6777b538SAndroid Build Coastguard Worker // configuration is available through GetOnlineLinks() and 89*6777b538SAndroid Build Coastguard Worker // GetAddressMap(). 90*6777b538SAndroid Build Coastguard Worker void Init(); 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker // Same as Init(), except instead of creating and binding a netlink socket, 93*6777b538SAndroid Build Coastguard Worker // this AddressTrackerLinux will send and receive messages from |fd|. 94*6777b538SAndroid Build Coastguard Worker void InitWithFdForTesting(base::ScopedFD fd); 95*6777b538SAndroid Build Coastguard Worker 96*6777b538SAndroid Build Coastguard Worker // AddressMapOwnerLinux implementation (callable on any thread): 97*6777b538SAndroid Build Coastguard Worker AddressMap GetAddressMap() const override; 98*6777b538SAndroid Build Coastguard Worker // Returns set of interface indices for online interfaces. 99*6777b538SAndroid Build Coastguard Worker std::unordered_set<int> GetOnlineLinks() const override; 100*6777b538SAndroid Build Coastguard Worker 101*6777b538SAndroid Build Coastguard Worker AddressTrackerLinux* GetAddressTrackerLinux() override; 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker // This returns the current AddressMap and set of online links, and atomically 104*6777b538SAndroid Build Coastguard Worker // starts recording diffs to those structures. This can be called on any 105*6777b538SAndroid Build Coastguard Worker // thread, and must be called called before SetDiffCallback() below. Available 106*6777b538SAndroid Build Coastguard Worker // only in tracking mode. 107*6777b538SAndroid Build Coastguard Worker std::pair<AddressMap, std::unordered_set<int>> 108*6777b538SAndroid Build Coastguard Worker GetInitialDataAndStartRecordingDiffs(); 109*6777b538SAndroid Build Coastguard Worker 110*6777b538SAndroid Build Coastguard Worker // Called after GetInitialDataAndStartRecordingDiffs(). 111*6777b538SAndroid Build Coastguard Worker // 112*6777b538SAndroid Build Coastguard Worker // Whenever the AddressMap or the set of online links (returned by the above 113*6777b538SAndroid Build Coastguard Worker // two methods) changes, this callback is called on AddressTrackerLinux's 114*6777b538SAndroid Build Coastguard Worker // sequence. On the first call, |diff_callback| is called synchronously with 115*6777b538SAndroid Build Coastguard Worker // the set of diffs that have been built since 116*6777b538SAndroid Build Coastguard Worker // GetInitialDataAndStartRecordingDiffs() was called. If there are none, 117*6777b538SAndroid Build Coastguard Worker // |diff_callback| won't be called. 118*6777b538SAndroid Build Coastguard Worker // 119*6777b538SAndroid Build Coastguard Worker // This is only available in tracking mode. It can be called on any thread, 120*6777b538SAndroid Build Coastguard Worker // but it will post a task to the AddressTrackerLinux's sequence and therefore 121*6777b538SAndroid Build Coastguard Worker // will finish asynchronously. The caller MUST ENSURE that the 122*6777b538SAndroid Build Coastguard Worker // AddressTrackerLinux is not deleted until this task finishes. 123*6777b538SAndroid Build Coastguard Worker // This also requires |sequenced_task_runner_| to be set by the 124*6777b538SAndroid Build Coastguard Worker // AddressTrackerLinux constructor above. 125*6777b538SAndroid Build Coastguard Worker // 126*6777b538SAndroid Build Coastguard Worker // Note that other threads may see updated AddressMaps by calling 127*6777b538SAndroid Build Coastguard Worker // GetAddressMap() before |diff_callback| is ever called. 128*6777b538SAndroid Build Coastguard Worker void SetDiffCallback(DiffCallback diff_callback); 129*6777b538SAndroid Build Coastguard Worker 130*6777b538SAndroid Build Coastguard Worker // Implementation of NetworkChangeNotifierLinux::GetCurrentConnectionType(). 131*6777b538SAndroid Build Coastguard Worker // Safe to call from any thread, but will block until Init() has completed. 132*6777b538SAndroid Build Coastguard Worker NetworkChangeNotifier::ConnectionType GetCurrentConnectionType(); 133*6777b538SAndroid Build Coastguard Worker 134*6777b538SAndroid Build Coastguard Worker // Returns the name for the interface with interface index |interface_index|. 135*6777b538SAndroid Build Coastguard Worker // |buf| should be a pointer to an array of size IFNAMSIZ. The returned 136*6777b538SAndroid Build Coastguard Worker // pointer will point to |buf|. This function acts like if_indextoname which 137*6777b538SAndroid Build Coastguard Worker // cannot be used as net/if.h cannot be mixed with linux/if.h. We'll stick 138*6777b538SAndroid Build Coastguard Worker // with exclusively talking to the kernel and not the C library. 139*6777b538SAndroid Build Coastguard Worker static char* GetInterfaceName(int interface_index, char* buf); 140*6777b538SAndroid Build Coastguard Worker 141*6777b538SAndroid Build Coastguard Worker // Does |name| refer to a tunnel interface? 142*6777b538SAndroid Build Coastguard Worker static bool IsTunnelInterfaceName(const char* name); 143*6777b538SAndroid Build Coastguard Worker 144*6777b538SAndroid Build Coastguard Worker private: 145*6777b538SAndroid Build Coastguard Worker friend class net::test::AddressTrackerLinuxTest; 146*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(AddressTrackerLinuxNetlinkTest, 147*6777b538SAndroid Build Coastguard Worker TestInitializeTwoTrackers); 148*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(AddressTrackerLinuxNetlinkTest, 149*6777b538SAndroid Build Coastguard Worker TestInitializeTwoTrackersInPidNamespaces); 150*6777b538SAndroid Build Coastguard Worker friend int ChildProcessInitializeTrackerForTesting(); 151*6777b538SAndroid Build Coastguard Worker 152*6777b538SAndroid Build Coastguard Worker // In tracking mode, holds |lock| while alive. In non-tracking mode, 153*6777b538SAndroid Build Coastguard Worker // enforces single-threaded access. 154*6777b538SAndroid Build Coastguard Worker class SCOPED_LOCKABLE AddressTrackerAutoLock { 155*6777b538SAndroid Build Coastguard Worker public: 156*6777b538SAndroid Build Coastguard Worker AddressTrackerAutoLock(const AddressTrackerLinux& tracker, base::Lock& lock) 157*6777b538SAndroid Build Coastguard Worker EXCLUSIVE_LOCK_FUNCTION(lock); 158*6777b538SAndroid Build Coastguard Worker AddressTrackerAutoLock(const AddressTrackerAutoLock&) = delete; 159*6777b538SAndroid Build Coastguard Worker AddressTrackerAutoLock& operator=(const AddressTrackerAutoLock&) = delete; 160*6777b538SAndroid Build Coastguard Worker ~AddressTrackerAutoLock() UNLOCK_FUNCTION(); 161*6777b538SAndroid Build Coastguard Worker 162*6777b538SAndroid Build Coastguard Worker private: 163*6777b538SAndroid Build Coastguard Worker const raw_ref<const AddressTrackerLinux> tracker_; 164*6777b538SAndroid Build Coastguard Worker const raw_ref<base::Lock> lock_; 165*6777b538SAndroid Build Coastguard Worker }; 166*6777b538SAndroid Build Coastguard Worker 167*6777b538SAndroid Build Coastguard Worker // A function that returns the name of an interface given the interface index 168*6777b538SAndroid Build Coastguard Worker // in |interface_index|. |ifname| should be a buffer of size IFNAMSIZ. The 169*6777b538SAndroid Build Coastguard Worker // function should return a pointer to |ifname|. 170*6777b538SAndroid Build Coastguard Worker typedef char* (*GetInterfaceNameFunction)(int interface_index, char* ifname); 171*6777b538SAndroid Build Coastguard Worker 172*6777b538SAndroid Build Coastguard Worker // Retrieves a dump of the current AddressMap and set of online links as part 173*6777b538SAndroid Build Coastguard Worker // of initialization. Expects |netlink_fd_| to exist already. 174*6777b538SAndroid Build Coastguard Worker void DumpInitialAddressesAndWatch(); 175*6777b538SAndroid Build Coastguard Worker 176*6777b538SAndroid Build Coastguard Worker // Sets |*address_changed| to indicate whether |address_map_| changed and 177*6777b538SAndroid Build Coastguard Worker // sets |*link_changed| to indicate if |online_links_| changed and sets 178*6777b538SAndroid Build Coastguard Worker // |*tunnel_changed| to indicate if |online_links_| changed with regards to a 179*6777b538SAndroid Build Coastguard Worker // tunnel interface while reading messages from |netlink_fd_|. 180*6777b538SAndroid Build Coastguard Worker // 181*6777b538SAndroid Build Coastguard Worker // If |address_map_| has changed and |address_map_diff_| is not nullopt, 182*6777b538SAndroid Build Coastguard Worker // |*address_map_diff_| is populated with the changes to the AddressMap. 183*6777b538SAndroid Build Coastguard Worker // Similarly, if |online_links_| has changed and |online_links_diff_| is not 184*6777b538SAndroid Build Coastguard Worker // nullopt, |*online_links_diff| is populated with the changes to the set of 185*6777b538SAndroid Build Coastguard Worker // online links. 186*6777b538SAndroid Build Coastguard Worker void ReadMessages(bool* address_changed, 187*6777b538SAndroid Build Coastguard Worker bool* link_changed, 188*6777b538SAndroid Build Coastguard Worker bool* tunnel_changed); 189*6777b538SAndroid Build Coastguard Worker 190*6777b538SAndroid Build Coastguard Worker // Sets |*address_changed| to true if |address_map_| changed, sets 191*6777b538SAndroid Build Coastguard Worker // |*link_changed| to true if |online_links_| changed, sets |*tunnel_changed| 192*6777b538SAndroid Build Coastguard Worker // to true if |online_links_| changed with regards to a tunnel interface while 193*6777b538SAndroid Build Coastguard Worker // reading the message from |buffer|. 194*6777b538SAndroid Build Coastguard Worker // 195*6777b538SAndroid Build Coastguard Worker // If |address_map_| has changed and |address_map_diff_| is not nullopt, 196*6777b538SAndroid Build Coastguard Worker // |*address_map_diff_| is populated with the changes to the AddressMap. 197*6777b538SAndroid Build Coastguard Worker // Similarly, if |online_links_| has changed and |online_links_diff_| is not 198*6777b538SAndroid Build Coastguard Worker // nullopt, |*online_links_diff| is populated with the changes to the set of 199*6777b538SAndroid Build Coastguard Worker // online links. 200*6777b538SAndroid Build Coastguard Worker void HandleMessage(const char* buffer, 201*6777b538SAndroid Build Coastguard Worker int length, 202*6777b538SAndroid Build Coastguard Worker bool* address_changed, 203*6777b538SAndroid Build Coastguard Worker bool* link_changed, 204*6777b538SAndroid Build Coastguard Worker bool* tunnel_changed); 205*6777b538SAndroid Build Coastguard Worker 206*6777b538SAndroid Build Coastguard Worker // Call when some part of initialization failed; forces online and unblocks. 207*6777b538SAndroid Build Coastguard Worker void AbortAndForceOnline(); 208*6777b538SAndroid Build Coastguard Worker 209*6777b538SAndroid Build Coastguard Worker // Called by |watcher_| when |netlink_fd_| can be read without blocking. 210*6777b538SAndroid Build Coastguard Worker void OnFileCanReadWithoutBlocking(); 211*6777b538SAndroid Build Coastguard Worker 212*6777b538SAndroid Build Coastguard Worker // Does |interface_index| refer to a tunnel interface? 213*6777b538SAndroid Build Coastguard Worker bool IsTunnelInterface(int interface_index) const; 214*6777b538SAndroid Build Coastguard Worker 215*6777b538SAndroid Build Coastguard Worker // Is interface with index |interface_index| in list of ignored interfaces? 216*6777b538SAndroid Build Coastguard Worker bool IsInterfaceIgnored(int interface_index) const; 217*6777b538SAndroid Build Coastguard Worker 218*6777b538SAndroid Build Coastguard Worker // Updates current_connection_type_ based on the network list. 219*6777b538SAndroid Build Coastguard Worker void UpdateCurrentConnectionType(); 220*6777b538SAndroid Build Coastguard Worker 221*6777b538SAndroid Build Coastguard Worker // Passes |address_map_diff_| and |online_links_diff_| to |diff_callback_| as 222*6777b538SAndroid Build Coastguard Worker // arguments, and then clears them. 223*6777b538SAndroid Build Coastguard Worker void RunDiffCallback(); 224*6777b538SAndroid Build Coastguard Worker 225*6777b538SAndroid Build Coastguard Worker // Used by AddressTrackerLinuxTest, returns the number of threads waiting 226*6777b538SAndroid Build Coastguard Worker // for |connection_type_initialized_cv_|. 227*6777b538SAndroid Build Coastguard Worker int GetThreadsWaitingForConnectionTypeInitForTesting(); 228*6777b538SAndroid Build Coastguard Worker 229*6777b538SAndroid Build Coastguard Worker // Used by AddressTrackerLinuxNetlinkTest, returns true iff `Init` succeeded. 230*6777b538SAndroid Build Coastguard Worker // Undefined for non-tracking mode. 231*6777b538SAndroid Build Coastguard Worker bool DidTrackingInitSucceedForTesting() const; 232*6777b538SAndroid Build Coastguard Worker address_map_diff_for_testing()233*6777b538SAndroid Build Coastguard Worker AddressMapDiff& address_map_diff_for_testing() { 234*6777b538SAndroid Build Coastguard Worker AddressTrackerAutoLock lock(*this, address_map_lock_); 235*6777b538SAndroid Build Coastguard Worker return address_map_diff_.value(); 236*6777b538SAndroid Build Coastguard Worker } online_links_diff_for_testing()237*6777b538SAndroid Build Coastguard Worker OnlineLinksDiff& online_links_diff_for_testing() { 238*6777b538SAndroid Build Coastguard Worker AddressTrackerAutoLock lock(*this, online_links_lock_); 239*6777b538SAndroid Build Coastguard Worker return online_links_diff_.value(); 240*6777b538SAndroid Build Coastguard Worker } 241*6777b538SAndroid Build Coastguard Worker 242*6777b538SAndroid Build Coastguard Worker // Gets the name of an interface given the interface index |interface_index|. 243*6777b538SAndroid Build Coastguard Worker // May return empty string if it fails but should not return NULL. This is 244*6777b538SAndroid Build Coastguard Worker // overridden by tests. 245*6777b538SAndroid Build Coastguard Worker GetInterfaceNameFunction get_interface_name_; 246*6777b538SAndroid Build Coastguard Worker 247*6777b538SAndroid Build Coastguard Worker DiffCallback diff_callback_ GUARDED_BY_CONTEXT(sequence_checker_); 248*6777b538SAndroid Build Coastguard Worker base::RepeatingClosure address_callback_ 249*6777b538SAndroid Build Coastguard Worker GUARDED_BY_CONTEXT(sequence_checker_); 250*6777b538SAndroid Build Coastguard Worker base::RepeatingClosure link_callback_ GUARDED_BY_CONTEXT(sequence_checker_); 251*6777b538SAndroid Build Coastguard Worker base::RepeatingClosure tunnel_callback_ GUARDED_BY_CONTEXT(sequence_checker_); 252*6777b538SAndroid Build Coastguard Worker 253*6777b538SAndroid Build Coastguard Worker // Note that |watcher_| must be inactive when |netlink_fd_| is closed. 254*6777b538SAndroid Build Coastguard Worker base::ScopedFD netlink_fd_ GUARDED_BY_CONTEXT(sequence_checker_); 255*6777b538SAndroid Build Coastguard Worker std::unique_ptr<base::FileDescriptorWatcher::Controller> watcher_ 256*6777b538SAndroid Build Coastguard Worker GUARDED_BY_CONTEXT(sequence_checker_); 257*6777b538SAndroid Build Coastguard Worker 258*6777b538SAndroid Build Coastguard Worker mutable base::Lock address_map_lock_; 259*6777b538SAndroid Build Coastguard Worker AddressMap address_map_ GUARDED_BY(address_map_lock_); 260*6777b538SAndroid Build Coastguard Worker std::optional<AddressMapDiff> address_map_diff_; 261*6777b538SAndroid Build Coastguard Worker 262*6777b538SAndroid Build Coastguard Worker // Set of interface indices for links that are currently online. 263*6777b538SAndroid Build Coastguard Worker mutable base::Lock online_links_lock_ ACQUIRED_AFTER(address_map_lock_); 264*6777b538SAndroid Build Coastguard Worker std::unordered_set<int> online_links_ GUARDED_BY(online_links_lock_); 265*6777b538SAndroid Build Coastguard Worker std::optional<OnlineLinksDiff> online_links_diff_; 266*6777b538SAndroid Build Coastguard Worker 267*6777b538SAndroid Build Coastguard Worker // Set of interface names that should be ignored. 268*6777b538SAndroid Build Coastguard Worker const std::unordered_set<std::string> ignored_interfaces_; 269*6777b538SAndroid Build Coastguard Worker 270*6777b538SAndroid Build Coastguard Worker base::Lock connection_type_lock_; 271*6777b538SAndroid Build Coastguard Worker bool connection_type_initialized_ GUARDED_BY(connection_type_lock_) = false; 272*6777b538SAndroid Build Coastguard Worker base::ConditionVariable connection_type_initialized_cv_; 273*6777b538SAndroid Build Coastguard Worker NetworkChangeNotifier::ConnectionType current_connection_type_ GUARDED_BY( 274*6777b538SAndroid Build Coastguard Worker connection_type_lock_) = NetworkChangeNotifier::CONNECTION_NONE; 275*6777b538SAndroid Build Coastguard Worker int threads_waiting_for_connection_type_initialization_ 276*6777b538SAndroid Build Coastguard Worker GUARDED_BY(connection_type_lock_) = 0; 277*6777b538SAndroid Build Coastguard Worker 278*6777b538SAndroid Build Coastguard Worker const bool tracking_; 279*6777b538SAndroid Build Coastguard Worker 280*6777b538SAndroid Build Coastguard Worker // This can be set by the tracking constructor. 281*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner_; 282*6777b538SAndroid Build Coastguard Worker // This SequenceChecker is still useful so instance variables above can be 283*6777b538SAndroid Build Coastguard Worker // marked GUARDED_BY_CONTEXT(sequence_checker_). 284*6777b538SAndroid Build Coastguard Worker SEQUENCE_CHECKER(sequence_checker_); 285*6777b538SAndroid Build Coastguard Worker 286*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<AddressTrackerLinux> weak_ptr_factory_{this}; 287*6777b538SAndroid Build Coastguard Worker }; 288*6777b538SAndroid Build Coastguard Worker 289*6777b538SAndroid Build Coastguard Worker } // namespace net::internal 290*6777b538SAndroid Build Coastguard Worker 291*6777b538SAndroid Build Coastguard Worker #endif // NET_BASE_ADDRESS_TRACKER_LINUX_H_ 292