112 строки
3.3 KiB
Diff
112 строки
3.3 KiB
Diff
From b36ee43032bcb38736622ac69a777744a377f971 Mon Sep 17 00:00:00 2001
|
|
From: Vlad Buslov <vladbu@nvidia.com>
|
|
Date: Fri, 3 Jun 2022 22:32:23 +0300
|
|
Subject: [PATCH 3/9] net/mlx5: Bridge, extract VLAN push/pop actions creation
|
|
|
|
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>
|
|
Change-Id: I05c14cc505fa732d7a27091ce857e18a4820c120
|
|
---
|
|
.../ethernet/mellanox/mlx5/core/esw/bridge.c | 52 +++++++++++++------
|
|
1 file changed, 36 insertions(+), 16 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c b/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c
|
|
index 4e3197c0e92b..2b6e258279f0 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c
|
|
@@ -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);
|
|
}
|
|
--
|
|
2.21.3
|
|
|