xref: /aosp_15_r20/external/cronet/net/base/address_map_linux.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2023 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_MAP_LINUX_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_BASE_ADDRESS_MAP_LINUX_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <map>
9*6777b538SAndroid Build Coastguard Worker #include <optional>
10*6777b538SAndroid Build Coastguard Worker #include <unordered_set>
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include "base/containers/flat_map.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_forward.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_address.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker struct ifaddrmsg;
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker namespace net {
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker class AddressMapCacheLinux;
22*6777b538SAndroid Build Coastguard Worker namespace internal {
23*6777b538SAndroid Build Coastguard Worker class AddressTrackerLinux;
24*6777b538SAndroid Build Coastguard Worker }
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker // Various components of //net need to access a real-time-updated AddressMap
27*6777b538SAndroid Build Coastguard Worker // (see comments below). For example, AddressSorterPosix (used in DNS
28*6777b538SAndroid Build Coastguard Worker // resolution) and GetNetworkList() (used in many places).
29*6777b538SAndroid Build Coastguard Worker // The methods defined in this interface should be safe to call from any thread.
30*6777b538SAndroid Build Coastguard Worker class NET_EXPORT AddressMapOwnerLinux {
31*6777b538SAndroid Build Coastguard Worker  public:
32*6777b538SAndroid Build Coastguard Worker   // A map from net::IPAddress to netlink's ifaddrmsg, which includes
33*6777b538SAndroid Build Coastguard Worker   // information about the network interface that the IP address is associated
34*6777b538SAndroid Build Coastguard Worker   // with (e.g. interface index).
35*6777b538SAndroid Build Coastguard Worker   using AddressMap = std::map<IPAddress, struct ifaddrmsg>;
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker   // Represents a diff between one AddressMap and a new one. IPAddresses that
38*6777b538SAndroid Build Coastguard Worker   // map to std::nullopt have been deleted from the map, and IPAddresses that
39*6777b538SAndroid Build Coastguard Worker   // map to non-nullopt have been added or updated.
40*6777b538SAndroid Build Coastguard Worker   using AddressMapDiff =
41*6777b538SAndroid Build Coastguard Worker       base::flat_map<IPAddress, std::optional<struct ifaddrmsg>>;
42*6777b538SAndroid Build Coastguard Worker   // Represents a diff between one set of online links and new one. Interface
43*6777b538SAndroid Build Coastguard Worker   // indices that map to true are newly online and indices that map to false are
44*6777b538SAndroid Build Coastguard Worker   // newly offline.
45*6777b538SAndroid Build Coastguard Worker   using OnlineLinksDiff = base::flat_map<int, bool>;
46*6777b538SAndroid Build Coastguard Worker   // A callback for diffs, to be used by AddressTrackerLinux.
47*6777b538SAndroid Build Coastguard Worker   using DiffCallback =
48*6777b538SAndroid Build Coastguard Worker       base::RepeatingCallback<void(const AddressMapDiff& addr_diff,
49*6777b538SAndroid Build Coastguard Worker                                    const OnlineLinksDiff&)>;
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker   AddressMapOwnerLinux() = default;
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker   AddressMapOwnerLinux(const AddressMapOwnerLinux&) = delete;
54*6777b538SAndroid Build Coastguard Worker   AddressMapOwnerLinux& operator=(const AddressMapOwnerLinux&) = delete;
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker   virtual ~AddressMapOwnerLinux() = default;
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker   // These functions can be called on any thread. Implementations should use
59*6777b538SAndroid Build Coastguard Worker   // locking if necessary.
60*6777b538SAndroid Build Coastguard Worker 
61*6777b538SAndroid Build Coastguard Worker   // Returns the current AddressMap.
62*6777b538SAndroid Build Coastguard Worker   virtual AddressMap GetAddressMap() const = 0;
63*6777b538SAndroid Build Coastguard Worker   // Returns set of interface indices for online interfaces.
64*6777b538SAndroid Build Coastguard Worker   virtual std::unordered_set<int> GetOnlineLinks() const = 0;
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker   // These are the concrete implementations of AddressMapOwnerLinux and these
67*6777b538SAndroid Build Coastguard Worker   // functions serve as an ad-hoc dynamic cast to the concrete implementation,
68*6777b538SAndroid Build Coastguard Worker   // so this base class is not polluted with methods that end up unimplemented
69*6777b538SAndroid Build Coastguard Worker   // in one subclass.
70*6777b538SAndroid Build Coastguard Worker   virtual internal::AddressTrackerLinux* GetAddressTrackerLinux();
71*6777b538SAndroid Build Coastguard Worker   virtual AddressMapCacheLinux* GetAddressMapCacheLinux();
72*6777b538SAndroid Build Coastguard Worker };
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker }  // namespace net
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker #endif  // NET_BASE_ADDRESS_MAP_LINUX_H_
77