You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
8.2 KiB
226 lines
8.2 KiB
From 3f285c020ca420cf7657c4a51da96573ae038f06 Mon Sep 17 00:00:00 2001
|
|
From: Alaa Hleihel <ahleihel@redhat.com>
|
|
Date: Sun, 10 May 2020 15:03:51 -0400
|
|
Subject: [PATCH 074/312] [netdrv] net/mlx5: E-switch, Introduce and use vlan
|
|
rule config helper
|
|
|
|
Message-id: <20200510150452.10307-27-ahleihel@redhat.com>
|
|
Patchwork-id: 306650
|
|
Patchwork-instance: patchwork
|
|
O-Subject: [RHEL8.3 BZ 1789380 v2 26/87] net/mlx5: E-switch, Introduce and use vlan rule config helper
|
|
Bugzilla: 1789380
|
|
RH-Acked-by: Kamal Heib <kheib@redhat.com>
|
|
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
|
|
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
|
|
RH-Acked-by: Jonathan Toppins <jtoppins@redhat.com>
|
|
|
|
Bugzilla: http://bugzilla.redhat.com/1789380
|
|
Upstream: v5.5-rc1
|
|
|
|
commit fdde49e00b9d2041086568b52670043a8def96ff
|
|
Author: Parav Pandit <parav@mellanox.com>
|
|
Date: Mon Oct 28 23:35:03 2019 +0000
|
|
|
|
net/mlx5: E-switch, Introduce and use vlan rule config helper
|
|
|
|
Between legacy mode and switchdev mode, only two fields are changed,
|
|
vlan_tag and flow action.
|
|
Hence to avoid duplicte code between two modes, introduce and and use
|
|
helper function to configure allowed VLAN rule.
|
|
|
|
While at it, get rid of duplicate debug message.
|
|
|
|
Signed-off-by: Parav Pandit <parav@mellanox.com>
|
|
Reviewed-by: Vu Pham <vuhuong@mellanox.com>
|
|
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
|
|
|
|
Signed-off-by: Alaa Hleihel <ahleihel@redhat.com>
|
|
Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com>
|
|
---
|
|
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | 68 ++++++++++++++--------
|
|
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h | 4 ++
|
|
.../ethernet/mellanox/mlx5/core/eswitch_offloads.c | 54 ++++-------------
|
|
3 files changed, 58 insertions(+), 68 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
|
|
index 386e82850ed5..773246f8e9c4 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
|
|
@@ -1323,6 +1323,43 @@ static int esw_vport_ingress_config(struct mlx5_eswitch *esw,
|
|
return err;
|
|
}
|
|
|
|
+int mlx5_esw_create_vport_egress_acl_vlan(struct mlx5_eswitch *esw,
|
|
+ struct mlx5_vport *vport,
|
|
+ u16 vlan_id, u32 flow_action)
|
|
+{
|
|
+ struct mlx5_flow_act flow_act = {};
|
|
+ struct mlx5_flow_spec *spec;
|
|
+ int err = 0;
|
|
+
|
|
+ if (vport->egress.allowed_vlan)
|
|
+ return -EEXIST;
|
|
+
|
|
+ spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
|
|
+ if (!spec)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, outer_headers.cvlan_tag);
|
|
+ MLX5_SET_TO_ONES(fte_match_param, spec->match_value, outer_headers.cvlan_tag);
|
|
+ MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, outer_headers.first_vid);
|
|
+ MLX5_SET(fte_match_param, spec->match_value, outer_headers.first_vid, vlan_id);
|
|
+
|
|
+ spec->match_criteria_enable = MLX5_MATCH_OUTER_HEADERS;
|
|
+ flow_act.action = flow_action;
|
|
+ vport->egress.allowed_vlan =
|
|
+ mlx5_add_flow_rules(vport->egress.acl, spec,
|
|
+ &flow_act, NULL, 0);
|
|
+ if (IS_ERR(vport->egress.allowed_vlan)) {
|
|
+ err = PTR_ERR(vport->egress.allowed_vlan);
|
|
+ esw_warn(esw->dev,
|
|
+ "vport[%d] configure egress vlan rule failed, err(%d)\n",
|
|
+ vport->vport, err);
|
|
+ vport->egress.allowed_vlan = NULL;
|
|
+ }
|
|
+
|
|
+ kvfree(spec);
|
|
+ return err;
|
|
+}
|
|
+
|
|
static int esw_vport_egress_config(struct mlx5_eswitch *esw,
|
|
struct mlx5_vport *vport)
|
|
{
|
|
@@ -1353,34 +1390,17 @@ static int esw_vport_egress_config(struct mlx5_eswitch *esw,
|
|
"vport[%d] configure egress rules, vlan(%d) qos(%d)\n",
|
|
vport->vport, vport->info.vlan, vport->info.qos);
|
|
|
|
- spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
|
|
- if (!spec) {
|
|
- err = -ENOMEM;
|
|
- goto out;
|
|
- }
|
|
-
|
|
/* Allowed vlan rule */
|
|
- MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, outer_headers.cvlan_tag);
|
|
- MLX5_SET_TO_ONES(fte_match_param, spec->match_value, outer_headers.cvlan_tag);
|
|
- MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, outer_headers.first_vid);
|
|
- MLX5_SET(fte_match_param, spec->match_value, outer_headers.first_vid, vport->info.vlan);
|
|
+ err = mlx5_esw_create_vport_egress_acl_vlan(esw, vport, vport->info.vlan,
|
|
+ MLX5_FLOW_CONTEXT_ACTION_ALLOW);
|
|
+ if (err)
|
|
+ return err;
|
|
|
|
- spec->match_criteria_enable = MLX5_MATCH_OUTER_HEADERS;
|
|
- flow_act.action = MLX5_FLOW_CONTEXT_ACTION_ALLOW;
|
|
- vport->egress.allowed_vlan =
|
|
- mlx5_add_flow_rules(vport->egress.acl, spec,
|
|
- &flow_act, NULL, 0);
|
|
- if (IS_ERR(vport->egress.allowed_vlan)) {
|
|
- err = PTR_ERR(vport->egress.allowed_vlan);
|
|
- esw_warn(esw->dev,
|
|
- "vport[%d] configure egress allowed vlan rule failed, err(%d)\n",
|
|
- vport->vport, err);
|
|
- vport->egress.allowed_vlan = NULL;
|
|
+ /* Drop others rule (star rule) */
|
|
+ spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
|
|
+ if (!spec)
|
|
goto out;
|
|
- }
|
|
|
|
- /* Drop others rule (star rule) */
|
|
- memset(spec, 0, sizeof(*spec));
|
|
flow_act.action = MLX5_FLOW_CONTEXT_ACTION_DROP;
|
|
|
|
/* Attach egress drop flow counter */
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
|
|
index 436c633407d6..0cba334270d9 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
|
|
@@ -423,6 +423,10 @@ int mlx5_eswitch_del_vlan_action(struct mlx5_eswitch *esw,
|
|
int __mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
|
|
u16 vport, u16 vlan, u8 qos, u8 set_flags);
|
|
|
|
+int mlx5_esw_create_vport_egress_acl_vlan(struct mlx5_eswitch *esw,
|
|
+ struct mlx5_vport *vport,
|
|
+ u16 vlan_id, u32 flow_action);
|
|
+
|
|
static inline bool mlx5_eswitch_vlan_actions_supported(struct mlx5_core_dev *dev,
|
|
u8 vlan_depth)
|
|
{
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
|
|
index 9e64bdf17861..657aeea3f879 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
|
|
@@ -1859,48 +1859,6 @@ void esw_vport_del_ingress_acl_modify_metadata(struct mlx5_eswitch *esw,
|
|
}
|
|
}
|
|
|
|
-static int esw_vport_egress_prio_tag_config(struct mlx5_eswitch *esw,
|
|
- struct mlx5_vport *vport)
|
|
-{
|
|
- struct mlx5_flow_act flow_act = {0};
|
|
- struct mlx5_flow_spec *spec;
|
|
- int err = 0;
|
|
-
|
|
- /* For prio tag mode, there is only 1 FTEs:
|
|
- * 1) prio tag packets - pop the prio tag VLAN, allow
|
|
- * Unmatched traffic is allowed by default
|
|
- */
|
|
- esw_debug(esw->dev,
|
|
- "vport[%d] configure prio tag egress rules\n", vport->vport);
|
|
-
|
|
- spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
|
|
- if (!spec)
|
|
- return -ENOMEM;
|
|
-
|
|
- /* prio tag vlan rule - pop it so VF receives untagged packets */
|
|
- MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, outer_headers.cvlan_tag);
|
|
- MLX5_SET_TO_ONES(fte_match_param, spec->match_value, outer_headers.cvlan_tag);
|
|
- MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, outer_headers.first_vid);
|
|
- MLX5_SET(fte_match_param, spec->match_value, outer_headers.first_vid, 0);
|
|
-
|
|
- spec->match_criteria_enable = MLX5_MATCH_OUTER_HEADERS;
|
|
- flow_act.action = MLX5_FLOW_CONTEXT_ACTION_VLAN_POP |
|
|
- MLX5_FLOW_CONTEXT_ACTION_ALLOW;
|
|
- vport->egress.allowed_vlan =
|
|
- mlx5_add_flow_rules(vport->egress.acl, spec,
|
|
- &flow_act, NULL, 0);
|
|
- if (IS_ERR(vport->egress.allowed_vlan)) {
|
|
- err = PTR_ERR(vport->egress.allowed_vlan);
|
|
- esw_warn(esw->dev,
|
|
- "vport[%d] configure egress pop prio tag vlan rule failed, err(%d)\n",
|
|
- vport->vport, err);
|
|
- vport->egress.allowed_vlan = NULL;
|
|
- }
|
|
-
|
|
- kvfree(spec);
|
|
- return err;
|
|
-}
|
|
-
|
|
static int esw_vport_ingress_config(struct mlx5_eswitch *esw,
|
|
struct mlx5_vport *vport)
|
|
{
|
|
@@ -1956,9 +1914,17 @@ static int esw_vport_egress_config(struct mlx5_eswitch *esw,
|
|
if (err)
|
|
return err;
|
|
|
|
- esw_debug(esw->dev, "vport(%d) configure egress rules\n", vport->vport);
|
|
+ /* For prio tag mode, there is only 1 FTEs:
|
|
+ * 1) prio tag packets - pop the prio tag VLAN, allow
|
|
+ * Unmatched traffic is allowed by default
|
|
+ */
|
|
+ esw_debug(esw->dev,
|
|
+ "vport[%d] configure prio tag egress rules\n", vport->vport);
|
|
|
|
- err = esw_vport_egress_prio_tag_config(esw, vport);
|
|
+ /* prio tag vlan rule - pop it so VF receives untagged packets */
|
|
+ err = mlx5_esw_create_vport_egress_acl_vlan(esw, vport, 0,
|
|
+ MLX5_FLOW_CONTEXT_ACTION_VLAN_POP |
|
|
+ MLX5_FLOW_CONTEXT_ACTION_ALLOW);
|
|
if (err)
|
|
esw_vport_disable_egress_acl(esw, vport);
|
|
|
|
--
|
|
2.13.6
|
|
|