blob: f23b54c80846525e51565f2167192a0f4235be57 [file] [log] [blame]
Ratan Gupta233524c2017-05-27 11:47:31 +05301#pragma once
2
3#include <asm/types.h>
Ratan Gupta233524c2017-05-27 11:47:31 +05304#include <linux/netlink.h>
Gunnar Mills57d9c502018-09-14 14:42:34 -05005#include <sys/socket.h>
Ratan Gupta233524c2017-05-27 11:47:31 +05306
7#include <iostream>
8#include <list>
Ratan Gupta233524c2017-05-27 11:47:31 +05309#include <map>
Patrick Venture189d44e2018-07-09 12:30:59 -070010#include <string>
Ratan Gupta233524c2017-05-27 11:47:31 +053011
12namespace phosphor
13{
14namespace network
15{
16namespace route
17{
Ratan Guptab46497f2017-06-09 12:00:34 +053018constexpr auto BUFSIZE = 4096;
Ratan Gupta233524c2017-05-27 11:47:31 +053019
20struct Entry
21{
22 // destination network
23 std::string destination;
24 // gateway for this network.
25 std::string gateway;
26 // interface for this route
27 std::string interface;
Gunnar Mills57d9c502018-09-14 14:42:34 -050028 Entry(std::string dest, std::string gtw, std::string intf) :
29 destination(dest), gateway(gtw), interface(intf)
30 {
31 }
Ratan Gupta233524c2017-05-27 11:47:31 +053032
33 bool operator==(const Entry& rhs)
34 {
35 return this->destination == rhs.destination &&
Gunnar Mills57d9c502018-09-14 14:42:34 -050036 this->gateway == rhs.gateway && this->interface == rhs.interface;
Ratan Gupta233524c2017-05-27 11:47:31 +053037 }
38};
39
40// Map of network address and the route entry
41using Map = std::map<std::string, struct Entry>;
42
43class Table
44{
Gunnar Mills57d9c502018-09-14 14:42:34 -050045 public:
46 Table();
47 ~Table() = default;
48 Table(const Table&) = default;
49 Table& operator=(const Table&) = default;
50 Table(Table&&) = default;
51 Table& operator=(Table&&) = default;
Ratan Gupta233524c2017-05-27 11:47:31 +053052
Gunnar Mills57d9c502018-09-14 14:42:34 -050053 /**
54 * @brief gets the list of routes.
55 *
56 * @returns list of routes.
57 */
58 Map getRoutes();
Ratan Gupta233524c2017-05-27 11:47:31 +053059
Gunnar Mills57d9c502018-09-14 14:42:34 -050060 /**
61 * @brief gets the default gateway.
62 *
63 * @returns the default gateway.
64 */
65 std::string getDefaultGateway() const
66 {
67 return defaultGateway;
68 };
Ratan Gupta233524c2017-05-27 11:47:31 +053069
Gunnar Mills57d9c502018-09-14 14:42:34 -050070 /**
71 * @brief get the gateway for the network.
72 * @param[in] addressFamily - ip address family(AF_INET/AF_INET6)
73 * @param[in] ipaddress - ip address.
74 * @param[in] prefix - prefix length.
75 * @returns the gatway for the given network.
76 */
77 std::string getGateway(int addressFamily, const std::string& ipaddress,
78 uint8_t prefix) const;
Ratan Gupta233524c2017-05-27 11:47:31 +053079
Gunnar Mills57d9c502018-09-14 14:42:34 -050080 private:
81 /**
82 * @brief read the routing data from the socket and fill the buffer.
83 *
84 * @param[in] bufPtr - unique pointer to confidentiality algorithm
85 * instance
86 */
87 int readNetLinkSock(int sockFd, std::array<char, BUFSIZE>& buff);
88 /**
89 * @brief Parse the route and add it to the route list.
90 *
91 * @param[in] nlHdr - net link message header.
92 */
93 void parseRoutes(const struct nlmsghdr* nlHdr);
Ratan Gupta233524c2017-05-27 11:47:31 +053094
Gunnar Mills57d9c502018-09-14 14:42:34 -050095 std::string defaultGateway; // default gateway
96 Map routeList; // List of routes
Ratan Gupta233524c2017-05-27 11:47:31 +053097};
98
Gunnar Mills57d9c502018-09-14 14:42:34 -050099} // namespace route
100} // namespace network
101} // namespace phosphor