14c3844d9SPaul Blakey /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
24c3844d9SPaul Blakey /* Copyright (c) 2018 Mellanox Technologies. */
34c3844d9SPaul Blakey 
44c3844d9SPaul Blakey #ifndef __MLX5_EN_TC_CT_H__
54c3844d9SPaul Blakey #define __MLX5_EN_TC_CT_H__
64c3844d9SPaul Blakey 
74c3844d9SPaul Blakey #include <net/pkt_cls.h>
84c3844d9SPaul Blakey #include <linux/mlx5/fs.h>
94c3844d9SPaul Blakey #include <net/tc_act/tc_ct.h>
104c3844d9SPaul Blakey 
113cfc4332SPaul Blakey #include "en.h"
123cfc4332SPaul Blakey 
13c620b772SAriel Levkovich struct mlx5_flow_attr;
141ef3018fSPaul Blakey struct mlx5e_tc_mod_hdr_acts;
154c3844d9SPaul Blakey struct mlx5_rep_uplink_priv;
164c3844d9SPaul Blakey struct mlx5e_tc_flow;
174c3844d9SPaul Blakey struct mlx5e_priv;
184c3844d9SPaul Blakey 
19aedd133dSAriel Levkovich struct mlx5_fs_chains;
20aedd133dSAriel Levkovich struct mlx5_tc_ct_priv;
214c3844d9SPaul Blakey struct mlx5_ct_flow;
224c3844d9SPaul Blakey 
23ac991b48SPaul Blakey struct nf_flowtable;
24ac991b48SPaul Blakey 
254c3844d9SPaul Blakey struct mlx5_ct_attr {
264c3844d9SPaul Blakey 	u16 zone;
274c3844d9SPaul Blakey 	u16 ct_action;
28ac991b48SPaul Blakey 	struct nf_flowtable *nf_ft;
2954b154ecSEli Britstein 	u32 ct_labels_id;
3067027828SPaul Blakey 	u32 act_miss_mapping;
3167027828SPaul Blakey 	u64 act_miss_cookie;
32*f7a48511SYevgeny Kliteynik 	bool offloaded;
3308fe94ecSPaul Blakey 	struct mlx5_ct_ft *ft;
344c3844d9SPaul Blakey };
354c3844d9SPaul Blakey 
364c3844d9SPaul Blakey #define zone_to_reg_ct {\
374c3844d9SPaul Blakey 	.mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_2,\
384c3844d9SPaul Blakey 	.moffset = 0,\
39ed2fe7baSPaul Blakey 	.mlen = 16,\
404c3844d9SPaul Blakey 	.soffset = MLX5_BYTE_OFF(fte_match_param,\
41ed2fe7baSPaul Blakey 				 misc_parameters_2.metadata_reg_c_2),\
424c3844d9SPaul Blakey }
434c3844d9SPaul Blakey 
444c3844d9SPaul Blakey #define ctstate_to_reg_ct {\
454c3844d9SPaul Blakey 	.mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_2,\
46ed2fe7baSPaul Blakey 	.moffset = 16,\
47ed2fe7baSPaul Blakey 	.mlen = 16,\
484c3844d9SPaul Blakey 	.soffset = MLX5_BYTE_OFF(fte_match_param,\
494c3844d9SPaul Blakey 				 misc_parameters_2.metadata_reg_c_2),\
504c3844d9SPaul Blakey }
514c3844d9SPaul Blakey 
524c3844d9SPaul Blakey #define mark_to_reg_ct {\
534c3844d9SPaul Blakey 	.mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_3,\
544c3844d9SPaul Blakey 	.moffset = 0,\
55ed2fe7baSPaul Blakey 	.mlen = 32,\
564c3844d9SPaul Blakey 	.soffset = MLX5_BYTE_OFF(fte_match_param,\
574c3844d9SPaul Blakey 				 misc_parameters_2.metadata_reg_c_3),\
584c3844d9SPaul Blakey }
594c3844d9SPaul Blakey 
604c3844d9SPaul Blakey #define labels_to_reg_ct {\
614c3844d9SPaul Blakey 	.mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_4,\
624c3844d9SPaul Blakey 	.moffset = 0,\
63ed2fe7baSPaul Blakey 	.mlen = 32,\
644c3844d9SPaul Blakey 	.soffset = MLX5_BYTE_OFF(fte_match_param,\
654c3844d9SPaul Blakey 				 misc_parameters_2.metadata_reg_c_4),\
664c3844d9SPaul Blakey }
674c3844d9SPaul Blakey 
6806fe52a4SJianbo Liu /* 8 LSB of metadata C5 are reserved for packet color */
694c3844d9SPaul Blakey #define fteid_to_reg_ct {\
704c3844d9SPaul Blakey 	.mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_5,\
7106fe52a4SJianbo Liu 	.moffset = 8,\
7206fe52a4SJianbo Liu 	.mlen = 24,\
734c3844d9SPaul Blakey 	.soffset = MLX5_BYTE_OFF(fte_match_param,\
744c3844d9SPaul Blakey 				 misc_parameters_2.metadata_reg_c_5),\
754c3844d9SPaul Blakey }
764c3844d9SPaul Blakey 
77a8eb919bSPaul Blakey #define zone_restore_to_reg_ct {\
785c6b9460SPaul Blakey 	.mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_1,\
795c6b9460SPaul Blakey 	.moffset = 0,\
80ed2fe7baSPaul Blakey 	.mlen = ESW_ZONE_ID_BITS,\
815c6b9460SPaul Blakey 	.soffset = MLX5_BYTE_OFF(fte_match_param,\
82ed2fe7baSPaul Blakey 				 misc_parameters_2.metadata_reg_c_1),\
835c6b9460SPaul Blakey }
845c6b9460SPaul Blakey 
85aedd133dSAriel Levkovich #define nic_zone_restore_to_reg_ct {\
86aedd133dSAriel Levkovich 	.mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_B,\
87ed2fe7baSPaul Blakey 	.moffset = 16,\
88ed2fe7baSPaul Blakey 	.mlen = ESW_ZONE_ID_BITS,\
89aedd133dSAriel Levkovich }
90aedd133dSAriel Levkovich 
9117c5da03SJianbo Liu #define MLX5_CT_ZONE_BITS MLX5_REG_MAPPING_MBITS(ZONE_TO_REG)
9217c5da03SJianbo Liu #define MLX5_CT_ZONE_MASK MLX5_REG_MAPPING_MASK(ZONE_TO_REG)
935c6b9460SPaul Blakey 
944c3844d9SPaul Blakey #if IS_ENABLED(CONFIG_MLX5_TC_CT)
954c3844d9SPaul Blakey 
96aedd133dSAriel Levkovich struct mlx5_tc_ct_priv *
97aedd133dSAriel Levkovich mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains,
98aedd133dSAriel Levkovich 		struct mod_hdr_tbl *mod_hdr,
99f0da4daaSChris Mi 		enum mlx5_flow_namespace_type ns_type,
100f0da4daaSChris Mi 		struct mlx5e_post_act *post_act);
1014c3844d9SPaul Blakey void
102aedd133dSAriel Levkovich mlx5_tc_ct_clean(struct mlx5_tc_ct_priv *ct_priv);
1034c3844d9SPaul Blakey 
1044c8594adSRoi Dayan void
105aedd133dSAriel Levkovich mlx5_tc_ct_match_del(struct mlx5_tc_ct_priv *priv, struct mlx5_ct_attr *ct_attr);
1064c8594adSRoi Dayan 
1074c3844d9SPaul Blakey int
108aedd133dSAriel Levkovich mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv,
1094c3844d9SPaul Blakey 		     struct mlx5_flow_spec *spec,
1104c3844d9SPaul Blakey 		     struct flow_cls_offload *f,
11154b154ecSEli Britstein 		     struct mlx5_ct_attr *ct_attr,
1124c3844d9SPaul Blakey 		     struct netlink_ext_ack *extack);
11389fbdbaeSSaeed Mahameed int mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec);
1147e36feebSPaul Blakey int
115aedd133dSAriel Levkovich mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
116c620b772SAriel Levkovich 			struct mlx5_flow_attr *attr,
1174c3844d9SPaul Blakey 			const struct flow_action_entry *act,
1184c3844d9SPaul Blakey 			struct netlink_ext_ack *extack);
1194c3844d9SPaul Blakey 
12008fe94ecSPaul Blakey int
12108fe94ecSPaul Blakey mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv, struct mlx5_flow_attr *attr);
12208fe94ecSPaul Blakey 
1234c3844d9SPaul Blakey void
124aedd133dSAriel Levkovich mlx5_tc_ct_delete_flow(struct mlx5_tc_ct_priv *priv,
125c620b772SAriel Levkovich 		       struct mlx5_flow_attr *attr);
1264c3844d9SPaul Blakey 
1275c6b9460SPaul Blakey bool
128aedd133dSAriel Levkovich mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv *ct_priv,
1298f5b3c3eSPaul Blakey 			 struct sk_buff *skb, u8 zone_restore_id);
1305c6b9460SPaul Blakey 
1314c3844d9SPaul Blakey #else /* CONFIG_MLX5_TC_CT */
1324c3844d9SPaul Blakey 
133aedd133dSAriel Levkovich static inline struct mlx5_tc_ct_priv *
mlx5_tc_ct_init(struct mlx5e_priv * priv,struct mlx5_fs_chains * chains,struct mod_hdr_tbl * mod_hdr,enum mlx5_flow_namespace_type ns_type,struct mlx5e_post_act * post_act)134aedd133dSAriel Levkovich mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains,
135aedd133dSAriel Levkovich 		struct mod_hdr_tbl *mod_hdr,
136f0da4daaSChris Mi 		enum mlx5_flow_namespace_type ns_type,
137f0da4daaSChris Mi 		struct mlx5e_post_act *post_act)
1384c3844d9SPaul Blakey {
139aedd133dSAriel Levkovich 	return NULL;
1404c3844d9SPaul Blakey }
1414c3844d9SPaul Blakey 
1424c3844d9SPaul Blakey static inline void
mlx5_tc_ct_clean(struct mlx5_tc_ct_priv * ct_priv)143aedd133dSAriel Levkovich mlx5_tc_ct_clean(struct mlx5_tc_ct_priv *ct_priv)
1444c3844d9SPaul Blakey {
1454c3844d9SPaul Blakey }
1464c3844d9SPaul Blakey 
1474c8594adSRoi Dayan static inline void
mlx5_tc_ct_match_del(struct mlx5_tc_ct_priv * priv,struct mlx5_ct_attr * ct_attr)148aedd133dSAriel Levkovich mlx5_tc_ct_match_del(struct mlx5_tc_ct_priv *priv, struct mlx5_ct_attr *ct_attr) {}
1494c8594adSRoi Dayan 
1504c3844d9SPaul Blakey static inline int
mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv * priv,struct mlx5_flow_spec * spec,struct flow_cls_offload * f,struct mlx5_ct_attr * ct_attr,struct netlink_ext_ack * extack)151aedd133dSAriel Levkovich mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv,
1524c3844d9SPaul Blakey 		     struct mlx5_flow_spec *spec,
1534c3844d9SPaul Blakey 		     struct flow_cls_offload *f,
15454b154ecSEli Britstein 		     struct mlx5_ct_attr *ct_attr,
1554c3844d9SPaul Blakey 		     struct netlink_ext_ack *extack)
1564c3844d9SPaul Blakey {
157d37bd5e8SRoi Dayan 	struct flow_rule *rule = flow_cls_offload_flow_rule(f);
158d37bd5e8SRoi Dayan 
159d37bd5e8SRoi Dayan 	if (!flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_CT))
1603cfc4332SPaul Blakey 		return 0;
1613cfc4332SPaul Blakey 
1623cfc4332SPaul Blakey 	NL_SET_ERR_MSG_MOD(extack, "mlx5 tc ct offload isn't enabled.");
1634c3844d9SPaul Blakey 	return -EOPNOTSUPP;
1644c3844d9SPaul Blakey }
1654c3844d9SPaul Blakey 
1664c3844d9SPaul Blakey static inline int
mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec * spec)16789fbdbaeSSaeed Mahameed mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec)
1687e36feebSPaul Blakey {
1697e36feebSPaul Blakey 	return 0;
1707e36feebSPaul Blakey }
1717e36feebSPaul Blakey 
1727e36feebSPaul Blakey static inline int
mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv * priv,struct mlx5_flow_attr * attr,const struct flow_action_entry * act,struct netlink_ext_ack * extack)173aedd133dSAriel Levkovich mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
174c620b772SAriel Levkovich 			struct mlx5_flow_attr *attr,
1754c3844d9SPaul Blakey 			const struct flow_action_entry *act,
1764c3844d9SPaul Blakey 			struct netlink_ext_ack *extack)
1774c3844d9SPaul Blakey {
1783cfc4332SPaul Blakey 	NL_SET_ERR_MSG_MOD(extack, "mlx5 tc ct offload isn't enabled.");
1794c3844d9SPaul Blakey 	return -EOPNOTSUPP;
1804c3844d9SPaul Blakey }
1814c3844d9SPaul Blakey 
18208fe94ecSPaul Blakey static inline int
mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv * priv,struct mlx5_flow_attr * attr)183aedd133dSAriel Levkovich mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv,
18408fe94ecSPaul Blakey 			struct mlx5_flow_attr *attr)
1854c3844d9SPaul Blakey {
18608fe94ecSPaul Blakey 	return -EOPNOTSUPP;
1874c3844d9SPaul Blakey }
1884c3844d9SPaul Blakey 
1894c3844d9SPaul Blakey static inline void
mlx5_tc_ct_delete_flow(struct mlx5_tc_ct_priv * priv,struct mlx5_flow_attr * attr)190aedd133dSAriel Levkovich mlx5_tc_ct_delete_flow(struct mlx5_tc_ct_priv *priv,
191c620b772SAriel Levkovich 		       struct mlx5_flow_attr *attr)
1924c3844d9SPaul Blakey {
1934c3844d9SPaul Blakey }
1944c3844d9SPaul Blakey 
1955c6b9460SPaul Blakey static inline bool
mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv * ct_priv,struct sk_buff * skb,u8 zone_restore_id)196aedd133dSAriel Levkovich mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv *ct_priv,
1978f5b3c3eSPaul Blakey 			 struct sk_buff *skb, u8 zone_restore_id)
1985c6b9460SPaul Blakey {
1998f5b3c3eSPaul Blakey 	if (!zone_restore_id)
2005c6b9460SPaul Blakey 		return true;
2015c6b9460SPaul Blakey 
2025c6b9460SPaul Blakey 	return false;
2035c6b9460SPaul Blakey }
2045c6b9460SPaul Blakey 
2054c3844d9SPaul Blakey #endif /* !IS_ENABLED(CONFIG_MLX5_TC_CT) */
2064c3844d9SPaul Blakey #endif /* __MLX5_EN_TC_CT_H__ */
207