11bbe3d1eSWilliam A. Kennington III #pragma once 21bbe3d1eSWilliam A. Kennington III #include "types.hpp" 31bbe3d1eSWilliam A. Kennington III 4fd862be8SWilliam A. Kennington III #include <net/ethernet.h> 5e5a48ab0SWilliam A. Kennington III #include <netinet/in.h> 61bbe3d1eSWilliam A. Kennington III #include <unistd.h> 71bbe3d1eSWilliam A. Kennington III 81bbe3d1eSWilliam A. Kennington III #include <cstring> 9a520a39dSWilliam A. Kennington III #include <filesystem> 101bbe3d1eSWilliam A. Kennington III #include <optional> 111bbe3d1eSWilliam A. Kennington III #include <sdbusplus/bus.hpp> 12*01c816f2SWilliam A. Kennington III #include <stdplus/raw.hpp> 1369f4554bSWilliam A. Kennington III #include <stdplus/zstring.hpp> 141bbe3d1eSWilliam A. Kennington III #include <string> 151bbe3d1eSWilliam A. Kennington III #include <string_view> 1695530ec9SWilliam A. Kennington III #include <unordered_set> 171bbe3d1eSWilliam A. Kennington III #include <xyz/openbmc_project/Network/EthernetInterface/server.hpp> 181bbe3d1eSWilliam A. Kennington III 191bbe3d1eSWilliam A. Kennington III namespace phosphor 201bbe3d1eSWilliam A. Kennington III { 211bbe3d1eSWilliam A. Kennington III namespace network 221bbe3d1eSWilliam A. Kennington III { 2320efa79fSWilliam A. Kennington III namespace config 2420efa79fSWilliam A. Kennington III { 2520efa79fSWilliam A. Kennington III class Parser; 2620efa79fSWilliam A. Kennington III } 271bbe3d1eSWilliam A. Kennington III 281bbe3d1eSWilliam A. Kennington III using EthernetInterfaceIntf = 291bbe3d1eSWilliam A. Kennington III sdbusplus::xyz::openbmc_project::Network::server::EthernetInterface; 301bbe3d1eSWilliam A. Kennington III 311bbe3d1eSWilliam A. Kennington III namespace mac_address 321bbe3d1eSWilliam A. Kennington III { 331bbe3d1eSWilliam A. Kennington III 341bbe3d1eSWilliam A. Kennington III /** @brief gets the MAC address from the Inventory. 351bbe3d1eSWilliam A. Kennington III * @param[in] bus - DBUS Bus Object. 361bbe3d1eSWilliam A. Kennington III * @param[in] intfName - Interface name 371bbe3d1eSWilliam A. Kennington III */ 38c38b0710SPatrick Williams ether_addr getfromInventory(sdbusplus::bus_t& bus, const std::string& intfName); 391bbe3d1eSWilliam A. Kennington III 401bbe3d1eSWilliam A. Kennington III /** @brief Determines if the mac address is empty 411bbe3d1eSWilliam A. Kennington III * @param[in] mac - The mac address 421bbe3d1eSWilliam A. Kennington III * @return True if 00:00:00:00:00:00 431bbe3d1eSWilliam A. Kennington III */ 441bbe3d1eSWilliam A. Kennington III bool isEmpty(const ether_addr& mac); 451bbe3d1eSWilliam A. Kennington III 461bbe3d1eSWilliam A. Kennington III /** @brief Determines if the mac address is a multicast address 471bbe3d1eSWilliam A. Kennington III * @param[in] mac - The mac address 481bbe3d1eSWilliam A. Kennington III * @return True if multicast bit is set 491bbe3d1eSWilliam A. Kennington III */ 501bbe3d1eSWilliam A. Kennington III bool isMulticast(const ether_addr& mac); 511bbe3d1eSWilliam A. Kennington III 521bbe3d1eSWilliam A. Kennington III /** @brief Determines if the mac address is a unicast address 531bbe3d1eSWilliam A. Kennington III * @param[in] mac - The mac address 541bbe3d1eSWilliam A. Kennington III * @return True if not multicast or empty 551bbe3d1eSWilliam A. Kennington III */ 561bbe3d1eSWilliam A. Kennington III bool isUnicast(const ether_addr& mac); 571bbe3d1eSWilliam A. Kennington III 581bbe3d1eSWilliam A. Kennington III } // namespace mac_address 591bbe3d1eSWilliam A. Kennington III 601bbe3d1eSWilliam A. Kennington III /* @brief converts a sockaddr for the specified address family into 611bbe3d1eSWilliam A. Kennington III * a type_safe InAddrAny. 6297b5dc68SWilliam A. Kennington III * @param[in] family - The address family of the buf 631bbe3d1eSWilliam A. Kennington III * @param[in] buf - The network byte order address 641bbe3d1eSWilliam A. Kennington III */ 65*01c816f2SWilliam A. Kennington III constexpr InAddrAny addrFromBuf(int family, std::string_view buf) 66*01c816f2SWilliam A. Kennington III { 67*01c816f2SWilliam A. Kennington III switch (family) 68*01c816f2SWilliam A. Kennington III { 69*01c816f2SWilliam A. Kennington III case AF_INET: 70*01c816f2SWilliam A. Kennington III return stdplus::raw::copyFromStrict<in_addr>(buf); 71*01c816f2SWilliam A. Kennington III case AF_INET6: 72*01c816f2SWilliam A. Kennington III return stdplus::raw::copyFromStrict<in6_addr>(buf); 73*01c816f2SWilliam A. Kennington III } 74*01c816f2SWilliam A. Kennington III throw std::invalid_argument("Unrecognized family"); 75*01c816f2SWilliam A. Kennington III } 761bbe3d1eSWilliam A. Kennington III 771bbe3d1eSWilliam A. Kennington III /** @brief Delete the given interface. 781bbe3d1eSWilliam A. Kennington III * @param[in] intf - interface name. 791bbe3d1eSWilliam A. Kennington III */ 8069f4554bSWilliam A. Kennington III void deleteInterface(stdplus::const_zstring intf); 811bbe3d1eSWilliam A. Kennington III 821bbe3d1eSWilliam A. Kennington III /** @brief Converts the interface name into a u-boot environment 831bbe3d1eSWilliam A. Kennington III * variable that would hold its ethernet address. 841bbe3d1eSWilliam A. Kennington III * 851bbe3d1eSWilliam A. Kennington III * @param[in] intf - interface name 861bbe3d1eSWilliam A. Kennington III * @return The name of th environment key 871bbe3d1eSWilliam A. Kennington III */ 8869f4554bSWilliam A. Kennington III std::optional<std::string> interfaceToUbootEthAddr(std::string_view intf); 891bbe3d1eSWilliam A. Kennington III 90a520a39dSWilliam A. Kennington III /** @brief read the IPv6AcceptRA value from the configuration file 91a520a39dSWilliam A. Kennington III * @param[in] config - The parsed configuration. 921bbe3d1eSWilliam A. Kennington III */ 93a520a39dSWilliam A. Kennington III bool getIPv6AcceptRA(const config::Parser& config); 94a520a39dSWilliam A. Kennington III 95a520a39dSWilliam A. Kennington III /** @brief read the DHCP value from the configuration file 96a520a39dSWilliam A. Kennington III * @param[in] config - The parsed configuration. 97a520a39dSWilliam A. Kennington III */ 988060c0daSWilliam A. Kennington III struct DHCPVal 998060c0daSWilliam A. Kennington III { 1008060c0daSWilliam A. Kennington III bool v4, v6; 1018060c0daSWilliam A. Kennington III }; 1028060c0daSWilliam A. Kennington III DHCPVal getDHCPValue(const config::Parser& config); 1031bbe3d1eSWilliam A. Kennington III 104e94c9ffcSWilliam A. Kennington III /** @brief Read a boolean DHCP property from a conf file 105e94c9ffcSWilliam A. Kennington III * @param[in] config - The parsed configuration. 106e94c9ffcSWilliam A. Kennington III * @param[in] key - The property name. 107e94c9ffcSWilliam A. Kennington III */ 108e94c9ffcSWilliam A. Kennington III bool getDHCPProp(const config::Parser& config, std::string_view key); 109e94c9ffcSWilliam A. Kennington III 1101bbe3d1eSWilliam A. Kennington III namespace internal 1111bbe3d1eSWilliam A. Kennington III { 1121bbe3d1eSWilliam A. Kennington III 1131bbe3d1eSWilliam A. Kennington III /* @brief runs the given command in child process. 1141bbe3d1eSWilliam A. Kennington III * @param[in] path - path of the binary file which needs to be execeuted. 1151bbe3d1eSWilliam A. Kennington III * @param[in] args - arguments of the command. 1161bbe3d1eSWilliam A. Kennington III */ 11769f4554bSWilliam A. Kennington III void executeCommandinChildProcess(stdplus::const_zstring path, char** args); 1181bbe3d1eSWilliam A. Kennington III 1191bbe3d1eSWilliam A. Kennington III /** @brief Get ignored interfaces from environment */ 1201bbe3d1eSWilliam A. Kennington III std::string_view getIgnoredInterfacesEnv(); 1211bbe3d1eSWilliam A. Kennington III 1221bbe3d1eSWilliam A. Kennington III /** @brief Parse the comma separated interface names */ 12395530ec9SWilliam A. Kennington III std::unordered_set<std::string_view> 12495530ec9SWilliam A. Kennington III parseInterfaces(std::string_view interfaces); 1251bbe3d1eSWilliam A. Kennington III 1261bbe3d1eSWilliam A. Kennington III /** @brief Get the ignored interfaces */ 12795530ec9SWilliam A. Kennington III const std::unordered_set<std::string_view>& getIgnoredInterfaces(); 1281bbe3d1eSWilliam A. Kennington III 1291bbe3d1eSWilliam A. Kennington III } // namespace internal 1301bbe3d1eSWilliam A. Kennington III 1311bbe3d1eSWilliam A. Kennington III /* @brief runs the given command in child process. 1321bbe3d1eSWilliam A. Kennington III * @param[in] path -path of the binary file which needs to be execeuted. 1331bbe3d1eSWilliam A. Kennington III * @param[in] tArgs - arguments of the command. 1341bbe3d1eSWilliam A. Kennington III */ 1351bbe3d1eSWilliam A. Kennington III template <typename... ArgTypes> 13669f4554bSWilliam A. Kennington III void execute(stdplus::const_zstring path, ArgTypes&&... tArgs) 1371bbe3d1eSWilliam A. Kennington III { 1381bbe3d1eSWilliam A. Kennington III using expandType = char*[]; 1391bbe3d1eSWilliam A. Kennington III 1401bbe3d1eSWilliam A. Kennington III expandType args = {const_cast<char*>(tArgs)..., nullptr}; 1411bbe3d1eSWilliam A. Kennington III 1421bbe3d1eSWilliam A. Kennington III internal::executeCommandinChildProcess(path, args); 1431bbe3d1eSWilliam A. Kennington III } 1441bbe3d1eSWilliam A. Kennington III 1451bbe3d1eSWilliam A. Kennington III } // namespace network 1461bbe3d1eSWilliam A. Kennington III 1471bbe3d1eSWilliam A. Kennington III } // namespace phosphor 148