net/mlx5e: E-Switch, Specify flow_source for rule with no in_port
authorJianbo Liu <jianbol@mellanox.com>
Fri, 3 Jul 2020 02:34:23 +0000 (02:34 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 31 Jul 2020 01:53:53 +0000 (18:53 -0700)
The flow_source must be specified, even for rule without matching
source vport, because some actions are only allowed in uplink.
Otherwise, rule can't be offloaded and firmware syndrome happens.

Fixes: 6fb0701a9cfa ("net/mlx5: E-Switch, Add support for offloading rules with no in_port")
Signed-off-by: Jianbo Liu <jianbol@mellanox.com>
Reviewed-by: Chris Mi <chrism@mellanox.com>
Reviewed-by: Roi Dayan <roid@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index d70d6c0..ed75353 100644 (file)
@@ -236,6 +236,15 @@ static struct mlx5_eswitch_rep *mlx5_eswitch_get_rep(struct mlx5_eswitch *esw,
        return &esw->offloads.vport_reps[idx];
 }
 
+static void
+mlx5_eswitch_set_rule_flow_source(struct mlx5_eswitch *esw,
+                                 struct mlx5_flow_spec *spec,
+                                 struct mlx5_esw_flow_attr *attr)
+{
+       if (MLX5_CAP_ESW_FLOWTABLE(esw->dev, flow_source) &&
+           attr && attr->in_rep && attr->in_rep->vport == MLX5_VPORT_UPLINK)
+               spec->flow_context.flow_source = MLX5_FLOW_CONTEXT_FLOW_SOURCE_UPLINK;
+}
 
 static void
 mlx5_eswitch_set_rule_source_port(struct mlx5_eswitch *esw,
@@ -276,10 +285,6 @@ mlx5_eswitch_set_rule_source_port(struct mlx5_eswitch *esw,
 
                spec->match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS;
        }
-
-       if (MLX5_CAP_ESW_FLOWTABLE(esw->dev, flow_source) &&
-           attr->in_rep->vport == MLX5_VPORT_UPLINK)
-               spec->flow_context.flow_source = MLX5_FLOW_CONTEXT_FLOW_SOURCE_UPLINK;
 }
 
 struct mlx5_flow_handle *
@@ -377,9 +382,6 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
                flow_act.modify_hdr = attr->modify_hdr;
 
        if (split) {
-               if (MLX5_CAP_ESW_FLOWTABLE(esw->dev, flow_source) &&
-                   attr->in_rep->vport == MLX5_VPORT_UPLINK)
-                       spec->flow_context.flow_source = MLX5_FLOW_CONTEXT_FLOW_SOURCE_UPLINK;
                fdb = esw_vport_tbl_get(esw, attr);
        } else {
                if (attr->chain || attr->prio)
@@ -396,6 +398,8 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
                goto err_esw_get;
        }
 
+       mlx5_eswitch_set_rule_flow_source(esw, spec, attr);
+
        if (mlx5_eswitch_termtbl_required(esw, attr, &flow_act, spec))
                rule = mlx5_eswitch_add_termtbl_rule(esw, fdb, spec, attr,
                                                     &flow_act, dest, i);
@@ -462,6 +466,7 @@ mlx5_eswitch_add_fwd_rule(struct mlx5_eswitch *esw,
        i++;
 
        mlx5_eswitch_set_rule_source_port(esw, spec, attr);
+       mlx5_eswitch_set_rule_flow_source(esw, spec, attr);
 
        if (attr->outer_match_level != MLX5_MATCH_NONE)
                spec->match_criteria_enable |= MLX5_MATCH_OUTER_HEADERS;