1 #pragma once 2 3 #include "dhcp_configuration.hpp" 4 #include "ethernet_interface.hpp" 5 #include "routing_table.hpp" 6 #include "system_configuration.hpp" 7 #include "vlan_interface.hpp" 8 #include "xyz/openbmc_project/Network/VLAN/Create/server.hpp" 9 10 #include <filesystem> 11 #include <function2/function2.hpp> 12 #include <memory> 13 #include <sdbusplus/bus.hpp> 14 #include <string> 15 #include <utility> 16 #include <vector> 17 #include <xyz/openbmc_project/Common/FactoryReset/server.hpp> 18 19 namespace phosphor 20 { 21 namespace network 22 { 23 24 using SystemConfPtr = std::unique_ptr<SystemConfiguration>; 25 using DHCPConfPtr = std::unique_ptr<dhcp::Configuration>; 26 27 namespace fs = std::filesystem; 28 namespace details 29 { 30 31 template <typename T, typename U> 32 using ServerObject = typename sdbusplus::server::object::object<T, U>; 33 34 using VLANCreateIface = details::ServerObject< 35 sdbusplus::xyz::openbmc_project::Network::VLAN::server::Create, 36 sdbusplus::xyz::openbmc_project::Common::server::FactoryReset>; 37 38 } // namespace details 39 40 /** @class Manager 41 * @brief OpenBMC network manager implementation. 42 */ 43 class Manager : public details::VLANCreateIface 44 { 45 public: 46 Manager() = delete; 47 Manager(const Manager&) = delete; 48 Manager& operator=(const Manager&) = delete; 49 Manager(Manager&&) = delete; 50 Manager& operator=(Manager&&) = delete; 51 virtual ~Manager() = default; 52 53 /** @brief Constructor to put object onto bus at a dbus path. 54 * @param[in] bus - Bus to attach to. 55 * @param[in] objPath - Path to attach at. 56 * @param[in] dir - Network Configuration directory path. 57 */ 58 Manager(sdbusplus::bus::bus& bus, const char* objPath, 59 const std::string& dir); 60 61 ObjectPath vlan(IntfName interfaceName, uint32_t id) override; 62 63 /** @brief write the network conf file with the in-memory objects. 64 */ 65 void writeToConfigurationFile(); 66 67 /** @brief Fetch the interface and the ipaddress details 68 * from the system and create the ethernet interraces 69 * dbus object. 70 */ 71 virtual void createInterfaces(); 72 73 /** @brief create child interface object and the system conf object. 74 */ 75 void createChildObjects(); 76 77 /** @brief sets the network conf directory. 78 * @param[in] dirName - Absolute path of the directory. 79 */ 80 void setConfDir(const fs::path& dir); 81 82 /** @brief gets the network conf directory. 83 */ 84 fs::path getConfDir() 85 { 86 return confDir; 87 } 88 89 /** @brief gets the system conf object. 90 * 91 */ 92 const SystemConfPtr& getSystemConf() 93 { 94 return systemConf; 95 } 96 97 /** @brief gets the dhcp conf object. 98 * 99 */ 100 const DHCPConfPtr& getDHCPConf() 101 { 102 return dhcpConf; 103 } 104 105 /** @brief create the default network files for each interface 106 * @detail if force param is true then forcefully create the network 107 * files otherwise if network file doesn't exist then 108 * create it. 109 * @param[in] force - forcefully create the file 110 * @return true if network file created else false 111 */ 112 bool createDefaultNetworkFiles(bool force); 113 114 /** @brief This function gets the MAC address from the VPD and 115 * sets it on the corresponding ethernet interface during first 116 * Boot, once it sets the MAC from VPD, it creates a file named 117 * firstBoot under /var/lib to make sure we dont run this function 118 * again. 119 * 120 * @param[in] ethPair - Its a pair of ethernet interface name & the 121 * corresponding MAC Address from the VPD 122 * 123 * return - NULL 124 */ 125 void setFistBootMACOnInterface( 126 const std::pair<std::string, std::string>& ethPair); 127 128 /** @brief Arms a timer to tell systemd-network to reload all of the network 129 * configurations 130 */ 131 virtual void reloadConfigs(); 132 133 /** @brief Tell systemd-network to reload all of the network configurations 134 */ 135 void doReloadConfigs(); 136 137 /** @brief Returns the number of interfaces under this manager. 138 * 139 * @return the number of interfaces managed by this manager. 140 */ 141 int getInterfaceCount() 142 { 143 return interfaces.size(); 144 } 145 146 /** @brief Does the requested interface exist under this manager? 147 * 148 * @param[in] intf - the interface name to check. 149 * @return true if found, false otherwise. 150 */ 151 bool hasInterface(const std::string& intf) 152 { 153 return (interfaces.find(intf) != interfaces.end()); 154 } 155 156 /** @brief Get the routing table owned by the manager 157 * 158 * @return Routing table reference. 159 */ 160 inline const auto& getRouteTable() const 161 { 162 return routeTable; 163 } 164 165 /** @brief Adds a hook that runs immediately prior to reloading 166 * 167 * @param[in] hook - The hook to execute before reloading 168 */ 169 inline void addReloadPreHook(fu2::unique_function<void()>&& hook) 170 { 171 reloadPreHooks.push_back(std::move(hook)); 172 } 173 174 protected: 175 /** @brief Persistent sdbusplus DBus bus connection. */ 176 sdbusplus::bus::bus& bus; 177 178 /** @brief Persistent map of EthernetInterface dbus objects and their names 179 */ 180 std::map<IntfName, std::shared_ptr<EthernetInterface>> interfaces; 181 182 /** @brief BMC network reset - resets network configuration for BMC. */ 183 void reset() override; 184 185 /** @brief Path of Object. */ 186 std::string objectPath; 187 188 /** @brief pointer to system conf object. */ 189 SystemConfPtr systemConf = nullptr; 190 191 /** @brief pointer to dhcp conf object. */ 192 DHCPConfPtr dhcpConf = nullptr; 193 194 /** @brief Network Configuration directory. */ 195 fs::path confDir; 196 197 /** @brief The routing table */ 198 route::Table routeTable; 199 200 /** @brief List of hooks to execute during the next reload */ 201 std::vector<fu2::unique_function<void()>> reloadPreHooks; 202 }; 203 204 } // namespace network 205 } // namespace phosphor 206