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