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