xref: /aosp_15_r20/external/cronet/net/base/address_tracker_linux.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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