1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606  * Copyright 2016 6WIND S.A.
3d30ea906Sjfb8856606  * Copyright 2016 Mellanox Technologies, Ltd
4d30ea906Sjfb8856606  */
5d30ea906Sjfb8856606 
6d30ea906Sjfb8856606 #ifndef RTE_FLOW_DRIVER_H_
7d30ea906Sjfb8856606 #define RTE_FLOW_DRIVER_H_
8d30ea906Sjfb8856606 
9d30ea906Sjfb8856606 /**
10d30ea906Sjfb8856606  * @file
11d30ea906Sjfb8856606  * RTE generic flow API (driver side)
12d30ea906Sjfb8856606  *
13d30ea906Sjfb8856606  * This file provides implementation helpers for internal use by PMDs, they
14d30ea906Sjfb8856606  * are not intended to be exposed to applications and are not subject to ABI
15d30ea906Sjfb8856606  * versioning.
16d30ea906Sjfb8856606  */
17d30ea906Sjfb8856606 
18d30ea906Sjfb8856606 #include <stdint.h>
19d30ea906Sjfb8856606 
20d30ea906Sjfb8856606 #include "rte_ethdev.h"
21*2d9fd380Sjfb8856606 #include "rte_ethdev_driver.h"
22d30ea906Sjfb8856606 #include "rte_flow.h"
23d30ea906Sjfb8856606 
24d30ea906Sjfb8856606 #ifdef __cplusplus
25d30ea906Sjfb8856606 extern "C" {
26d30ea906Sjfb8856606 #endif
27d30ea906Sjfb8856606 
28d30ea906Sjfb8856606 /**
29d30ea906Sjfb8856606  * Generic flow operations structure implemented and returned by PMDs.
30d30ea906Sjfb8856606  *
31d30ea906Sjfb8856606  * To implement this API, PMDs must handle the RTE_ETH_FILTER_GENERIC filter
32d30ea906Sjfb8856606  * type in their .filter_ctrl callback function (struct eth_dev_ops) as well
33d30ea906Sjfb8856606  * as the RTE_ETH_FILTER_GET filter operation.
34d30ea906Sjfb8856606  *
35d30ea906Sjfb8856606  * If successful, this operation must result in a pointer to a PMD-specific
36d30ea906Sjfb8856606  * struct rte_flow_ops written to the argument address as described below:
37d30ea906Sjfb8856606  *
38d30ea906Sjfb8856606  * \code
39d30ea906Sjfb8856606  *
40d30ea906Sjfb8856606  * // PMD filter_ctrl callback
41d30ea906Sjfb8856606  *
42d30ea906Sjfb8856606  * static const struct rte_flow_ops pmd_flow_ops = { ... };
43d30ea906Sjfb8856606  *
44d30ea906Sjfb8856606  * switch (filter_type) {
45d30ea906Sjfb8856606  * case RTE_ETH_FILTER_GENERIC:
46d30ea906Sjfb8856606  *     if (filter_op != RTE_ETH_FILTER_GET)
47d30ea906Sjfb8856606  *         return -EINVAL;
48d30ea906Sjfb8856606  *     *(const void **)arg = &pmd_flow_ops;
49d30ea906Sjfb8856606  *     return 0;
50d30ea906Sjfb8856606  * }
51d30ea906Sjfb8856606  *
52d30ea906Sjfb8856606  * \endcode
53d30ea906Sjfb8856606  *
54d30ea906Sjfb8856606  * See also rte_flow_ops_get().
55d30ea906Sjfb8856606  *
56d30ea906Sjfb8856606  * These callback functions are not supposed to be used by applications
57d30ea906Sjfb8856606  * directly, which must rely on the API defined in rte_flow.h.
58d30ea906Sjfb8856606  *
59d30ea906Sjfb8856606  * Public-facing wrapper functions perform a few consistency checks so that
60d30ea906Sjfb8856606  * unimplemented (i.e. NULL) callbacks simply return -ENOTSUP. These
61d30ea906Sjfb8856606  * callbacks otherwise only differ by their first argument (with port ID
62d30ea906Sjfb8856606  * already resolved to a pointer to struct rte_eth_dev).
63d30ea906Sjfb8856606  */
64d30ea906Sjfb8856606 struct rte_flow_ops {
65d30ea906Sjfb8856606 	/** See rte_flow_validate(). */
66d30ea906Sjfb8856606 	int (*validate)
67d30ea906Sjfb8856606 		(struct rte_eth_dev *,
68d30ea906Sjfb8856606 		 const struct rte_flow_attr *,
69d30ea906Sjfb8856606 		 const struct rte_flow_item [],
70d30ea906Sjfb8856606 		 const struct rte_flow_action [],
71d30ea906Sjfb8856606 		 struct rte_flow_error *);
72d30ea906Sjfb8856606 	/** See rte_flow_create(). */
73d30ea906Sjfb8856606 	struct rte_flow *(*create)
74d30ea906Sjfb8856606 		(struct rte_eth_dev *,
75d30ea906Sjfb8856606 		 const struct rte_flow_attr *,
76d30ea906Sjfb8856606 		 const struct rte_flow_item [],
77d30ea906Sjfb8856606 		 const struct rte_flow_action [],
78d30ea906Sjfb8856606 		 struct rte_flow_error *);
79d30ea906Sjfb8856606 	/** See rte_flow_destroy(). */
80d30ea906Sjfb8856606 	int (*destroy)
81d30ea906Sjfb8856606 		(struct rte_eth_dev *,
82d30ea906Sjfb8856606 		 struct rte_flow *,
83d30ea906Sjfb8856606 		 struct rte_flow_error *);
84d30ea906Sjfb8856606 	/** See rte_flow_flush(). */
85d30ea906Sjfb8856606 	int (*flush)
86d30ea906Sjfb8856606 		(struct rte_eth_dev *,
87d30ea906Sjfb8856606 		 struct rte_flow_error *);
88d30ea906Sjfb8856606 	/** See rte_flow_query(). */
89d30ea906Sjfb8856606 	int (*query)
90d30ea906Sjfb8856606 		(struct rte_eth_dev *,
91d30ea906Sjfb8856606 		 struct rte_flow *,
92d30ea906Sjfb8856606 		 const struct rte_flow_action *,
93d30ea906Sjfb8856606 		 void *,
94d30ea906Sjfb8856606 		 struct rte_flow_error *);
95d30ea906Sjfb8856606 	/** See rte_flow_isolate(). */
96d30ea906Sjfb8856606 	int (*isolate)
97d30ea906Sjfb8856606 		(struct rte_eth_dev *,
98d30ea906Sjfb8856606 		 int,
99d30ea906Sjfb8856606 		 struct rte_flow_error *);
100*2d9fd380Sjfb8856606 	/** See rte_flow_dev_dump(). */
101*2d9fd380Sjfb8856606 	int (*dev_dump)
102*2d9fd380Sjfb8856606 		(struct rte_eth_dev *dev,
103*2d9fd380Sjfb8856606 		 FILE *file,
104*2d9fd380Sjfb8856606 		 struct rte_flow_error *error);
105*2d9fd380Sjfb8856606 	/** See rte_flow_get_aged_flows() */
106*2d9fd380Sjfb8856606 	int (*get_aged_flows)
107*2d9fd380Sjfb8856606 		(struct rte_eth_dev *dev,
108*2d9fd380Sjfb8856606 		 void **context,
109*2d9fd380Sjfb8856606 		 uint32_t nb_contexts,
110*2d9fd380Sjfb8856606 		 struct rte_flow_error *err);
111*2d9fd380Sjfb8856606 	/** See rte_flow_shared_action_create() */
112*2d9fd380Sjfb8856606 	struct rte_flow_shared_action *(*shared_action_create)
113*2d9fd380Sjfb8856606 		(struct rte_eth_dev *dev,
114*2d9fd380Sjfb8856606 		 const struct rte_flow_shared_action_conf *conf,
115*2d9fd380Sjfb8856606 		 const struct rte_flow_action *action,
116*2d9fd380Sjfb8856606 		 struct rte_flow_error *error);
117*2d9fd380Sjfb8856606 	/** See rte_flow_shared_action_destroy() */
118*2d9fd380Sjfb8856606 	int (*shared_action_destroy)
119*2d9fd380Sjfb8856606 		(struct rte_eth_dev *dev,
120*2d9fd380Sjfb8856606 		 struct rte_flow_shared_action *shared_action,
121*2d9fd380Sjfb8856606 		 struct rte_flow_error *error);
122*2d9fd380Sjfb8856606 	/** See rte_flow_shared_action_update() */
123*2d9fd380Sjfb8856606 	int (*shared_action_update)
124*2d9fd380Sjfb8856606 		(struct rte_eth_dev *dev,
125*2d9fd380Sjfb8856606 		 struct rte_flow_shared_action *shared_action,
126*2d9fd380Sjfb8856606 		 const struct rte_flow_action *update,
127*2d9fd380Sjfb8856606 		 struct rte_flow_error *error);
128*2d9fd380Sjfb8856606 	/** See rte_flow_shared_action_query() */
129*2d9fd380Sjfb8856606 	int (*shared_action_query)
130*2d9fd380Sjfb8856606 		(struct rte_eth_dev *dev,
131*2d9fd380Sjfb8856606 		 const struct rte_flow_shared_action *shared_action,
132*2d9fd380Sjfb8856606 		 void *data,
133*2d9fd380Sjfb8856606 		 struct rte_flow_error *error);
134*2d9fd380Sjfb8856606 	/** See rte_flow_tunnel_decap_set() */
135*2d9fd380Sjfb8856606 	int (*tunnel_decap_set)
136*2d9fd380Sjfb8856606 		(struct rte_eth_dev *dev,
137*2d9fd380Sjfb8856606 		 struct rte_flow_tunnel *tunnel,
138*2d9fd380Sjfb8856606 		 struct rte_flow_action **pmd_actions,
139*2d9fd380Sjfb8856606 		 uint32_t *num_of_actions,
140*2d9fd380Sjfb8856606 		 struct rte_flow_error *err);
141*2d9fd380Sjfb8856606 	/** See rte_flow_tunnel_match() */
142*2d9fd380Sjfb8856606 	int (*tunnel_match)
143*2d9fd380Sjfb8856606 		(struct rte_eth_dev *dev,
144*2d9fd380Sjfb8856606 		 struct rte_flow_tunnel *tunnel,
145*2d9fd380Sjfb8856606 		 struct rte_flow_item **pmd_items,
146*2d9fd380Sjfb8856606 		 uint32_t *num_of_items,
147*2d9fd380Sjfb8856606 		 struct rte_flow_error *err);
148*2d9fd380Sjfb8856606 	/** See rte_flow_get_rte_flow_restore_info() */
149*2d9fd380Sjfb8856606 	int (*get_restore_info)
150*2d9fd380Sjfb8856606 		(struct rte_eth_dev *dev,
151*2d9fd380Sjfb8856606 		 struct rte_mbuf *m,
152*2d9fd380Sjfb8856606 		 struct rte_flow_restore_info *info,
153*2d9fd380Sjfb8856606 		 struct rte_flow_error *err);
154*2d9fd380Sjfb8856606 	/** See rte_flow_action_tunnel_decap_release() */
155*2d9fd380Sjfb8856606 	int (*tunnel_action_decap_release)
156*2d9fd380Sjfb8856606 		(struct rte_eth_dev *dev,
157*2d9fd380Sjfb8856606 		 struct rte_flow_action *pmd_actions,
158*2d9fd380Sjfb8856606 		 uint32_t num_of_actions,
159*2d9fd380Sjfb8856606 		 struct rte_flow_error *err);
160*2d9fd380Sjfb8856606 	/** See rte_flow_item_release() */
161*2d9fd380Sjfb8856606 	int (*tunnel_item_release)
162*2d9fd380Sjfb8856606 		(struct rte_eth_dev *dev,
163*2d9fd380Sjfb8856606 		 struct rte_flow_item *pmd_items,
164*2d9fd380Sjfb8856606 		 uint32_t num_of_items,
165*2d9fd380Sjfb8856606 		 struct rte_flow_error *err);
166d30ea906Sjfb8856606 };
167d30ea906Sjfb8856606 
168d30ea906Sjfb8856606 /**
169d30ea906Sjfb8856606  * Get generic flow operations structure from a port.
170d30ea906Sjfb8856606  *
171d30ea906Sjfb8856606  * @param port_id
172d30ea906Sjfb8856606  *   Port identifier to query.
173d30ea906Sjfb8856606  * @param[out] error
174d30ea906Sjfb8856606  *   Pointer to flow error structure.
175d30ea906Sjfb8856606  *
176d30ea906Sjfb8856606  * @return
177d30ea906Sjfb8856606  *   The flow operations structure associated with port_id, NULL in case of
178d30ea906Sjfb8856606  *   error, in which case rte_errno is set and the error structure contains
179d30ea906Sjfb8856606  *   additional details.
180d30ea906Sjfb8856606  */
181d30ea906Sjfb8856606 const struct rte_flow_ops *
182d30ea906Sjfb8856606 rte_flow_ops_get(uint16_t port_id, struct rte_flow_error *error);
183d30ea906Sjfb8856606 
184d30ea906Sjfb8856606 #ifdef __cplusplus
185d30ea906Sjfb8856606 }
186d30ea906Sjfb8856606 #endif
187d30ea906Sjfb8856606 
188d30ea906Sjfb8856606 #endif /* RTE_FLOW_DRIVER_H_ */
189