Loading drivers/net/ethernet/mellanox/mlx5/core/Makefile +2 −1 Original line number Diff line number Diff line Loading @@ -48,7 +48,8 @@ mlx5_core-$(CONFIG_MLX5_CLS_ACT) += en_tc.o en/rep/tc.o en/rep/neigh.o \ en/tc/post_act.o en/tc/int_port.o mlx5_core-$(CONFIG_MLX5_CLS_ACT) += en/tc/act/act.o en/tc/act/drop.o en/tc/act/trap.o \ en/tc/act/accept.o en/tc/act/mark.o en/tc/act/goto.o en/tc/act/accept.o en/tc/act/mark.o en/tc/act/goto.o \ en/tc/act/tun.o mlx5_core-$(CONFIG_MLX5_TC_CT) += en/tc_ct.o mlx5_core-$(CONFIG_MLX5_TC_SAMPLE) += en/tc/sample.o Loading drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/act.c +9 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,15 @@ static struct mlx5e_tc_act *tc_acts_fdb[NUM_FLOW_ACTIONS] = { &mlx5e_tc_act_drop, &mlx5e_tc_act_trap, &mlx5e_tc_act_goto, NULL, /* FLOW_ACTION_REDIRECT, */ NULL, /* FLOW_ACTION_MIRRED, */ NULL, /* FLOW_ACTION_REDIRECT_INGRESS, */ NULL, /* FLOW_ACTION_MIRRED_INGRESS, */ NULL, /* FLOW_ACTION_VLAN_PUSH, */ NULL, /* FLOW_ACTION_VLAN_POP, */ NULL, /* FLOW_ACTION_VLAN_MANGLE, */ &mlx5e_tc_act_tun_encap, &mlx5e_tc_act_tun_decap, }; /* Must be aligned with enum flow_action_id. */ Loading drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/act.h +5 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,9 @@ struct mlx5e_tc_act_parse_state { unsigned int num_actions; struct mlx5e_tc_flow *flow; struct netlink_ext_ack *extack; bool encap; bool decap; const struct ip_tunnel_info *tun_info; }; struct mlx5e_tc_act { Loading @@ -32,6 +35,8 @@ extern struct mlx5e_tc_act mlx5e_tc_act_trap; extern struct mlx5e_tc_act mlx5e_tc_act_accept; extern struct mlx5e_tc_act mlx5e_tc_act_mark; extern struct mlx5e_tc_act mlx5e_tc_act_goto; extern struct mlx5e_tc_act mlx5e_tc_act_tun_encap; extern struct mlx5e_tc_act mlx5e_tc_act_tun_decap; struct mlx5e_tc_act * mlx5e_tc_act_get(enum flow_action_id act_id, Loading drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/tun.c 0 → 100644 +61 −0 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB // Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. #include "act.h" #include "en/tc_tun_encap.h" #include "en/tc_priv.h" static bool tc_act_can_offload_tun_encap(struct mlx5e_tc_act_parse_state *parse_state, const struct flow_action_entry *act, int act_index) { if (!act->tunnel) { NL_SET_ERR_MSG_MOD(parse_state->extack, "Zero tunnel attributes is not supported"); return false; } return true; } static int tc_act_parse_tun_encap(struct mlx5e_tc_act_parse_state *parse_state, const struct flow_action_entry *act, struct mlx5e_priv *priv, struct mlx5_flow_attr *attr) { parse_state->tun_info = act->tunnel; parse_state->encap = true; return 0; } static bool tc_act_can_offload_tun_decap(struct mlx5e_tc_act_parse_state *parse_state, const struct flow_action_entry *act, int act_index) { return true; } static int tc_act_parse_tun_decap(struct mlx5e_tc_act_parse_state *parse_state, const struct flow_action_entry *act, struct mlx5e_priv *priv, struct mlx5_flow_attr *attr) { parse_state->decap = true; return 0; } struct mlx5e_tc_act mlx5e_tc_act_tun_encap = { .can_offload = tc_act_can_offload_tun_encap, .parse_action = tc_act_parse_tun_encap, }; struct mlx5e_tc_act mlx5e_tc_act_tun_decap = { .can_offload = tc_act_can_offload_tun_decap, .parse_action = tc_act_parse_tun_decap, }; drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +4 −20 Original line number Diff line number Diff line Loading @@ -3819,14 +3819,12 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct mlx5e_tc_flow_parse_attr *parse_attr; struct mlx5e_rep_priv *rpriv = priv->ppriv; struct mlx5e_sample_attr sample_attr = {}; const struct ip_tunnel_info *info = NULL; struct mlx5_flow_attr *attr = flow->attr; int ifindexes[MLX5_MAX_FLOW_FWD_VPORTS]; bool ft_flow = mlx5e_is_ft_flow(flow); enum mlx5_flow_namespace_type ns_type; const struct flow_action_entry *act; struct mlx5_esw_flow_attr *esw_attr; bool encap = false, decap = false; struct mlx5e_tc_act *tc_act; int err, i, if_count = 0; bool ptype_host = false; Loading Loading @@ -3985,14 +3983,14 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, attr->action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | MLX5_FLOW_CONTEXT_ACTION_COUNT; if (encap) { if (parse_state->encap) { parse_attr->mirred_ifindex[esw_attr->out_count] = out_dev->ifindex; parse_attr->tun_info[esw_attr->out_count] = mlx5e_dup_tun_info(info); mlx5e_dup_tun_info(parse_state->tun_info); if (!parse_attr->tun_info[esw_attr->out_count]) return -ENOMEM; encap = false; parse_state->encap = false; esw_attr->dests[esw_attr->out_count].flags |= MLX5_ESW_DEST_ENCAP; esw_attr->out_count++; Loading Loading @@ -4080,17 +4078,6 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, return -EOPNOTSUPP; } } break; case FLOW_ACTION_TUNNEL_ENCAP: info = act->tunnel; if (info) { encap = true; } else { NL_SET_ERR_MSG_MOD(extack, "Zero tunnel attributes is not supported"); return -EOPNOTSUPP; } break; case FLOW_ACTION_VLAN_PUSH: case FLOW_ACTION_VLAN_POP: Loading Loading @@ -4121,9 +4108,6 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, esw_attr->split_count = esw_attr->out_count; break; case FLOW_ACTION_TUNNEL_DECAP: decap = true; break; case FLOW_ACTION_CT: if (flow_flag_test(flow, SAMPLE)) { NL_SET_ERR_MSG_MOD(extack, "Sample action with connection tracking is not supported"); Loading Loading @@ -4194,7 +4178,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, if (!actions_match_supported(priv, flow_action, parse_attr, flow, extack)) return -EOPNOTSUPP; if (attr->dest_chain && decap) { if (attr->dest_chain && parse_state->decap) { /* It can be supported if we'll create a mapping for * the tunnel device only (without tunnel), and set * this tunnel id with this decap flow. Loading Loading
drivers/net/ethernet/mellanox/mlx5/core/Makefile +2 −1 Original line number Diff line number Diff line Loading @@ -48,7 +48,8 @@ mlx5_core-$(CONFIG_MLX5_CLS_ACT) += en_tc.o en/rep/tc.o en/rep/neigh.o \ en/tc/post_act.o en/tc/int_port.o mlx5_core-$(CONFIG_MLX5_CLS_ACT) += en/tc/act/act.o en/tc/act/drop.o en/tc/act/trap.o \ en/tc/act/accept.o en/tc/act/mark.o en/tc/act/goto.o en/tc/act/accept.o en/tc/act/mark.o en/tc/act/goto.o \ en/tc/act/tun.o mlx5_core-$(CONFIG_MLX5_TC_CT) += en/tc_ct.o mlx5_core-$(CONFIG_MLX5_TC_SAMPLE) += en/tc/sample.o Loading
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/act.c +9 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,15 @@ static struct mlx5e_tc_act *tc_acts_fdb[NUM_FLOW_ACTIONS] = { &mlx5e_tc_act_drop, &mlx5e_tc_act_trap, &mlx5e_tc_act_goto, NULL, /* FLOW_ACTION_REDIRECT, */ NULL, /* FLOW_ACTION_MIRRED, */ NULL, /* FLOW_ACTION_REDIRECT_INGRESS, */ NULL, /* FLOW_ACTION_MIRRED_INGRESS, */ NULL, /* FLOW_ACTION_VLAN_PUSH, */ NULL, /* FLOW_ACTION_VLAN_POP, */ NULL, /* FLOW_ACTION_VLAN_MANGLE, */ &mlx5e_tc_act_tun_encap, &mlx5e_tc_act_tun_decap, }; /* Must be aligned with enum flow_action_id. */ Loading
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/act.h +5 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,9 @@ struct mlx5e_tc_act_parse_state { unsigned int num_actions; struct mlx5e_tc_flow *flow; struct netlink_ext_ack *extack; bool encap; bool decap; const struct ip_tunnel_info *tun_info; }; struct mlx5e_tc_act { Loading @@ -32,6 +35,8 @@ extern struct mlx5e_tc_act mlx5e_tc_act_trap; extern struct mlx5e_tc_act mlx5e_tc_act_accept; extern struct mlx5e_tc_act mlx5e_tc_act_mark; extern struct mlx5e_tc_act mlx5e_tc_act_goto; extern struct mlx5e_tc_act mlx5e_tc_act_tun_encap; extern struct mlx5e_tc_act mlx5e_tc_act_tun_decap; struct mlx5e_tc_act * mlx5e_tc_act_get(enum flow_action_id act_id, Loading
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/tun.c 0 → 100644 +61 −0 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB // Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. #include "act.h" #include "en/tc_tun_encap.h" #include "en/tc_priv.h" static bool tc_act_can_offload_tun_encap(struct mlx5e_tc_act_parse_state *parse_state, const struct flow_action_entry *act, int act_index) { if (!act->tunnel) { NL_SET_ERR_MSG_MOD(parse_state->extack, "Zero tunnel attributes is not supported"); return false; } return true; } static int tc_act_parse_tun_encap(struct mlx5e_tc_act_parse_state *parse_state, const struct flow_action_entry *act, struct mlx5e_priv *priv, struct mlx5_flow_attr *attr) { parse_state->tun_info = act->tunnel; parse_state->encap = true; return 0; } static bool tc_act_can_offload_tun_decap(struct mlx5e_tc_act_parse_state *parse_state, const struct flow_action_entry *act, int act_index) { return true; } static int tc_act_parse_tun_decap(struct mlx5e_tc_act_parse_state *parse_state, const struct flow_action_entry *act, struct mlx5e_priv *priv, struct mlx5_flow_attr *attr) { parse_state->decap = true; return 0; } struct mlx5e_tc_act mlx5e_tc_act_tun_encap = { .can_offload = tc_act_can_offload_tun_encap, .parse_action = tc_act_parse_tun_encap, }; struct mlx5e_tc_act mlx5e_tc_act_tun_decap = { .can_offload = tc_act_can_offload_tun_decap, .parse_action = tc_act_parse_tun_decap, };
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +4 −20 Original line number Diff line number Diff line Loading @@ -3819,14 +3819,12 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct mlx5e_tc_flow_parse_attr *parse_attr; struct mlx5e_rep_priv *rpriv = priv->ppriv; struct mlx5e_sample_attr sample_attr = {}; const struct ip_tunnel_info *info = NULL; struct mlx5_flow_attr *attr = flow->attr; int ifindexes[MLX5_MAX_FLOW_FWD_VPORTS]; bool ft_flow = mlx5e_is_ft_flow(flow); enum mlx5_flow_namespace_type ns_type; const struct flow_action_entry *act; struct mlx5_esw_flow_attr *esw_attr; bool encap = false, decap = false; struct mlx5e_tc_act *tc_act; int err, i, if_count = 0; bool ptype_host = false; Loading Loading @@ -3985,14 +3983,14 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, attr->action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | MLX5_FLOW_CONTEXT_ACTION_COUNT; if (encap) { if (parse_state->encap) { parse_attr->mirred_ifindex[esw_attr->out_count] = out_dev->ifindex; parse_attr->tun_info[esw_attr->out_count] = mlx5e_dup_tun_info(info); mlx5e_dup_tun_info(parse_state->tun_info); if (!parse_attr->tun_info[esw_attr->out_count]) return -ENOMEM; encap = false; parse_state->encap = false; esw_attr->dests[esw_attr->out_count].flags |= MLX5_ESW_DEST_ENCAP; esw_attr->out_count++; Loading Loading @@ -4080,17 +4078,6 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, return -EOPNOTSUPP; } } break; case FLOW_ACTION_TUNNEL_ENCAP: info = act->tunnel; if (info) { encap = true; } else { NL_SET_ERR_MSG_MOD(extack, "Zero tunnel attributes is not supported"); return -EOPNOTSUPP; } break; case FLOW_ACTION_VLAN_PUSH: case FLOW_ACTION_VLAN_POP: Loading Loading @@ -4121,9 +4108,6 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, esw_attr->split_count = esw_attr->out_count; break; case FLOW_ACTION_TUNNEL_DECAP: decap = true; break; case FLOW_ACTION_CT: if (flow_flag_test(flow, SAMPLE)) { NL_SET_ERR_MSG_MOD(extack, "Sample action with connection tracking is not supported"); Loading Loading @@ -4194,7 +4178,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, if (!actions_match_supported(priv, flow_action, parse_attr, flow, extack)) return -EOPNOTSUPP; if (attr->dest_chain && decap) { if (attr->dest_chain && parse_state->decap) { /* It can be supported if we'll create a mapping for * the tunnel device only (without tunnel), and set * this tunnel id with this decap flow. Loading