1 #pragma once 2 #include "ipaddress.hpp" 3 #include "neighbor.hpp" 4 #include "types.hpp" 5 #include "xyz/openbmc_project/Network/IP/Create/server.hpp" 6 #include "xyz/openbmc_project/Network/Neighbor/CreateStatic/server.hpp" 7 8 #include <optional> 9 #include <sdbusplus/bus.hpp> 10 #include <sdbusplus/server/object.hpp> 11 #include <stdplus/zstring_view.hpp> 12 #include <string> 13 #include <vector> 14 #include <xyz/openbmc_project/Collection/DeleteAll/server.hpp> 15 #include <xyz/openbmc_project/Network/EthernetInterface/server.hpp> 16 #include <xyz/openbmc_project/Network/MACAddress/server.hpp> 17 #include <xyz/openbmc_project/Network/VLAN/server.hpp> 18 #include <xyz/openbmc_project/Object/Delete/server.hpp> 19 20 namespace phosphor 21 { 22 namespace network 23 { 24 25 using Ifaces = sdbusplus::server::object_t< 26 sdbusplus::xyz::openbmc_project::Network::server::EthernetInterface, 27 sdbusplus::xyz::openbmc_project::Network::server::MACAddress, 28 sdbusplus::xyz::openbmc_project::Network::IP::server::Create, 29 sdbusplus::xyz::openbmc_project::Network::Neighbor::server::CreateStatic, 30 sdbusplus::xyz::openbmc_project::Collection::server::DeleteAll>; 31 32 using VlanIfaces = sdbusplus::server::object_t< 33 sdbusplus::xyz::openbmc_project::Object::server::Delete, 34 sdbusplus::xyz::openbmc_project::Network::server::VLAN>; 35 36 using VlanIntf = sdbusplus::xyz::openbmc_project::Network::server::VLAN; 37 38 using IP = sdbusplus::xyz::openbmc_project::Network::server::IP; 39 40 using EthernetInterfaceIntf = 41 sdbusplus::xyz::openbmc_project::Network::server::EthernetInterface; 42 using MacAddressIntf = 43 sdbusplus::xyz::openbmc_project::Network::server::MACAddress; 44 45 using ServerList = std::vector<std::string>; 46 using ObjectPath = sdbusplus::message::object_path; 47 48 class Manager; 49 50 class TestEthernetInterface; 51 class TestNetworkManager; 52 53 namespace config 54 { 55 class Parser; 56 } 57 58 /** @class EthernetInterface 59 * @brief OpenBMC Ethernet Interface implementation. 60 * @details A concrete implementation for the 61 * xyz.openbmc_project.Network.EthernetInterface DBus API. 62 */ 63 class EthernetInterface : public Ifaces 64 { 65 public: 66 EthernetInterface() = delete; 67 EthernetInterface(const EthernetInterface&) = delete; 68 EthernetInterface& operator=(const EthernetInterface&) = delete; 69 EthernetInterface(EthernetInterface&&) = delete; 70 EthernetInterface& operator=(EthernetInterface&&) = delete; 71 virtual ~EthernetInterface() = default; 72 73 /** @brief Constructor to put object onto bus at a dbus path. 74 * @param[in] bus - Bus to attach to. 75 * @param[in] manager - parent object. 76 * @param[in] info - Interface information. 77 * @param[in] objRoot - Path to attach at. 78 * @param[in] config - The parsed configuation file. 79 * @param[in] vlan - The id of the vlan if configured 80 * @param[in] emitSignal - true if the object added signal needs to be 81 * send. 82 * @param[in] enabled - Determine if systemd-networkd is managing this link 83 */ 84 EthernetInterface(sdbusplus::bus_t& bus, Manager& manager, 85 const InterfaceInfo& info, std::string_view objRoot, 86 const config::Parser& config, bool emitSignal, 87 bool enabled); 88 89 /** @brief Network Manager object. */ 90 Manager& manager; 91 92 /** @brief Persistent map of IPAddress dbus objects and their names */ 93 std::unordered_map<IfAddr, std::unique_ptr<IPAddress>> addrs; 94 95 /** @brief Persistent map of Neighbor dbus objects and their names */ 96 std::unordered_map<InAddrAny, std::unique_ptr<Neighbor>> staticNeighbors; 97 98 void addAddr(const AddressInfo& info); 99 void addStaticNeigh(const NeighborInfo& info); 100 101 /** @brief Updates the interface information based on new InterfaceInfo */ 102 void updateInfo(const InterfaceInfo& info); 103 104 /** @brief Function used to load the ntpservers 105 */ 106 void loadNTPServers(const config::Parser& config); 107 108 /** @brief Function used to load the nameservers. 109 */ 110 void loadNameServers(const config::Parser& config); 111 112 /** @brief Function to create ipAddress dbus object. 113 * @param[in] addressType - Type of ip address. 114 * @param[in] ipAddress- IP address. 115 * @param[in] prefixLength - Length of prefix. 116 */ 117 118 ObjectPath ip(IP::Protocol addressType, std::string ipAddress, 119 uint8_t prefixLength, std::string) override; 120 121 /** @brief Function to create static neighbor dbus object. 122 * @param[in] ipAddress - IP address. 123 * @param[in] macAddress - Low level MAC address. 124 */ 125 ObjectPath neighbor(std::string ipAddress, std::string macAddress) override; 126 127 /** Set value of DHCPEnabled */ 128 DHCPConf dhcpEnabled() const override; 129 DHCPConf dhcpEnabled(DHCPConf value) override; 130 using EthernetInterfaceIntf::dhcp4; 131 bool dhcp4(bool value) override; 132 using EthernetInterfaceIntf::dhcp6; 133 bool dhcp6(bool value) override; 134 135 inline bool dhcpIsEnabled(in_addr) const 136 { 137 return dhcp4(); 138 } 139 inline bool dhcpIsEnabled(in6_addr) const 140 { 141 return dhcp6(); 142 } 143 inline bool dhcpIsEnabled(InAddrAny addr) const 144 { 145 return std::visit([&](auto v) { return dhcpIsEnabled(v); }, addr); 146 } 147 148 /** Set size of MTU */ 149 size_t mtu(size_t value) override; 150 151 /** Set value of NICEnabled */ 152 bool nicEnabled(bool value) override; 153 154 /** @brief sets the MAC address. 155 * @param[in] value - MAC address which needs to be set on the system. 156 * @returns macAddress of the interface or throws an error. 157 */ 158 std::string macAddress(std::string value) override; 159 160 /** @brief check conf file for Router Advertisements 161 * 162 */ 163 bool ipv6AcceptRA(bool value) override; 164 using EthernetInterfaceIntf::ipv6AcceptRA; 165 166 /** @brief sets the NTP servers. 167 * @param[in] value - vector of NTP servers. 168 */ 169 ServerList ntpServers(ServerList value) override; 170 171 /** @brief sets the static NTP servers. 172 * @param[in] value - vector of NTP servers. 173 */ 174 ServerList staticNTPServers(ServerList value) override; 175 176 /** @brief sets the Static DNS/nameservers. 177 * @param[in] value - vector of DNS servers. 178 */ 179 180 ServerList staticNameServers(ServerList value) override; 181 182 /** @brief create Vlan interface. 183 * @param[in] id- VLAN identifier. 184 */ 185 ObjectPath createVLAN(uint16_t id); 186 187 /** @brief write the network conf file with the in-memory objects. 188 */ 189 void writeConfigurationFile(); 190 191 /** @brief delete all dbus objects. 192 */ 193 void deleteAll(); 194 195 /** @brief set the default v4 gateway of the interface. 196 * @param[in] gateway - default v4 gateway of the interface. 197 */ 198 std::string defaultGateway(std::string gateway) override; 199 200 /** @brief set the default v6 gateway of the interface. 201 * @param[in] gateway - default v6 gateway of the interface. 202 */ 203 std::string defaultGateway6(std::string gateway) override; 204 205 using EthernetInterfaceIntf::interfaceName; 206 using EthernetInterfaceIntf::linkUp; 207 using EthernetInterfaceIntf::mtu; 208 using EthernetInterfaceIntf::nicEnabled; 209 using MacAddressIntf::macAddress; 210 211 using EthernetInterfaceIntf::defaultGateway; 212 using EthernetInterfaceIntf::defaultGateway6; 213 214 protected: 215 /** @brief get the NTP server list from the timsyncd dbus obj 216 * 217 */ 218 virtual ServerList getNTPServerFromTimeSyncd(); 219 220 /** @brief get the name server details from the network conf 221 * 222 */ 223 virtual ServerList getNameServerFromResolvd(); 224 225 /** @brief Persistent sdbusplus DBus bus connection. */ 226 sdbusplus::bus_t& bus; 227 228 /** @brief Dbus object path */ 229 std::string objPath; 230 231 /** @brief Interface index */ 232 unsigned ifIdx; 233 234 struct VlanProperties : VlanIfaces 235 { 236 VlanProperties(sdbusplus::bus_t& bus, stdplus::const_zstring objPath, 237 const InterfaceInfo& info, EthernetInterface& eth, 238 bool emitSignal = true); 239 void delete_() override; 240 unsigned parentIdx; 241 EthernetInterface& eth; 242 }; 243 std::optional<VlanProperties> vlan; 244 245 friend class TestEthernetInterface; 246 friend class TestNetworkManager; 247 248 private: 249 EthernetInterface(sdbusplus::bus_t& bus, Manager& manager, 250 const InterfaceInfo& info, std::string&& objPath, 251 const config::Parser& config, bool emitSignal, 252 bool enabled); 253 254 /** @brief Determines if the address is manually assigned 255 * @param[in] origin - The origin entry of the IP::Address 256 * @returns true/false value if the address is static 257 */ 258 bool originIsManuallyAssigned(IP::AddressOrigin origin); 259 }; 260 261 } // namespace network 262 } // namespace phosphor 263