1*1285115cSWilliam A. Kennington III /* 2*1285115cSWilliam A. Kennington III * Copyright 2021 Google LLC 3*1285115cSWilliam A. Kennington III * 4*1285115cSWilliam A. Kennington III * Licensed under the Apache License, Version 2.0 (the "License"); 5*1285115cSWilliam A. Kennington III * you may not use this file except in compliance with the License. 6*1285115cSWilliam A. Kennington III * You may obtain a copy of the License at 7*1285115cSWilliam A. Kennington III * 8*1285115cSWilliam A. Kennington III * http://www.apache.org/licenses/LICENSE-2.0 9*1285115cSWilliam A. Kennington III * 10*1285115cSWilliam A. Kennington III * Unless required by applicable law or agreed to in writing, software 11*1285115cSWilliam A. Kennington III * distributed under the License is distributed on an "AS IS" BASIS, 12*1285115cSWilliam A. Kennington III * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*1285115cSWilliam A. Kennington III * See the License for the specific language governing permissions and 14*1285115cSWilliam A. Kennington III * limitations under the License. 15*1285115cSWilliam A. Kennington III */ 16*1285115cSWilliam A. Kennington III 17*1285115cSWilliam A. Kennington III #pragma once 18*1285115cSWilliam A. Kennington III 19*1285115cSWilliam A. Kennington III #include "platforms/nemora/portable/net_types.h" 20*1285115cSWilliam A. Kennington III 21*1285115cSWilliam A. Kennington III #include <net_iface.h> 22*1285115cSWilliam A. Kennington III 23*1285115cSWilliam A. Kennington III #include <sdbusplus/bus.hpp> 24*1285115cSWilliam A. Kennington III 25*1285115cSWilliam A. Kennington III #include <experimental/optional> 26*1285115cSWilliam A. Kennington III #include <list> 27*1285115cSWilliam A. Kennington III #include <map> 28*1285115cSWilliam A. Kennington III #include <optional> 29*1285115cSWilliam A. Kennington III #include <string> 30*1285115cSWilliam A. Kennington III #include <vector> 31*1285115cSWilliam A. Kennington III 32*1285115cSWilliam A. Kennington III // The API for configuring and querying network. 33*1285115cSWilliam A. Kennington III 34*1285115cSWilliam A. Kennington III namespace net 35*1285115cSWilliam A. Kennington III { 36*1285115cSWilliam A. Kennington III 37*1285115cSWilliam A. Kennington III using DBusObjectPath = std::string; 38*1285115cSWilliam A. Kennington III using DBusService = std::string; 39*1285115cSWilliam A. Kennington III using DBusInterface = std::string; 40*1285115cSWilliam A. Kennington III using ObjectTree = 41*1285115cSWilliam A. Kennington III std::map<DBusObjectPath, std::map<DBusService, std::vector<DBusInterface>>>; 42*1285115cSWilliam A. Kennington III 43*1285115cSWilliam A. Kennington III class ConfigBase 44*1285115cSWilliam A. Kennington III { 45*1285115cSWilliam A. Kennington III public: 46*1285115cSWilliam A. Kennington III virtual ~ConfigBase() = default; 47*1285115cSWilliam A. Kennington III 48*1285115cSWilliam A. Kennington III virtual int get_mac_addr(mac_addr_t* mac) = 0; 49*1285115cSWilliam A. Kennington III 50*1285115cSWilliam A. Kennington III virtual int set_mac_addr(const mac_addr_t& mac) = 0; 51*1285115cSWilliam A. Kennington III 52*1285115cSWilliam A. Kennington III // Called each time is_nic_hostless state is sampled. 53*1285115cSWilliam A. Kennington III virtual int set_nic_hostless(bool is_nic_hostless) = 0; 54*1285115cSWilliam A. Kennington III }; 55*1285115cSWilliam A. Kennington III 56*1285115cSWilliam A. Kennington III // Calls phosphord-networkd 57*1285115cSWilliam A. Kennington III class PhosphorConfig : public ConfigBase 58*1285115cSWilliam A. Kennington III { 59*1285115cSWilliam A. Kennington III public: 60*1285115cSWilliam A. Kennington III explicit PhosphorConfig(const std::string& iface_name); 61*1285115cSWilliam A. Kennington III 62*1285115cSWilliam A. Kennington III // Reads the MAC address from phosphor-networkd interface or internal 63*1285115cSWilliam A. Kennington III // cache, and store in the mac pointer. 64*1285115cSWilliam A. Kennington III // Returns -1 if failed, 0 if succeeded. 65*1285115cSWilliam A. Kennington III int get_mac_addr(mac_addr_t* mac) override; 66*1285115cSWilliam A. Kennington III 67*1285115cSWilliam A. Kennington III // Sets the MAC address over phosphor-networkd, and update internal 68*1285115cSWilliam A. Kennington III // cache. 69*1285115cSWilliam A. Kennington III // Returns -1 if failed, 0 if succeeded. 70*1285115cSWilliam A. Kennington III int set_mac_addr(const mac_addr_t& mac) override; 71*1285115cSWilliam A. Kennington III 72*1285115cSWilliam A. Kennington III virtual int set_nic_hostless(bool is_nic_hostless) override; 73*1285115cSWilliam A. Kennington III 74*1285115cSWilliam A. Kennington III private: 75*1285115cSWilliam A. Kennington III sdbusplus::message::message new_networkd_call(sdbusplus::bus::bus* dbus, 76*1285115cSWilliam A. Kennington III bool get = false) const; 77*1285115cSWilliam A. Kennington III 78*1285115cSWilliam A. Kennington III const std::string iface_name_; 79*1285115cSWilliam A. Kennington III const std::string iface_path_; 80*1285115cSWilliam A. Kennington III 81*1285115cSWilliam A. Kennington III // Stores the currently configured nic state, if previously set 82*1285115cSWilliam A. Kennington III std::optional<bool> was_nic_hostless_; 83*1285115cSWilliam A. Kennington III 84*1285115cSWilliam A. Kennington III // The MAC address obtained from NIC. 85*1285115cSWilliam A. Kennington III // ncsid will commit this MAC address over DBus to phosphor-networkd 86*1285115cSWilliam A. Kennington III // and expect it to be persisted. If actual host MAC address changes or 87*1285115cSWilliam A. Kennington III // BMC MAC address is overwritten, a daemon reboot is needed to reset 88*1285115cSWilliam A. Kennington III // the MAC. 89*1285115cSWilliam A. Kennington III // Initialized to nullopt which evaluates to false. Once a value is 90*1285115cSWilliam A. Kennington III // set, bool() evaluates to true. 91*1285115cSWilliam A. Kennington III std::experimental::optional<mac_addr_t> shared_host_mac_; 92*1285115cSWilliam A. Kennington III 93*1285115cSWilliam A. Kennington III // List of outstanding pids for config jobs 94*1285115cSWilliam A. Kennington III std::list<pid_t> running_pids_; 95*1285115cSWilliam A. Kennington III 96*1285115cSWilliam A. Kennington III // Holds a reference to the bus for issuing commands to update network 97*1285115cSWilliam A. Kennington III // config 98*1285115cSWilliam A. Kennington III sdbusplus::bus::bus bus; 99*1285115cSWilliam A. Kennington III }; 100*1285115cSWilliam A. Kennington III 101*1285115cSWilliam A. Kennington III } // namespace net 102