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