diff options
author | Ratan Gupta <ratagupt@in.ibm.com> | 2017-06-17 19:20:04 +0530 |
---|---|---|
committer | Ratan Gupta <ratagupt@in.ibm.com> | 2017-06-21 15:34:32 +0530 |
commit | 3681a503d79f9db5e81fa440af054817e728a4b4 (patch) | |
tree | 7778ed3ee13f2e7dfdf144754b0c3ca371428768 | |
parent | 34f96d6d2c2e293801861265c199f7f68fe5c324 (diff) | |
download | phosphor-networkd-3681a503d79f9db5e81fa440af054817e728a4b4.tar.gz phosphor-networkd-3681a503d79f9db5e81fa440af054817e728a4b4.zip |
Move function from network manager to utility function
Function which fetches the interface address from the system.
Add some types to types.hpp
Change-Id: Ie2c02980a9fd7a0aaeafa22d93bc758b5c79fd04
Signed-off-by: Ratan Gupta <ratagupt@in.ibm.com>
-rw-r--r-- | network_manager.cpp | 90 | ||||
-rw-r--r-- | network_manager.hpp | 29 | ||||
-rw-r--r-- | types.hpp | 16 | ||||
-rw-r--r-- | util.cpp | 97 | ||||
-rw-r--r-- | util.hpp | 6 |
5 files changed, 117 insertions, 121 deletions
diff --git a/network_manager.cpp b/network_manager.cpp index ee88c3f..e1bfa41 100644 --- a/network_manager.cpp +++ b/network_manager.cpp @@ -1,5 +1,6 @@ #include "config.h" #include "config_parser.hpp" +#include "util.hpp" #include "network_manager.hpp" #include "network_config.hpp" #include "xyz/openbmc_project/Common/error.hpp" @@ -133,95 +134,6 @@ void Manager::reset() return; } -IntfAddrMap Manager::getInterfaceAddrs() const -{ - IntfAddrMap intfMap{}; - AddrList addrList{}; - struct ifaddrs* ifaddr = nullptr; - - // attempt to fill struct with ifaddrs - if (getifaddrs(&ifaddr) == -1) - { - auto error = errno; - log<level::ERR>("Error occurred during the getifaddrs call", - entry("ERRNO=%s", strerror(error))); - elog<InternalFailure>(); - } - - details::AddrPtr ifaddrPtr(ifaddr); - ifaddr = nullptr; - - std::string intfName{}; - - for (ifaddrs* ifa = ifaddrPtr.get(); ifa != nullptr; ifa = ifa->ifa_next) - { - // walk interfaces - if (ifa->ifa_addr == nullptr) - { - continue; - } - - // get only INET interfaces not ipv6 - if (ifa->ifa_addr->sa_family == AF_INET || - ifa->ifa_addr->sa_family == AF_INET6) - { - // if loopback, or not running ignore - if ((ifa->ifa_flags & IFF_LOOPBACK) || - !(ifa->ifa_flags & IFF_RUNNING)) - { - continue; - } - // if the interface name is not same as the previous - // iteration then add the addr list into - // the map. - if (intfName != "" && intfName != std::string(ifa->ifa_name)) - { - intfMap.emplace(intfName, addrList); - addrList.clear(); - } - intfName = ifa->ifa_name; - AddrInfo info{}; - char ip[INET6_ADDRSTRLEN] = { 0 }; - char subnetMask[INET6_ADDRSTRLEN] = { 0 }; - - if (ifa->ifa_addr->sa_family == AF_INET) - { - - inet_ntop(ifa->ifa_addr->sa_family, - &(((struct sockaddr_in*)(ifa->ifa_addr))->sin_addr), - ip, - sizeof(ip)); - - inet_ntop(ifa->ifa_addr->sa_family, - &(((struct sockaddr_in*)(ifa->ifa_netmask))->sin_addr), - subnetMask, - sizeof(subnetMask)); - - } - else - { - inet_ntop(ifa->ifa_addr->sa_family, - &(((struct sockaddr_in6*)(ifa->ifa_addr))->sin6_addr), - ip, - sizeof(ip)); - - inet_ntop(ifa->ifa_addr->sa_family, - &(((struct sockaddr_in6*)(ifa->ifa_netmask))->sin6_addr), - subnetMask, - sizeof(subnetMask)); - - } - - info.addrType = ifa->ifa_addr->sa_family; - info.ipaddress = ip; - info.prefix = toCidr(info.addrType, std::string(subnetMask)); - addrList.emplace_back(info); - } - } - intfMap.emplace(intfName, addrList); - return intfMap; -} - // Need to merge the below function with the code which writes the // config file during factory reset. //TODO openbmc/openbmc#1751 diff --git a/network_manager.hpp b/network_manager.hpp index 5c6358b..ce61737 100644 --- a/network_manager.hpp +++ b/network_manager.hpp @@ -2,12 +2,10 @@ #include "ethernet_interface.hpp" #include "system_configuration.hpp" -#include "types.hpp" #include "xyz/openbmc_project/Network/VLAN/Create/server.hpp" #include <xyz/openbmc_project/Common/FactoryReset/server.hpp> #include <sdbusplus/bus.hpp> -#include <ifaddrs.h> #include <list> #include <memory> @@ -31,29 +29,6 @@ using VLANCreateIface = details::ServerObject< sdbusplus::xyz::openbmc_project::Network::VLAN::server::Create, sdbusplus::xyz::openbmc_project::Common::server::FactoryReset>; -using IntfName = std::string; - -struct AddrInfo -{ - short addrType; - std::string ipaddress; -}; - -using Addr_t = ifaddrs*; - -struct AddrDeleter -{ - void operator()(Addr_t ptr) const - { - freeifaddrs(ptr); - } -}; - -using AddrPtr = std::unique_ptr<ifaddrs, AddrDeleter>; - -using AddrList = std::list<AddrInfo>; -using IntfAddrMap = std::map<IntfName, AddrList>; - } // namespace details class TestNetworkManager; //forward declaration @@ -99,10 +74,6 @@ class Manager : public details::VLANCreateIface void setConfDir(const fs::path& dir); private: - /** @brief Get all the interfaces from the system. - * @returns list of interface names. - */ - IntfAddrMap getInterfaceAddrs() const; /** @brief Restart the systemd networkd */ @@ -1,9 +1,12 @@ #pragma once +#include <ifaddrs.h> + #include <list> #include <string> #include <vector> #include <map> +#include <memory> namespace phosphor { @@ -18,6 +21,19 @@ struct AddrInfo { uint16_t prefix; }; +using Addr_t = ifaddrs*; + +struct AddrDeleter +{ + void operator()(Addr_t ptr) const + { + freeifaddrs(ptr); + } +}; + +using AddrPtr = std::unique_ptr<ifaddrs, AddrDeleter>; + + using AddrList = std::list<AddrInfo>; using IntfAddrMap = std::map<IntfName, AddrList>; @@ -1,11 +1,13 @@ -#include <arpa/inet.h> -#include <dirent.h> -#include <net/if.h> +#include "util.hpp" #include "xyz/openbmc_project/Common/error.hpp" #include <phosphor-logging/log.hpp> #include <phosphor-logging/elog-errors.hpp> +#include <arpa/inet.h> +#include <dirent.h> +#include <net/if.h> + #include <iostream> #include <list> #include <string> @@ -202,5 +204,94 @@ bool isLinkLocal(const std::string& address) true : false; } +IntfAddrMap getInterfaceAddrs() +{ + IntfAddrMap intfMap{}; + AddrList addrList{}; + struct ifaddrs* ifaddr = nullptr; + + // attempt to fill struct with ifaddrs + if (getifaddrs(&ifaddr) == -1) + { + auto error = errno; + log<level::ERR>("Error occurred during the getifaddrs call", + entry("ERRNO=%s", strerror(error))); + elog<InternalFailure>(); + } + + AddrPtr ifaddrPtr(ifaddr); + ifaddr = nullptr; + + std::string intfName{}; + + for (ifaddrs* ifa = ifaddrPtr.get(); ifa != nullptr; ifa = ifa->ifa_next) + { + // walk interfaces + if (ifa->ifa_addr == nullptr) + { + continue; + } + + // get only INET interfaces not ipv6 + if (ifa->ifa_addr->sa_family == AF_INET || + ifa->ifa_addr->sa_family == AF_INET6) + { + // if loopback, or not running ignore + if ((ifa->ifa_flags & IFF_LOOPBACK) || + !(ifa->ifa_flags & IFF_RUNNING)) + { + continue; + } + // if the interface name is not same as the previous + // iteration then add the addr list into + // the map. + if (intfName != "" && intfName != std::string(ifa->ifa_name)) + { + intfMap.emplace(intfName, addrList); + addrList.clear(); + } + intfName = ifa->ifa_name; + AddrInfo info{}; + char ip[INET6_ADDRSTRLEN] = { 0 }; + char subnetMask[INET6_ADDRSTRLEN] = { 0 }; + + if (ifa->ifa_addr->sa_family == AF_INET) + { + + inet_ntop(ifa->ifa_addr->sa_family, + &(((struct sockaddr_in*)(ifa->ifa_addr))->sin_addr), + ip, + sizeof(ip)); + + inet_ntop(ifa->ifa_addr->sa_family, + &(((struct sockaddr_in*)(ifa->ifa_netmask))->sin_addr), + subnetMask, + sizeof(subnetMask)); + + } + else + { + inet_ntop(ifa->ifa_addr->sa_family, + &(((struct sockaddr_in6*)(ifa->ifa_addr))->sin6_addr), + ip, + sizeof(ip)); + + inet_ntop(ifa->ifa_addr->sa_family, + &(((struct sockaddr_in6*)(ifa->ifa_netmask))->sin6_addr), + subnetMask, + sizeof(subnetMask)); + + } + + info.addrType = ifa->ifa_addr->sa_family; + info.ipaddress = ip; + info.prefix = toCidr(info.addrType, std::string(subnetMask)); + addrList.emplace_back(info); + } + } + intfMap.emplace(intfName, addrList); + return intfMap; +} + }//namespace network }//namespace phosphor @@ -1,6 +1,7 @@ #pragma once #include <unistd.h> +#include "types.hpp" namespace phosphor { @@ -36,6 +37,11 @@ bool isLinkLocal(const std::string& address); std::string getNetworkID(int addressFamily, const std::string& ipaddress, uint8_t prefix); +/** @brief Get all the interfaces from the system. + * @returns list of interface names. + */ +IntfAddrMap getInterfaceAddrs(); + } //namespace network class Descriptor |