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