1 /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 2 /* Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. */ 3 4 #ifndef __MLX5_EN_TC_ACT_H__ 5 #define __MLX5_EN_TC_ACT_H__ 6 7 #include <net/tc_act/tc_pedit.h> 8 #include <net/flow_offload.h> 9 #include <linux/netlink.h> 10 #include "eswitch.h" 11 #include "pedit.h" 12 13 struct mlx5_flow_attr; 14 15 struct mlx5e_tc_act_parse_state { 16 unsigned int num_actions; 17 struct mlx5e_tc_flow *flow; 18 struct netlink_ext_ack *extack; 19 bool encap; 20 bool decap; 21 bool mpls_push; 22 bool ptype_host; 23 const struct ip_tunnel_info *tun_info; 24 struct pedit_headers_action hdrs[__PEDIT_CMD_MAX]; 25 int ifindexes[MLX5_MAX_FLOW_FWD_VPORTS]; 26 int if_count; 27 struct mlx5_tc_ct_priv *ct_priv; 28 }; 29 30 struct mlx5e_tc_act { 31 bool (*can_offload)(struct mlx5e_tc_act_parse_state *parse_state, 32 const struct flow_action_entry *act, 33 int act_index); 34 35 int (*parse_action)(struct mlx5e_tc_act_parse_state *parse_state, 36 const struct flow_action_entry *act, 37 struct mlx5e_priv *priv, 38 struct mlx5_flow_attr *attr); 39 40 int (*post_parse)(struct mlx5e_tc_act_parse_state *parse_state, 41 struct mlx5e_priv *priv, 42 struct mlx5_flow_attr *attr); 43 }; 44 45 extern struct mlx5e_tc_act mlx5e_tc_act_drop; 46 extern struct mlx5e_tc_act mlx5e_tc_act_trap; 47 extern struct mlx5e_tc_act mlx5e_tc_act_accept; 48 extern struct mlx5e_tc_act mlx5e_tc_act_mark; 49 extern struct mlx5e_tc_act mlx5e_tc_act_goto; 50 extern struct mlx5e_tc_act mlx5e_tc_act_tun_encap; 51 extern struct mlx5e_tc_act mlx5e_tc_act_tun_decap; 52 extern struct mlx5e_tc_act mlx5e_tc_act_csum; 53 extern struct mlx5e_tc_act mlx5e_tc_act_pedit; 54 extern struct mlx5e_tc_act mlx5e_tc_act_vlan; 55 extern struct mlx5e_tc_act mlx5e_tc_act_vlan_mangle; 56 extern struct mlx5e_tc_act mlx5e_tc_act_mpls_push; 57 extern struct mlx5e_tc_act mlx5e_tc_act_mpls_pop; 58 extern struct mlx5e_tc_act mlx5e_tc_act_mirred; 59 extern struct mlx5e_tc_act mlx5e_tc_act_mirred_nic; 60 extern struct mlx5e_tc_act mlx5e_tc_act_ct; 61 extern struct mlx5e_tc_act mlx5e_tc_act_sample; 62 extern struct mlx5e_tc_act mlx5e_tc_act_ptype; 63 extern struct mlx5e_tc_act mlx5e_tc_act_redirect_ingress; 64 65 struct mlx5e_tc_act * 66 mlx5e_tc_act_get(enum flow_action_id act_id, 67 enum mlx5_flow_namespace_type ns_type); 68 69 void 70 mlx5e_tc_act_init_parse_state(struct mlx5e_tc_act_parse_state *parse_state, 71 struct mlx5e_tc_flow *flow, 72 struct flow_action *flow_action, 73 struct netlink_ext_ack *extack); 74 75 #endif /* __MLX5_EN_TC_ACT_H__ */ 76