1 #pragma once 2 3 #include "platforms/nemora/portable/net_types.h" 4 5 #include <net_iface.h> 6 7 #include <sdbusplus/bus.hpp> 8 9 #include <experimental/optional> 10 #include <list> 11 #include <map> 12 #include <optional> 13 #include <string> 14 #include <vector> 15 16 // The API for configuring and querying network. 17 18 namespace net 19 { 20 21 using DBusObjectPath = std::string; 22 using DBusService = std::string; 23 using DBusInterface = std::string; 24 using ObjectTree = 25 std::map<DBusObjectPath, std::map<DBusService, std::vector<DBusInterface>>>; 26 27 class ConfigBase 28 { 29 public: 30 virtual ~ConfigBase() = default; 31 32 virtual int get_mac_addr(mac_addr_t* mac) = 0; 33 34 virtual int set_mac_addr(const mac_addr_t& mac) = 0; 35 36 // Called each time is_nic_hostless state is sampled. 37 virtual int set_nic_hostless(bool is_nic_hostless) = 0; 38 }; 39 40 // Calls phosphord-networkd 41 class PhosphorConfig : public ConfigBase 42 { 43 public: 44 explicit PhosphorConfig(const std::string& iface_name); 45 46 // Reads the MAC address from phosphor-networkd interface or internal 47 // cache, and store in the mac pointer. 48 // Returns -1 if failed, 0 if succeeded. 49 int get_mac_addr(mac_addr_t* mac) override; 50 51 // Sets the MAC address over phosphor-networkd, and update internal 52 // cache. 53 // Returns -1 if failed, 0 if succeeded. 54 int set_mac_addr(const mac_addr_t& mac) override; 55 56 virtual int set_nic_hostless(bool is_nic_hostless) override; 57 58 private: 59 sdbusplus::message::message new_networkd_call(sdbusplus::bus::bus* dbus, 60 bool get = false) const; 61 62 const std::string iface_name_; 63 const std::string iface_path_; 64 65 // Stores the currently configured nic state, if previously set 66 std::optional<bool> was_nic_hostless_; 67 68 // The MAC address obtained from NIC. 69 // ncsid will commit this MAC address over DBus to phosphor-networkd 70 // and expect it to be persisted. If actual host MAC address changes or 71 // BMC MAC address is overwritten, a daemon reboot is needed to reset 72 // the MAC. 73 // Initialized to nullopt which evaluates to false. Once a value is 74 // set, bool() evaluates to true. 75 std::experimental::optional<mac_addr_t> shared_host_mac_; 76 77 // List of outstanding pids for config jobs 78 std::list<pid_t> running_pids_; 79 80 // Holds a reference to the bus for issuing commands to update network 81 // config 82 sdbusplus::bus::bus bus; 83 }; 84 85 } // namespace net 86