]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/mlx5: Bridge, extract VLAN push/pop actions creation
authorVlad Buslov <vladbu@nvidia.com>
Fri, 3 Jun 2022 19:32:23 +0000 (22:32 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Wed, 13 Jul 2022 22:56:47 +0000 (15:56 -0700)
Following patches in series need to re-create VLAN actions when user
changes VLAN protocol. Extract the code that creates VLAN push/pop actions
into dedicated function in order to be reused in next patch.

Signed-off-by: Vlad Buslov <vladbu@nvidia.com>
Reviewed-by: Roi Dayan <roid@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c

index 4e3197c0e92b9283f171e8a9fb071acb75988269..2b6e258279f02bbae6dc9e2a7645a87bdddc8fd2 100644 (file)
@@ -1025,36 +1025,58 @@ mlx5_esw_bridge_vlan_push_mark_cleanup(struct mlx5_esw_bridge_vlan *vlan, struct
        vlan->pkt_mod_hdr_push_mark = NULL;
 }
 
-static struct mlx5_esw_bridge_vlan *
-mlx5_esw_bridge_vlan_create(u16 vid, u16 flags, struct mlx5_esw_bridge_port *port,
-                           struct mlx5_eswitch *esw)
+static int
+mlx5_esw_bridge_vlan_push_pop_create(u16 flags, struct mlx5_esw_bridge_vlan *vlan,
+                                    struct mlx5_eswitch *esw)
 {
-       struct mlx5_esw_bridge_vlan *vlan;
        int err;
 
-       vlan = kvzalloc(sizeof(*vlan), GFP_KERNEL);
-       if (!vlan)
-               return ERR_PTR(-ENOMEM);
-
-       vlan->vid = vid;
-       vlan->flags = flags;
-       INIT_LIST_HEAD(&vlan->fdb_list);
-
        if (flags & BRIDGE_VLAN_INFO_PVID) {
                err = mlx5_esw_bridge_vlan_push_create(vlan, esw);
                if (err)
-                       goto err_vlan_push;
+                       return err;
 
                err = mlx5_esw_bridge_vlan_push_mark_create(vlan, esw);
                if (err)
                        goto err_vlan_push_mark;
        }
+
        if (flags & BRIDGE_VLAN_INFO_UNTAGGED) {
                err = mlx5_esw_bridge_vlan_pop_create(vlan, esw);
                if (err)
                        goto err_vlan_pop;
        }
 
+       return 0;
+
+err_vlan_pop:
+       if (vlan->pkt_mod_hdr_push_mark)
+               mlx5_esw_bridge_vlan_push_mark_cleanup(vlan, esw);
+err_vlan_push_mark:
+       if (vlan->pkt_reformat_push)
+               mlx5_esw_bridge_vlan_push_cleanup(vlan, esw);
+       return err;
+}
+
+static struct mlx5_esw_bridge_vlan *
+mlx5_esw_bridge_vlan_create(u16 vid, u16 flags, struct mlx5_esw_bridge_port *port,
+                           struct mlx5_eswitch *esw)
+{
+       struct mlx5_esw_bridge_vlan *vlan;
+       int err;
+
+       vlan = kvzalloc(sizeof(*vlan), GFP_KERNEL);
+       if (!vlan)
+               return ERR_PTR(-ENOMEM);
+
+       vlan->vid = vid;
+       vlan->flags = flags;
+       INIT_LIST_HEAD(&vlan->fdb_list);
+
+       err = mlx5_esw_bridge_vlan_push_pop_create(flags, vlan, esw);
+       if (err)
+               goto err_vlan_push_pop;
+
        err = xa_insert(&port->vlans, vid, vlan, GFP_KERNEL);
        if (err)
                goto err_xa_insert;
@@ -1065,13 +1087,11 @@ mlx5_esw_bridge_vlan_create(u16 vid, u16 flags, struct mlx5_esw_bridge_port *por
 err_xa_insert:
        if (vlan->pkt_reformat_pop)
                mlx5_esw_bridge_vlan_pop_cleanup(vlan, esw);
-err_vlan_pop:
        if (vlan->pkt_mod_hdr_push_mark)
                mlx5_esw_bridge_vlan_push_mark_cleanup(vlan, esw);
-err_vlan_push_mark:
        if (vlan->pkt_reformat_push)
                mlx5_esw_bridge_vlan_push_cleanup(vlan, esw);
-err_vlan_push:
+err_vlan_push_pop:
        kvfree(vlan);
        return ERR_PTR(err);
 }