|  | #pragma once | 
|  |  | 
|  | #include <asm/types.h> | 
|  | #include <sys/socket.h> | 
|  | #include <linux/netlink.h> | 
|  |  | 
|  | #include <iostream> | 
|  | #include <list> | 
|  | #include <string> | 
|  | #include <map> | 
|  |  | 
|  | namespace phosphor | 
|  | { | 
|  | namespace network | 
|  | { | 
|  | namespace route | 
|  | { | 
|  | constexpr auto BUFSIZE = 4096; | 
|  |  | 
|  | struct Entry | 
|  | { | 
|  | // destination network | 
|  | std::string destination; | 
|  | // gateway for this network. | 
|  | std::string gateway; | 
|  | // interface for this route | 
|  | std::string interface; | 
|  | Entry(std::string dest, | 
|  | std::string gtw, | 
|  | std::string intf) : | 
|  | destination(dest), | 
|  | gateway(gtw), | 
|  | interface(intf){} | 
|  |  | 
|  | bool operator==(const Entry& rhs) | 
|  | { | 
|  | return this->destination == rhs.destination && | 
|  | this->gateway == rhs.gateway && | 
|  | this->interface == rhs.interface; | 
|  | } | 
|  | }; | 
|  |  | 
|  | // Map of network address and the route entry | 
|  | using Map = std::map<std::string, struct Entry>; | 
|  |  | 
|  | class Table | 
|  | { | 
|  | public: | 
|  | Table(); | 
|  | ~Table() = default; | 
|  | Table(const Table&) = default; | 
|  | Table& operator=(const Table&) = default; | 
|  | Table(Table&&) = default; | 
|  | Table& operator=(Table &&) = default; | 
|  |  | 
|  | /** | 
|  | * @brief gets the list of routes. | 
|  | * | 
|  | * @returns list of routes. | 
|  | */ | 
|  | Map getRoutes(); | 
|  |  | 
|  | /** | 
|  | * @brief gets the default gateway. | 
|  | * | 
|  | * @returns the default gateway. | 
|  | */ | 
|  | std::string getDefaultGateway() const | 
|  | { | 
|  | return defaultGateway; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * @brief get the gateway for the network. | 
|  | * @param[in] addressFamily - ip address family(AF_INET/AF_INET6) | 
|  | * @param[in] ipaddress - ip address. | 
|  | * @param[in] prefix - prefix length. | 
|  | * @returns the gatway for the given network. | 
|  | */ | 
|  | std::string getGateway(int addressFamily, | 
|  | const std::string& ipaddress, | 
|  | uint8_t prefix) const; | 
|  | private: | 
|  |  | 
|  | /** | 
|  | * @brief read the routing data from the socket and fill the buffer. | 
|  | * | 
|  | * @param[in] bufPtr - unique pointer to confidentiality algorithm | 
|  | *                     instance | 
|  | */ | 
|  | int readNetLinkSock(int sockFd, std::array<char, BUFSIZE>& buff); | 
|  | /** | 
|  | * @brief Parse the route and add it to the route list. | 
|  | * | 
|  | * @param[in] nlHdr - net link message header. | 
|  | */ | 
|  | void parseRoutes(const struct nlmsghdr* nlHdr); | 
|  |  | 
|  | std::string defaultGateway; // default gateway | 
|  | Map routeList; //List of routes | 
|  |  | 
|  | }; | 
|  |  | 
|  | }// namespace route | 
|  | }// namespace network | 
|  | }// namespace phosphor |