Merge tag 'tag-chrome-platform-for-v5.11' of git://git.kernel.org/pub/scm/linux/kerne...
[linux-2.6-microblaze.git] / drivers / net / ethernet / mellanox / mlx5 / core / en / tc_ct.h
1 /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
2 /* Copyright (c) 2018 Mellanox Technologies. */
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
13 struct mlx5_flow_attr;
14 struct mlx5e_tc_mod_hdr_acts;
15 struct mlx5_rep_uplink_priv;
16 struct mlx5e_tc_flow;
17 struct mlx5e_priv;
18
19 struct mlx5_fs_chains;
20 struct mlx5_tc_ct_priv;
21 struct mlx5_ct_flow;
22
23 struct nf_flowtable;
24
25 struct 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 = 2,\
37         .soffset = MLX5_BYTE_OFF(fte_match_param,\
38                                  misc_parameters_2.metadata_reg_c_2) + 2,\
39 }
40
41 #define ctstate_to_reg_ct {\
42         .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_2,\
43         .moffset = 2,\
44         .mlen = 2,\
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 = 4,\
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 = 4,\
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 = 4,\
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 = 1,\
77         .soffset = MLX5_BYTE_OFF(fte_match_param,\
78                                  misc_parameters_2.metadata_reg_c_1) + 3,\
79 }
80
81 #define nic_zone_restore_to_reg_ct {\
82         .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_B,\
83         .moffset = 2,\
84         .mlen = 1,\
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 #define REG_MAPPING_SHIFT(reg) (REG_MAPPING_MOFFSET(reg) * 8)
90 #define ZONE_RESTORE_BITS (REG_MAPPING_MLEN(ZONE_RESTORE_TO_REG) * 8)
91 #define ZONE_RESTORE_MAX GENMASK(ZONE_RESTORE_BITS - 1, 0)
92
93 #if IS_ENABLED(CONFIG_MLX5_TC_CT)
94
95 struct mlx5_tc_ct_priv *
96 mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains,
97                 struct mod_hdr_tbl *mod_hdr,
98                 enum mlx5_flow_namespace_type ns_type);
99 void
100 mlx5_tc_ct_clean(struct mlx5_tc_ct_priv *ct_priv);
101
102 void
103 mlx5_tc_ct_match_del(struct mlx5_tc_ct_priv *priv, struct mlx5_ct_attr *ct_attr);
104
105 int
106 mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv,
107                      struct mlx5_flow_spec *spec,
108                      struct flow_cls_offload *f,
109                      struct mlx5_ct_attr *ct_attr,
110                      struct netlink_ext_ack *extack);
111 int mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec);
112 int
113 mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
114                         struct mlx5_flow_attr *attr,
115                         const struct flow_action_entry *act,
116                         struct netlink_ext_ack *extack);
117
118 struct mlx5_flow_handle *
119 mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv,
120                         struct mlx5e_tc_flow *flow,
121                         struct mlx5_flow_spec *spec,
122                         struct mlx5_flow_attr *attr,
123                         struct mlx5e_tc_mod_hdr_acts *mod_hdr_acts);
124 void
125 mlx5_tc_ct_delete_flow(struct mlx5_tc_ct_priv *priv,
126                        struct mlx5e_tc_flow *flow,
127                        struct mlx5_flow_attr *attr);
128
129 bool
130 mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv *ct_priv,
131                          struct sk_buff *skb, u8 zone_restore_id);
132
133 #else /* CONFIG_MLX5_TC_CT */
134
135 static inline struct mlx5_tc_ct_priv *
136 mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains,
137                 struct mod_hdr_tbl *mod_hdr,
138                 enum mlx5_flow_namespace_type ns_type)
139 {
140         return NULL;
141 }
142
143 static inline void
144 mlx5_tc_ct_clean(struct mlx5_tc_ct_priv *ct_priv)
145 {
146 }
147
148 static inline void
149 mlx5_tc_ct_match_del(struct mlx5_tc_ct_priv *priv, struct mlx5_ct_attr *ct_attr) {}
150
151 static inline int
152 mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv,
153                      struct mlx5_flow_spec *spec,
154                      struct flow_cls_offload *f,
155                      struct mlx5_ct_attr *ct_attr,
156                      struct netlink_ext_ack *extack)
157 {
158         struct flow_rule *rule = flow_cls_offload_flow_rule(f);
159
160         if (!flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_CT))
161                 return 0;
162
163         NL_SET_ERR_MSG_MOD(extack, "mlx5 tc ct offload isn't enabled.");
164         return -EOPNOTSUPP;
165 }
166
167 static inline int
168 mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec)
169 {
170         return 0;
171 }
172
173 static inline int
174 mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
175                         struct mlx5_flow_attr *attr,
176                         const struct flow_action_entry *act,
177                         struct netlink_ext_ack *extack)
178 {
179         NL_SET_ERR_MSG_MOD(extack, "mlx5 tc ct offload isn't enabled.");
180         return -EOPNOTSUPP;
181 }
182
183 static inline struct mlx5_flow_handle *
184 mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv,
185                         struct mlx5e_tc_flow *flow,
186                         struct mlx5_flow_spec *spec,
187                         struct mlx5_flow_attr *attr,
188                         struct mlx5e_tc_mod_hdr_acts *mod_hdr_acts)
189 {
190         return ERR_PTR(-EOPNOTSUPP);
191 }
192
193 static inline void
194 mlx5_tc_ct_delete_flow(struct mlx5_tc_ct_priv *priv,
195                        struct mlx5e_tc_flow *flow,
196                        struct mlx5_flow_attr *attr)
197 {
198 }
199
200 static inline bool
201 mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv *ct_priv,
202                          struct sk_buff *skb, u8 zone_restore_id)
203 {
204         if (!zone_restore_id)
205                 return true;
206
207         return false;
208 }
209
210 #endif /* !IS_ENABLED(CONFIG_MLX5_TC_CT) */
211 #endif /* __MLX5_EN_TC_CT_H__ */