summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/netlink-private/route/link/api.h3
-rw-r--r--lib/route/link.c14
-rw-r--r--lib/route/link/bridge.c7
3 files changed, 13 insertions, 11 deletions
diff --git a/include/netlink-private/route/link/api.h b/include/netlink-private/route/link/api.h
index 6e11062..dedc921 100644
--- a/include/netlink-private/route/link/api.h
+++ b/include/netlink-private/route/link/api.h
@@ -126,7 +126,8 @@ struct rtnl_link_af_ops
/** Called for GETLINK message to the kernel. Used to append
* link address family specific attributes to the request message. */
- int (*ao_get_af)(struct nl_msg *msg);
+ int (*ao_get_af)(struct nl_msg *msg,
+ uint32_t *ext_filter_mask);
/** Dump address family specific link attributes */
void (*ao_dump[NL_DUMP_MAX+1])(struct rtnl_link *,
diff --git a/lib/route/link.c b/lib/route/link.c
index 48eb6d3..1b4f94c 100644
--- a/lib/route/link.c
+++ b/lib/route/link.c
@@ -677,7 +677,7 @@ static int link_request_update(struct nl_cache *cache, struct nl_sock *sk)
struct rtnl_link_af_ops *ops;
struct nl_msg *msg;
int err;
- __u32 vf_mask = RTEXT_FILTER_VF;
+ __u32 ext_filter_mask = RTEXT_FILTER_VF;
msg = nlmsg_alloc_simple(RTM_GETLINK, NLM_F_DUMP);
if (!msg)
@@ -687,13 +687,15 @@ static int link_request_update(struct nl_cache *cache, struct nl_sock *sk)
if (nlmsg_append(msg, &hdr, sizeof(hdr), NLMSG_ALIGNTO) < 0)
goto nla_put_failure;
- err = nla_put(msg, IFLA_EXT_MASK, sizeof(vf_mask), &vf_mask);
- if (err)
- goto nla_put_failure;
-
ops = rtnl_link_af_ops_lookup(family);
if (ops && ops->ao_get_af) {
- err = ops->ao_get_af(msg);
+ err = ops->ao_get_af(msg, &ext_filter_mask);
+ if (err)
+ goto nla_put_failure;
+ }
+
+ if (ext_filter_mask) {
+ err = nla_put(msg, IFLA_EXT_MASK, sizeof(ext_filter_mask), &ext_filter_mask);
if (err)
goto nla_put_failure;
}
diff --git a/lib/route/link/bridge.c b/lib/route/link/bridge.c
index 75d5792..330ac53 100644
--- a/lib/route/link/bridge.c
+++ b/lib/route/link/bridge.c
@@ -224,11 +224,10 @@ static int bridge_parse_af_full(struct rtnl_link *link, struct nlattr *attr_full
return 0;
}
-static int bridge_get_af(struct nl_msg *msg)
+static int bridge_get_af(struct nl_msg *msg, uint32_t *ext_filter_mask)
{
- __u32 ext_filter_mask = RTEXT_FILTER_BRVLAN;
-
- return nla_put(msg, IFLA_EXT_MASK, sizeof(ext_filter_mask), &ext_filter_mask);
+ *ext_filter_mask |= RTEXT_FILTER_BRVLAN;
+ return 0;
}
static void dump_bitmap(struct nl_dump_params *p, const uint32_t *b)