blob: 87cfd681e17db54ac0835b0f88911c4c8eebf88e [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 <sdbusplus/bus.hpp>
#include <sdbusplus/server/object.hpp>
#include <stdplus/pinned.hpp>
#include <stdplus/zstring_view.hpp>
#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>
#include <optional>
#include <string>
#include <vector>
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;
}
/** @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(EthernetInterface&&) = delete;
EthernetInterface& operator=(EthernetInterface&&) = delete;
/** @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] enabled - Determine if systemd-networkd is managing this link
*/
EthernetInterface(stdplus::PinnedRef<sdbusplus::bus_t> bus,
stdplus::PinnedRef<Manager> manager,
const AllIntfInfo& info, std::string_view objRoot,
const config::Parser& config, bool enabled);
/** @brief Network Manager object. */
stdplus::PinnedRef<Manager> manager;
/** @brief Persistent map of IPAddress dbus objects and their names */
std::unordered_map<IfAddr, std::unique_ptr<IPAddress>> addrs;
/** @brief Persistent map of Neighbor dbus objects and their names */
std::unordered_map<InAddrAny, std::unique_ptr<Neighbor>> staticNeighbors;
void addAddr(const AddressInfo& info);
void addStaticNeigh(const NeighborInfo& info);
/** @brief Updates the interface information based on new InterfaceInfo */
void updateInfo(const InterfaceInfo& info, bool skipSignal = false);
/** @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;
/** 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);
}
/** 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 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. */
stdplus::PinnedRef<sdbusplus::bus_t> bus;
/** @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 InterfaceInfo& info,
stdplus::PinnedRef<EthernetInterface> eth);
void delete_() override;
unsigned parentIdx;
stdplus::PinnedRef<EthernetInterface> eth;
};
std::optional<VlanProperties> vlan;
friend class TestEthernetInterface;
friend class TestNetworkManager;
private:
EthernetInterface(stdplus::PinnedRef<sdbusplus::bus_t> bus,
stdplus::PinnedRef<Manager> manager,
const AllIntfInfo& info, std::string&& objPath,
const config::Parser& config, 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);
};
} // namespace network
} // namespace phosphor