xref: /dpdk/drivers/net/mlx5/linux/mlx5_flow_os.h (revision 80c676259a04f9220a9928f072c6dfa92b798f0a)
117ad3af9SDekel Peled /* SPDX-License-Identifier: BSD-3-Clause
217ad3af9SDekel Peled  * Copyright 2020 Mellanox Technologies, Ltd
317ad3af9SDekel Peled  */
417ad3af9SDekel Peled 
517ad3af9SDekel Peled #ifndef RTE_PMD_MLX5_FLOW_OS_H_
617ad3af9SDekel Peled #define RTE_PMD_MLX5_FLOW_OS_H_
717ad3af9SDekel Peled 
8e4ed8de3SDekel Peled #include "mlx5_flow.h"
9e4ed8de3SDekel Peled 
10e4ed8de3SDekel Peled #ifdef HAVE_IBV_FLOW_DV_SUPPORT
11e4ed8de3SDekel Peled extern const struct mlx5_flow_driver_ops mlx5_flow_dv_drv_ops;
122b679150SSuanming Mou extern const struct mlx5_flow_driver_ops mlx5_flow_hw_drv_ops;
13e4ed8de3SDekel Peled #endif
14e4ed8de3SDekel Peled 
15e4ed8de3SDekel Peled /**
16e4ed8de3SDekel Peled  * Get OS enforced flow type. MLX5_FLOW_TYPE_MAX means "non enforced type".
17e4ed8de3SDekel Peled  *
18e4ed8de3SDekel Peled  * @return
19e4ed8de3SDekel Peled  *   Flow type (MLX5_FLOW_TYPE_MAX)
20e4ed8de3SDekel Peled  */
21e4ed8de3SDekel Peled static inline enum mlx5_flow_drv_type
mlx5_flow_os_get_type(void)22e4ed8de3SDekel Peled mlx5_flow_os_get_type(void)
23e4ed8de3SDekel Peled {
24e4ed8de3SDekel Peled 	return MLX5_FLOW_TYPE_MAX;
25e4ed8de3SDekel Peled }
26e4ed8de3SDekel Peled 
2717ad3af9SDekel Peled /**
2817ad3af9SDekel Peled  * Check if item type is supported.
2917ad3af9SDekel Peled  *
3017ad3af9SDekel Peled  * @param item
3117ad3af9SDekel Peled  *   Item type to check.
3217ad3af9SDekel Peled  *
3317ad3af9SDekel Peled  * @return
3417ad3af9SDekel Peled  *   True is this item type is supported, false if not supported.
3517ad3af9SDekel Peled  */
3617ad3af9SDekel Peled static inline bool
mlx5_flow_os_item_supported(int item __rte_unused)3717ad3af9SDekel Peled mlx5_flow_os_item_supported(int item __rte_unused)
3817ad3af9SDekel Peled {
3917ad3af9SDekel Peled 	return true;
4017ad3af9SDekel Peled }
4117ad3af9SDekel Peled 
4217ad3af9SDekel Peled /**
4317ad3af9SDekel Peled  * Check if action type is supported.
4417ad3af9SDekel Peled  *
4517ad3af9SDekel Peled  * @param action
4617ad3af9SDekel Peled  *   Action type to check.
4717ad3af9SDekel Peled  *
4817ad3af9SDekel Peled  * @return
4917ad3af9SDekel Peled  *   True is this action type is supported, false if not supported.
5017ad3af9SDekel Peled  */
5117ad3af9SDekel Peled static inline bool
mlx5_flow_os_action_supported(int action __rte_unused)5217ad3af9SDekel Peled mlx5_flow_os_action_supported(int action __rte_unused)
5317ad3af9SDekel Peled {
5417ad3af9SDekel Peled 	return true;
5517ad3af9SDekel Peled }
5617ad3af9SDekel Peled 
57e57b8587SDekel Peled /**
58e57b8587SDekel Peled  * Create flow rule.
59e57b8587SDekel Peled  *
60e57b8587SDekel Peled  * @param[in] matcher
61e57b8587SDekel Peled  *   Pointer to match mask structure.
62e57b8587SDekel Peled  * @param[in] match_value
63e57b8587SDekel Peled  *   Pointer to match value structure.
64e57b8587SDekel Peled  * @param[in] num_actions
65e57b8587SDekel Peled  *   Number of actions in flow rule.
66e57b8587SDekel Peled  * @param[in] actions
67e57b8587SDekel Peled  *   Pointer to array of flow rule actions.
68e57b8587SDekel Peled  * @param[out] flow
69e57b8587SDekel Peled  *   Pointer to a valid flow rule object on success, NULL otherwise.
70e57b8587SDekel Peled  *
71e57b8587SDekel Peled  * @return
72e57b8587SDekel Peled  *   0 on success, or -1 on failure and errno is set.
73e57b8587SDekel Peled  */
74e57b8587SDekel Peled static inline int
mlx5_flow_os_create_flow(void * matcher,void * match_value,size_t num_actions,void * actions[],void ** flow)75e57b8587SDekel Peled mlx5_flow_os_create_flow(void *matcher, void *match_value,
76e57b8587SDekel Peled 			 size_t num_actions, void *actions[], void **flow)
77e57b8587SDekel Peled {
78e57b8587SDekel Peled 	*flow = mlx5_glue->dv_create_flow(matcher, match_value,
79e57b8587SDekel Peled 					  num_actions, actions);
80e57b8587SDekel Peled 	return (*flow) ? 0 : -1;
81e57b8587SDekel Peled }
82e57b8587SDekel Peled 
83e57b8587SDekel Peled /**
84e57b8587SDekel Peled  * Destroy flow rule.
85e57b8587SDekel Peled  *
86e57b8587SDekel Peled  * @param[in] drv_flow_ptr
87e57b8587SDekel Peled  *   Pointer to flow rule object.
88e57b8587SDekel Peled  *
89e57b8587SDekel Peled  * @return
90e57b8587SDekel Peled  *   0 on success, or the value of errno on failure.
91e57b8587SDekel Peled  */
92e57b8587SDekel Peled static inline int
mlx5_flow_os_destroy_flow(void * drv_flow_ptr)93e57b8587SDekel Peled mlx5_flow_os_destroy_flow(void *drv_flow_ptr)
94e57b8587SDekel Peled {
95e57b8587SDekel Peled 	return mlx5_glue->dv_destroy_flow(drv_flow_ptr);
96e57b8587SDekel Peled }
97e57b8587SDekel Peled 
98e57b8587SDekel Peled /**
99e57b8587SDekel Peled  * Create flow table.
100e57b8587SDekel Peled  *
101e57b8587SDekel Peled  * @param[in] domain
102e57b8587SDekel Peled  *   Pointer to relevant domain.
103e57b8587SDekel Peled  * @param[in] table_id
104e57b8587SDekel Peled  *   Table ID.
105e57b8587SDekel Peled  * @param[out] table
106e57b8587SDekel Peled  *   Pointer to a valid flow table object on success, NULL otherwise.
107e57b8587SDekel Peled  *
108e57b8587SDekel Peled  * @return
109e57b8587SDekel Peled  *   0 on success, or -1 on failure and errno is set.
110e57b8587SDekel Peled  */
111e57b8587SDekel Peled static inline int
mlx5_flow_os_create_flow_tbl(void * domain,uint32_t table_id,void ** table)112e57b8587SDekel Peled mlx5_flow_os_create_flow_tbl(void *domain, uint32_t table_id, void **table)
113e57b8587SDekel Peled {
114e57b8587SDekel Peled 	*table = mlx5_glue->dr_create_flow_tbl(domain, table_id);
115e57b8587SDekel Peled 	return (*table) ? 0 : -1;
116e57b8587SDekel Peled }
117e57b8587SDekel Peled 
118e57b8587SDekel Peled /**
119e57b8587SDekel Peled  * Destroy flow table.
120e57b8587SDekel Peled  *
121e57b8587SDekel Peled  * @param[in] table
122e57b8587SDekel Peled  *   Pointer to table object to destroy.
123e57b8587SDekel Peled  *
124e57b8587SDekel Peled  * @return
125e57b8587SDekel Peled  *   0 on success, or the value of errno on failure.
126e57b8587SDekel Peled  */
127e57b8587SDekel Peled static inline int
mlx5_flow_os_destroy_flow_tbl(void * table)128e57b8587SDekel Peled mlx5_flow_os_destroy_flow_tbl(void *table)
129e57b8587SDekel Peled {
130e57b8587SDekel Peled 	return mlx5_glue->dr_destroy_flow_tbl(table);
131e57b8587SDekel Peled }
132e57b8587SDekel Peled 
133e57b8587SDekel Peled /**
134e57b8587SDekel Peled  * Create flow matcher in a flow table.
135e57b8587SDekel Peled  *
136e57b8587SDekel Peled  * @param[in] ctx
137e57b8587SDekel Peled  *   Pointer to relevant device context.
138e57b8587SDekel Peled  * @param[in] attr
139e57b8587SDekel Peled  *   Pointer to relevant attributes.
140e57b8587SDekel Peled  * @param[in] table
141e57b8587SDekel Peled  *   Pointer to table object.
142e57b8587SDekel Peled  * @param[out] matcher
143e57b8587SDekel Peled  *   Pointer to a valid flow matcher object on success, NULL otherwise.
144e57b8587SDekel Peled  *
145e57b8587SDekel Peled  * @return
146e57b8587SDekel Peled  *   0 on success, or -1 on failure and errno is set.
147e57b8587SDekel Peled  */
148e57b8587SDekel Peled static inline int
mlx5_flow_os_create_flow_matcher(void * ctx,void * attr,void * table,void ** matcher)149e57b8587SDekel Peled mlx5_flow_os_create_flow_matcher(void *ctx, void *attr, void *table,
150e57b8587SDekel Peled 				 void **matcher)
151e57b8587SDekel Peled {
152e57b8587SDekel Peled 	*matcher = mlx5_glue->dv_create_flow_matcher(ctx, attr, table);
153e57b8587SDekel Peled 	return (*matcher) ? 0 : -1;
154e57b8587SDekel Peled }
155e57b8587SDekel Peled 
156e57b8587SDekel Peled /**
157e57b8587SDekel Peled  * Destroy flow matcher.
158e57b8587SDekel Peled  *
159e57b8587SDekel Peled  * @param[in] matcher
160e57b8587SDekel Peled  *   Pointer to matcher object to destroy.
161e57b8587SDekel Peled  *
162e57b8587SDekel Peled  * @return
163e57b8587SDekel Peled  *   0 on success, or the value of errno on failure.
164e57b8587SDekel Peled  */
165e57b8587SDekel Peled static inline int
mlx5_flow_os_destroy_flow_matcher(void * matcher)166e57b8587SDekel Peled mlx5_flow_os_destroy_flow_matcher(void *matcher)
167e57b8587SDekel Peled {
168e57b8587SDekel Peled 	return mlx5_glue->dv_destroy_flow_matcher(matcher);
169e57b8587SDekel Peled }
170e57b8587SDekel Peled 
171b293fbf9SDekel Peled /**
172b293fbf9SDekel Peled  * Create flow action: packet reformat.
173b293fbf9SDekel Peled  *
174b293fbf9SDekel Peled  * @param[in] ctx
175b293fbf9SDekel Peled  *   Pointer to relevant device context.
176b293fbf9SDekel Peled  * @param[in] domain
177b293fbf9SDekel Peled  *   Pointer to domain handler.
178b293fbf9SDekel Peled  * @param[in] resource
179b293fbf9SDekel Peled  *   Pointer to action data resource.
180b293fbf9SDekel Peled  * @param[out] action
181b293fbf9SDekel Peled  *   Pointer to a valid action on success, NULL otherwise.
182b293fbf9SDekel Peled  *
183b293fbf9SDekel Peled  *
184b293fbf9SDekel Peled  * @return
185b293fbf9SDekel Peled  *   0 on success, or -1 on failure and errno is set.
186b293fbf9SDekel Peled  */
187b293fbf9SDekel Peled static inline int
mlx5_flow_os_create_flow_action_packet_reformat(void * ctx,void * domain,void * resource,void ** action)188b293fbf9SDekel Peled mlx5_flow_os_create_flow_action_packet_reformat(void *ctx, void *domain,
189b293fbf9SDekel Peled 						void *resource, void **action)
190b293fbf9SDekel Peled {
191b293fbf9SDekel Peled 	struct mlx5_flow_dv_encap_decap_resource *res =
192b293fbf9SDekel Peled 			(struct mlx5_flow_dv_encap_decap_resource *)resource;
193b293fbf9SDekel Peled 
194b293fbf9SDekel Peled 	*action = mlx5_glue->dv_create_flow_action_packet_reformat
195b293fbf9SDekel Peled 					(ctx, res->reformat_type, res->ft_type,
196b293fbf9SDekel Peled 					 domain, res->flags, res->size,
197b293fbf9SDekel Peled 					 (res->size ? res->buf : NULL));
198b293fbf9SDekel Peled 	return (*action) ? 0 : -1;
199b293fbf9SDekel Peled }
200b293fbf9SDekel Peled 
201b293fbf9SDekel Peled /**
202b293fbf9SDekel Peled  * Create flow action: modify header.
203b293fbf9SDekel Peled  *
204b293fbf9SDekel Peled  * @param[in] ctx
205b293fbf9SDekel Peled  *   Pointer to relevant device context.
206b293fbf9SDekel Peled  * @param[in] domain
207b293fbf9SDekel Peled  *   Pointer to domain handler.
208b293fbf9SDekel Peled  * @param[in] resource
209b293fbf9SDekel Peled  *   Pointer to action data resource.
210b293fbf9SDekel Peled  * @param[in] actions_len
211b293fbf9SDekel Peled  *   Total length of actions data in resource.
212b293fbf9SDekel Peled  * @param[out] action
213b293fbf9SDekel Peled  *   Pointer to a valid action on success, NULL otherwise.
214b293fbf9SDekel Peled  *
215b293fbf9SDekel Peled  *
216b293fbf9SDekel Peled  * @return
217b293fbf9SDekel Peled  *   0 on success, or -1 on failure and errno is set.
218b293fbf9SDekel Peled  */
219b293fbf9SDekel Peled static inline int
mlx5_flow_os_create_flow_action_modify_header(void * ctx,void * domain,void * resource,uint32_t actions_len,void ** action)220b293fbf9SDekel Peled mlx5_flow_os_create_flow_action_modify_header(void *ctx, void *domain,
221b293fbf9SDekel Peled 					      void *resource,
222b293fbf9SDekel Peled 					      uint32_t actions_len,
223b293fbf9SDekel Peled 					      void **action)
224b293fbf9SDekel Peled {
225b293fbf9SDekel Peled 	struct mlx5_flow_dv_modify_hdr_resource *res =
226b293fbf9SDekel Peled 			(struct mlx5_flow_dv_modify_hdr_resource *)resource;
227b293fbf9SDekel Peled 
228b293fbf9SDekel Peled 	*action = mlx5_glue->dv_create_flow_action_modify_header
229e681eb05SMatan Azrad 					(ctx, res->ft_type, domain, res->root ?
230e681eb05SMatan Azrad 					 MLX5DV_DR_ACTION_FLAGS_ROOT_LEVEL : 0,
231b293fbf9SDekel Peled 					 actions_len, (uint64_t *)res->actions);
232b293fbf9SDekel Peled 	return (*action) ? 0 : -1;
233b293fbf9SDekel Peled }
234b293fbf9SDekel Peled 
235b293fbf9SDekel Peled /**
236b293fbf9SDekel Peled  * Create flow action: destination flow table.
237b293fbf9SDekel Peled  *
238b293fbf9SDekel Peled  * @param[in] tbl_obj
239b293fbf9SDekel Peled  *   Pointer to destination table object.
240b293fbf9SDekel Peled  * @param[out] action
241b293fbf9SDekel Peled  *   Pointer to a valid action on success, NULL otherwise.
242b293fbf9SDekel Peled  *
243b293fbf9SDekel Peled  * @return
244b293fbf9SDekel Peled  *   0 on success, or -1 on failure and errno is set.
245b293fbf9SDekel Peled  */
246b293fbf9SDekel Peled static inline int
mlx5_flow_os_create_flow_action_dest_flow_tbl(void * tbl_obj,void ** action)247b293fbf9SDekel Peled mlx5_flow_os_create_flow_action_dest_flow_tbl(void *tbl_obj, void **action)
248b293fbf9SDekel Peled {
249b293fbf9SDekel Peled 	*action = mlx5_glue->dr_create_flow_action_dest_flow_tbl(tbl_obj);
250b293fbf9SDekel Peled 	return (*action) ? 0 : -1;
251b293fbf9SDekel Peled }
252b293fbf9SDekel Peled 
253b293fbf9SDekel Peled /**
254b293fbf9SDekel Peled  * Create flow action: destination port.
255b293fbf9SDekel Peled  *
256b293fbf9SDekel Peled  * @param[in] domain
257b293fbf9SDekel Peled  *   Pointer to domain handler.
258b293fbf9SDekel Peled  * @param[in] port_id
259b293fbf9SDekel Peled  *   Destination port ID.
260b293fbf9SDekel Peled  * @param[out] action
261b293fbf9SDekel Peled  *   Pointer to a valid action on success, NULL otherwise.
262b293fbf9SDekel Peled  *
263b293fbf9SDekel Peled  * @return
264b293fbf9SDekel Peled  *   0 on success, or -1 on failure and errno is set.
265b293fbf9SDekel Peled  */
266b293fbf9SDekel Peled static inline int
mlx5_flow_os_create_flow_action_dest_port(void * domain,uint32_t port_id,void ** action)267b293fbf9SDekel Peled mlx5_flow_os_create_flow_action_dest_port(void *domain, uint32_t port_id,
268b293fbf9SDekel Peled 					  void **action)
269b293fbf9SDekel Peled {
270b293fbf9SDekel Peled 	/*
271b293fbf9SDekel Peled 	 * Depending on rdma_core version the glue routine calls
272b293fbf9SDekel Peled 	 * either mlx5dv_dr_action_create_dest_ib_port(domain, dev_port)
273b293fbf9SDekel Peled 	 * or mlx5dv_dr_action_create_dest_vport(domain, vport_id).
274b293fbf9SDekel Peled 	 */
275b293fbf9SDekel Peled 	*action = mlx5_glue->dr_create_flow_action_dest_port(domain, port_id);
276b293fbf9SDekel Peled 	return (*action) ? 0 : -1;
277b293fbf9SDekel Peled }
278b293fbf9SDekel Peled 
279b293fbf9SDekel Peled /**
280b293fbf9SDekel Peled  * Create flow action: push vlan.
281b293fbf9SDekel Peled  *
282b293fbf9SDekel Peled  * @param[in] domain
283b293fbf9SDekel Peled  *   Pointer to domain handler.
284b293fbf9SDekel Peled  * @param[in] vlan_tag
285b293fbf9SDekel Peled  *   VLAN tag value.
286b293fbf9SDekel Peled  * @param[out] action
287b293fbf9SDekel Peled  *   Pointer to a valid action on success, NULL otherwise.
288b293fbf9SDekel Peled  *
289b293fbf9SDekel Peled  * @return
290b293fbf9SDekel Peled  *   0 on success, or -1 on failure and errno is set.
291b293fbf9SDekel Peled  */
292b293fbf9SDekel Peled static inline int
mlx5_flow_os_create_flow_action_push_vlan(void * domain,rte_be32_t vlan_tag,void ** action)293b293fbf9SDekel Peled mlx5_flow_os_create_flow_action_push_vlan(void *domain, rte_be32_t vlan_tag,
294b293fbf9SDekel Peled 					  void **action)
295b293fbf9SDekel Peled {
296b293fbf9SDekel Peled 	*action = mlx5_glue->dr_create_flow_action_push_vlan(domain, vlan_tag);
297b293fbf9SDekel Peled 	return (*action) ? 0 : -1;
298b293fbf9SDekel Peled }
299b293fbf9SDekel Peled 
300b293fbf9SDekel Peled /**
301b293fbf9SDekel Peled  * Create flow action: count.
302b293fbf9SDekel Peled  *
303b293fbf9SDekel Peled  * @param[in] cnt_obj
304b293fbf9SDekel Peled  *   Pointer to DevX counter object.
305b293fbf9SDekel Peled  * @param[in] offset
306b293fbf9SDekel Peled  *   Offset of counter in array.
307b293fbf9SDekel Peled  * @param[out] action
308b293fbf9SDekel Peled  *   Pointer to a valid action on success, NULL otherwise.
309b293fbf9SDekel Peled  *
310b293fbf9SDekel Peled  * @return
311b293fbf9SDekel Peled  *   0 on success, or -1 on failure and errno is set.
312b293fbf9SDekel Peled  */
313b293fbf9SDekel Peled static inline int
mlx5_flow_os_create_flow_action_count(void * cnt_obj,uint16_t offset,void ** action)314b293fbf9SDekel Peled mlx5_flow_os_create_flow_action_count(void *cnt_obj, uint16_t offset,
315b293fbf9SDekel Peled 				      void **action)
316b293fbf9SDekel Peled {
317b293fbf9SDekel Peled 	*action = mlx5_glue->dv_create_flow_action_counter(cnt_obj, offset);
318b293fbf9SDekel Peled 	return (*action) ? 0 : -1;
319b293fbf9SDekel Peled }
320b293fbf9SDekel Peled 
321b293fbf9SDekel Peled /**
322b293fbf9SDekel Peled  * Create flow action: tag.
323b293fbf9SDekel Peled  *
324b293fbf9SDekel Peled  * @param[in] tag
325b293fbf9SDekel Peled  *   Tag value.
326b293fbf9SDekel Peled  * @param[out] action
327b293fbf9SDekel Peled  *   Pointer to a valid action on success, NULL otherwise.
328b293fbf9SDekel Peled  *
329b293fbf9SDekel Peled  * @return
330b293fbf9SDekel Peled  *   0 on success, or -1 on failure and errno is set.
331b293fbf9SDekel Peled  */
332b293fbf9SDekel Peled static inline int
mlx5_flow_os_create_flow_action_tag(uint32_t tag,void ** action)333b293fbf9SDekel Peled mlx5_flow_os_create_flow_action_tag(uint32_t tag, void **action)
334b293fbf9SDekel Peled {
335b293fbf9SDekel Peled 	*action = mlx5_glue->dv_create_flow_action_tag(tag);
336b293fbf9SDekel Peled 	return (*action) ? 0 : -1;
337b293fbf9SDekel Peled }
338b293fbf9SDekel Peled 
339b293fbf9SDekel Peled /**
340b293fbf9SDekel Peled  * Create flow action: drop.
341b293fbf9SDekel Peled  *
342b293fbf9SDekel Peled  * @param[out] action
343b293fbf9SDekel Peled  *   Pointer to a valid action on success, NULL otherwise.
344b293fbf9SDekel Peled  *
345b293fbf9SDekel Peled  * @return
346b293fbf9SDekel Peled  *   0 on success, or -1 on failure and errno is set.
347b293fbf9SDekel Peled  */
348b293fbf9SDekel Peled static inline int
mlx5_flow_os_create_flow_action_drop(void ** action)349b293fbf9SDekel Peled mlx5_flow_os_create_flow_action_drop(void **action)
350b293fbf9SDekel Peled {
351b293fbf9SDekel Peled 	*action = mlx5_glue->dr_create_flow_action_drop();
352b293fbf9SDekel Peled 	return (*action) ? 0 : -1;
353b293fbf9SDekel Peled }
354b293fbf9SDekel Peled 
355b293fbf9SDekel Peled /**
35614020ad5SOphir Munk  * Create flow action: default miss.
35714020ad5SOphir Munk  *
35814020ad5SOphir Munk  * @param[out] action
35914020ad5SOphir Munk  *   Pointer to a valid action on success, NULL otherwise.
36014020ad5SOphir Munk  *
36114020ad5SOphir Munk  * @return
36214020ad5SOphir Munk  *   0 on success, or -1 on failure and errno is set.
36314020ad5SOphir Munk  */
36414020ad5SOphir Munk static inline int
mlx5_flow_os_create_flow_action_default_miss(void ** action)36514020ad5SOphir Munk mlx5_flow_os_create_flow_action_default_miss(void **action)
36614020ad5SOphir Munk {
36714020ad5SOphir Munk 	*action = mlx5_glue->dr_create_flow_action_default_miss();
36814020ad5SOphir Munk 	return (*action) ? 0 : -1;
36914020ad5SOphir Munk }
37014020ad5SOphir Munk 
37114020ad5SOphir Munk /**
37280f998daSMichael Savisko  * Create flow action: send_to_kernel.
37380f998daSMichael Savisko  *
37480f998daSMichael Savisko  * @param[in] tbl
37580f998daSMichael Savisko  *   Pointer to destination root table.
37680f998daSMichael Savisko  * @param[in] priority
37780f998daSMichael Savisko  *   Priority to which traffic will arrive.
37880f998daSMichael Savisko  * @param[out] action
37980f998daSMichael Savisko  *   Pointer to a valid action on success, NULL otherwise.
38080f998daSMichael Savisko  *
38180f998daSMichael Savisko  * @return
38280f998daSMichael Savisko  *   0 on success, or -1 on failure and errno is set.
38380f998daSMichael Savisko  */
38480f998daSMichael Savisko static inline int
mlx5_flow_os_create_flow_action_send_to_kernel(void * tbl,uint16_t priority,void ** action)38580f998daSMichael Savisko mlx5_flow_os_create_flow_action_send_to_kernel(void *tbl, uint16_t priority,
38680f998daSMichael Savisko 					  void **action)
38780f998daSMichael Savisko {
38880f998daSMichael Savisko 	*action = mlx5_glue->dr_create_flow_action_send_to_kernel(tbl,
38980f998daSMichael Savisko 								  priority);
39080f998daSMichael Savisko 	return (*action) ? 0 : -1;
39180f998daSMichael Savisko }
39280f998daSMichael Savisko 
39380f998daSMichael Savisko /**
39488019723SOphir Munk  * Create flow action: dest_devx_tir
39588019723SOphir Munk  *
39688019723SOphir Munk  * @param[in] tir
39788019723SOphir Munk  *   Pointer to DevX tir object
39888019723SOphir Munk  * @param[out] action
39988019723SOphir Munk  *   Pointer to a valid action on success, NULL otherwise.
40088019723SOphir Munk  *
40188019723SOphir Munk  * @return
40288019723SOphir Munk  *   0 on success, or -1 on failure and errno is set.
40388019723SOphir Munk  */
40488019723SOphir Munk static inline int
mlx5_flow_os_create_flow_action_dest_devx_tir(struct mlx5_devx_obj * tir,void ** action)40588019723SOphir Munk mlx5_flow_os_create_flow_action_dest_devx_tir(struct mlx5_devx_obj *tir,
40688019723SOphir Munk 					      void **action)
40788019723SOphir Munk {
40888019723SOphir Munk #ifdef HAVE_IBV_FLOW_DV_SUPPORT
40988019723SOphir Munk 	*action = mlx5_glue->dv_create_flow_action_dest_devx_tir(tir->obj);
41088019723SOphir Munk 	return (*action) ? 0 : -1;
41188019723SOphir Munk #else
41288019723SOphir Munk 	/* If no DV support - skip the operation and return success */
41388019723SOphir Munk 	RTE_SET_USED(tir);
41488019723SOphir Munk 	*action = 0;
41588019723SOphir Munk 	return 0;
41688019723SOphir Munk #endif
41788019723SOphir Munk }
41888019723SOphir Munk 
41988019723SOphir Munk /**
420bd935fe3SOphir Munk  * Create flow action: sampler
421bd935fe3SOphir Munk  *
422bd935fe3SOphir Munk  * @param[in] attr
423bd935fe3SOphir Munk  *   Pointer to sampler attribute
424bd935fe3SOphir Munk  * @param[out] action
425bd935fe3SOphir Munk  *   Pointer to a valid action on success, NULL otherwise.
426bd935fe3SOphir Munk  *
427bd935fe3SOphir Munk  * @return
428bd935fe3SOphir Munk  *   0 on success, or -1 on failure and errno is set.
429bd935fe3SOphir Munk  */
430bd935fe3SOphir Munk static inline int
mlx5_os_flow_dr_create_flow_action_sampler(struct mlx5dv_dr_flow_sampler_attr * attr,void ** action)431bd935fe3SOphir Munk mlx5_os_flow_dr_create_flow_action_sampler
432bd935fe3SOphir Munk 			(struct mlx5dv_dr_flow_sampler_attr *attr,
433bd935fe3SOphir Munk 			void **action)
434bd935fe3SOphir Munk {
435bd935fe3SOphir Munk 	*action = mlx5_glue->dr_create_flow_action_sampler(attr);
436bd935fe3SOphir Munk 	return (*action) ? 0 : -1;
437bd935fe3SOphir Munk }
438bd935fe3SOphir Munk 
439bd935fe3SOphir Munk /**
440bd935fe3SOphir Munk  * Create flow action: dest_array
441bd935fe3SOphir Munk  *
442bd935fe3SOphir Munk  * @param[in] domain
443bd935fe3SOphir Munk  *   Pointer to relevant domain.
444bd935fe3SOphir Munk  * @param[in] num_dest
445bd935fe3SOphir Munk  *   Number of destinations array.
446bd935fe3SOphir Munk  * @param[in] dests
447bd935fe3SOphir Munk  *   Array of destination attributes.
448bd935fe3SOphir Munk  * @param[out] action
449bd935fe3SOphir Munk  *   Pointer to a valid action on success, NULL otherwise.
450bd935fe3SOphir Munk  *
451bd935fe3SOphir Munk  * @return
452bd935fe3SOphir Munk  *   0 on success, or -1 on failure and errno is set.
453bd935fe3SOphir Munk  */
454bd935fe3SOphir Munk static inline int
mlx5_os_flow_dr_create_flow_action_dest_array(void * domain,size_t num_dest,struct mlx5dv_dr_action_dest_attr * dests[],void ** action)455bd935fe3SOphir Munk mlx5_os_flow_dr_create_flow_action_dest_array
456bd935fe3SOphir Munk 			(void *domain,
457bd935fe3SOphir Munk 			 size_t num_dest,
458bd935fe3SOphir Munk 			 struct mlx5dv_dr_action_dest_attr *dests[],
459bd935fe3SOphir Munk 			 void **action)
460bd935fe3SOphir Munk {
461bd935fe3SOphir Munk 	*action = mlx5_glue->dr_create_flow_action_dest_array(
462bd935fe3SOphir Munk 						domain, num_dest, dests);
463bd935fe3SOphir Munk 	return (*action) ? 0 : -1;
464bd935fe3SOphir Munk }
465bd935fe3SOphir Munk 
466bd935fe3SOphir Munk /**
467b293fbf9SDekel Peled  * Destroy flow action.
468b293fbf9SDekel Peled  *
469b293fbf9SDekel Peled  * @param[in] action
470b293fbf9SDekel Peled  *   Pointer to action object to destroy.
471b293fbf9SDekel Peled  *
472b293fbf9SDekel Peled  * @return
473b293fbf9SDekel Peled  *   0 on success, or the value of errno on failure.
474b293fbf9SDekel Peled  */
475b293fbf9SDekel Peled static inline int
mlx5_flow_os_destroy_flow_action(void * action)476b293fbf9SDekel Peled mlx5_flow_os_destroy_flow_action(void *action)
477b293fbf9SDekel Peled {
478b293fbf9SDekel Peled 	return mlx5_glue->destroy_flow_action(action);
479b293fbf9SDekel Peled }
480b293fbf9SDekel Peled 
481c604d92aSOphir Munk /**
482c604d92aSOphir Munk  * OS wrapper over Verbs API.
483c604d92aSOphir Munk  * Adjust flow priority based on the highest layer and the request priority.
484c604d92aSOphir Munk  *
485c604d92aSOphir Munk  * @param[in] dev
486c604d92aSOphir Munk  *    Pointer to the Ethernet device structure.
487c604d92aSOphir Munk  * @param[in] priority
488c604d92aSOphir Munk  *    The rule base priority.
489c604d92aSOphir Munk  * @param[in] subpriority
490c604d92aSOphir Munk  *    The priority based on the items.
491c604d92aSOphir Munk  *
492c604d92aSOphir Munk  * @return
493c604d92aSOphir Munk  *    The new priority.
494c604d92aSOphir Munk  */
495c604d92aSOphir Munk static inline uint32_t
mlx5_os_flow_adjust_priority(struct rte_eth_dev * dev,int32_t priority,uint32_t subpriority)496c604d92aSOphir Munk mlx5_os_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
497c604d92aSOphir Munk 			  uint32_t subpriority)
498c604d92aSOphir Munk {
499c604d92aSOphir Munk 	return mlx5_flow_adjust_priority(dev, priority, subpriority);
500c604d92aSOphir Munk }
50162d5b30bSTal Shnaiderman 
50262d5b30bSTal Shnaiderman static inline int
mlx5_os_flow_dr_sync_domain(void * domain,uint32_t flags)50362d5b30bSTal Shnaiderman mlx5_os_flow_dr_sync_domain(void *domain, uint32_t flags)
50462d5b30bSTal Shnaiderman {
50562d5b30bSTal Shnaiderman 	return mlx5_glue->dr_sync_domain(domain, flags);
50662d5b30bSTal Shnaiderman }
507fb96caa5SRaja Zidane 
508fb96caa5SRaja Zidane /**
509fb96caa5SRaja Zidane  * Validate ESP item.
510fb96caa5SRaja Zidane  *
511fb96caa5SRaja Zidane  * @param[in] item
512fb96caa5SRaja Zidane  *   Item specification.
513fb96caa5SRaja Zidane  * @param[in] item_flags
514fb96caa5SRaja Zidane  *   Bit-fields that holds the items detected until now.
515fb96caa5SRaja Zidane  * @param[in] target_protocol
516fb96caa5SRaja Zidane  *   The next protocol in the previous item.
517fb96caa5SRaja Zidane  * @param[out] error
518fb96caa5SRaja Zidane  *   Pointer to error structure.
519fb96caa5SRaja Zidane  *
520fb96caa5SRaja Zidane  * @return
521fb96caa5SRaja Zidane  *   0 on success, a negative errno value otherwise and rte_errno is set.
522fb96caa5SRaja Zidane  */
523fb96caa5SRaja Zidane int
524*80c67625SGregory Etelson mlx5_flow_os_validate_item_esp(const struct rte_eth_dev *dev,
525*80c67625SGregory Etelson 			       const struct rte_flow_item *item,
526fb96caa5SRaja Zidane 			       uint64_t item_flags,
527fb96caa5SRaja Zidane 			       uint8_t target_protocol,
528fb96caa5SRaja Zidane 			       struct rte_flow_error *error);
529fb96caa5SRaja Zidane 
5302ece3b71SBing Zhao /**
5312ece3b71SBing Zhao  * Add per thread workspace to the global list for garbage collection.
5322ece3b71SBing Zhao  *
5332ece3b71SBing Zhao  * @param[in] ws
5342ece3b71SBing Zhao  *   Pointer to the flow workspace.
5352ece3b71SBing Zhao  */
5362ece3b71SBing Zhao void mlx5_flow_os_workspace_gc_add(struct mlx5_flow_workspace *ws);
5372ece3b71SBing Zhao 
53817ad3af9SDekel Peled #endif /* RTE_PMD_MLX5_FLOW_OS_H_ */
539