11285115cSWilliam A. Kennington III /* 21285115cSWilliam A. Kennington III * Copyright 2021 Google LLC 31285115cSWilliam A. Kennington III * 41285115cSWilliam A. Kennington III * Licensed under the Apache License, Version 2.0 (the "License"); 51285115cSWilliam A. Kennington III * you may not use this file except in compliance with the License. 61285115cSWilliam A. Kennington III * You may obtain a copy of the License at 71285115cSWilliam A. Kennington III * 81285115cSWilliam A. Kennington III * http://www.apache.org/licenses/LICENSE-2.0 91285115cSWilliam A. Kennington III * 101285115cSWilliam A. Kennington III * Unless required by applicable law or agreed to in writing, software 111285115cSWilliam A. Kennington III * distributed under the License is distributed on an "AS IS" BASIS, 121285115cSWilliam A. Kennington III * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131285115cSWilliam A. Kennington III * See the License for the specific language governing permissions and 141285115cSWilliam A. Kennington III * limitations under the License. 151285115cSWilliam A. Kennington III */ 161285115cSWilliam A. Kennington III 171285115cSWilliam A. Kennington III #pragma once 181285115cSWilliam A. Kennington III 191285115cSWilliam A. Kennington III #include "platforms/nemora/portable/net_types.h" 201285115cSWilliam A. Kennington III 211285115cSWilliam A. Kennington III #include <net_iface.h> 221285115cSWilliam A. Kennington III 231285115cSWilliam A. Kennington III #include <sdbusplus/bus.hpp> 241285115cSWilliam A. Kennington III 251285115cSWilliam A. Kennington III #include <experimental/optional> 261285115cSWilliam A. Kennington III #include <list> 271285115cSWilliam A. Kennington III #include <map> 281285115cSWilliam A. Kennington III #include <optional> 291285115cSWilliam A. Kennington III #include <string> 301285115cSWilliam A. Kennington III #include <vector> 311285115cSWilliam A. Kennington III 321285115cSWilliam A. Kennington III // The API for configuring and querying network. 331285115cSWilliam A. Kennington III 341285115cSWilliam A. Kennington III namespace net 351285115cSWilliam A. Kennington III { 361285115cSWilliam A. Kennington III 371285115cSWilliam A. Kennington III using DBusObjectPath = std::string; 381285115cSWilliam A. Kennington III using DBusService = std::string; 391285115cSWilliam A. Kennington III using DBusInterface = std::string; 401285115cSWilliam A. Kennington III using ObjectTree = 411285115cSWilliam A. Kennington III std::map<DBusObjectPath, std::map<DBusService, std::vector<DBusInterface>>>; 421285115cSWilliam A. Kennington III 431285115cSWilliam A. Kennington III class ConfigBase 441285115cSWilliam A. Kennington III { 451285115cSWilliam A. Kennington III public: 461285115cSWilliam A. Kennington III virtual ~ConfigBase() = default; 471285115cSWilliam A. Kennington III 481285115cSWilliam A. Kennington III virtual int get_mac_addr(mac_addr_t* mac) = 0; 491285115cSWilliam A. Kennington III 501285115cSWilliam A. Kennington III virtual int set_mac_addr(const mac_addr_t& mac) = 0; 511285115cSWilliam A. Kennington III 521285115cSWilliam A. Kennington III // Called each time is_nic_hostless state is sampled. 531285115cSWilliam A. Kennington III virtual int set_nic_hostless(bool is_nic_hostless) = 0; 541285115cSWilliam A. Kennington III }; 551285115cSWilliam A. Kennington III 56*d94dc257SMo Elbadry // Calls Socket Ioctl to obtain information about NIC (previously 57*d94dc257SMo Elbadry // phosphor-networkd) 581285115cSWilliam A. Kennington III class PhosphorConfig : public ConfigBase 591285115cSWilliam A. Kennington III { 601285115cSWilliam A. Kennington III public: 611285115cSWilliam A. Kennington III explicit PhosphorConfig(const std::string& iface_name); 621285115cSWilliam A. Kennington III 63*d94dc257SMo Elbadry // Reads the MAC address from socket interface or internal 641285115cSWilliam A. Kennington III // cache, and store in the mac pointer. 651285115cSWilliam A. Kennington III // Returns -1 if failed, 0 if succeeded. 661285115cSWilliam A. Kennington III int get_mac_addr(mac_addr_t* mac) override; 671285115cSWilliam A. Kennington III 68*d94dc257SMo Elbadry // Sets the MAC address over socket, and update internal 691285115cSWilliam A. Kennington III // cache. 701285115cSWilliam A. Kennington III // Returns -1 if failed, 0 if succeeded. 711285115cSWilliam A. Kennington III int set_mac_addr(const mac_addr_t& mac) override; 721285115cSWilliam A. Kennington III virtual int set_nic_hostless(bool is_nic_hostless) override; 731285115cSWilliam A. Kennington III 741285115cSWilliam A. Kennington III private: 7559ac2c2dSPatrick Williams sdbusplus::message_t new_networkd_call(sdbusplus::bus_t* dbus, 761285115cSWilliam A. Kennington III bool get = false) const; 771285115cSWilliam A. Kennington III 781285115cSWilliam A. Kennington III const std::string iface_name_; 791285115cSWilliam A. Kennington III const std::string iface_path_; 801285115cSWilliam A. Kennington III 811285115cSWilliam A. Kennington III // Stores the currently configured nic state, if previously set 821285115cSWilliam A. Kennington III std::optional<bool> was_nic_hostless_; 831285115cSWilliam A. Kennington III 84*d94dc257SMo Elbadry // Function helper allows get_mac_addr and set_mac_addr to do 85*d94dc257SMo Elbadry // ioctl calls to get and set different states of NIC. 86*d94dc257SMo Elbadry void call_nic(auto fd, struct ifreq& ifr, int op); 87*d94dc257SMo Elbadry 881285115cSWilliam A. Kennington III // The MAC address obtained from NIC. 891285115cSWilliam A. Kennington III // ncsid will commit this MAC address over DBus to phosphor-networkd 901285115cSWilliam A. Kennington III // and expect it to be persisted. If actual host MAC address changes or 911285115cSWilliam A. Kennington III // BMC MAC address is overwritten, a daemon reboot is needed to reset 921285115cSWilliam A. Kennington III // the MAC. 931285115cSWilliam A. Kennington III // Initialized to nullopt which evaluates to false. Once a value is 941285115cSWilliam A. Kennington III // set, bool() evaluates to true. 951285115cSWilliam A. Kennington III std::experimental::optional<mac_addr_t> shared_host_mac_; 961285115cSWilliam A. Kennington III 971285115cSWilliam A. Kennington III // List of outstanding pids for config jobs 981285115cSWilliam A. Kennington III std::list<pid_t> running_pids_; 991285115cSWilliam A. Kennington III 1001285115cSWilliam A. Kennington III // Holds a reference to the bus for issuing commands to update network 1011285115cSWilliam A. Kennington III // config 10259ac2c2dSPatrick Williams sdbusplus::bus_t bus; 1031285115cSWilliam A. Kennington III }; 1041285115cSWilliam A. Kennington III 1051285115cSWilliam A. Kennington III } // namespace net 106