libnetlink: Add filter function to rtnl_neighdump_req

Add filter function to rtnl_neighdump_req and a buffer to the
request for the filter functions to append attributes.

Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
David Ahern 2018-12-31 09:54:47 -08:00
parent 66e8e73edc
commit f255ab1225
3 changed files with 14 additions and 3 deletions

View File

@ -60,7 +60,8 @@ int rtnl_routedump_req(struct rtnl_handle *rth, int family,
__attribute__((warn_unused_result)); __attribute__((warn_unused_result));
int rtnl_ruledump_req(struct rtnl_handle *rth, int family) int rtnl_ruledump_req(struct rtnl_handle *rth, int family)
__attribute__((warn_unused_result)); __attribute__((warn_unused_result));
int rtnl_neighdump_req(struct rtnl_handle *rth, int family) int rtnl_neighdump_req(struct rtnl_handle *rth, int family,
req_filter_fn_t filter_fn)
__attribute__((warn_unused_result)); __attribute__((warn_unused_result));
int rtnl_neightbldump_req(struct rtnl_handle *rth, int family) int rtnl_neightbldump_req(struct rtnl_handle *rth, int family)
__attribute__((warn_unused_result)); __attribute__((warn_unused_result));

View File

@ -327,11 +327,13 @@ int rtnl_ruledump_req(struct rtnl_handle *rth, int family)
return send(rth->fd, &req, sizeof(req), 0); return send(rth->fd, &req, sizeof(req), 0);
} }
int rtnl_neighdump_req(struct rtnl_handle *rth, int family) int rtnl_neighdump_req(struct rtnl_handle *rth, int family,
req_filter_fn_t filter_fn)
{ {
struct { struct {
struct nlmsghdr nlh; struct nlmsghdr nlh;
struct ndmsg ndm; struct ndmsg ndm;
char buf[256];
} req = { } req = {
.nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg)), .nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg)),
.nlh.nlmsg_type = RTM_GETNEIGH, .nlh.nlmsg_type = RTM_GETNEIGH,
@ -340,6 +342,14 @@ int rtnl_neighdump_req(struct rtnl_handle *rth, int family)
.ndm.ndm_family = family, .ndm.ndm_family = family,
}; };
if (filter_fn) {
int err;
err = filter_fn(&req.nlh, sizeof(req));
if (err)
return err;
}
return send(rth->fd, &req, sizeof(req), 0); return send(rth->fd, &req, sizeof(req), 0);
} }

View File

@ -424,7 +424,7 @@ static int do_one_request(struct nlmsghdr *n)
static void load_initial_table(void) static void load_initial_table(void)
{ {
if (rtnl_neighdump_req(&rth, AF_INET) < 0) { if (rtnl_neighdump_req(&rth, AF_INET, NULL) < 0) {
perror("dump request failed"); perror("dump request failed");
exit(1); exit(1);
} }