Commit b6c02ef5 authored by Henrik Bjoernlund's avatar Henrik Bjoernlund Committed by Jakub Kicinski
Browse files

bridge: Netlink interface fix.



This commit is correcting NETLINK br_fill_ifinfo() to be able to
handle 'filter_mask' with multiple flags asserted.

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

Signed-off-by: default avatarHenrik Bjoernlund <henrik.bjoernlund@microchip.com>
Reviewed-by: default avatarHoratiu Vultur <horatiu.vultur@microchip.com>
Suggested-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
Tested-by: default avatarHoratiu Vultur <horatiu.vultur@microchip.com>
Acked-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent d91dc434
Loading
Loading
Loading
Loading
+11 −15
Original line number Diff line number Diff line
@@ -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;
@@ -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) */
@@ -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
@@ -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;