net/mlx5e: E-Switch, Use metadata for vport matching in send-to-vport rules
Like other rules use metadata matching if supported instead of source_port. Signed-off-by: Roi Dayan <roid@nvidia.com> Reviewed-by: Maor Dickman <maord@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
parent
99db5669f6
commit
29bcb6e4fe
@ -838,6 +838,7 @@ mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *on_esw,
|
||||
struct mlx5_flow_handle *flow_rule;
|
||||
struct mlx5_flow_spec *spec;
|
||||
void *misc;
|
||||
u16 vport;
|
||||
|
||||
spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
|
||||
if (!spec) {
|
||||
@ -847,20 +848,43 @@ mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *on_esw,
|
||||
|
||||
misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters);
|
||||
MLX5_SET(fte_match_set_misc, misc, source_sqn, sqn);
|
||||
/* source vport is the esw manager */
|
||||
MLX5_SET(fte_match_set_misc, misc, source_port, from_esw->manager_vport);
|
||||
if (MLX5_CAP_ESW(on_esw->dev, merged_eswitch))
|
||||
MLX5_SET(fte_match_set_misc, misc, source_eswitch_owner_vhca_id,
|
||||
MLX5_CAP_GEN(from_esw->dev, vhca_id));
|
||||
|
||||
misc = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, misc_parameters);
|
||||
MLX5_SET_TO_ONES(fte_match_set_misc, misc, source_sqn);
|
||||
MLX5_SET_TO_ONES(fte_match_set_misc, misc, source_port);
|
||||
if (MLX5_CAP_ESW(on_esw->dev, merged_eswitch))
|
||||
MLX5_SET_TO_ONES(fte_match_set_misc, misc,
|
||||
source_eswitch_owner_vhca_id);
|
||||
|
||||
spec->match_criteria_enable = MLX5_MATCH_MISC_PARAMETERS;
|
||||
|
||||
/* source vport is the esw manager */
|
||||
vport = from_esw->manager_vport;
|
||||
|
||||
if (mlx5_eswitch_vport_match_metadata_enabled(on_esw)) {
|
||||
misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters_2);
|
||||
MLX5_SET(fte_match_set_misc2, misc, metadata_reg_c_0,
|
||||
mlx5_eswitch_get_vport_metadata_for_match(from_esw, vport));
|
||||
|
||||
misc = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, misc_parameters_2);
|
||||
MLX5_SET(fte_match_set_misc2, misc, metadata_reg_c_0,
|
||||
mlx5_eswitch_get_vport_metadata_mask());
|
||||
|
||||
spec->match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS_2;
|
||||
} else {
|
||||
misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters);
|
||||
MLX5_SET(fte_match_set_misc, misc, source_port, vport);
|
||||
|
||||
if (MLX5_CAP_ESW(on_esw->dev, merged_eswitch))
|
||||
MLX5_SET(fte_match_set_misc, misc, source_eswitch_owner_vhca_id,
|
||||
MLX5_CAP_GEN(from_esw->dev, vhca_id));
|
||||
|
||||
misc = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, misc_parameters);
|
||||
MLX5_SET_TO_ONES(fte_match_set_misc, misc, source_port);
|
||||
|
||||
if (MLX5_CAP_ESW(on_esw->dev, merged_eswitch))
|
||||
MLX5_SET_TO_ONES(fte_match_set_misc, misc,
|
||||
source_eswitch_owner_vhca_id);
|
||||
|
||||
spec->match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS;
|
||||
}
|
||||
|
||||
dest.type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
|
||||
dest.vport.num = rep->vport;
|
||||
dest.vport.vhca_id = MLX5_CAP_GEN(rep->esw->dev, vhca_id);
|
||||
@ -1270,7 +1294,8 @@ esw_add_restore_rule(struct mlx5_eswitch *esw, u32 tag)
|
||||
#define MAX_SQ_NVPORTS 32
|
||||
|
||||
static void esw_set_flow_group_source_port(struct mlx5_eswitch *esw,
|
||||
u32 *flow_group_in)
|
||||
u32 *flow_group_in,
|
||||
int match_params)
|
||||
{
|
||||
void *match_criteria = MLX5_ADDR_OF(create_flow_group_in,
|
||||
flow_group_in,
|
||||
@ -1279,7 +1304,7 @@ static void esw_set_flow_group_source_port(struct mlx5_eswitch *esw,
|
||||
if (mlx5_eswitch_vport_match_metadata_enabled(esw)) {
|
||||
MLX5_SET(create_flow_group_in, flow_group_in,
|
||||
match_criteria_enable,
|
||||
MLX5_MATCH_MISC_PARAMETERS_2);
|
||||
MLX5_MATCH_MISC_PARAMETERS_2 | match_params);
|
||||
|
||||
MLX5_SET(fte_match_param, match_criteria,
|
||||
misc_parameters_2.metadata_reg_c_0,
|
||||
@ -1287,7 +1312,7 @@ static void esw_set_flow_group_source_port(struct mlx5_eswitch *esw,
|
||||
} else {
|
||||
MLX5_SET(create_flow_group_in, flow_group_in,
|
||||
match_criteria_enable,
|
||||
MLX5_MATCH_MISC_PARAMETERS);
|
||||
MLX5_MATCH_MISC_PARAMETERS | match_params);
|
||||
|
||||
MLX5_SET_TO_ONES(fte_match_param, match_criteria,
|
||||
misc_parameters.source_port);
|
||||
@ -1463,14 +1488,13 @@ esw_create_send_to_vport_group(struct mlx5_eswitch *esw,
|
||||
|
||||
memset(flow_group_in, 0, inlen);
|
||||
|
||||
MLX5_SET(create_flow_group_in, flow_group_in, match_criteria_enable,
|
||||
MLX5_MATCH_MISC_PARAMETERS);
|
||||
esw_set_flow_group_source_port(esw, flow_group_in, MLX5_MATCH_MISC_PARAMETERS);
|
||||
|
||||
match_criteria = MLX5_ADDR_OF(create_flow_group_in, flow_group_in, match_criteria);
|
||||
|
||||
MLX5_SET_TO_ONES(fte_match_param, match_criteria, misc_parameters.source_sqn);
|
||||
MLX5_SET_TO_ONES(fte_match_param, match_criteria, misc_parameters.source_port);
|
||||
if (MLX5_CAP_ESW(esw->dev, merged_eswitch)) {
|
||||
|
||||
if (!mlx5_eswitch_vport_match_metadata_enabled(esw) &&
|
||||
MLX5_CAP_ESW(esw->dev, merged_eswitch)) {
|
||||
MLX5_SET_TO_ONES(fte_match_param, match_criteria,
|
||||
misc_parameters.source_eswitch_owner_vhca_id);
|
||||
MLX5_SET(create_flow_group_in, flow_group_in,
|
||||
@ -1558,7 +1582,7 @@ esw_create_peer_esw_miss_group(struct mlx5_eswitch *esw,
|
||||
|
||||
memset(flow_group_in, 0, inlen);
|
||||
|
||||
esw_set_flow_group_source_port(esw, flow_group_in);
|
||||
esw_set_flow_group_source_port(esw, flow_group_in, 0);
|
||||
|
||||
if (!mlx5_eswitch_vport_match_metadata_enabled(esw)) {
|
||||
match_criteria = MLX5_ADDR_OF(create_flow_group_in,
|
||||
@ -1845,7 +1869,7 @@ static int esw_create_vport_rx_group(struct mlx5_eswitch *esw)
|
||||
return -ENOMEM;
|
||||
|
||||
/* create vport rx group */
|
||||
esw_set_flow_group_source_port(esw, flow_group_in);
|
||||
esw_set_flow_group_source_port(esw, flow_group_in, 0);
|
||||
|
||||
MLX5_SET(create_flow_group_in, flow_group_in, start_flow_index, 0);
|
||||
MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, nvports - 1);
|
||||
|
Loading…
Reference in New Issue
Block a user