77 lines
2.8 KiB
C++
77 lines
2.8 KiB
C++
// Copyright 2023 The Chromium Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef NET_BASE_ADDRESS_MAP_LINUX_H_
|
|
#define NET_BASE_ADDRESS_MAP_LINUX_H_
|
|
|
|
#include <map>
|
|
#include <unordered_set>
|
|
|
|
#include "base/containers/flat_map.h"
|
|
#include "base/functional/callback_forward.h"
|
|
#include "net/base/ip_address.h"
|
|
#include "net/base/net_export.h"
|
|
#include "third_party/abseil-cpp/absl/types/optional.h"
|
|
|
|
struct ifaddrmsg;
|
|
|
|
namespace net {
|
|
|
|
class AddressMapCacheLinux;
|
|
namespace internal {
|
|
class AddressTrackerLinux;
|
|
}
|
|
|
|
// Various components of //net need to access a real-time-updated AddressMap
|
|
// (see comments below). For example, AddressSorterPosix (used in DNS
|
|
// resolution) and GetNetworkList() (used in many places).
|
|
// The methods defined in this interface should be safe to call from any thread.
|
|
class NET_EXPORT AddressMapOwnerLinux {
|
|
public:
|
|
// A map from net::IPAddress to netlink's ifaddrmsg, which includes
|
|
// information about the network interface that the IP address is associated
|
|
// with (e.g. interface index).
|
|
using AddressMap = std::map<IPAddress, struct ifaddrmsg>;
|
|
|
|
// Represents a diff between one AddressMap and a new one. IPAddresses that
|
|
// map to absl::nullopt have been deleted from the map, and IPAddresses that
|
|
// map to non-nullopt have been added or updated.
|
|
using AddressMapDiff =
|
|
base::flat_map<IPAddress, absl::optional<struct ifaddrmsg>>;
|
|
// Represents a diff between one set of online links and new one. Interface
|
|
// indices that map to true are newly online and indices that map to false are
|
|
// newly offline.
|
|
using OnlineLinksDiff = base::flat_map<int, bool>;
|
|
// A callback for diffs, to be used by AddressTrackerLinux.
|
|
using DiffCallback =
|
|
base::RepeatingCallback<void(const AddressMapDiff& addr_diff,
|
|
const OnlineLinksDiff&)>;
|
|
|
|
AddressMapOwnerLinux() = default;
|
|
|
|
AddressMapOwnerLinux(const AddressMapOwnerLinux&) = delete;
|
|
AddressMapOwnerLinux& operator=(const AddressMapOwnerLinux&) = delete;
|
|
|
|
virtual ~AddressMapOwnerLinux() = default;
|
|
|
|
// These functions can be called on any thread. Implementations should use
|
|
// locking if necessary.
|
|
|
|
// Returns the current AddressMap.
|
|
virtual AddressMap GetAddressMap() const = 0;
|
|
// Returns set of interface indices for online interfaces.
|
|
virtual std::unordered_set<int> GetOnlineLinks() const = 0;
|
|
|
|
// These are the concrete implementations of AddressMapOwnerLinux and these
|
|
// functions serve as an ad-hoc dynamic cast to the concrete implementation,
|
|
// so this base class is not polluted with methods that end up unimplemented
|
|
// in one subclass.
|
|
virtual internal::AddressTrackerLinux* GetAddressTrackerLinux();
|
|
virtual AddressMapCacheLinux* GetAddressMapCacheLinux();
|
|
};
|
|
|
|
} // namespace net
|
|
|
|
#endif // NET_BASE_ADDRESS_MAP_LINUX_H_
|