#pragma once #include "config.h" #include "ethernet_interface.hpp" #include "types.hpp" #include #include #include #include #include #include #include #include namespace phosphor { namespace network { using EthernetInterfaceIntf = sdbusplus::xyz::openbmc_project::Network::server::EthernetInterface; constexpr auto IPV4_MIN_PREFIX_LENGTH = 1; constexpr auto IPV4_MAX_PREFIX_LENGTH = 32; constexpr auto IPV6_MAX_PREFIX_LENGTH = 128; namespace mac_address { /** @brief gets the MAC address from the Inventory. * @param[in] bus - DBUS Bus Object. * @param[in] intfName - Interface name */ ether_addr getfromInventory(sdbusplus::bus_t& bus, const std::string& intfName); /** @brief Converts the given mac address into byte form * @param[in] str - The mac address in human readable form * @returns A mac address in network byte order * @throws std::runtime_error for bad mac */ ether_addr fromString(const char* str); inline ether_addr fromString(const std::string& str) { return fromString(str.c_str()); } /** @brief Converts the given mac address bytes into a string * @param[in] mac - The mac address * @returns A valid mac address string */ std::string toString(const ether_addr& mac); /** @brief Determines if the mac address is empty * @param[in] mac - The mac address * @return True if 00:00:00:00:00:00 */ bool isEmpty(const ether_addr& mac); /** @brief Determines if the mac address is a multicast address * @param[in] mac - The mac address * @return True if multicast bit is set */ bool isMulticast(const ether_addr& mac); /** @brief Determines if the mac address is a unicast address * @param[in] mac - The mac address * @return True if not multicast or empty */ bool isUnicast(const ether_addr& mac); } // namespace mac_address constexpr auto networkdService = "systemd-networkd.service"; constexpr auto timeSynchdService = "systemd-timesyncd.service"; /* @brief converts a sockaddr for the specified address family into * a type_safe InAddrAny. * @param[in] addressFamily - The address family of the buf * @param[in] buf - The network byte order address */ InAddrAny addrFromBuf(int addressFamily, std::string_view buf); /* @brief converts the ip bytes into a string representation * @param[in] addr - input ip address to convert. * @returns String representation of the ip. */ std::string toString(const InAddrAny& addr); std::string toString(const struct in_addr& addr); std::string toString(const struct in6_addr& addr); /* @brief checks that the given ip address valid or not. * @param[in] addressFamily - IP address family(AF_INET/AF_INET6). * @param[in] address - IP address. * @returns true if it is valid otherwise false. */ bool isValidIP(int addressFamily, const std::string& address); /* @brief checks that the given prefix is valid or not. * @param[in] addressFamily - IP address family(AF_INET/AF_INET6). * @param[in] prefix - prefix length. * @returns true if it is valid otherwise false. */ bool isValidPrefix(int addressFamily, uint8_t prefixLength); /** @brief Get all the interfaces from the system. * @returns list of interface names. */ InterfaceList getInterfaces(); /** @brief Delete the given interface. * @param[in] intf - interface name. */ void deleteInterface(const std::string& intf); /** @brief Converts the interface name into a u-boot environment * variable that would hold its ethernet address. * * @param[in] intf - interface name * @return The name of th environment key */ std::optional interfaceToUbootEthAddr(const char* intf); /** @brief read the DHCP value from the configuration file * @param[in] confDir - Network configuration directory. * @param[in] intf - Interface name. */ EthernetInterfaceIntf::DHCPConf getDHCPValue(const std::string& confDir, const std::string& intf); namespace internal { /* @brief runs the given command in child process. * @param[in] path - path of the binary file which needs to be execeuted. * @param[in] args - arguments of the command. */ void executeCommandinChildProcess(const char* path, char** args); /** @brief Get ignored interfaces from environment */ std::string_view getIgnoredInterfacesEnv(); /** @brief Parse the comma separated interface names */ std::set parseInterfaces(std::string_view interfaces); /** @brief Get the ignored interfaces */ const std::set& getIgnoredInterfaces(); } // namespace internal /* @brief runs the given command in child process. * @param[in] path -path of the binary file which needs to be execeuted. * @param[in] tArgs - arguments of the command. */ template void execute(const char* path, ArgTypes&&... tArgs) { using expandType = char*[]; expandType args = {const_cast(tArgs)..., nullptr}; internal::executeCommandinChildProcess(path, args); } } // namespace network } // namespace phosphor