80 строки
3.4 KiB
Diff
80 строки
3.4 KiB
Diff
From 3b715eb73d13b194a8725507a299fecd6120f706 Mon Sep 17 00:00:00 2001
|
|
From: Vlad Buslov <vladbu@nvidia.com>
|
|
Date: Thu, 2 Sep 2021 11:12:16 +0300
|
|
Subject: [PATCH 16/22] net/mlx5: Bridge, extract VLAN pop code to dedicated
|
|
functions
|
|
|
|
Following patches in series need to pop VLAN when packet misses on egress.
|
|
To reuse existing bridge VLAN pop handling code, extract it to dedicated
|
|
helpers mlx5_esw_bridge_pkt_reformat_vlan_pop_supported() and
|
|
mlx5_esw_bridge_pkt_reformat_vlan_pop_create().
|
|
|
|
Signed-off-by: Vlad Buslov <vladbu@nvidia.com>
|
|
Reviewed-by: Paul Blakey <paulb@nvidia.com>
|
|
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
|
|
---
|
|
.../ethernet/mellanox/mlx5/core/esw/bridge.c | 34 ++++++++++++-------
|
|
1 file changed, 22 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c b/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c
|
|
index 9d8e09a3b4eb..895bf3866ed3 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c
|
|
@@ -86,6 +86,26 @@ mlx5_esw_bridge_fdb_del_notify(struct mlx5_esw_bridge_fdb_entry *entry)
|
|
SWITCHDEV_FDB_DEL_TO_BRIDGE);
|
|
}
|
|
|
|
+static bool mlx5_esw_bridge_pkt_reformat_vlan_pop_supported(struct mlx5_eswitch *esw)
|
|
+{
|
|
+ return BIT(MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, reformat_remove)) &&
|
|
+ MLX5_CAP_GEN_2(esw->dev, max_reformat_remove_size) >= sizeof(struct vlan_hdr) &&
|
|
+ MLX5_CAP_GEN_2(esw->dev, max_reformat_remove_offset) >=
|
|
+ offsetof(struct vlan_ethhdr, h_vlan_proto);
|
|
+}
|
|
+
|
|
+static struct mlx5_pkt_reformat *
|
|
+mlx5_esw_bridge_pkt_reformat_vlan_pop_create(struct mlx5_eswitch *esw)
|
|
+{
|
|
+ struct mlx5_pkt_reformat_params reformat_params = {};
|
|
+
|
|
+ reformat_params.type = MLX5_REFORMAT_TYPE_REMOVE_HDR;
|
|
+ reformat_params.param_0 = MLX5_REFORMAT_CONTEXT_ANCHOR_MAC_START;
|
|
+ reformat_params.param_1 = offsetof(struct vlan_ethhdr, h_vlan_proto);
|
|
+ reformat_params.size = sizeof(struct vlan_hdr);
|
|
+ return mlx5_packet_reformat_alloc(esw->dev, &reformat_params, MLX5_FLOW_NAMESPACE_FDB);
|
|
+}
|
|
+
|
|
static struct mlx5_flow_table *
|
|
mlx5_esw_bridge_table_create(int max_fte, u32 level, struct mlx5_eswitch *esw)
|
|
{
|
|
@@ -800,24 +820,14 @@ mlx5_esw_bridge_vlan_push_cleanup(struct mlx5_esw_bridge_vlan *vlan, struct mlx5
|
|
static int
|
|
mlx5_esw_bridge_vlan_pop_create(struct mlx5_esw_bridge_vlan *vlan, struct mlx5_eswitch *esw)
|
|
{
|
|
- struct mlx5_pkt_reformat_params reformat_params = {};
|
|
struct mlx5_pkt_reformat *pkt_reformat;
|
|
|
|
- if (!BIT(MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, reformat_remove)) ||
|
|
- MLX5_CAP_GEN_2(esw->dev, max_reformat_remove_size) < sizeof(struct vlan_hdr) ||
|
|
- MLX5_CAP_GEN_2(esw->dev, max_reformat_remove_offset) <
|
|
- offsetof(struct vlan_ethhdr, h_vlan_proto)) {
|
|
+ if (!mlx5_esw_bridge_pkt_reformat_vlan_pop_supported(esw)) {
|
|
esw_warn(esw->dev, "Packet reformat REMOVE_HEADER is not supported\n");
|
|
return -EOPNOTSUPP;
|
|
}
|
|
|
|
- reformat_params.type = MLX5_REFORMAT_TYPE_REMOVE_HDR;
|
|
- reformat_params.param_0 = MLX5_REFORMAT_CONTEXT_ANCHOR_MAC_START;
|
|
- reformat_params.param_1 = offsetof(struct vlan_ethhdr, h_vlan_proto);
|
|
- reformat_params.size = sizeof(struct vlan_hdr);
|
|
- pkt_reformat = mlx5_packet_reformat_alloc(esw->dev,
|
|
- &reformat_params,
|
|
- MLX5_FLOW_NAMESPACE_FDB);
|
|
+ pkt_reformat = mlx5_esw_bridge_pkt_reformat_vlan_pop_create(esw);
|
|
if (IS_ERR(pkt_reformat)) {
|
|
esw_warn(esw->dev, "Failed to alloc packet reformat REMOVE_HEADER (err=%ld)\n",
|
|
PTR_ERR(pkt_reformat));
|
|
--
|
|
2.25.1
|
|
|