OSDN Git Service

net: bridge: move br_vlan_replay to br_switchdev.c
authorVladimir Oltean <vladimir.oltean@nxp.com>
Wed, 27 Oct 2021 16:21:16 +0000 (19:21 +0300)
committerJakub Kicinski <kuba@kernel.org>
Fri, 29 Oct 2021 03:05:57 +0000 (20:05 -0700)
br_vlan_replay() is relevant only if CONFIG_NET_SWITCHDEV is enabled, so
move it to 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_private.h
net/bridge/br_switchdev.c
net/bridge/br_vlan.c

index cc31c3f..b16c83e 100644 (file)
@@ -1459,9 +1459,6 @@ void br_vlan_notify(const struct net_bridge *br,
                    const struct net_bridge_port *p,
                    u16 vid, u16 vid_range,
                    int cmd);
-int br_vlan_replay(struct net_device *br_dev, struct net_device *dev,
-                  const void *ctx, bool adding, struct notifier_block *nb,
-                  struct netlink_ext_ack *extack);
 bool br_vlan_can_enter_range(const struct net_bridge_vlan *v_curr,
                             const struct net_bridge_vlan *range_end);
 
@@ -1713,13 +1710,6 @@ static inline u16 br_vlan_flags(const struct net_bridge_vlan *v, u16 pvid)
        return 0;
 }
 
-static inline int br_vlan_replay(struct net_device *br_dev,
-                                struct net_device *dev, const void *ctx,
-                                bool adding, struct notifier_block *nb,
-                                struct netlink_ext_ack *extack)
-{
-       return -EOPNOTSUPP;
-}
 #endif
 
 /* br_vlan_options.c */
index 2fbe881..d773d81 100644 (file)
@@ -327,6 +327,91 @@ static int br_fdb_replay(const struct net_device *br_dev, const void *ctx,
        return err;
 }
 
+static int br_vlan_replay_one(struct notifier_block *nb,
+                             struct net_device *dev,
+                             struct switchdev_obj_port_vlan *vlan,
+                             const void *ctx, unsigned long action,
+                             struct netlink_ext_ack *extack)
+{
+       struct switchdev_notifier_port_obj_info obj_info = {
+               .info = {
+                       .dev = dev,
+                       .extack = extack,
+                       .ctx = ctx,
+               },
+               .obj = &vlan->obj,
+       };
+       int err;
+
+       err = nb->notifier_call(nb, action, &obj_info);
+       return notifier_to_errno(err);
+}
+
+static int br_vlan_replay(struct net_device *br_dev, struct net_device *dev,
+                         const void *ctx, bool adding,
+                         struct notifier_block *nb,
+                         struct netlink_ext_ack *extack)
+{
+       struct net_bridge_vlan_group *vg;
+       struct net_bridge_vlan *v;
+       struct net_bridge_port *p;
+       struct net_bridge *br;
+       unsigned long action;
+       int err = 0;
+       u16 pvid;
+
+       ASSERT_RTNL();
+
+       if (!nb)
+               return 0;
+
+       if (!netif_is_bridge_master(br_dev))
+               return -EINVAL;
+
+       if (!netif_is_bridge_master(dev) && !netif_is_bridge_port(dev))
+               return -EINVAL;
+
+       if (netif_is_bridge_master(dev)) {
+               br = netdev_priv(dev);
+               vg = br_vlan_group(br);
+               p = NULL;
+       } else {
+               p = br_port_get_rtnl(dev);
+               if (WARN_ON(!p))
+                       return -EINVAL;
+               vg = nbp_vlan_group(p);
+               br = p->br;
+       }
+
+       if (!vg)
+               return 0;
+
+       if (adding)
+               action = SWITCHDEV_PORT_OBJ_ADD;
+       else
+               action = SWITCHDEV_PORT_OBJ_DEL;
+
+       pvid = br_get_pvid(vg);
+
+       list_for_each_entry(v, &vg->vlan_list, vlist) {
+               struct switchdev_obj_port_vlan vlan = {
+                       .obj.orig_dev = dev,
+                       .obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN,
+                       .flags = br_vlan_flags(v, pvid),
+                       .vid = v->vid,
+               };
+
+               if (!br_vlan_should_use(v))
+                       continue;
+
+               err = br_vlan_replay_one(nb, dev, &vlan, ctx, action, extack);
+               if (err)
+                       return err;
+       }
+
+       return err;
+}
+
 static int nbp_switchdev_sync_objs(struct net_bridge_port *p, const void *ctx,
                                   struct notifier_block *atomic_nb,
                                   struct notifier_block *blocking_nb,
index 57bd6ee..49e105e 100644 (file)
@@ -1860,90 +1860,6 @@ out_kfree:
        kfree_skb(skb);
 }
 
-static int br_vlan_replay_one(struct notifier_block *nb,
-                             struct net_device *dev,
-                             struct switchdev_obj_port_vlan *vlan,
-                             const void *ctx, unsigned long action,
-                             struct netlink_ext_ack *extack)
-{
-       struct switchdev_notifier_port_obj_info obj_info = {
-               .info = {
-                       .dev = dev,
-                       .extack = extack,
-                       .ctx = ctx,
-               },
-               .obj = &vlan->obj,
-       };
-       int err;
-
-       err = nb->notifier_call(nb, action, &obj_info);
-       return notifier_to_errno(err);
-}
-
-int br_vlan_replay(struct net_device *br_dev, struct net_device *dev,
-                  const void *ctx, bool adding, struct notifier_block *nb,
-                  struct netlink_ext_ack *extack)
-{
-       struct net_bridge_vlan_group *vg;
-       struct net_bridge_vlan *v;
-       struct net_bridge_port *p;
-       struct net_bridge *br;
-       unsigned long action;
-       int err = 0;
-       u16 pvid;
-
-       ASSERT_RTNL();
-
-       if (!nb)
-               return 0;
-
-       if (!netif_is_bridge_master(br_dev))
-               return -EINVAL;
-
-       if (!netif_is_bridge_master(dev) && !netif_is_bridge_port(dev))
-               return -EINVAL;
-
-       if (netif_is_bridge_master(dev)) {
-               br = netdev_priv(dev);
-               vg = br_vlan_group(br);
-               p = NULL;
-       } else {
-               p = br_port_get_rtnl(dev);
-               if (WARN_ON(!p))
-                       return -EINVAL;
-               vg = nbp_vlan_group(p);
-               br = p->br;
-       }
-
-       if (!vg)
-               return 0;
-
-       if (adding)
-               action = SWITCHDEV_PORT_OBJ_ADD;
-       else
-               action = SWITCHDEV_PORT_OBJ_DEL;
-
-       pvid = br_get_pvid(vg);
-
-       list_for_each_entry(v, &vg->vlan_list, vlist) {
-               struct switchdev_obj_port_vlan vlan = {
-                       .obj.orig_dev = dev,
-                       .obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN,
-                       .flags = br_vlan_flags(v, pvid),
-                       .vid = v->vid,
-               };
-
-               if (!br_vlan_should_use(v))
-                       continue;
-
-               err = br_vlan_replay_one(nb, dev, &vlan, ctx, action, extack);
-               if (err)
-                       return err;
-       }
-
-       return err;
-}
-
 /* check if v_curr can enter a range ending in range_end */
 bool br_vlan_can_enter_range(const struct net_bridge_vlan *v_curr,
                             const struct net_bridge_vlan *range_end)