net/mlx5: E-Switch, Add API to configure rules for the offloaded mode
This allows for upper levels in the driver, e.g the TC offload code to add e-switch offloaded steering rules. The caller provides the rule spec for matching, action, source and destination vports. Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1033665e63
commit
3d80d1a2f5
|
@ -222,6 +222,12 @@ int mlx5_eswitch_get_vport_stats(struct mlx5_eswitch *esw,
|
|||
int vport,
|
||||
struct ifla_vf_stats *vf_stats);
|
||||
|
||||
struct mlx5_flow_spec;
|
||||
|
||||
struct mlx5_flow_rule *
|
||||
mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
|
||||
struct mlx5_flow_spec *spec,
|
||||
u32 action, u32 src_vport, u32 dst_vport);
|
||||
struct mlx5_flow_rule *
|
||||
mlx5_eswitch_create_vport_rx_rule(struct mlx5_eswitch *esw, int vport, u32 tirn);
|
||||
|
||||
|
|
|
@ -43,6 +43,49 @@ enum {
|
|||
FDB_SLOW_PATH
|
||||
};
|
||||
|
||||
struct mlx5_flow_rule *
|
||||
mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
|
||||
struct mlx5_flow_spec *spec,
|
||||
u32 action, u32 src_vport, u32 dst_vport)
|
||||
{
|
||||
struct mlx5_flow_destination dest = { 0 };
|
||||
struct mlx5_fc *counter = NULL;
|
||||
struct mlx5_flow_rule *rule;
|
||||
void *misc;
|
||||
|
||||
if (esw->mode != SRIOV_OFFLOADS)
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
|
||||
if (action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
|
||||
dest.type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
|
||||
dest.vport_num = dst_vport;
|
||||
action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
|
||||
} else if (action & MLX5_FLOW_CONTEXT_ACTION_COUNT) {
|
||||
counter = mlx5_fc_create(esw->dev, true);
|
||||
if (IS_ERR(counter))
|
||||
return ERR_CAST(counter);
|
||||
dest.type = MLX5_FLOW_DESTINATION_TYPE_COUNTER;
|
||||
dest.counter = counter;
|
||||
}
|
||||
|
||||
misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters);
|
||||
MLX5_SET(fte_match_set_misc, misc, source_port, src_vport);
|
||||
|
||||
misc = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, misc_parameters);
|
||||
MLX5_SET_TO_ONES(fte_match_set_misc, misc, source_port);
|
||||
|
||||
spec->match_criteria_enable = MLX5_MATCH_OUTER_HEADERS |
|
||||
MLX5_MATCH_MISC_PARAMETERS;
|
||||
|
||||
rule = mlx5_add_flow_rule((struct mlx5_flow_table *)esw->fdb_table.fdb,
|
||||
spec, action, 0, &dest);
|
||||
|
||||
if (IS_ERR(rule))
|
||||
mlx5_fc_destroy(esw->dev, counter);
|
||||
|
||||
return rule;
|
||||
}
|
||||
|
||||
static struct mlx5_flow_rule *
|
||||
mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *esw, int vport, u32 sqn)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue