diff options
-rw-r--r-- | include/netlink-private/route/link/api.h | 3 | ||||
-rw-r--r-- | lib/route/link.c | 14 | ||||
-rw-r--r-- | lib/route/link/bridge.c | 7 |
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) |