1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (c) 2021 NVIDIA CORPORATION. All rights reserved.
3 */
4 #include <rte_flow.h>
5
6 #include "mlx5_defs.h"
7 #if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H)
8 #include "mlx5_dr.h"
9
10 /*
11 * The following null stubs are prepared in order not to break the linkage
12 * before the HW steering low-level implementation is added.
13 */
14
15 /* Open a context used for direct rule insertion using hardware steering.
16 * Each context can contain multiple tables of different types.
17 *
18 * @param[in] ibv_ctx
19 * The ibv context to used for HWS.
20 * @param[in] attr
21 * Attributes used for context open.
22 * @return pointer to mlx5dr_context on success NULL otherwise.
23 */
24 __rte_weak struct mlx5dr_context *
mlx5dr_context_open(void * ibv_ctx,struct mlx5dr_context_attr * attr)25 mlx5dr_context_open(void *ibv_ctx,
26 struct mlx5dr_context_attr *attr)
27 {
28 (void)ibv_ctx;
29 (void)attr;
30 return NULL;
31 }
32
33 /* Close a context used for direct hardware steering.
34 *
35 * @param[in] ctx
36 * mlx5dr context to close.
37 * @return zero on success non zero otherwise.
38 */
39 __rte_weak int
mlx5dr_context_close(struct mlx5dr_context * ctx)40 mlx5dr_context_close(struct mlx5dr_context *ctx)
41 {
42 (void)ctx;
43 return 0;
44 }
45
46 /* Create a new direct rule table. Each table can contain multiple matchers.
47 *
48 * @param[in] ctx
49 * The context in which the new table will be opened.
50 * @param[in] attr
51 * Attributes used for table creation.
52 * @return pointer to mlx5dr_table on success NULL otherwise.
53 */
54 __rte_weak struct mlx5dr_table *
mlx5dr_table_create(struct mlx5dr_context * ctx,struct mlx5dr_table_attr * attr)55 mlx5dr_table_create(struct mlx5dr_context *ctx,
56 struct mlx5dr_table_attr *attr)
57 {
58 (void)ctx;
59 (void)attr;
60 return NULL;
61 }
62
63 /* Destroy direct rule table.
64 *
65 * @param[in] tbl
66 * mlx5dr table to destroy.
67 * @return zero on success non zero otherwise.
68 */
mlx5dr_table_destroy(struct mlx5dr_table * tbl)69 __rte_weak int mlx5dr_table_destroy(struct mlx5dr_table *tbl)
70 {
71 (void)tbl;
72 return 0;
73 }
74
75 /* Create new match template based on items mask, the match template
76 * will be used for matcher creation.
77 *
78 * @param[in] items
79 * Describe the mask for template creation
80 * @param[in] flags
81 * Template creation flags
82 * @return pointer to mlx5dr_match_template on success NULL otherwise
83 */
84 __rte_weak struct mlx5dr_match_template *
mlx5dr_match_template_create(const struct rte_flow_item items[],enum mlx5dr_match_template_flags flags)85 mlx5dr_match_template_create(const struct rte_flow_item items[],
86 enum mlx5dr_match_template_flags flags)
87 {
88 (void)items;
89 (void)flags;
90 return NULL;
91 }
92
93 /* Destroy match template.
94 *
95 * @param[in] mt
96 * Match template to destroy.
97 * @return zero on success non zero otherwise.
98 */
99 __rte_weak int
mlx5dr_match_template_destroy(struct mlx5dr_match_template * mt)100 mlx5dr_match_template_destroy(struct mlx5dr_match_template *mt)
101 {
102 (void)mt;
103 return 0;
104 }
105
106 /* Create a new direct rule matcher. Each matcher can contain multiple rules.
107 * Matchers on the table will be processed by priority. Matching fields and
108 * mask are described by the match template. In some cases multiple match
109 * templates can be used on the same matcher.
110 *
111 * @param[in] table
112 * The table in which the new matcher will be opened.
113 * @param[in] mt
114 * Array of match templates to be used on matcher.
115 * @param[in] num_of_mt
116 * Number of match templates in mt array.
117 * @param[in] attr
118 * Attributes used for matcher creation.
119 * @return pointer to mlx5dr_matcher on success NULL otherwise.
120 */
121 __rte_weak struct mlx5dr_matcher *
mlx5dr_matcher_create(struct mlx5dr_table * table __rte_unused,struct mlx5dr_match_template * mt[]__rte_unused,uint8_t num_of_mt __rte_unused,struct mlx5dr_matcher_attr * attr __rte_unused)122 mlx5dr_matcher_create(struct mlx5dr_table *table __rte_unused,
123 struct mlx5dr_match_template *mt[] __rte_unused,
124 uint8_t num_of_mt __rte_unused,
125 struct mlx5dr_matcher_attr *attr __rte_unused)
126 {
127 return NULL;
128 }
129
130 /* Destroy direct rule matcher.
131 *
132 * @param[in] matcher
133 * Matcher to destroy.
134 * @return zero on success non zero otherwise.
135 */
136 __rte_weak int
mlx5dr_matcher_destroy(struct mlx5dr_matcher * matcher __rte_unused)137 mlx5dr_matcher_destroy(struct mlx5dr_matcher *matcher __rte_unused)
138 {
139 return 0;
140 }
141
142 /* Enqueue create rule operation.
143 *
144 * @param[in] matcher
145 * The matcher in which the new rule will be created.
146 * @param[in] mt_idx
147 * Match template index to create the rule with.
148 * @param[in] items
149 * The items used for the value matching.
150 * @param[in] rule_actions
151 * Rule action to be executed on match.
152 * @param[in] num_of_actions
153 * Number of rule actions.
154 * @param[in] attr
155 * Rule creation attributes.
156 * @param[in, out] rule_handle
157 * A valid rule handle. The handle doesn't require any initialization.
158 * @return zero on successful enqueue non zero otherwise.
159 */
160 __rte_weak int
mlx5dr_rule_create(struct mlx5dr_matcher * matcher __rte_unused,uint8_t mt_idx __rte_unused,const struct rte_flow_item items[]__rte_unused,struct mlx5dr_rule_action rule_actions[]__rte_unused,uint8_t num_of_actions __rte_unused,struct mlx5dr_rule_attr * attr __rte_unused,struct mlx5dr_rule * rule_handle __rte_unused)161 mlx5dr_rule_create(struct mlx5dr_matcher *matcher __rte_unused,
162 uint8_t mt_idx __rte_unused,
163 const struct rte_flow_item items[] __rte_unused,
164 struct mlx5dr_rule_action rule_actions[] __rte_unused,
165 uint8_t num_of_actions __rte_unused,
166 struct mlx5dr_rule_attr *attr __rte_unused,
167 struct mlx5dr_rule *rule_handle __rte_unused)
168 {
169 return 0;
170 }
171
172 /* Enqueue destroy rule operation.
173 *
174 * @param[in] rule
175 * The rule destruction to enqueue.
176 * @param[in] attr
177 * Rule destruction attributes.
178 * @return zero on successful enqueue non zero otherwise.
179 */
180 __rte_weak int
mlx5dr_rule_destroy(struct mlx5dr_rule * rule __rte_unused,struct mlx5dr_rule_attr * attr __rte_unused)181 mlx5dr_rule_destroy(struct mlx5dr_rule *rule __rte_unused,
182 struct mlx5dr_rule_attr *attr __rte_unused)
183 {
184 return 0;
185 }
186
187 /* Create direct rule drop action.
188 *
189 * @param[in] ctx
190 * The context in which the new action will be created.
191 * @param[in] flags
192 * Action creation flags. (enum mlx5dr_action_flags)
193 * @return pointer to mlx5dr_action on success NULL otherwise.
194 */
195 __rte_weak struct mlx5dr_action *
mlx5dr_action_create_dest_drop(struct mlx5dr_context * ctx __rte_unused,uint32_t flags __rte_unused)196 mlx5dr_action_create_dest_drop(struct mlx5dr_context *ctx __rte_unused,
197 uint32_t flags __rte_unused)
198 {
199 return NULL;
200 }
201
202 /* Create direct rule default miss action.
203 * Defaults are RX: Drop TX: Wire.
204 *
205 * @param[in] ctx
206 * The context in which the new action will be created.
207 * @param[in] flags
208 * Action creation flags. (enum mlx5dr_action_flags)
209 * @return pointer to mlx5dr_action on success NULL otherwise.
210 */
211 __rte_weak struct mlx5dr_action *
mlx5dr_action_create_default_miss(struct mlx5dr_context * ctx __rte_unused,uint32_t flags __rte_unused)212 mlx5dr_action_create_default_miss(struct mlx5dr_context *ctx __rte_unused,
213 uint32_t flags __rte_unused)
214 {
215 return NULL;
216 }
217
218 /* Create direct rule goto table action.
219 *
220 * @param[in] ctx
221 * The context in which the new action will be created.
222 * @param[in] tbl
223 * Destination table.
224 * @param[in] flags
225 * Action creation flags. (enum mlx5dr_action_flags)
226 * @return pointer to mlx5dr_action on success NULL otherwise.
227 */
228 __rte_weak struct mlx5dr_action *
mlx5dr_action_create_dest_table(struct mlx5dr_context * ctx __rte_unused,struct mlx5dr_table * tbl __rte_unused,uint32_t flags __rte_unused)229 mlx5dr_action_create_dest_table(struct mlx5dr_context *ctx __rte_unused,
230 struct mlx5dr_table *tbl __rte_unused,
231 uint32_t flags __rte_unused)
232 {
233 return NULL;
234 }
235
236 /* Create direct rule goto TIR action.
237 *
238 * @param[in] ctx
239 * The context in which the new action will be created.
240 * @param[in] obj
241 * Direct rule TIR devx object.
242 * @param[in] flags
243 * Action creation flags. (enum mlx5dr_action_flags)
244 * @return pointer to mlx5dr_action on success NULL otherwise.
245 */
246 __rte_weak struct mlx5dr_action *
mlx5dr_action_create_dest_tir(struct mlx5dr_context * ctx __rte_unused,struct mlx5dr_devx_obj * obj __rte_unused,uint32_t flags __rte_unused)247 mlx5dr_action_create_dest_tir(struct mlx5dr_context *ctx __rte_unused,
248 struct mlx5dr_devx_obj *obj __rte_unused,
249 uint32_t flags __rte_unused)
250 {
251 return NULL;
252 }
253
254 /* Create direct rule TAG action.
255 *
256 * @param[in] ctx
257 * The context in which the new action will be created.
258 * @param[in] flags
259 * Action creation flags. (enum mlx5dr_action_flags)
260 * @return pointer to mlx5dr_action on success NULL otherwise.
261 */
262 __rte_weak struct mlx5dr_action *
mlx5dr_action_create_tag(struct mlx5dr_context * ctx __rte_unused,uint32_t flags __rte_unused)263 mlx5dr_action_create_tag(struct mlx5dr_context *ctx __rte_unused,
264 uint32_t flags __rte_unused)
265 {
266 return NULL;
267 }
268
269 /* Create direct rule counter action.
270 *
271 * @param[in] ctx
272 * The context in which the new action will be created.
273 * @param[in] obj
274 * Direct rule counter devx object.
275 * @param[in] flags
276 * Action creation flags. (enum mlx5dr_action_flags)
277 * @return pointer to mlx5dr_action on success NULL otherwise.
278 */
279 __rte_weak struct mlx5dr_action *
280 mlx5dr_action_create_counter(struct mlx5dr_context *ctx,
281 struct mlx5dr_devx_obj *obj,
282 uint32_t flags);
283
284 /* Create direct rule reformat action.
285 *
286 * @param[in] ctx
287 * The context in which the new action will be created.
288 * @param[in] reformat_type
289 * Type of reformat.
290 * @param[in] data_sz
291 * Size in bytes of data.
292 * @param[in] inline_data
293 * Header data array in case of inline action.
294 * @param[in] log_bulk_size
295 * Number of unique values used with this pattern.
296 * @param[in] flags
297 * Action creation flags. (enum mlx5dr_action_flags)
298 * @return pointer to mlx5dr_action on success NULL otherwise.
299 */
300 __rte_weak struct mlx5dr_action *
mlx5dr_action_create_reformat(struct mlx5dr_context * ctx __rte_unused,enum mlx5dr_action_reformat_type reformat_type __rte_unused,size_t data_sz __rte_unused,void * inline_data __rte_unused,uint32_t log_bulk_size __rte_unused,uint32_t flags __rte_unused)301 mlx5dr_action_create_reformat(struct mlx5dr_context *ctx __rte_unused,
302 enum mlx5dr_action_reformat_type reformat_type __rte_unused,
303 size_t data_sz __rte_unused,
304 void *inline_data __rte_unused,
305 uint32_t log_bulk_size __rte_unused,
306 uint32_t flags __rte_unused)
307 {
308 return NULL;
309 }
310
311 /* Create direct rule modify header action.
312 *
313 * @param[in] ctx
314 * The context in which the new action will be created.
315 * @param[in] pattern_sz
316 * Byte size of the pattern array.
317 * @param[in] pattern
318 * PRM format modify pattern action array.
319 * @param[in] log_bulk_size
320 * Number of unique values used with this pattern.
321 * @param[in] flags
322 * Action creation flags. (enum mlx5dr_action_flags)
323 * @return pointer to mlx5dr_action on success NULL otherwise.
324 */
325 __rte_weak struct mlx5dr_action *
326 mlx5dr_action_create_modify_header(struct mlx5dr_context *ctx,
327 size_t pattern_sz,
328 rte_be64_t pattern[],
329 uint32_t log_bulk_size,
330 uint32_t flags);
331
332 /* Destroy direct rule action.
333 *
334 * @param[in] action
335 * The action to destroy.
336 * @return zero on success non zero otherwise.
337 */
338 __rte_weak int
mlx5dr_action_destroy(struct mlx5dr_action * action __rte_unused)339 mlx5dr_action_destroy(struct mlx5dr_action *action __rte_unused)
340 {
341 return 0;
342 }
343
344 /* Poll queue for rule creation and deletions completions.
345 *
346 * @param[in] ctx
347 * The context to which the queue belong to.
348 * @param[in] queue_id
349 * The id of the queue to poll.
350 * @param[in, out] res
351 * Completion array.
352 * @param[in] res_nb
353 * Maximum number of results to return.
354 * @return negative number on failure, the number of completions otherwise.
355 */
356 __rte_weak int
mlx5dr_send_queue_poll(struct mlx5dr_context * ctx __rte_unused,uint16_t queue_id __rte_unused,struct rte_flow_op_result res[]__rte_unused,uint32_t res_nb __rte_unused)357 mlx5dr_send_queue_poll(struct mlx5dr_context *ctx __rte_unused,
358 uint16_t queue_id __rte_unused,
359 struct rte_flow_op_result res[] __rte_unused,
360 uint32_t res_nb __rte_unused)
361 {
362 return 0;
363 }
364
365 /* Perform an action on the queue
366 *
367 * @param[in] ctx
368 * The context to which the queue belong to.
369 * @param[in] queue_id
370 * The id of the queue to perform the action on.
371 * @param[in] actions
372 * Actions to perform on the queue. (enum mlx5dr_send_queue_actions)
373 * @return zero on success non zero otherwise.
374 */
375 __rte_weak int
mlx5dr_send_queue_action(struct mlx5dr_context * ctx __rte_unused,uint16_t queue_id __rte_unused,uint32_t actions __rte_unused)376 mlx5dr_send_queue_action(struct mlx5dr_context *ctx __rte_unused,
377 uint16_t queue_id __rte_unused,
378 uint32_t actions __rte_unused)
379 {
380 return 0;
381 }
382
383 #endif
384