11bbe3d1eSWilliam A. Kennington III #pragma once 21bbe3d1eSWilliam A. Kennington III #include "types.hpp" 31bbe3d1eSWilliam A. Kennington III 401c816f2SWilliam A. Kennington III #include <stdplus/raw.hpp> 569f4554bSWilliam A. Kennington III #include <stdplus/zstring.hpp> 6*89d734b9SPatrick Williams 7*89d734b9SPatrick Williams #include <optional> 81bbe3d1eSWilliam A. Kennington III #include <string> 91bbe3d1eSWilliam A. Kennington III #include <string_view> 1095530ec9SWilliam A. Kennington III #include <unordered_set> 111bbe3d1eSWilliam A. Kennington III 121bbe3d1eSWilliam A. Kennington III namespace phosphor 131bbe3d1eSWilliam A. Kennington III { 141bbe3d1eSWilliam A. Kennington III namespace network 151bbe3d1eSWilliam A. Kennington III { 1620efa79fSWilliam A. Kennington III namespace config 1720efa79fSWilliam A. Kennington III { 1820efa79fSWilliam A. Kennington III class Parser; 1920efa79fSWilliam A. Kennington III } 201bbe3d1eSWilliam A. Kennington III 211bbe3d1eSWilliam A. Kennington III namespace mac_address 221bbe3d1eSWilliam A. Kennington III { 231bbe3d1eSWilliam A. Kennington III 241bbe3d1eSWilliam A. Kennington III /** @brief Determines if the mac address is empty 251bbe3d1eSWilliam A. Kennington III * @param[in] mac - The mac address 261bbe3d1eSWilliam A. Kennington III * @return True if 00:00:00:00:00:00 271bbe3d1eSWilliam A. Kennington III */ 281bbe3d1eSWilliam A. Kennington III bool isEmpty(const ether_addr& mac); 291bbe3d1eSWilliam A. Kennington III 301bbe3d1eSWilliam A. Kennington III /** @brief Determines if the mac address is a multicast address 311bbe3d1eSWilliam A. Kennington III * @param[in] mac - The mac address 321bbe3d1eSWilliam A. Kennington III * @return True if multicast bit is set 331bbe3d1eSWilliam A. Kennington III */ 341bbe3d1eSWilliam A. Kennington III bool isMulticast(const ether_addr& mac); 351bbe3d1eSWilliam A. Kennington III 361bbe3d1eSWilliam A. Kennington III /** @brief Determines if the mac address is a unicast address 371bbe3d1eSWilliam A. Kennington III * @param[in] mac - The mac address 381bbe3d1eSWilliam A. Kennington III * @return True if not multicast or empty 391bbe3d1eSWilliam A. Kennington III */ 401bbe3d1eSWilliam A. Kennington III bool isUnicast(const ether_addr& mac); 411bbe3d1eSWilliam A. Kennington III 421bbe3d1eSWilliam A. Kennington III } // namespace mac_address 431bbe3d1eSWilliam A. Kennington III 441bbe3d1eSWilliam A. Kennington III /* @brief converts a sockaddr for the specified address family into 451bbe3d1eSWilliam A. Kennington III * a type_safe InAddrAny. 4697b5dc68SWilliam A. Kennington III * @param[in] family - The address family of the buf 471bbe3d1eSWilliam A. Kennington III * @param[in] buf - The network byte order address 481bbe3d1eSWilliam A. Kennington III */ 4901c816f2SWilliam A. Kennington III constexpr InAddrAny addrFromBuf(int family, std::string_view buf) 5001c816f2SWilliam A. Kennington III { 5101c816f2SWilliam A. Kennington III switch (family) 5201c816f2SWilliam A. Kennington III { 5301c816f2SWilliam A. Kennington III case AF_INET: 5401c816f2SWilliam A. Kennington III return stdplus::raw::copyFromStrict<in_addr>(buf); 5501c816f2SWilliam A. Kennington III case AF_INET6: 5601c816f2SWilliam A. Kennington III return stdplus::raw::copyFromStrict<in6_addr>(buf); 5701c816f2SWilliam A. Kennington III } 5801c816f2SWilliam A. Kennington III throw std::invalid_argument("Unrecognized family"); 5901c816f2SWilliam A. Kennington III } 601bbe3d1eSWilliam A. Kennington III 611bbe3d1eSWilliam A. Kennington III /** @brief Converts the interface name into a u-boot environment 621bbe3d1eSWilliam A. Kennington III * variable that would hold its ethernet address. 631bbe3d1eSWilliam A. Kennington III * 641bbe3d1eSWilliam A. Kennington III * @param[in] intf - interface name 651bbe3d1eSWilliam A. Kennington III * @return The name of th environment key 661bbe3d1eSWilliam A. Kennington III */ 6769f4554bSWilliam A. Kennington III std::optional<std::string> interfaceToUbootEthAddr(std::string_view intf); 681bbe3d1eSWilliam A. Kennington III 69a520a39dSWilliam A. Kennington III /** @brief read the IPv6AcceptRA value from the configuration file 70a520a39dSWilliam A. Kennington III * @param[in] config - The parsed configuration. 711bbe3d1eSWilliam A. Kennington III */ 72a520a39dSWilliam A. Kennington III bool getIPv6AcceptRA(const config::Parser& config); 73a520a39dSWilliam A. Kennington III 74a520a39dSWilliam A. Kennington III /** @brief read the DHCP value from the configuration file 75a520a39dSWilliam A. Kennington III * @param[in] config - The parsed configuration. 76a520a39dSWilliam A. Kennington III */ 778060c0daSWilliam A. Kennington III struct DHCPVal 788060c0daSWilliam A. Kennington III { 798060c0daSWilliam A. Kennington III bool v4, v6; 808060c0daSWilliam A. Kennington III }; 818060c0daSWilliam A. Kennington III DHCPVal getDHCPValue(const config::Parser& config); 821bbe3d1eSWilliam A. Kennington III 83e94c9ffcSWilliam A. Kennington III /** @brief Read a boolean DHCP property from a conf file 84e94c9ffcSWilliam A. Kennington III * @param[in] config - The parsed configuration. 85e94c9ffcSWilliam A. Kennington III * @param[in] key - The property name. 86e94c9ffcSWilliam A. Kennington III */ 87e94c9ffcSWilliam A. Kennington III bool getDHCPProp(const config::Parser& config, std::string_view key); 88e94c9ffcSWilliam A. Kennington III 891bbe3d1eSWilliam A. Kennington III namespace internal 901bbe3d1eSWilliam A. Kennington III { 911bbe3d1eSWilliam A. Kennington III 921bbe3d1eSWilliam A. Kennington III /* @brief runs the given command in child process. 931bbe3d1eSWilliam A. Kennington III * @param[in] path - path of the binary file which needs to be execeuted. 941bbe3d1eSWilliam A. Kennington III * @param[in] args - arguments of the command. 951bbe3d1eSWilliam A. Kennington III */ 9669f4554bSWilliam A. Kennington III void executeCommandinChildProcess(stdplus::const_zstring path, char** args); 971bbe3d1eSWilliam A. Kennington III 981bbe3d1eSWilliam A. Kennington III /** @brief Get ignored interfaces from environment */ 991bbe3d1eSWilliam A. Kennington III std::string_view getIgnoredInterfacesEnv(); 1001bbe3d1eSWilliam A. Kennington III 1011bbe3d1eSWilliam A. Kennington III /** @brief Parse the comma separated interface names */ 10295530ec9SWilliam A. Kennington III std::unordered_set<std::string_view> 10395530ec9SWilliam A. Kennington III parseInterfaces(std::string_view interfaces); 1041bbe3d1eSWilliam A. Kennington III 1051bbe3d1eSWilliam A. Kennington III /** @brief Get the ignored interfaces */ 10695530ec9SWilliam A. Kennington III const std::unordered_set<std::string_view>& getIgnoredInterfaces(); 1071bbe3d1eSWilliam A. Kennington III 1081bbe3d1eSWilliam A. Kennington III } // namespace internal 1091bbe3d1eSWilliam A. Kennington III 1101bbe3d1eSWilliam A. Kennington III /* @brief runs the given command in child process. 1111bbe3d1eSWilliam A. Kennington III * @param[in] path -path of the binary file which needs to be execeuted. 1121bbe3d1eSWilliam A. Kennington III * @param[in] tArgs - arguments of the command. 1131bbe3d1eSWilliam A. Kennington III */ 1141bbe3d1eSWilliam A. Kennington III template <typename... ArgTypes> 11569f4554bSWilliam A. Kennington III void execute(stdplus::const_zstring path, ArgTypes&&... tArgs) 1161bbe3d1eSWilliam A. Kennington III { 1171bbe3d1eSWilliam A. Kennington III using expandType = char*[]; 1181bbe3d1eSWilliam A. Kennington III 1191bbe3d1eSWilliam A. Kennington III expandType args = {const_cast<char*>(tArgs)..., nullptr}; 1201bbe3d1eSWilliam A. Kennington III 1211bbe3d1eSWilliam A. Kennington III internal::executeCommandinChildProcess(path, args); 1221bbe3d1eSWilliam A. Kennington III } 1231bbe3d1eSWilliam A. Kennington III 1241bbe3d1eSWilliam A. Kennington III } // namespace network 1251bbe3d1eSWilliam A. Kennington III 1261bbe3d1eSWilliam A. Kennington III } // namespace phosphor 127