1
2
3
4#ifndef __MLX5_EN_TC_CT_H__
5#define __MLX5_EN_TC_CT_H__
6
7#include <net/pkt_cls.h>
8#include <linux/mlx5/fs.h>
9#include <net/tc_act/tc_ct.h>
10
11#include "en.h"
12
13struct mlx5_flow_attr;
14struct mlx5e_tc_mod_hdr_acts;
15struct mlx5_rep_uplink_priv;
16struct mlx5e_tc_flow;
17struct mlx5e_priv;
18
19struct mlx5_fs_chains;
20struct mlx5_tc_ct_priv;
21struct mlx5_ct_flow;
22
23struct nf_flowtable;
24
25struct mlx5_ct_attr {
26 u16 zone;
27 u16 ct_action;
28 struct mlx5_ct_flow *ct_flow;
29 struct nf_flowtable *nf_ft;
30 u32 ct_labels_id;
31};
32
33#define zone_to_reg_ct {\
34 .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_2,\
35 .moffset = 0,\
36 .mlen = 16,\
37 .soffset = MLX5_BYTE_OFF(fte_match_param,\
38 misc_parameters_2.metadata_reg_c_2),\
39}
40
41#define ctstate_to_reg_ct {\
42 .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_2,\
43 .moffset = 16,\
44 .mlen = 16,\
45 .soffset = MLX5_BYTE_OFF(fte_match_param,\
46 misc_parameters_2.metadata_reg_c_2),\
47}
48
49#define mark_to_reg_ct {\
50 .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_3,\
51 .moffset = 0,\
52 .mlen = 32,\
53 .soffset = MLX5_BYTE_OFF(fte_match_param,\
54 misc_parameters_2.metadata_reg_c_3),\
55}
56
57#define labels_to_reg_ct {\
58 .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_4,\
59 .moffset = 0,\
60 .mlen = 32,\
61 .soffset = MLX5_BYTE_OFF(fte_match_param,\
62 misc_parameters_2.metadata_reg_c_4),\
63}
64
65#define fteid_to_reg_ct {\
66 .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_5,\
67 .moffset = 0,\
68 .mlen = 32,\
69 .soffset = MLX5_BYTE_OFF(fte_match_param,\
70 misc_parameters_2.metadata_reg_c_5),\
71}
72
73#define zone_restore_to_reg_ct {\
74 .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_1,\
75 .moffset = 0,\
76 .mlen = ESW_ZONE_ID_BITS,\
77 .soffset = MLX5_BYTE_OFF(fte_match_param,\
78 misc_parameters_2.metadata_reg_c_1),\
79}
80
81#define nic_zone_restore_to_reg_ct {\
82 .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_B,\
83 .moffset = 16,\
84 .mlen = ESW_ZONE_ID_BITS,\
85}
86
87#define REG_MAPPING_MLEN(reg) (mlx5e_tc_attr_to_reg_mappings[reg].mlen)
88#define REG_MAPPING_MOFFSET(reg) (mlx5e_tc_attr_to_reg_mappings[reg].moffset)
89
90#if IS_ENABLED(CONFIG_MLX5_TC_CT)
91
92struct mlx5_tc_ct_priv *
93mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains,
94 struct mod_hdr_tbl *mod_hdr,
95 enum mlx5_flow_namespace_type ns_type,
96 struct mlx5e_post_act *post_act);
97void
98mlx5_tc_ct_clean(struct mlx5_tc_ct_priv *ct_priv);
99
100void
101mlx5_tc_ct_match_del(struct mlx5_tc_ct_priv *priv, struct mlx5_ct_attr *ct_attr);
102
103int
104mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv,
105 struct mlx5_flow_spec *spec,
106 struct flow_cls_offload *f,
107 struct mlx5_ct_attr *ct_attr,
108 struct netlink_ext_ack *extack);
109int mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec);
110int
111mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
112 struct mlx5_flow_attr *attr,
113 const struct flow_action_entry *act,
114 struct netlink_ext_ack *extack);
115
116struct mlx5_flow_handle *
117mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv,
118 struct mlx5e_tc_flow *flow,
119 struct mlx5_flow_spec *spec,
120 struct mlx5_flow_attr *attr,
121 struct mlx5e_tc_mod_hdr_acts *mod_hdr_acts);
122void
123mlx5_tc_ct_delete_flow(struct mlx5_tc_ct_priv *priv,
124 struct mlx5e_tc_flow *flow,
125 struct mlx5_flow_attr *attr);
126
127bool
128mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv *ct_priv,
129 struct sk_buff *skb, u8 zone_restore_id);
130
131#else
132
133static inline struct mlx5_tc_ct_priv *
134mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains,
135 struct mod_hdr_tbl *mod_hdr,
136 enum mlx5_flow_namespace_type ns_type,
137 struct mlx5e_post_act *post_act)
138{
139 return NULL;
140}
141
142static inline void
143mlx5_tc_ct_clean(struct mlx5_tc_ct_priv *ct_priv)
144{
145}
146
147static inline void
148mlx5_tc_ct_match_del(struct mlx5_tc_ct_priv *priv, struct mlx5_ct_attr *ct_attr) {}
149
150static inline int
151mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv,
152 struct mlx5_flow_spec *spec,
153 struct flow_cls_offload *f,
154 struct mlx5_ct_attr *ct_attr,
155 struct netlink_ext_ack *extack)
156{
157 struct flow_rule *rule = flow_cls_offload_flow_rule(f);
158
159 if (!flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_CT))
160 return 0;
161
162 NL_SET_ERR_MSG_MOD(extack, "mlx5 tc ct offload isn't enabled.");
163 return -EOPNOTSUPP;
164}
165
166static inline int
167mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec)
168{
169 return 0;
170}
171
172static inline int
173mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
174 struct mlx5_flow_attr *attr,
175 const struct flow_action_entry *act,
176 struct netlink_ext_ack *extack)
177{
178 NL_SET_ERR_MSG_MOD(extack, "mlx5 tc ct offload isn't enabled.");
179 return -EOPNOTSUPP;
180}
181
182static inline struct mlx5_flow_handle *
183mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv,
184 struct mlx5e_tc_flow *flow,
185 struct mlx5_flow_spec *spec,
186 struct mlx5_flow_attr *attr,
187 struct mlx5e_tc_mod_hdr_acts *mod_hdr_acts)
188{
189 return ERR_PTR(-EOPNOTSUPP);
190}
191
192static inline void
193mlx5_tc_ct_delete_flow(struct mlx5_tc_ct_priv *priv,
194 struct mlx5e_tc_flow *flow,
195 struct mlx5_flow_attr *attr)
196{
197}
198
199static inline bool
200mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv *ct_priv,
201 struct sk_buff *skb, u8 zone_restore_id)
202{
203 if (!zone_restore_id)
204 return true;
205
206 return false;
207}
208
209#endif
210#endif
211