OSDN Git Service

net: bridge: split out the switchdev portion of br_mdb_notify
authorVladimir Oltean <vladimir.oltean@nxp.com>
Wed, 27 Oct 2021 16:21:17 +0000 (19:21 +0300)
committerJakub Kicinski <kuba@kernel.org>
Fri, 29 Oct 2021 03:05:57 +0000 (20:05 -0700)
Similar to fdb_notify() and br_switchdev_fdb_notify(), split the
switchdev specific logic from br_mdb_notify() into a different function.
This will be moved later in br_switchdev.c.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Acked-by: Nikolay Aleksandrov <nikolay@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/bridge/br_mdb.c

index 61ccf46..9513f07 100644 (file)
@@ -759,10 +759,10 @@ static void br_mdb_switchdev_host(struct net_device *dev,
                br_mdb_switchdev_host_port(dev, lower_dev, mp, type);
 }
 
-void br_mdb_notify(struct net_device *dev,
-                  struct net_bridge_mdb_entry *mp,
-                  struct net_bridge_port_group *pg,
-                  int type)
+static void br_switchdev_mdb_notify(struct net_device *dev,
+                                   struct net_bridge_mdb_entry *mp,
+                                   struct net_bridge_port_group *pg,
+                                   int type)
 {
        struct br_mdb_complete_info *complete_info;
        struct switchdev_obj_port_mdb mdb = {
@@ -771,33 +771,41 @@ void br_mdb_notify(struct net_device *dev,
                        .flags = SWITCHDEV_F_DEFER,
                },
        };
-       struct net *net = dev_net(dev);
-       struct sk_buff *skb;
-       int err = -ENOBUFS;
 
-       if (pg) {
-               br_switchdev_mdb_populate(&mdb, mp);
+       if (!pg)
+               return br_mdb_switchdev_host(dev, mp, type);
 
-               mdb.obj.orig_dev = pg->key.port->dev;
-               switch (type) {
-               case RTM_NEWMDB:
-                       complete_info = kmalloc(sizeof(*complete_info), GFP_ATOMIC);
-                       if (!complete_info)
-                               break;
-                       complete_info->port = pg->key.port;
-                       complete_info->ip = mp->addr;
-                       mdb.obj.complete_priv = complete_info;
-                       mdb.obj.complete = br_mdb_complete;
-                       if (switchdev_port_obj_add(pg->key.port->dev, &mdb.obj, NULL))
-                               kfree(complete_info);
-                       break;
-               case RTM_DELMDB:
-                       switchdev_port_obj_del(pg->key.port->dev, &mdb.obj);
+       br_switchdev_mdb_populate(&mdb, mp);
+
+       mdb.obj.orig_dev = pg->key.port->dev;
+       switch (type) {
+       case RTM_NEWMDB:
+               complete_info = kmalloc(sizeof(*complete_info), GFP_ATOMIC);
+               if (!complete_info)
                        break;
-               }
-       } else {
-               br_mdb_switchdev_host(dev, mp, type);
+               complete_info->port = pg->key.port;
+               complete_info->ip = mp->addr;
+               mdb.obj.complete_priv = complete_info;
+               mdb.obj.complete = br_mdb_complete;
+               if (switchdev_port_obj_add(pg->key.port->dev, &mdb.obj, NULL))
+                       kfree(complete_info);
+               break;
+       case RTM_DELMDB:
+               switchdev_port_obj_del(pg->key.port->dev, &mdb.obj);
+               break;
        }
+}
+
+void br_mdb_notify(struct net_device *dev,
+                  struct net_bridge_mdb_entry *mp,
+                  struct net_bridge_port_group *pg,
+                  int type)
+{
+       struct net *net = dev_net(dev);
+       struct sk_buff *skb;
+       int err = -ENOBUFS;
+
+       br_switchdev_mdb_notify(dev, mp, pg, type);
 
        skb = nlmsg_new(rtnl_mdb_nlmsg_size(pg), GFP_ATOMIC);
        if (!skb)