net/mlx5e: Support VLAN modify action
Support VLAN modify action by emulating a rewrite action for the VLAN fields. Currently, the only supported field is the vid. The prio in the action must be set to 0 to indicate no change. Signed-off-by: Eli Britstein <elibr@mellanox.com> Reviewed-by: Roi Dayan <roid@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
0eb69bb996
commit
bdc837eecf
@ -2249,6 +2249,35 @@ static bool same_hw_devs(struct mlx5e_priv *priv, struct mlx5e_priv *peer_priv)
|
||||
return (fsystem_guid == psystem_guid);
|
||||
}
|
||||
|
||||
static int add_vlan_rewrite_action(struct mlx5e_priv *priv, int namespace,
|
||||
const struct flow_action_entry *act,
|
||||
struct mlx5e_tc_flow_parse_attr *parse_attr,
|
||||
struct pedit_headers_action *hdrs,
|
||||
u32 *action, struct netlink_ext_ack *extack)
|
||||
{
|
||||
u16 mask16 = VLAN_VID_MASK;
|
||||
u16 val16 = act->vlan.vid & VLAN_VID_MASK;
|
||||
const struct flow_action_entry pedit_act = {
|
||||
.id = FLOW_ACTION_MANGLE,
|
||||
.mangle.htype = FLOW_ACT_MANGLE_HDR_TYPE_ETH,
|
||||
.mangle.offset = offsetof(struct vlan_ethhdr, h_vlan_TCI),
|
||||
.mangle.mask = ~(u32)be16_to_cpu(*(__be16 *)&mask16),
|
||||
.mangle.val = (u32)be16_to_cpu(*(__be16 *)&val16),
|
||||
};
|
||||
int err;
|
||||
|
||||
if (act->vlan.prio) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Setting VLAN prio is not supported");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
err = parse_tc_pedit_action(priv, &pedit_act, namespace, parse_attr,
|
||||
hdrs, NULL);
|
||||
*action |= MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int parse_tc_nic_actions(struct mlx5e_priv *priv,
|
||||
struct flow_action *flow_action,
|
||||
struct mlx5e_tc_flow_parse_attr *parse_attr,
|
||||
@ -2284,6 +2313,15 @@ static int parse_tc_nic_actions(struct mlx5e_priv *priv,
|
||||
action |= MLX5_FLOW_CONTEXT_ACTION_MOD_HDR |
|
||||
MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
|
||||
break;
|
||||
case FLOW_ACTION_VLAN_MANGLE:
|
||||
err = add_vlan_rewrite_action(priv,
|
||||
MLX5_FLOW_NAMESPACE_KERNEL,
|
||||
act, parse_attr, hdrs,
|
||||
&action, extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
break;
|
||||
case FLOW_ACTION_CSUM:
|
||||
if (csum_offload_supported(priv, action,
|
||||
act->csum_flags,
|
||||
@ -2492,8 +2530,7 @@ static int parse_tc_vlan_action(struct mlx5e_priv *priv,
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* action is FLOW_ACT_VLAN_MANGLE */
|
||||
return -EOPNOTSUPP;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
attr->total_vlan = vlan_idx + 1;
|
||||
@ -2631,6 +2668,16 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
attr->split_count = attr->out_count;
|
||||
break;
|
||||
case FLOW_ACTION_VLAN_MANGLE:
|
||||
err = add_vlan_rewrite_action(priv,
|
||||
MLX5_FLOW_NAMESPACE_FDB,
|
||||
act, parse_attr, hdrs,
|
||||
&action, extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
attr->split_count = attr->out_count;
|
||||
break;
|
||||
case FLOW_ACTION_TUNNEL_DECAP:
|
||||
|
Loading…
Reference in New Issue
Block a user