11bbe3d1eSWilliam A. Kennington III #pragma once 21bbe3d1eSWilliam A. Kennington III #include "types.hpp" 31bbe3d1eSWilliam A. Kennington III 41bbe3d1eSWilliam A. Kennington III #include <netinet/ether.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> 1269f4554bSWilliam A. Kennington III #include <stdplus/zstring.hpp> 131bbe3d1eSWilliam A. Kennington III #include <string> 141bbe3d1eSWilliam A. Kennington III #include <string_view> 1595530ec9SWilliam A. Kennington III #include <unordered_set> 161bbe3d1eSWilliam A. Kennington III #include <xyz/openbmc_project/Network/EthernetInterface/server.hpp> 171bbe3d1eSWilliam A. Kennington III 181bbe3d1eSWilliam A. Kennington III namespace phosphor 191bbe3d1eSWilliam A. Kennington III { 201bbe3d1eSWilliam A. Kennington III namespace network 211bbe3d1eSWilliam A. Kennington III { 2220efa79fSWilliam A. Kennington III namespace config 2320efa79fSWilliam A. Kennington III { 2420efa79fSWilliam A. Kennington III class Parser; 2520efa79fSWilliam A. Kennington III } 261bbe3d1eSWilliam A. Kennington III 271bbe3d1eSWilliam A. Kennington III using EthernetInterfaceIntf = 281bbe3d1eSWilliam A. Kennington III sdbusplus::xyz::openbmc_project::Network::server::EthernetInterface; 291bbe3d1eSWilliam A. Kennington III 301bbe3d1eSWilliam A. Kennington III namespace mac_address 311bbe3d1eSWilliam A. Kennington III { 321bbe3d1eSWilliam A. Kennington III 331bbe3d1eSWilliam A. Kennington III /** @brief gets the MAC address from the Inventory. 341bbe3d1eSWilliam A. Kennington III * @param[in] bus - DBUS Bus Object. 351bbe3d1eSWilliam A. Kennington III * @param[in] intfName - Interface name 361bbe3d1eSWilliam A. Kennington III */ 37c38b0710SPatrick Williams ether_addr getfromInventory(sdbusplus::bus_t& bus, const std::string& intfName); 381bbe3d1eSWilliam A. Kennington III 391bbe3d1eSWilliam A. Kennington III /** @brief Converts the given mac address into byte form 401bbe3d1eSWilliam A. Kennington III * @param[in] str - The mac address in human readable form 411bbe3d1eSWilliam A. Kennington III * @returns A mac address in network byte order 421bbe3d1eSWilliam A. Kennington III * @throws std::runtime_error for bad mac 431bbe3d1eSWilliam A. Kennington III */ 44feb7aab0SWilliam A. Kennington III ether_addr fromString(std::string_view str); 451bbe3d1eSWilliam A. Kennington III 461bbe3d1eSWilliam A. Kennington III /** @brief Converts the given mac address bytes into a string 471bbe3d1eSWilliam A. Kennington III * @param[in] mac - The mac address 481bbe3d1eSWilliam A. Kennington III * @returns A valid mac address string 491bbe3d1eSWilliam A. Kennington III */ 501bbe3d1eSWilliam A. Kennington III std::string toString(const ether_addr& mac); 511bbe3d1eSWilliam A. Kennington III 521bbe3d1eSWilliam A. Kennington III /** @brief Determines if the mac address is empty 531bbe3d1eSWilliam A. Kennington III * @param[in] mac - The mac address 541bbe3d1eSWilliam A. Kennington III * @return True if 00:00:00:00:00:00 551bbe3d1eSWilliam A. Kennington III */ 561bbe3d1eSWilliam A. Kennington III bool isEmpty(const ether_addr& mac); 571bbe3d1eSWilliam A. Kennington III 581bbe3d1eSWilliam A. Kennington III /** @brief Determines if the mac address is a multicast address 591bbe3d1eSWilliam A. Kennington III * @param[in] mac - The mac address 601bbe3d1eSWilliam A. Kennington III * @return True if multicast bit is set 611bbe3d1eSWilliam A. Kennington III */ 621bbe3d1eSWilliam A. Kennington III bool isMulticast(const ether_addr& mac); 631bbe3d1eSWilliam A. Kennington III 641bbe3d1eSWilliam A. Kennington III /** @brief Determines if the mac address is a unicast address 651bbe3d1eSWilliam A. Kennington III * @param[in] mac - The mac address 661bbe3d1eSWilliam A. Kennington III * @return True if not multicast or empty 671bbe3d1eSWilliam A. Kennington III */ 681bbe3d1eSWilliam A. Kennington III bool isUnicast(const ether_addr& mac); 691bbe3d1eSWilliam A. Kennington III 701bbe3d1eSWilliam A. Kennington III } // namespace mac_address 711bbe3d1eSWilliam A. Kennington III 721bbe3d1eSWilliam A. Kennington III constexpr auto networkdService = "systemd-networkd.service"; 731bbe3d1eSWilliam A. Kennington III constexpr auto timeSynchdService = "systemd-timesyncd.service"; 741bbe3d1eSWilliam A. Kennington III 75e5a48ab0SWilliam A. Kennington III template <int family> 76e5a48ab0SWilliam A. Kennington III struct FamilyTraits 77e5a48ab0SWilliam A. Kennington III { 78e5a48ab0SWilliam A. Kennington III }; 79e5a48ab0SWilliam A. Kennington III 80e5a48ab0SWilliam A. Kennington III template <> 81e5a48ab0SWilliam A. Kennington III struct FamilyTraits<AF_INET> 82e5a48ab0SWilliam A. Kennington III { 83e5a48ab0SWilliam A. Kennington III using addr = in_addr; 84e5a48ab0SWilliam A. Kennington III }; 85e5a48ab0SWilliam A. Kennington III 86e5a48ab0SWilliam A. Kennington III template <> 87e5a48ab0SWilliam A. Kennington III struct FamilyTraits<AF_INET6> 88e5a48ab0SWilliam A. Kennington III { 89e5a48ab0SWilliam A. Kennington III using addr = in6_addr; 90e5a48ab0SWilliam A. Kennington III }; 91e5a48ab0SWilliam A. Kennington III 921bbe3d1eSWilliam A. Kennington III /* @brief converts a sockaddr for the specified address family into 931bbe3d1eSWilliam A. Kennington III * a type_safe InAddrAny. 94*97b5dc68SWilliam A. Kennington III * @param[in] family - The address family of the buf 951bbe3d1eSWilliam A. Kennington III * @param[in] buf - The network byte order address 961bbe3d1eSWilliam A. Kennington III */ 97*97b5dc68SWilliam A. Kennington III template <int family> 98*97b5dc68SWilliam A. Kennington III typename FamilyTraits<family>::addr addrFromBuf(std::string_view buf); 99*97b5dc68SWilliam A. Kennington III InAddrAny addrFromBuf(int family, std::string_view buf); 1001bbe3d1eSWilliam A. Kennington III 1011bbe3d1eSWilliam A. Kennington III /* @brief converts the ip bytes into a string representation 1021bbe3d1eSWilliam A. Kennington III * @param[in] addr - input ip address to convert. 1031bbe3d1eSWilliam A. Kennington III * @returns String representation of the ip. 1041bbe3d1eSWilliam A. Kennington III */ 1051bbe3d1eSWilliam A. Kennington III std::string toString(const InAddrAny& addr); 1061bbe3d1eSWilliam A. Kennington III std::string toString(const struct in_addr& addr); 1071bbe3d1eSWilliam A. Kennington III std::string toString(const struct in6_addr& addr); 1081bbe3d1eSWilliam A. Kennington III 1091bbe3d1eSWilliam A. Kennington III /* @brief checks that the given ip address valid or not. 1101bbe3d1eSWilliam A. Kennington III * @param[in] addressFamily - IP address family(AF_INET/AF_INET6). 1111bbe3d1eSWilliam A. Kennington III * @param[in] address - IP address. 1121bbe3d1eSWilliam A. Kennington III * @returns true if it is valid otherwise false. 1131bbe3d1eSWilliam A. Kennington III */ 11469f4554bSWilliam A. Kennington III bool isValidIP(int addressFamily, stdplus::const_zstring address); 1151bbe3d1eSWilliam A. Kennington III 1161bbe3d1eSWilliam A. Kennington III /* @brief checks that the given prefix is valid or not. 117e5a48ab0SWilliam A. Kennington III * @param[in] family - IP address family(AF_INET/AF_INET6). 1181bbe3d1eSWilliam A. Kennington III * @param[in] prefix - prefix length. 1191bbe3d1eSWilliam A. Kennington III * @returns true if it is valid otherwise false. 1201bbe3d1eSWilliam A. Kennington III */ 121e5a48ab0SWilliam A. Kennington III template <int family> 122e5a48ab0SWilliam A. Kennington III constexpr bool isValidPrefix(uint8_t prefix) noexcept 123e5a48ab0SWilliam A. Kennington III { 124e5a48ab0SWilliam A. Kennington III return prefix <= sizeof(typename FamilyTraits<family>::addr) * 8; 125e5a48ab0SWilliam A. Kennington III } 126e5a48ab0SWilliam A. Kennington III bool isValidPrefix(int family, uint8_t prefixLength); 1271bbe3d1eSWilliam A. Kennington III 1281bbe3d1eSWilliam A. Kennington III /** @brief Get all the interfaces from the system. 1291bbe3d1eSWilliam A. Kennington III * @returns list of interface names. 1301bbe3d1eSWilliam A. Kennington III */ 1311bbe3d1eSWilliam A. Kennington III InterfaceList getInterfaces(); 1321bbe3d1eSWilliam A. Kennington III 1331bbe3d1eSWilliam A. Kennington III /** @brief Delete the given interface. 1341bbe3d1eSWilliam A. Kennington III * @param[in] intf - interface name. 1351bbe3d1eSWilliam A. Kennington III */ 13669f4554bSWilliam A. Kennington III void deleteInterface(stdplus::const_zstring intf); 1371bbe3d1eSWilliam A. Kennington III 1381bbe3d1eSWilliam A. Kennington III /** @brief Converts the interface name into a u-boot environment 1391bbe3d1eSWilliam A. Kennington III * variable that would hold its ethernet address. 1401bbe3d1eSWilliam A. Kennington III * 1411bbe3d1eSWilliam A. Kennington III * @param[in] intf - interface name 1421bbe3d1eSWilliam A. Kennington III * @return The name of th environment key 1431bbe3d1eSWilliam A. Kennington III */ 14469f4554bSWilliam A. Kennington III std::optional<std::string> interfaceToUbootEthAddr(std::string_view intf); 1451bbe3d1eSWilliam A. Kennington III 146a520a39dSWilliam A. Kennington III /** @brief read the IPv6AcceptRA value from the configuration file 147a520a39dSWilliam A. Kennington III * @param[in] config - The parsed configuration. 1481bbe3d1eSWilliam A. Kennington III */ 149a520a39dSWilliam A. Kennington III bool getIPv6AcceptRA(const config::Parser& config); 150a520a39dSWilliam A. Kennington III 151a520a39dSWilliam A. Kennington III /** @brief read the DHCP value from the configuration file 152a520a39dSWilliam A. Kennington III * @param[in] config - The parsed configuration. 153a520a39dSWilliam A. Kennington III */ 1548060c0daSWilliam A. Kennington III struct DHCPVal 1558060c0daSWilliam A. Kennington III { 1568060c0daSWilliam A. Kennington III bool v4, v6; 1578060c0daSWilliam A. Kennington III }; 1588060c0daSWilliam A. Kennington III DHCPVal getDHCPValue(const config::Parser& config); 1591bbe3d1eSWilliam A. Kennington III 160e94c9ffcSWilliam A. Kennington III /** @brief Read a boolean DHCP property from a conf file 161e94c9ffcSWilliam A. Kennington III * @param[in] config - The parsed configuration. 162e94c9ffcSWilliam A. Kennington III * @param[in] key - The property name. 163e94c9ffcSWilliam A. Kennington III */ 164e94c9ffcSWilliam A. Kennington III bool getDHCPProp(const config::Parser& config, std::string_view key); 165e94c9ffcSWilliam A. Kennington III 1661bbe3d1eSWilliam A. Kennington III namespace internal 1671bbe3d1eSWilliam A. Kennington III { 1681bbe3d1eSWilliam A. Kennington III 1691bbe3d1eSWilliam A. Kennington III /* @brief runs the given command in child process. 1701bbe3d1eSWilliam A. Kennington III * @param[in] path - path of the binary file which needs to be execeuted. 1711bbe3d1eSWilliam A. Kennington III * @param[in] args - arguments of the command. 1721bbe3d1eSWilliam A. Kennington III */ 17369f4554bSWilliam A. Kennington III void executeCommandinChildProcess(stdplus::const_zstring path, char** args); 1741bbe3d1eSWilliam A. Kennington III 1751bbe3d1eSWilliam A. Kennington III /** @brief Get ignored interfaces from environment */ 1761bbe3d1eSWilliam A. Kennington III std::string_view getIgnoredInterfacesEnv(); 1771bbe3d1eSWilliam A. Kennington III 1781bbe3d1eSWilliam A. Kennington III /** @brief Parse the comma separated interface names */ 17995530ec9SWilliam A. Kennington III std::unordered_set<std::string_view> 18095530ec9SWilliam A. Kennington III parseInterfaces(std::string_view interfaces); 1811bbe3d1eSWilliam A. Kennington III 1821bbe3d1eSWilliam A. Kennington III /** @brief Get the ignored interfaces */ 18395530ec9SWilliam A. Kennington III const std::unordered_set<std::string_view>& getIgnoredInterfaces(); 1841bbe3d1eSWilliam A. Kennington III 1851bbe3d1eSWilliam A. Kennington III } // namespace internal 1861bbe3d1eSWilliam A. Kennington III 1871bbe3d1eSWilliam A. Kennington III /* @brief runs the given command in child process. 1881bbe3d1eSWilliam A. Kennington III * @param[in] path -path of the binary file which needs to be execeuted. 1891bbe3d1eSWilliam A. Kennington III * @param[in] tArgs - arguments of the command. 1901bbe3d1eSWilliam A. Kennington III */ 1911bbe3d1eSWilliam A. Kennington III template <typename... ArgTypes> 19269f4554bSWilliam A. Kennington III void execute(stdplus::const_zstring path, ArgTypes&&... tArgs) 1931bbe3d1eSWilliam A. Kennington III { 1941bbe3d1eSWilliam A. Kennington III using expandType = char*[]; 1951bbe3d1eSWilliam A. Kennington III 1961bbe3d1eSWilliam A. Kennington III expandType args = {const_cast<char*>(tArgs)..., nullptr}; 1971bbe3d1eSWilliam A. Kennington III 1981bbe3d1eSWilliam A. Kennington III internal::executeCommandinChildProcess(path, args); 1991bbe3d1eSWilliam A. Kennington III } 2001bbe3d1eSWilliam A. Kennington III 2011bbe3d1eSWilliam A. Kennington III } // namespace network 2021bbe3d1eSWilliam A. Kennington III 2031bbe3d1eSWilliam A. Kennington III } // namespace phosphor 204