]> git.baikalelectronics.ru Git - kernel.git/commitdiff
bridge: Netlink interface fix.
authorHenrik Bjoernlund <henrik.bjoernlund@microchip.com>
Wed, 7 Oct 2020 12:07:00 +0000 (12:07 +0000)
committerJakub Kicinski <kuba@kernel.org>
Thu, 8 Oct 2020 19:05:07 +0000 (12:05 -0700)
This commit is correcting NETLINK br_fill_ifinfo() to be able to
handle 'filter_mask' with multiple flags asserted.

Fixes: 89c122ee599db ("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>
net/bridge/br_netlink.c

index 147d52596e1741582c451c6aba479d039c6d3d9a..da310f0ca72527159c740c8a1dc8b11d2b12eb46 100644 (file)
@@ -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;