1 #pragma once 2 #include "types.hpp" 3 4 #include <stdplus/raw.hpp> 5 #include <stdplus/zstring_view.hpp> 6 7 #include <map> 8 #include <optional> 9 #include <string> 10 #include <string_view> 11 #include <unordered_set> 12 13 namespace phosphor 14 { 15 namespace network 16 { 17 namespace config 18 { 19 class Parser; 20 } 21 22 /* @brief converts a sockaddr for the specified address family into 23 * a type_safe InAddrAny. 24 * @param[in] family - The address family of the buf 25 * @param[in] buf - The network byte order address 26 */ 27 constexpr stdplus::InAnyAddr addrFromBuf(int family, std::string_view buf) 28 { 29 switch (family) 30 { 31 case AF_INET: 32 return stdplus::raw::copyFromStrict<stdplus::In4Addr>(buf); 33 case AF_INET6: 34 return stdplus::raw::copyFromStrict<stdplus::In6Addr>(buf); 35 } 36 throw std::invalid_argument("Unrecognized family"); 37 } 38 39 /** @brief Converts the interface name into a u-boot environment 40 * variable that would hold its ethernet address. 41 * 42 * @param[in] intf - interface name 43 * @return The name of th environment key 44 */ 45 std::optional<std::string> interfaceToUbootEthAddr(std::string_view intf); 46 47 /** @brief read the IPv6AcceptRA value from the configuration file 48 * @param[in] config - The parsed configuration. 49 */ 50 bool getIPv6AcceptRA(const config::Parser& config); 51 52 /** @brief read the DHCP value from the configuration file 53 * @param[in] config - The parsed configuration. 54 */ 55 struct DHCPVal 56 { 57 bool v4, v6; 58 }; 59 60 enum class DHCPType 61 { 62 v4, 63 v6 64 }; 65 66 DHCPVal getDHCPValue(const config::Parser& config); 67 68 /** @brief Read a boolean DHCP property from a conf file 69 * @param[in] config - The parsed configuration. 70 * @param[in] nwType - The network type. 71 * @param[in] key - The property name. 72 */ 73 bool getDHCPProp(const config::Parser& config, DHCPType dhcpType, 74 std::string_view key); 75 76 /** @brief Read LLDP configuration from lldpd conf file 77 */ 78 std::map<std::string, bool> parseLLDPConf(); 79 80 namespace internal 81 { 82 83 /* @brief runs the given command in child process. 84 * @param[in] path - path of the binary file which needs to be execeuted. 85 * @param[in] args - arguments of the command. 86 */ 87 void executeCommandinChildProcess(stdplus::zstring_view path, char** args); 88 89 /** @brief Get ignored interfaces from environment */ 90 std::string_view getIgnoredInterfacesEnv(); 91 92 /** @brief Parse the comma separated interface names */ 93 std::unordered_set<std::string_view> parseInterfaces( 94 std::string_view interfaces); 95 96 /** @brief Get the ignored interfaces */ 97 const std::unordered_set<std::string_view>& getIgnoredInterfaces(); 98 99 } // namespace internal 100 101 /* @brief runs the given command in child process. 102 * @param[in] path -path of the binary file which needs to be execeuted. 103 * @param[in] tArgs - arguments of the command. 104 */ 105 template <typename... ArgTypes> 106 void execute(stdplus::zstring_view path, ArgTypes&&... tArgs) 107 { 108 using expandType = char*[]; 109 110 expandType args = {const_cast<char*>(tArgs)..., nullptr}; 111 112 internal::executeCommandinChildProcess(path, args); 113 } 114 115 } // namespace network 116 117 } // namespace phosphor 118