aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhil Sutter <phil@nwl.cc>2015-11-24 15:31:01 +0100
committerStephen Hemminger <shemming@brocade.com>2015-11-29 11:47:29 -0800
commit8e72880f6bfa39f439b9c4a88eb84b635b991687 (patch)
tree0cc705d625ea9622237ba0e31e1df25a578998b1
parentc6995c48025233902a5b0c5fe88654e17ea934f6 (diff)
downloadandroid_external_iproute2-8e72880f6bfa39f439b9c4a88eb84b635b991687.tar.gz
android_external_iproute2-8e72880f6bfa39f439b9c4a88eb84b635b991687.tar.bz2
android_external_iproute2-8e72880f6bfa39f439b9c4a88eb84b635b991687.zip
libnetlink: introduce nc_flags
Allow for a filter to ignore certain nlmsg_flags. Signed-off-by: Phil Sutter <phil@nwl.cc>
-rw-r--r--include/libnetlink.h7
-rw-r--r--lib/libnetlink.c10
2 files changed, 12 insertions, 5 deletions
diff --git a/include/libnetlink.h b/include/libnetlink.h
index 2280c39..431189e 100644
--- a/include/libnetlink.h
+++ b/include/libnetlink.h
@@ -60,11 +60,16 @@ struct rtnl_dump_filter_arg
{
rtnl_filter_t filter;
void *arg1;
+ __u16 nc_flags;
};
int rtnl_dump_filter_l(struct rtnl_handle *rth,
const struct rtnl_dump_filter_arg *arg);
-int rtnl_dump_filter(struct rtnl_handle *rth, rtnl_filter_t filter, void *arg);
+int rtnl_dump_filter_nc(struct rtnl_handle *rth,
+ rtnl_filter_t filter,
+ void *arg, __u16 nc_flags);
+#define rtnl_dump_filter(rth, filter, arg) \
+ rtnl_dump_filter_nc(rth, filter, arg, 0)
int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
struct nlmsghdr *answer, size_t len)
__attribute__((warn_unused_result));
diff --git a/lib/libnetlink.c b/lib/libnetlink.c
index 09b0e91..922ec2d 100644
--- a/lib/libnetlink.c
+++ b/lib/libnetlink.c
@@ -259,6 +259,8 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,
while (NLMSG_OK(h, msglen)) {
int err = 0;
+ h->nlmsg_flags &= ~a->nc_flags;
+
if (nladdr.nl_pid != 0 ||
h->nlmsg_pid != rth->local.nl_pid ||
h->nlmsg_seq != rth->dump)
@@ -317,13 +319,13 @@ skip_it:
}
}
-int rtnl_dump_filter(struct rtnl_handle *rth,
+int rtnl_dump_filter_nc(struct rtnl_handle *rth,
rtnl_filter_t filter,
- void *arg1)
+ void *arg1, __u16 nc_flags)
{
const struct rtnl_dump_filter_arg a[2] = {
- { .filter = filter, .arg1 = arg1, },
- { .filter = NULL, .arg1 = NULL, },
+ { .filter = filter, .arg1 = arg1, .nc_flags = nc_flags, },
+ { .filter = NULL, .arg1 = NULL, .nc_flags = 0, },
};
return rtnl_dump_filter_l(rth, a);