Skip to content

Commit

Permalink
net/mlx5e: Add TC vlan action for SRIOV offloads
Browse files Browse the repository at this point in the history
Parse TC vlan actions and set the required elements to allow offloading.

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>
  • Loading branch information
ogerlitz authored and davem330 committed Sep 23, 2016
1 parent f5f8247 commit 8b32580
Showing 1 changed file with 32 additions and 11 deletions.
43 changes: 32 additions & 11 deletions drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,17 +119,27 @@ static struct mlx5_flow_rule *mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
struct mlx5_esw_flow_attr *attr)
{
struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
int err;

err = mlx5_eswitch_add_vlan_action(esw, attr);
if (err)
return ERR_PTR(err);

return mlx5_eswitch_add_offloaded_rule(esw, spec, attr);
}

static void mlx5e_tc_del_flow(struct mlx5e_priv *priv,
struct mlx5_flow_rule *rule)
struct mlx5_flow_rule *rule,
struct mlx5_esw_flow_attr *attr)
{
struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
struct mlx5_fc *counter = NULL;

counter = mlx5_flow_rule_counter(rule);

if (esw && esw->mode == SRIOV_OFFLOADS)
mlx5_eswitch_del_vlan_action(esw, attr);

mlx5_del_flow_rule(rule);

mlx5_fc_destroy(priv->mdev, counter);
Expand Down Expand Up @@ -369,13 +379,9 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,

tcf_exts_to_list(exts, &actions);
list_for_each_entry(a, &actions, list) {
/* Only support a single action per rule */
if (attr->action)
return -EINVAL;

if (is_tcf_gact_shot(a)) {
attr->action = MLX5_FLOW_CONTEXT_ACTION_DROP |
MLX5_FLOW_CONTEXT_ACTION_COUNT;
attr->action |= MLX5_FLOW_CONTEXT_ACTION_DROP |
MLX5_FLOW_CONTEXT_ACTION_COUNT;
continue;
}

Expand All @@ -392,12 +398,25 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
return -EINVAL;
}

attr->action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
attr->action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
out_priv = netdev_priv(out_dev);
attr->out_rep = out_priv->ppriv;
continue;
}

if (is_tcf_vlan(a)) {
if (tcf_vlan_action(a) == VLAN_F_POP) {
attr->action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_POP;
} else if (tcf_vlan_action(a) == VLAN_F_PUSH) {
if (tcf_vlan_push_proto(a) != htons(ETH_P_8021Q))
return -EOPNOTSUPP;

attr->action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH;
attr->vlan = tcf_vlan_push_vid(a);
}
continue;
}

return -EINVAL;
}
return 0;
Expand All @@ -413,6 +432,7 @@ int mlx5e_configure_flower(struct mlx5e_priv *priv, __be16 protocol,
struct mlx5e_tc_flow *flow;
struct mlx5_flow_spec *spec;
struct mlx5_flow_rule *old = NULL;
struct mlx5_esw_flow_attr *old_attr;
struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;

if (esw && esw->mode == SRIOV_OFFLOADS)
Expand All @@ -422,6 +442,7 @@ int mlx5e_configure_flower(struct mlx5e_priv *priv, __be16 protocol,
tc->ht_params);
if (flow) {
old = flow->rule;
old_attr = flow->attr;
} else {
if (fdb_flow)
flow = kzalloc(sizeof(*flow) + sizeof(struct mlx5_esw_flow_attr),
Expand Down Expand Up @@ -466,7 +487,7 @@ int mlx5e_configure_flower(struct mlx5e_priv *priv, __be16 protocol,
goto err_del_rule;

if (old)
mlx5e_tc_del_flow(priv, old);
mlx5e_tc_del_flow(priv, old, old_attr);

goto out;

Expand Down Expand Up @@ -494,7 +515,7 @@ int mlx5e_delete_flower(struct mlx5e_priv *priv,

rhashtable_remove_fast(&tc->ht, &flow->node, tc->ht_params);

mlx5e_tc_del_flow(priv, flow->rule);
mlx5e_tc_del_flow(priv, flow->rule, flow->attr);

kfree(flow);

Expand Down Expand Up @@ -551,7 +572,7 @@ static void _mlx5e_tc_del_flow(void *ptr, void *arg)
struct mlx5e_tc_flow *flow = ptr;
struct mlx5e_priv *priv = arg;

mlx5e_tc_del_flow(priv, flow->rule);
mlx5e_tc_del_flow(priv, flow->rule, flow->attr);
kfree(flow);
}

Expand Down

0 comments on commit 8b32580

Please sign in to comment.