1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright 2020 Mellanox Technologies, Ltd
3 */
4
5 #ifndef RTE_PMD_MLX5_FLOW_OS_H_
6 #define RTE_PMD_MLX5_FLOW_OS_H_
7
8 #include "mlx5_flow.h"
9
10 #ifdef HAVE_IBV_FLOW_DV_SUPPORT
11 extern const struct mlx5_flow_driver_ops mlx5_flow_dv_drv_ops;
12 #endif
13
14 /**
15 * Get OS enforced flow type. MLX5_FLOW_TYPE_MAX means "non enforced type".
16 *
17 * @return
18 * Flow type (MLX5_FLOW_TYPE_MAX)
19 */
20 static inline enum mlx5_flow_drv_type
mlx5_flow_os_get_type(void)21 mlx5_flow_os_get_type(void)
22 {
23 return MLX5_FLOW_TYPE_MAX;
24 }
25
26 /**
27 * Check if item type is supported.
28 *
29 * @param item
30 * Item type to check.
31 *
32 * @return
33 * True is this item type is supported, false if not supported.
34 */
35 static inline bool
mlx5_flow_os_item_supported(int item __rte_unused)36 mlx5_flow_os_item_supported(int item __rte_unused)
37 {
38 return true;
39 }
40
41 /**
42 * Check if action type is supported.
43 *
44 * @param action
45 * Action type to check.
46 *
47 * @return
48 * True is this action type is supported, false if not supported.
49 */
50 static inline bool
mlx5_flow_os_action_supported(int action __rte_unused)51 mlx5_flow_os_action_supported(int action __rte_unused)
52 {
53 return true;
54 }
55
56 /**
57 * Create flow rule.
58 *
59 * @param[in] matcher
60 * Pointer to match mask structure.
61 * @param[in] match_value
62 * Pointer to match value structure.
63 * @param[in] num_actions
64 * Number of actions in flow rule.
65 * @param[in] actions
66 * Pointer to array of flow rule actions.
67 * @param[out] flow
68 * Pointer to a valid flow rule object on success, NULL otherwise.
69 *
70 * @return
71 * 0 on success, or -1 on failure and errno is set.
72 */
73 static inline int
mlx5_flow_os_create_flow(void * matcher,void * match_value,size_t num_actions,void * actions[],void ** flow)74 mlx5_flow_os_create_flow(void *matcher, void *match_value,
75 size_t num_actions, void *actions[], void **flow)
76 {
77 *flow = mlx5_glue->dv_create_flow(matcher, match_value,
78 num_actions, actions);
79 return (*flow) ? 0 : -1;
80 }
81
82 /**
83 * Destroy flow rule.
84 *
85 * @param[in] drv_flow_ptr
86 * Pointer to flow rule object.
87 *
88 * @return
89 * 0 on success, or the value of errno on failure.
90 */
91 static inline int
mlx5_flow_os_destroy_flow(void * drv_flow_ptr)92 mlx5_flow_os_destroy_flow(void *drv_flow_ptr)
93 {
94 return mlx5_glue->dv_destroy_flow(drv_flow_ptr);
95 }
96
97 /**
98 * Create flow table.
99 *
100 * @param[in] domain
101 * Pointer to relevant domain.
102 * @param[in] table_id
103 * Table ID.
104 * @param[out] table
105 * Pointer to a valid flow table object on success, NULL otherwise.
106 *
107 * @return
108 * 0 on success, or -1 on failure and errno is set.
109 */
110 static inline int
mlx5_flow_os_create_flow_tbl(void * domain,uint32_t table_id,void ** table)111 mlx5_flow_os_create_flow_tbl(void *domain, uint32_t table_id, void **table)
112 {
113 *table = mlx5_glue->dr_create_flow_tbl(domain, table_id);
114 return (*table) ? 0 : -1;
115 }
116
117 /**
118 * Destroy flow table.
119 *
120 * @param[in] table
121 * Pointer to table object to destroy.
122 *
123 * @return
124 * 0 on success, or the value of errno on failure.
125 */
126 static inline int
mlx5_flow_os_destroy_flow_tbl(void * table)127 mlx5_flow_os_destroy_flow_tbl(void *table)
128 {
129 return mlx5_glue->dr_destroy_flow_tbl(table);
130 }
131
132 /**
133 * Create flow matcher in a flow table.
134 *
135 * @param[in] ctx
136 * Pointer to relevant device context.
137 * @param[in] attr
138 * Pointer to relevant attributes.
139 * @param[in] table
140 * Pointer to table object.
141 * @param[out] matcher
142 * Pointer to a valid flow matcher object on success, NULL otherwise.
143 *
144 * @return
145 * 0 on success, or -1 on failure and errno is set.
146 */
147 static inline int
mlx5_flow_os_create_flow_matcher(void * ctx,void * attr,void * table,void ** matcher)148 mlx5_flow_os_create_flow_matcher(void *ctx, void *attr, void *table,
149 void **matcher)
150 {
151 *matcher = mlx5_glue->dv_create_flow_matcher(ctx, attr, table);
152 return (*matcher) ? 0 : -1;
153 }
154
155 /**
156 * Destroy flow matcher.
157 *
158 * @param[in] matcher
159 * Pointer to matcher object to destroy.
160 *
161 * @return
162 * 0 on success, or the value of errno on failure.
163 */
164 static inline int
mlx5_flow_os_destroy_flow_matcher(void * matcher)165 mlx5_flow_os_destroy_flow_matcher(void *matcher)
166 {
167 return mlx5_glue->dv_destroy_flow_matcher(matcher);
168 }
169
170 /**
171 * Create flow action: packet reformat.
172 *
173 * @param[in] ctx
174 * Pointer to relevant device context.
175 * @param[in] domain
176 * Pointer to domain handler.
177 * @param[in] resource
178 * Pointer to action data resource.
179 * @param[out] action
180 * Pointer to a valid action on success, NULL otherwise.
181 *
182 *
183 * @return
184 * 0 on success, or -1 on failure and errno is set.
185 */
186 static inline int
mlx5_flow_os_create_flow_action_packet_reformat(void * ctx,void * domain,void * resource,void ** action)187 mlx5_flow_os_create_flow_action_packet_reformat(void *ctx, void *domain,
188 void *resource, void **action)
189 {
190 struct mlx5_flow_dv_encap_decap_resource *res =
191 (struct mlx5_flow_dv_encap_decap_resource *)resource;
192
193 *action = mlx5_glue->dv_create_flow_action_packet_reformat
194 (ctx, res->reformat_type, res->ft_type,
195 domain, res->flags, res->size,
196 (res->size ? res->buf : NULL));
197 return (*action) ? 0 : -1;
198 }
199
200 /**
201 * Create flow action: modify header.
202 *
203 * @param[in] ctx
204 * Pointer to relevant device context.
205 * @param[in] domain
206 * Pointer to domain handler.
207 * @param[in] resource
208 * Pointer to action data resource.
209 * @param[in] actions_len
210 * Total length of actions data in resource.
211 * @param[out] action
212 * Pointer to a valid action on success, NULL otherwise.
213 *
214 *
215 * @return
216 * 0 on success, or -1 on failure and errno is set.
217 */
218 static inline int
mlx5_flow_os_create_flow_action_modify_header(void * ctx,void * domain,void * resource,uint32_t actions_len,void ** action)219 mlx5_flow_os_create_flow_action_modify_header(void *ctx, void *domain,
220 void *resource,
221 uint32_t actions_len,
222 void **action)
223 {
224 struct mlx5_flow_dv_modify_hdr_resource *res =
225 (struct mlx5_flow_dv_modify_hdr_resource *)resource;
226
227 *action = mlx5_glue->dv_create_flow_action_modify_header
228 (ctx, res->ft_type, domain, res->flags,
229 actions_len, (uint64_t *)res->actions);
230 return (*action) ? 0 : -1;
231 }
232
233 /**
234 * Create flow action: destination flow table.
235 *
236 * @param[in] tbl_obj
237 * Pointer to destination table object.
238 * @param[out] action
239 * Pointer to a valid action on success, NULL otherwise.
240 *
241 * @return
242 * 0 on success, or -1 on failure and errno is set.
243 */
244 static inline int
mlx5_flow_os_create_flow_action_dest_flow_tbl(void * tbl_obj,void ** action)245 mlx5_flow_os_create_flow_action_dest_flow_tbl(void *tbl_obj, void **action)
246 {
247 *action = mlx5_glue->dr_create_flow_action_dest_flow_tbl(tbl_obj);
248 return (*action) ? 0 : -1;
249 }
250
251 /**
252 * Create flow action: destination port.
253 *
254 * @param[in] domain
255 * Pointer to domain handler.
256 * @param[in] port_id
257 * Destination port ID.
258 * @param[out] action
259 * Pointer to a valid action on success, NULL otherwise.
260 *
261 * @return
262 * 0 on success, or -1 on failure and errno is set.
263 */
264 static inline int
mlx5_flow_os_create_flow_action_dest_port(void * domain,uint32_t port_id,void ** action)265 mlx5_flow_os_create_flow_action_dest_port(void *domain, uint32_t port_id,
266 void **action)
267 {
268 /*
269 * Depending on rdma_core version the glue routine calls
270 * either mlx5dv_dr_action_create_dest_ib_port(domain, dev_port)
271 * or mlx5dv_dr_action_create_dest_vport(domain, vport_id).
272 */
273 *action = mlx5_glue->dr_create_flow_action_dest_port(domain, port_id);
274 return (*action) ? 0 : -1;
275 }
276
277 /**
278 * Create flow action: push vlan.
279 *
280 * @param[in] domain
281 * Pointer to domain handler.
282 * @param[in] vlan_tag
283 * VLAN tag value.
284 * @param[out] action
285 * Pointer to a valid action on success, NULL otherwise.
286 *
287 * @return
288 * 0 on success, or -1 on failure and errno is set.
289 */
290 static inline int
mlx5_flow_os_create_flow_action_push_vlan(void * domain,rte_be32_t vlan_tag,void ** action)291 mlx5_flow_os_create_flow_action_push_vlan(void *domain, rte_be32_t vlan_tag,
292 void **action)
293 {
294 *action = mlx5_glue->dr_create_flow_action_push_vlan(domain, vlan_tag);
295 return (*action) ? 0 : -1;
296 }
297
298 /**
299 * Create flow action: count.
300 *
301 * @param[in] cnt_obj
302 * Pointer to DevX counter object.
303 * @param[in] offset
304 * Offset of counter in array.
305 * @param[out] action
306 * Pointer to a valid action on success, NULL otherwise.
307 *
308 * @return
309 * 0 on success, or -1 on failure and errno is set.
310 */
311 static inline int
mlx5_flow_os_create_flow_action_count(void * cnt_obj,uint16_t offset,void ** action)312 mlx5_flow_os_create_flow_action_count(void *cnt_obj, uint16_t offset,
313 void **action)
314 {
315 *action = mlx5_glue->dv_create_flow_action_counter(cnt_obj, offset);
316 return (*action) ? 0 : -1;
317 }
318
319 /**
320 * Create flow action: tag.
321 *
322 * @param[in] tag
323 * Tag value.
324 * @param[out] action
325 * Pointer to a valid action on success, NULL otherwise.
326 *
327 * @return
328 * 0 on success, or -1 on failure and errno is set.
329 */
330 static inline int
mlx5_flow_os_create_flow_action_tag(uint32_t tag,void ** action)331 mlx5_flow_os_create_flow_action_tag(uint32_t tag, void **action)
332 {
333 *action = mlx5_glue->dv_create_flow_action_tag(tag);
334 return (*action) ? 0 : -1;
335 }
336
337 /**
338 * Create flow action: drop.
339 *
340 * @param[out] action
341 * Pointer to a valid action on success, NULL otherwise.
342 *
343 * @return
344 * 0 on success, or -1 on failure and errno is set.
345 */
346 static inline int
mlx5_flow_os_create_flow_action_drop(void ** action)347 mlx5_flow_os_create_flow_action_drop(void **action)
348 {
349 *action = mlx5_glue->dr_create_flow_action_drop();
350 return (*action) ? 0 : -1;
351 }
352
353 /**
354 * Destroy flow action.
355 *
356 * @param[in] action
357 * Pointer to action object to destroy.
358 *
359 * @return
360 * 0 on success, or the value of errno on failure.
361 */
362 static inline int
mlx5_flow_os_destroy_flow_action(void * action)363 mlx5_flow_os_destroy_flow_action(void *action)
364 {
365 return mlx5_glue->destroy_flow_action(action);
366 }
367
368 #endif /* RTE_PMD_MLX5_FLOW_OS_H_ */
369