xref: /openbmc/phosphor-networkd/src/util.hpp (revision 89d734b9)
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