diff options
author | Phil Sutter <phil@nwl.cc> | 2015-11-24 15:31:01 +0100 |
---|---|---|
committer | Stephen Hemminger <shemming@brocade.com> | 2015-11-29 11:47:29 -0800 |
commit | 8e72880f6bfa39f439b9c4a88eb84b635b991687 (patch) | |
tree | 0cc705d625ea9622237ba0e31e1df25a578998b1 | |
parent | c6995c48025233902a5b0c5fe88654e17ea934f6 (diff) | |
download | android_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.h | 7 | ||||
-rw-r--r-- | lib/libnetlink.c | 10 |
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); |