libnetlink: introduce nc_flags
Allow for a filter to ignore certain nlmsg_flags. Signed-off-by: Phil Sutter <phil@nwl.cc>
This commit is contained in:
parent
c6995c4802
commit
8e72880f6b
|
|
@ -60,11 +60,16 @@ struct rtnl_dump_filter_arg
|
||||||
{
|
{
|
||||||
rtnl_filter_t filter;
|
rtnl_filter_t filter;
|
||||||
void *arg1;
|
void *arg1;
|
||||||
|
__u16 nc_flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
int rtnl_dump_filter_l(struct rtnl_handle *rth,
|
int rtnl_dump_filter_l(struct rtnl_handle *rth,
|
||||||
const struct rtnl_dump_filter_arg *arg);
|
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,
|
int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
struct nlmsghdr *answer, size_t len)
|
struct nlmsghdr *answer, size_t len)
|
||||||
__attribute__((warn_unused_result));
|
__attribute__((warn_unused_result));
|
||||||
|
|
|
||||||
|
|
@ -259,6 +259,8 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,
|
||||||
while (NLMSG_OK(h, msglen)) {
|
while (NLMSG_OK(h, msglen)) {
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
h->nlmsg_flags &= ~a->nc_flags;
|
||||||
|
|
||||||
if (nladdr.nl_pid != 0 ||
|
if (nladdr.nl_pid != 0 ||
|
||||||
h->nlmsg_pid != rth->local.nl_pid ||
|
h->nlmsg_pid != rth->local.nl_pid ||
|
||||||
h->nlmsg_seq != rth->dump)
|
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,
|
rtnl_filter_t filter,
|
||||||
void *arg1)
|
void *arg1, __u16 nc_flags)
|
||||||
{
|
{
|
||||||
const struct rtnl_dump_filter_arg a[2] = {
|
const struct rtnl_dump_filter_arg a[2] = {
|
||||||
{ .filter = filter, .arg1 = arg1, },
|
{ .filter = filter, .arg1 = arg1, .nc_flags = nc_flags, },
|
||||||
{ .filter = NULL, .arg1 = NULL, },
|
{ .filter = NULL, .arg1 = NULL, .nc_flags = 0, },
|
||||||
};
|
};
|
||||||
|
|
||||||
return rtnl_dump_filter_l(rth, a);
|
return rtnl_dump_filter_l(rth, a);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue