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