summaryrefslogtreecommitdiff
path: root/zebra/rt_netlink.c
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2017-07-10 23:22:46 +0200
committerDavid Lamparter <equinox@opensourcerouting.org>2017-07-10 23:22:46 +0200
commit1c95bad18a0256bc7f85db773a39bbc7484078de (patch)
tree6230beb732c4faeac5a5a81530a8f043746172ad /zebra/rt_netlink.c
parent4ad79cbd11be1d08a73bf0fd389139dbedee76bc (diff)
parent7fb9d20fcfe5619a2dfb05085f9da5590820ecb5 (diff)
Merge branch 'evpn-prep'
First 12-and-a-half commits from PR #619 Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'zebra/rt_netlink.c')
-rw-r--r--zebra/rt_netlink.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 0adbe2c27f..471f650588 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -600,6 +600,25 @@ netlink_route_change (struct sockaddr_nl *snl, struct nlmsghdr *h,
return 0;
}
+/* Request for specific route information from the kernel */
+static int
+netlink_request_route (struct zebra_ns *zns, int family, int type)
+{
+ struct
+ {
+ struct nlmsghdr n;
+ struct rtmsg rtm;
+ } req;
+
+ /* Form the request, specifying filter (rtattr) if needed. */
+ memset (&req, 0, sizeof (req));
+ req.n.nlmsg_type = type;
+ req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
+ req.rtm.rtm_family = family;
+
+ return netlink_request (&zns->netlink_cmd, &req.n);
+}
+
/* Routing table read function using netlink interface. Only called
bootstrap time. */
int
@@ -608,7 +627,7 @@ netlink_route_read (struct zebra_ns *zns)
int ret;
/* Get IPv4 routing table. */
- ret = netlink_request (AF_INET, RTM_GETROUTE, &zns->netlink_cmd);
+ ret = netlink_request_route (zns, AF_INET, RTM_GETROUTE);
if (ret < 0)
return ret;
ret = netlink_parse_info (netlink_route_change_read_unicast, &zns->netlink_cmd, zns, 0, 1);
@@ -616,7 +635,7 @@ netlink_route_read (struct zebra_ns *zns)
return ret;
/* Get IPv6 routing table. */
- ret = netlink_request (AF_INET6, RTM_GETROUTE, &zns->netlink_cmd);
+ ret = netlink_request_route (zns, AF_INET6, RTM_GETROUTE);
if (ret < 0)
return ret;
ret = netlink_parse_info (netlink_route_change_read_unicast, &zns->netlink_cmd, zns, 0, 1);