blob: d7342a80a9047f8822804bd06579c319970ed2d0 [file] [log] [blame]
#pragma once
#include "ipaddress.hpp"
#include "neighbor.hpp"
#include "types.hpp"
#include "xyz/openbmc_project/Network/IP/Create/server.hpp"
#include "xyz/openbmc_project/Network/Neighbor/CreateStatic/server.hpp"
#include <optional>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/server/object.hpp>
#include <stdplus/zstring_view.hpp>
#include <string>
#include <vector>
#include <xyz/openbmc_project/Collection/DeleteAll/server.hpp>
#include <xyz/openbmc_project/Network/EthernetInterface/server.hpp>
#include <xyz/openbmc_project/Network/MACAddress/server.hpp>
#include <xyz/openbmc_project/Network/VLAN/server.hpp>
#include <xyz/openbmc_project/Object/Delete/server.hpp>
namespace phosphor
{
namespace network
{
using Ifaces = sdbusplus::server::object_t<
sdbusplus::xyz::openbmc_project::Network::server::EthernetInterface,
sdbusplus::xyz::openbmc_project::Network::server::MACAddress,
sdbusplus::xyz::openbmc_project::Network::IP::server::Create,
sdbusplus::xyz::openbmc_project::Network::Neighbor::server::CreateStatic,
sdbusplus::xyz::openbmc_project::Collection::server::DeleteAll>;
using VlanIfaces = sdbusplus::server::object_t<
sdbusplus::xyz::openbmc_project::Object::server::Delete,
sdbusplus::xyz::openbmc_project::Network::server::VLAN>;
using VlanIntf = sdbusplus::xyz::openbmc_project::Network::server::VLAN;
using IP = sdbusplus::xyz::openbmc_project::Network::server::IP;
using EthernetInterfaceIntf =
sdbusplus::xyz::openbmc_project::Network::server::EthernetInterface;
using MacAddressIntf =
sdbusplus::xyz::openbmc_project::Network::server::MACAddress;
using ServerList = std::vector<std::string>;
using ObjectPath = sdbusplus::message::object_path;
class Manager;
class TestEthernetInterface;
class TestNetworkManager;
namespace config
{
class Parser;
}
namespace system
{
struct InterfaceInfo;
};
/** @class EthernetInterface
* @brief OpenBMC Ethernet Interface implementation.
* @details A concrete implementation for the
* xyz.openbmc_project.Network.EthernetInterface DBus API.
*/
class EthernetInterface : public Ifaces
{
public:
EthernetInterface() = delete;
EthernetInterface(const EthernetInterface&) = delete;
EthernetInterface& operator=(const EthernetInterface&) = delete;
EthernetInterface(EthernetInterface&&) = delete;
EthernetInterface& operator=(EthernetInterface&&) = delete;
virtual ~EthernetInterface() = default;
/** @brief Constructor to put object onto bus at a dbus path.
* @param[in] bus - Bus to attach to.
* @param[in] manager - parent object.
* @param[in] info - Interface information.
* @param[in] objRoot - Path to attach at.
* @param[in] config - The parsed configuation file.
* @param[in] vlan - The id of the vlan if configured
* @param[in] emitSignal - true if the object added signal needs to be
* send.
* @param[in] enabled - Override the lookup of nicEnabled
*/
EthernetInterface(sdbusplus::bus_t& bus, Manager& manager,
const system::InterfaceInfo& info,
std::string_view objRoot, const config::Parser& config,
bool emitSignal = true,
std::optional<bool> enabled = std::nullopt);
/** @brief Network Manager object. */
Manager& manager;
/** @brief Persistent map of IPAddress dbus objects and their names */
std::unordered_map<IfAddr, std::unique_ptr<IPAddress>> addrs;
/** @brief Updates the interface information based on new InterfaceInfo */
void updateInfo(const system::InterfaceInfo& info);
/** @brief Function used to load the ntpservers
*/
void loadNTPServers(const config::Parser& config);
/** @brief Function used to load the nameservers.
*/
void loadNameServers(const config::Parser& config);
/** @brief Function to create ipAddress dbus object.
* @param[in] addressType - Type of ip address.
* @param[in] ipAddress- IP address.
* @param[in] prefixLength - Length of prefix.
*/
ObjectPath ip(IP::Protocol addressType, std::string ipAddress,
uint8_t prefixLength, std::string) override;
/** @brief Function to create static neighbor dbus object.
* @param[in] ipAddress - IP address.
* @param[in] macAddress - Low level MAC address.
*/
ObjectPath neighbor(std::string ipAddress, std::string macAddress) override;
/* @brief delete the dbus object of the given ipAddress.
* @param[in] ipAddress - IP address.
*/
void deleteStaticNeighborObject(std::string_view ipAddress);
/* @brief creates the dbus object(IPaddres) given in the address list.
* @param[in] addrs - address list for which dbus objects needs
* to create.
*/
void createIPAddressObjects();
/* @brief creates the dbus object(Neighbor) given in the neighbor list.
*/
void createStaticNeighborObjects();
/* @brief Gets all the static neighbor entries.
* @returns Static neighbor map.
*/
inline const auto& getStaticNeighbors() const
{
return staticNeighbors;
}
/** Set value of DHCPEnabled */
DHCPConf dhcpEnabled() const override;
DHCPConf dhcpEnabled(DHCPConf value) override;
using EthernetInterfaceIntf::dhcp4;
bool dhcp4(bool value) override;
using EthernetInterfaceIntf::dhcp6;
bool dhcp6(bool value) override;
inline bool dhcpIsEnabled(in_addr) const
{
return dhcp4();
}
inline bool dhcpIsEnabled(in6_addr) const
{
return dhcp6();
}
inline bool dhcpIsEnabled(InAddrAny addr) const
{
return std::visit([&](auto v) { return dhcpIsEnabled(v); }, addr);
}
/** Retrieve Link State */
bool linkUp() const override;
/** Retrieve MTU Size */
size_t mtu() const override;
/** Set size of MTU */
size_t mtu(size_t value) override;
/** Set value of NICEnabled */
bool nicEnabled(bool value) override;
/** @brief sets the MAC address.
* @param[in] value - MAC address which needs to be set on the system.
* @returns macAddress of the interface or throws an error.
*/
std::string macAddress(std::string value) override;
/** @brief check conf file for Router Advertisements
*
*/
bool ipv6AcceptRA(bool value) override;
using EthernetInterfaceIntf::ipv6AcceptRA;
/** @brief sets the NTP servers.
* @param[in] value - vector of NTP servers.
*/
ServerList ntpServers(ServerList value) override;
/** @brief sets the static NTP servers.
* @param[in] value - vector of NTP servers.
*/
ServerList staticNTPServers(ServerList value) override;
/** @brief sets the Static DNS/nameservers.
* @param[in] value - vector of DNS servers.
*/
ServerList staticNameServers(ServerList value) override;
/** @brief create Vlan interface.
* @param[in] id- VLAN identifier.
*/
ObjectPath createVLAN(uint16_t id);
/** @brief write the network conf file with the in-memory objects.
*/
void writeConfigurationFile();
/** @brief delete all dbus objects.
*/
void deleteAll();
/** @brief set the default v4 gateway of the interface.
* @param[in] gateway - default v4 gateway of the interface.
*/
std::string defaultGateway(std::string gateway) override;
/** @brief set the default v6 gateway of the interface.
* @param[in] gateway - default v6 gateway of the interface.
*/
std::string defaultGateway6(std::string gateway) override;
using EthernetInterfaceIntf::interfaceName;
using EthernetInterfaceIntf::linkUp;
using EthernetInterfaceIntf::mtu;
using EthernetInterfaceIntf::nicEnabled;
using MacAddressIntf::macAddress;
using EthernetInterfaceIntf::defaultGateway;
using EthernetInterfaceIntf::defaultGateway6;
protected:
/** @brief construct the ip address dbus object path.
* @param[in] addressType - Type of ip address.
* @param[in] ipAddress - IP address.
* @param[in] prefixLength - Length of prefix.
* @param[in] origin - The origin entry of the IP::Address
* @return path of the address object.
*/
std::string generateObjectPath(IP::Protocol addressType,
std::string_view ipAddress,
uint8_t prefixLength,
IP::AddressOrigin origin) const;
std::string
generateStaticNeighborObjectPath(std::string_view ipAddress,
std::string_view macAddress) const;
/** @brief get the NTP server list from the timsyncd dbus obj
*
*/
virtual ServerList getNTPServerFromTimeSyncd();
/** @brief get the name server details from the network conf
*
*/
virtual ServerList getNameServerFromResolvd();
/** @brief Persistent sdbusplus DBus bus connection. */
sdbusplus::bus_t& bus;
/** @brief Persistent map of Neighbor dbus objects and their names */
string_umap<std::unique_ptr<Neighbor>> staticNeighbors;
/** @brief Dbus object path */
std::string objPath;
/** @brief Interface index */
unsigned ifIdx;
struct VlanProperties : VlanIfaces
{
VlanProperties(sdbusplus::bus_t& bus, stdplus::const_zstring objPath,
const system::InterfaceInfo& info,
EthernetInterface& eth, bool emitSignal = true);
void delete_() override;
unsigned parentIdx;
EthernetInterface& eth;
};
std::optional<VlanProperties> vlan;
friend class TestEthernetInterface;
friend class TestNetworkManager;
private:
EthernetInterface(sdbusplus::bus_t& bus, Manager& manager,
const system::InterfaceInfo& info, std::string&& objPath,
const config::Parser& config, bool emitSignal,
std::optional<bool> enabled);
/** @brief Determines if the address is manually assigned
* @param[in] origin - The origin entry of the IP::Address
* @returns true/false value if the address is static
*/
bool originIsManuallyAssigned(IP::AddressOrigin origin);
/** @brief Determines if the NIC is enabled in systemd
* @returns true/false value if the NIC is enabled
*/
bool queryNicEnabled() const;
};
} // namespace network
} // namespace phosphor