Loading drivers/net/ethernet/mellanox/mlx5/core/Makefile +2 −1 Original line number Diff line number Diff line Loading @@ -51,7 +51,8 @@ mlx5_core-$(CONFIG_MLX5_CLS_ACT) += en/tc/act/act.o en/tc/act/drop.o en/tc/a en/tc/act/accept.o en/tc/act/mark.o en/tc/act/goto.o \ en/tc/act/tun.o en/tc/act/csum.o en/tc/act/pedit.o \ en/tc/act/vlan.o en/tc/act/vlan_mangle.o en/tc/act/mpls.o \ en/tc/act/mirred.o en/tc/act/mirred_nic.o en/tc/act/mirred.o en/tc/act/mirred_nic.o \ en/tc/act/ct.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 +8 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ static struct mlx5e_tc_act *tc_acts_fdb[NUM_FLOW_ACTIONS] = { NULL, /* FLOW_ACTION_QUEUE, */ NULL, /* FLOW_ACTION_SAMPLE, */ NULL, /* FLOW_ACTION_POLICE, */ NULL, /* FLOW_ACTION_CT, */ &mlx5e_tc_act_ct, NULL, /* FLOW_ACTION_CT_METADATA, */ &mlx5e_tc_act_mpls_push, &mlx5e_tc_act_mpls_pop, Loading @@ -55,6 +55,13 @@ static struct mlx5e_tc_act *tc_acts_nic[NUM_FLOW_ACTIONS] = { &mlx5e_tc_act_pedit, &mlx5e_tc_act_csum, &mlx5e_tc_act_mark, NULL, /* FLOW_ACTION_PTYPE, */ NULL, /* FLOW_ACTION_PRIORITY, */ NULL, /* FLOW_ACTION_WAKE, */ NULL, /* FLOW_ACTION_QUEUE, */ NULL, /* FLOW_ACTION_SAMPLE, */ NULL, /* FLOW_ACTION_POLICE, */ &mlx5e_tc_act_ct, }; /** Loading drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/act.h +2 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ struct mlx5e_tc_act_parse_state { struct pedit_headers_action hdrs[__PEDIT_CMD_MAX]; int ifindexes[MLX5_MAX_FLOW_FWD_VPORTS]; int if_count; struct mlx5_tc_ct_priv *ct_priv; }; struct mlx5e_tc_act { Loading Loading @@ -51,6 +52,7 @@ extern struct mlx5e_tc_act mlx5e_tc_act_mpls_push; extern struct mlx5e_tc_act mlx5e_tc_act_mpls_pop; extern struct mlx5e_tc_act mlx5e_tc_act_mirred; extern struct mlx5e_tc_act mlx5e_tc_act_mirred_nic; extern struct mlx5e_tc_act mlx5e_tc_act_ct; struct mlx5e_tc_act * mlx5e_tc_act_get(enum flow_action_id act_id, Loading drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/ct.c 0 → 100644 +50 −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_priv.h" #include "en/tc_ct.h" static bool tc_act_can_offload_ct(struct mlx5e_tc_act_parse_state *parse_state, const struct flow_action_entry *act, int act_index) { struct netlink_ext_ack *extack = parse_state->extack; if (flow_flag_test(parse_state->flow, SAMPLE)) { NL_SET_ERR_MSG_MOD(extack, "Sample action with connection tracking is not supported"); return false; } return true; } static int tc_act_parse_ct(struct mlx5e_tc_act_parse_state *parse_state, const struct flow_action_entry *act, struct mlx5e_priv *priv, struct mlx5_flow_attr *attr) { int err; err = mlx5_tc_ct_parse_action(parse_state->ct_priv, attr, &attr->parse_attr->mod_hdr_acts, act, parse_state->extack); if (err) return err; flow_flag_set(parse_state->flow, CT); if (mlx5e_is_eswitch_flow(parse_state->flow)) attr->esw_attr->split_count = attr->esw_attr->out_count; return 0; } struct mlx5e_tc_act mlx5e_tc_act_ct = { .can_offload = tc_act_can_offload_ct, .parse_action = tc_act_parse_ct, }; drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +2 −28 Original line number Diff line number Diff line Loading @@ -3219,24 +3219,11 @@ parse_tc_nic_actions(struct mlx5e_priv *priv, parse_attr = attr->parse_attr; parse_state = &parse_attr->parse_state; mlx5e_tc_act_init_parse_state(parse_state, flow, flow_action, extack); parse_state->ct_priv = get_ct_priv(priv); ns_type = mlx5e_get_flow_namespace(flow); hdrs = parse_state->hdrs; flow_action_for_each(i, act, flow_action) { switch (act->id) { case FLOW_ACTION_CT: err = mlx5_tc_ct_parse_action(get_ct_priv(priv), attr, &parse_attr->mod_hdr_acts, act, extack); if (err) return err; flow_flag_set(flow, CT); break; default: break; } tc_act = mlx5e_tc_act_get(act->id, ns_type); if (!tc_act) { NL_SET_ERR_MSG_MOD(extack, "Not implemented offload action"); Loading Loading @@ -3377,6 +3364,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, parse_attr = attr->parse_attr; parse_state = &parse_attr->parse_state; mlx5e_tc_act_init_parse_state(parse_state, flow, flow_action, extack); parse_state->ct_priv = get_ct_priv(priv); ns_type = mlx5e_get_flow_namespace(flow); hdrs = parse_state->hdrs; Loading Loading @@ -3435,20 +3423,6 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, 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"); return -EOPNOTSUPP; } err = mlx5_tc_ct_parse_action(get_ct_priv(priv), attr, &parse_attr->mod_hdr_acts, act, extack); if (err) return err; flow_flag_set(flow, CT); esw_attr->split_count = esw_attr->out_count; break; case FLOW_ACTION_SAMPLE: if (flow_flag_test(flow, CT)) { NL_SET_ERR_MSG_MOD(extack, "Sample action with connection tracking is not supported"); Loading Loading
drivers/net/ethernet/mellanox/mlx5/core/Makefile +2 −1 Original line number Diff line number Diff line Loading @@ -51,7 +51,8 @@ mlx5_core-$(CONFIG_MLX5_CLS_ACT) += en/tc/act/act.o en/tc/act/drop.o en/tc/a en/tc/act/accept.o en/tc/act/mark.o en/tc/act/goto.o \ en/tc/act/tun.o en/tc/act/csum.o en/tc/act/pedit.o \ en/tc/act/vlan.o en/tc/act/vlan_mangle.o en/tc/act/mpls.o \ en/tc/act/mirred.o en/tc/act/mirred_nic.o en/tc/act/mirred.o en/tc/act/mirred_nic.o \ en/tc/act/ct.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 +8 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ static struct mlx5e_tc_act *tc_acts_fdb[NUM_FLOW_ACTIONS] = { NULL, /* FLOW_ACTION_QUEUE, */ NULL, /* FLOW_ACTION_SAMPLE, */ NULL, /* FLOW_ACTION_POLICE, */ NULL, /* FLOW_ACTION_CT, */ &mlx5e_tc_act_ct, NULL, /* FLOW_ACTION_CT_METADATA, */ &mlx5e_tc_act_mpls_push, &mlx5e_tc_act_mpls_pop, Loading @@ -55,6 +55,13 @@ static struct mlx5e_tc_act *tc_acts_nic[NUM_FLOW_ACTIONS] = { &mlx5e_tc_act_pedit, &mlx5e_tc_act_csum, &mlx5e_tc_act_mark, NULL, /* FLOW_ACTION_PTYPE, */ NULL, /* FLOW_ACTION_PRIORITY, */ NULL, /* FLOW_ACTION_WAKE, */ NULL, /* FLOW_ACTION_QUEUE, */ NULL, /* FLOW_ACTION_SAMPLE, */ NULL, /* FLOW_ACTION_POLICE, */ &mlx5e_tc_act_ct, }; /** Loading
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/act.h +2 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ struct mlx5e_tc_act_parse_state { struct pedit_headers_action hdrs[__PEDIT_CMD_MAX]; int ifindexes[MLX5_MAX_FLOW_FWD_VPORTS]; int if_count; struct mlx5_tc_ct_priv *ct_priv; }; struct mlx5e_tc_act { Loading Loading @@ -51,6 +52,7 @@ extern struct mlx5e_tc_act mlx5e_tc_act_mpls_push; extern struct mlx5e_tc_act mlx5e_tc_act_mpls_pop; extern struct mlx5e_tc_act mlx5e_tc_act_mirred; extern struct mlx5e_tc_act mlx5e_tc_act_mirred_nic; extern struct mlx5e_tc_act mlx5e_tc_act_ct; struct mlx5e_tc_act * mlx5e_tc_act_get(enum flow_action_id act_id, Loading
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/ct.c 0 → 100644 +50 −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_priv.h" #include "en/tc_ct.h" static bool tc_act_can_offload_ct(struct mlx5e_tc_act_parse_state *parse_state, const struct flow_action_entry *act, int act_index) { struct netlink_ext_ack *extack = parse_state->extack; if (flow_flag_test(parse_state->flow, SAMPLE)) { NL_SET_ERR_MSG_MOD(extack, "Sample action with connection tracking is not supported"); return false; } return true; } static int tc_act_parse_ct(struct mlx5e_tc_act_parse_state *parse_state, const struct flow_action_entry *act, struct mlx5e_priv *priv, struct mlx5_flow_attr *attr) { int err; err = mlx5_tc_ct_parse_action(parse_state->ct_priv, attr, &attr->parse_attr->mod_hdr_acts, act, parse_state->extack); if (err) return err; flow_flag_set(parse_state->flow, CT); if (mlx5e_is_eswitch_flow(parse_state->flow)) attr->esw_attr->split_count = attr->esw_attr->out_count; return 0; } struct mlx5e_tc_act mlx5e_tc_act_ct = { .can_offload = tc_act_can_offload_ct, .parse_action = tc_act_parse_ct, };
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +2 −28 Original line number Diff line number Diff line Loading @@ -3219,24 +3219,11 @@ parse_tc_nic_actions(struct mlx5e_priv *priv, parse_attr = attr->parse_attr; parse_state = &parse_attr->parse_state; mlx5e_tc_act_init_parse_state(parse_state, flow, flow_action, extack); parse_state->ct_priv = get_ct_priv(priv); ns_type = mlx5e_get_flow_namespace(flow); hdrs = parse_state->hdrs; flow_action_for_each(i, act, flow_action) { switch (act->id) { case FLOW_ACTION_CT: err = mlx5_tc_ct_parse_action(get_ct_priv(priv), attr, &parse_attr->mod_hdr_acts, act, extack); if (err) return err; flow_flag_set(flow, CT); break; default: break; } tc_act = mlx5e_tc_act_get(act->id, ns_type); if (!tc_act) { NL_SET_ERR_MSG_MOD(extack, "Not implemented offload action"); Loading Loading @@ -3377,6 +3364,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, parse_attr = attr->parse_attr; parse_state = &parse_attr->parse_state; mlx5e_tc_act_init_parse_state(parse_state, flow, flow_action, extack); parse_state->ct_priv = get_ct_priv(priv); ns_type = mlx5e_get_flow_namespace(flow); hdrs = parse_state->hdrs; Loading Loading @@ -3435,20 +3423,6 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, 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"); return -EOPNOTSUPP; } err = mlx5_tc_ct_parse_action(get_ct_priv(priv), attr, &parse_attr->mod_hdr_acts, act, extack); if (err) return err; flow_flag_set(flow, CT); esw_attr->split_count = esw_attr->out_count; break; case FLOW_ACTION_SAMPLE: if (flow_flag_test(flow, CT)) { NL_SET_ERR_MSG_MOD(extack, "Sample action with connection tracking is not supported"); Loading