Skip to content

Commit

Permalink
bridge: Netlink interface fix.
Browse files Browse the repository at this point in the history
This commit is correcting NETLINK br_fill_ifinfo() to be able to
handle 'filter_mask' with multiple flags asserted.

Fixes: 36a8e8e ("bridge: Extend br_fill_ifinfo to return MPR status")

Signed-off-by: Henrik Bjoernlund <henrik.bjoernlund@microchip.com>
Reviewed-by: Horatiu Vultur <horatiu.vultur@microchip.com>
Suggested-by: Nikolay Aleksandrov <nikolay@nvidia.com>
Tested-by: Horatiu Vultur <horatiu.vultur@microchip.com>
Acked-by: Nikolay Aleksandrov <nikolay@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Henrik Bjoernlund authored and Jakub Kicinski committed Oct 8, 2020
1 parent d91dc43 commit b6c02ef
Showing 1 changed file with 11 additions and 15 deletions.
26 changes: 11 additions & 15 deletions net/bridge/br_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,7 @@ static int br_fill_ifinfo(struct sk_buff *skb,
u32 filter_mask, const struct net_device *dev)
{
u8 operstate = netif_running(dev) ? dev->operstate : IF_OPER_DOWN;
struct nlattr *af = NULL;
struct net_bridge *br;
struct ifinfomsg *hdr;
struct nlmsghdr *nlh;
Expand Down Expand Up @@ -423,11 +424,18 @@ static int br_fill_ifinfo(struct sk_buff *skb,
nla_nest_end(skb, nest);
}

if (filter_mask & (RTEXT_FILTER_BRVLAN |
RTEXT_FILTER_BRVLAN_COMPRESSED |
RTEXT_FILTER_MRP)) {
af = nla_nest_start_noflag(skb, IFLA_AF_SPEC);
if (!af)
goto nla_put_failure;
}

/* Check if the VID information is requested */
if ((filter_mask & RTEXT_FILTER_BRVLAN) ||
(filter_mask & RTEXT_FILTER_BRVLAN_COMPRESSED)) {
struct net_bridge_vlan_group *vg;
struct nlattr *af;
int err;

/* RCU needed because of the VLAN locking rules (rcu || rtnl) */
Expand All @@ -441,11 +449,6 @@ static int br_fill_ifinfo(struct sk_buff *skb,
rcu_read_unlock();
goto done;
}
af = nla_nest_start_noflag(skb, IFLA_AF_SPEC);
if (!af) {
rcu_read_unlock();
goto nla_put_failure;
}
if (filter_mask & RTEXT_FILTER_BRVLAN_COMPRESSED)
err = br_fill_ifvlaninfo_compressed(skb, vg);
else
Expand All @@ -456,32 +459,25 @@ static int br_fill_ifinfo(struct sk_buff *skb,
rcu_read_unlock();
if (err)
goto nla_put_failure;

nla_nest_end(skb, af);
}

if (filter_mask & RTEXT_FILTER_MRP) {
struct nlattr *af;
int err;

if (!br_mrp_enabled(br) || port)
goto done;

af = nla_nest_start_noflag(skb, IFLA_AF_SPEC);
if (!af)
goto nla_put_failure;

rcu_read_lock();
err = br_mrp_fill_info(skb, br);
rcu_read_unlock();

if (err)
goto nla_put_failure;

nla_nest_end(skb, af);
}

done:
if (af)
nla_nest_end(skb, af);
nlmsg_end(skb, nlh);
return 0;

Expand Down

0 comments on commit b6c02ef

Please sign in to comment.