blob: ed4b67ccea8fc29fd11fd9173cf316a40622bc7f [file] [log] [blame] [edit]
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PATCHPANEL_NETWORK_ADDRESS_SERVICE_H_
#define PATCHPANEL_NETWORK_ADDRESS_SERVICE_H_
#include <map>
#include <memory>
#include <optional>
#include <vector>
#include <base/no_destructor.h>
#include <chromeos/net-base/ip_address.h>
#include <chromeos/net-base/rtnl_handler.h>
namespace patchpanel {
class RoutingTable;
// A singleton providing capability to configure address onto kernel netdevice,
// and maintaining the address information currently configured.
class AddressService {
public:
virtual ~AddressService();
explicit AddressService(RoutingTable* routing_table);
AddressService(const AddressService&) = delete;
AddressService& operator=(const AddressService&) = delete;
// Helper factory function for test code with dependency injection.
static std::unique_ptr<AddressService> CreateForTesting(
net_base::RTNLHandler* rtnl_handler, RoutingTable* routing_table);
// Removes all addresses previous configured onto |interface_index|.
virtual void FlushAddress(int interface_index);
// Configures |local| onto |interface_index| through kernel RTNL. A customized
// |broadcast| address can be specified. If an IPv4 address was already set
// through AddressService, the old address will be removed first.
virtual void SetIPv4Address(
int interface_index,
const net_base::IPv4CIDR& local,
const std::optional<net_base::IPv4Address>& broadcast = std::nullopt);
// Removes the IPv4 address previously configured onto |interface_index|
// through AddressService.
virtual void ClearIPv4Address(int interface_index);
// Configure |addresses| onto |interface_index| through kernel RTNL. All
// previous IPv6 addresses set through AddressService but not in |addresses|
// will be removed. The addresses added by other parties (e.g. kernel) will
// not be affected.
virtual void SetIPv6Addresses(
int interface_index, const std::vector<net_base::IPv6CIDR>& addresses);
private:
friend class base::NoDestructor<AddressService>;
// Cache for the addresses added earlier by us, keyed by the interface id.
std::map<int, net_base::IPv4CIDR> added_ipv4_address_;
std::map<int, std::vector<net_base::IPv6CIDR>> added_ipv6_addresses_;
// Owned by the same NetworkApplier that owns the instance of AddressService.
RoutingTable* routing_table_;
// Cache singleton pointer for performance and test purposes.
net_base::RTNLHandler* rtnl_handler_;
};
} // namespace patchpanel
#endif // PATCHPANEL_NETWORK_ADDRESS_SERVICE_H_