summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--zebra/rt_netlink.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index b95ef8462b..5686d8e528 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -290,11 +290,12 @@ vrf_lookup_by_table (u_int32_t table_id)
static int
netlink_parse_info (int (*filter) (struct sockaddr_nl *, struct nlmsghdr *,
ns_id_t),
- struct nlsock *nl, struct zebra_ns *zns)
+ struct nlsock *nl, struct zebra_ns *zns, int count)
{
int status;
int ret = 0;
int error;
+ int read_in = 0;
while (1)
{
@@ -312,6 +313,9 @@ netlink_parse_info (int (*filter) (struct sockaddr_nl *, struct nlmsghdr *,
};
struct nlmsghdr *h;
+ if (count && read_in >= count)
+ return 0;
+
status = recvmsg (nl->sock, &msg, 0);
if (status < 0)
{
@@ -336,7 +340,8 @@ netlink_parse_info (int (*filter) (struct sockaddr_nl *, struct nlmsghdr *,
nl->name, msg.msg_namelen);
return -1;
}
-
+
+ read_in++;
for (h = (struct nlmsghdr *) buf; NLMSG_OK (h, (unsigned int) status);
h = NLMSG_NEXT (h, status))
{
@@ -1464,7 +1469,7 @@ interface_lookup_netlink (struct zebra_ns *zns)
ret = netlink_request (AF_PACKET, RTM_GETLINK, &zns->netlink_cmd);
if (ret < 0)
return ret;
- ret = netlink_parse_info (netlink_interface, &zns->netlink_cmd, zns);
+ ret = netlink_parse_info (netlink_interface, &zns->netlink_cmd, zns, 0);
if (ret < 0)
return ret;
@@ -1472,7 +1477,7 @@ interface_lookup_netlink (struct zebra_ns *zns)
ret = netlink_request (AF_INET, RTM_GETADDR, &zns->netlink_cmd);
if (ret < 0)
return ret;
- ret = netlink_parse_info (netlink_interface_addr, &zns->netlink_cmd, zns);
+ ret = netlink_parse_info (netlink_interface_addr, &zns->netlink_cmd, zns, 0);
if (ret < 0)
return ret;
@@ -1481,7 +1486,7 @@ interface_lookup_netlink (struct zebra_ns *zns)
ret = netlink_request (AF_INET6, RTM_GETADDR, &zns->netlink_cmd);
if (ret < 0)
return ret;
- ret = netlink_parse_info (netlink_interface_addr, &zns->netlink_cmd, zns);
+ ret = netlink_parse_info (netlink_interface_addr, &zns->netlink_cmd, zns, 0);
if (ret < 0)
return ret;
#endif /* HAVE_IPV6 */
@@ -1500,7 +1505,7 @@ netlink_route_read (struct zebra_ns *zns)
ret = netlink_request (AF_INET, RTM_GETROUTE, &zns->netlink_cmd);
if (ret < 0)
return ret;
- ret = netlink_parse_info (netlink_routing_table, &zns->netlink_cmd, zns);
+ ret = netlink_parse_info (netlink_routing_table, &zns->netlink_cmd, zns, 0);
if (ret < 0)
return ret;
@@ -1509,7 +1514,7 @@ netlink_route_read (struct zebra_ns *zns)
ret = netlink_request (AF_INET6, RTM_GETROUTE, &zns->netlink_cmd);
if (ret < 0)
return ret;
- ret = netlink_parse_info (netlink_routing_table, &zns->netlink_cmd, zns);
+ ret = netlink_parse_info (netlink_routing_table, &zns->netlink_cmd, zns, 0);
if (ret < 0)
return ret;
#endif /* HAVE_IPV6 */
@@ -1642,7 +1647,7 @@ netlink_talk (struct nlmsghdr *n, struct nlsock *nl, struct zebra_ns *zns)
* Get reply from netlink socket.
* The reply should either be an acknowlegement or an error.
*/
- return netlink_parse_info (netlink_talk_filter, nl, zns);
+ return netlink_parse_info (netlink_talk_filter, nl, zns, 0);
}
/* Routing table change via netlink interface. */
@@ -2471,7 +2476,7 @@ static int
kernel_read (struct thread *thread)
{
struct zebra_ns *zns = (struct zebra_ns *)THREAD_ARG (thread);
- netlink_parse_info (netlink_information_fetch, &zns->netlink, zns);
+ netlink_parse_info (netlink_information_fetch, &zns->netlink, zns, 5);
zns->t_netlink = thread_add_read (zebrad.master, kernel_read, zns,
zns->netlink.sock);