xref: /dpdk/lib/acl/rte_acl.h (revision 99a2dd955fba6e4cc23b77d590a033650ced9c45)
1*99a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2*99a2dd95SBruce Richardson  * Copyright(c) 2010-2014 Intel Corporation
3*99a2dd95SBruce Richardson  */
4*99a2dd95SBruce Richardson 
5*99a2dd95SBruce Richardson #ifndef _RTE_ACL_H_
6*99a2dd95SBruce Richardson #define _RTE_ACL_H_
7*99a2dd95SBruce Richardson 
8*99a2dd95SBruce Richardson /**
9*99a2dd95SBruce Richardson  * @file
10*99a2dd95SBruce Richardson  *
11*99a2dd95SBruce Richardson  * RTE Classifier.
12*99a2dd95SBruce Richardson  */
13*99a2dd95SBruce Richardson 
14*99a2dd95SBruce Richardson #include <rte_acl_osdep.h>
15*99a2dd95SBruce Richardson 
16*99a2dd95SBruce Richardson #ifdef __cplusplus
17*99a2dd95SBruce Richardson extern "C" {
18*99a2dd95SBruce Richardson #endif
19*99a2dd95SBruce Richardson 
20*99a2dd95SBruce Richardson #define	RTE_ACL_MAX_CATEGORIES	16
21*99a2dd95SBruce Richardson 
22*99a2dd95SBruce Richardson #define	RTE_ACL_RESULTS_MULTIPLIER	(XMM_SIZE / sizeof(uint32_t))
23*99a2dd95SBruce Richardson 
24*99a2dd95SBruce Richardson #define RTE_ACL_MAX_LEVELS 64
25*99a2dd95SBruce Richardson #define RTE_ACL_MAX_FIELDS 64
26*99a2dd95SBruce Richardson 
27*99a2dd95SBruce Richardson union rte_acl_field_types {
28*99a2dd95SBruce Richardson 	uint8_t  u8;
29*99a2dd95SBruce Richardson 	uint16_t u16;
30*99a2dd95SBruce Richardson 	uint32_t u32;
31*99a2dd95SBruce Richardson 	uint64_t u64;
32*99a2dd95SBruce Richardson };
33*99a2dd95SBruce Richardson 
34*99a2dd95SBruce Richardson enum {
35*99a2dd95SBruce Richardson 	RTE_ACL_FIELD_TYPE_MASK = 0,
36*99a2dd95SBruce Richardson 	RTE_ACL_FIELD_TYPE_RANGE,
37*99a2dd95SBruce Richardson 	RTE_ACL_FIELD_TYPE_BITMASK
38*99a2dd95SBruce Richardson };
39*99a2dd95SBruce Richardson 
40*99a2dd95SBruce Richardson /**
41*99a2dd95SBruce Richardson  * ACL Field definition.
42*99a2dd95SBruce Richardson  * Each field in the ACL rule has an associate definition.
43*99a2dd95SBruce Richardson  * It defines the type of field, its size, its offset in the input buffer,
44*99a2dd95SBruce Richardson  * the field index, and the input index.
45*99a2dd95SBruce Richardson  * For performance reasons, the inner loop of the search function is unrolled
46*99a2dd95SBruce Richardson  * to process four input bytes at a time. This requires the input to be grouped
47*99a2dd95SBruce Richardson  * into sets of 4 consecutive bytes. The loop processes the first input byte as
48*99a2dd95SBruce Richardson  * part of the setup and then subsequent bytes must be in groups of 4
49*99a2dd95SBruce Richardson  * consecutive bytes.
50*99a2dd95SBruce Richardson  */
51*99a2dd95SBruce Richardson struct rte_acl_field_def {
52*99a2dd95SBruce Richardson 	uint8_t  type;        /**< type - RTE_ACL_FIELD_TYPE_*. */
53*99a2dd95SBruce Richardson 	uint8_t	 size;        /**< size of field 1,2,4, or 8. */
54*99a2dd95SBruce Richardson 	uint8_t	 field_index; /**< index of field inside the rule. */
55*99a2dd95SBruce Richardson 	uint8_t  input_index; /**< 0-N input index. */
56*99a2dd95SBruce Richardson 	uint32_t offset;      /**< offset to start of field. */
57*99a2dd95SBruce Richardson };
58*99a2dd95SBruce Richardson 
59*99a2dd95SBruce Richardson /**
60*99a2dd95SBruce Richardson  * ACL build configuration.
61*99a2dd95SBruce Richardson  * Defines the fields of an ACL trie and number of categories to build with.
62*99a2dd95SBruce Richardson  */
63*99a2dd95SBruce Richardson struct rte_acl_config {
64*99a2dd95SBruce Richardson 	uint32_t num_categories; /**< Number of categories to build with. */
65*99a2dd95SBruce Richardson 	uint32_t num_fields;     /**< Number of field definitions. */
66*99a2dd95SBruce Richardson 	struct rte_acl_field_def defs[RTE_ACL_MAX_FIELDS];
67*99a2dd95SBruce Richardson 	/**< array of field definitions. */
68*99a2dd95SBruce Richardson 	size_t max_size;
69*99a2dd95SBruce Richardson 	/**< max memory limit for internal run-time structures. */
70*99a2dd95SBruce Richardson };
71*99a2dd95SBruce Richardson 
72*99a2dd95SBruce Richardson /**
73*99a2dd95SBruce Richardson  * Defines the value of a field for a rule.
74*99a2dd95SBruce Richardson  */
75*99a2dd95SBruce Richardson struct rte_acl_field {
76*99a2dd95SBruce Richardson 	union rte_acl_field_types value;
77*99a2dd95SBruce Richardson 	/**< a 1,2,4, or 8 byte value of the field. */
78*99a2dd95SBruce Richardson 	union rte_acl_field_types mask_range;
79*99a2dd95SBruce Richardson 	/**<
80*99a2dd95SBruce Richardson 	 * depending on field type:
81*99a2dd95SBruce Richardson 	 * mask -> 1.2.3.4/32 value=0x1020304, mask_range=32,
82*99a2dd95SBruce Richardson 	 * range -> 0 : 65535 value=0, mask_range=65535,
83*99a2dd95SBruce Richardson 	 * bitmask -> 0x06/0xff value=6, mask_range=0xff.
84*99a2dd95SBruce Richardson 	 */
85*99a2dd95SBruce Richardson };
86*99a2dd95SBruce Richardson 
87*99a2dd95SBruce Richardson enum {
88*99a2dd95SBruce Richardson 	RTE_ACL_TYPE_SHIFT = 29,
89*99a2dd95SBruce Richardson 	RTE_ACL_MAX_INDEX = RTE_LEN2MASK(RTE_ACL_TYPE_SHIFT, uint32_t),
90*99a2dd95SBruce Richardson 	RTE_ACL_MAX_PRIORITY = RTE_ACL_MAX_INDEX,
91*99a2dd95SBruce Richardson 	RTE_ACL_MIN_PRIORITY = 1,
92*99a2dd95SBruce Richardson };
93*99a2dd95SBruce Richardson 
94*99a2dd95SBruce Richardson #define	RTE_ACL_MASKLEN_TO_BITMASK(v, s)	\
95*99a2dd95SBruce Richardson ((v) == 0 ? (v) : (typeof(v))((uint64_t)-1 << ((s) * CHAR_BIT - (v))))
96*99a2dd95SBruce Richardson 
97*99a2dd95SBruce Richardson /**
98*99a2dd95SBruce Richardson  * Miscellaneous data for ACL rule.
99*99a2dd95SBruce Richardson  */
100*99a2dd95SBruce Richardson struct rte_acl_rule_data {
101*99a2dd95SBruce Richardson 	uint32_t category_mask; /**< Mask of categories for that rule. */
102*99a2dd95SBruce Richardson 	int32_t  priority;      /**< Priority for that rule. */
103*99a2dd95SBruce Richardson 	uint32_t userdata;      /**< Associated with the rule user data. */
104*99a2dd95SBruce Richardson };
105*99a2dd95SBruce Richardson 
106*99a2dd95SBruce Richardson /**
107*99a2dd95SBruce Richardson  * Defines single ACL rule.
108*99a2dd95SBruce Richardson  * data - miscellaneous data for the rule.
109*99a2dd95SBruce Richardson  * field[] - value and mask or range for each field.
110*99a2dd95SBruce Richardson  */
111*99a2dd95SBruce Richardson #define	RTE_ACL_RULE_DEF(name, fld_num)	struct name {\
112*99a2dd95SBruce Richardson 	struct rte_acl_rule_data data;               \
113*99a2dd95SBruce Richardson 	struct rte_acl_field field[fld_num];         \
114*99a2dd95SBruce Richardson }
115*99a2dd95SBruce Richardson 
116*99a2dd95SBruce Richardson RTE_ACL_RULE_DEF(rte_acl_rule,);
117*99a2dd95SBruce Richardson 
118*99a2dd95SBruce Richardson #define	RTE_ACL_RULE_SZ(fld_num)	\
119*99a2dd95SBruce Richardson 	(sizeof(struct rte_acl_rule) + sizeof(struct rte_acl_field) * (fld_num))
120*99a2dd95SBruce Richardson 
121*99a2dd95SBruce Richardson 
122*99a2dd95SBruce Richardson /** Max number of characters in name.*/
123*99a2dd95SBruce Richardson #define	RTE_ACL_NAMESIZE		32
124*99a2dd95SBruce Richardson 
125*99a2dd95SBruce Richardson /**
126*99a2dd95SBruce Richardson  * Parameters used when creating the ACL context.
127*99a2dd95SBruce Richardson  */
128*99a2dd95SBruce Richardson struct rte_acl_param {
129*99a2dd95SBruce Richardson 	const char *name;         /**< Name of the ACL context. */
130*99a2dd95SBruce Richardson 	int         socket_id;    /**< Socket ID to allocate memory for. */
131*99a2dd95SBruce Richardson 	uint32_t    rule_size;    /**< Size of each rule. */
132*99a2dd95SBruce Richardson 	uint32_t    max_rule_num; /**< Maximum number of rules. */
133*99a2dd95SBruce Richardson };
134*99a2dd95SBruce Richardson 
135*99a2dd95SBruce Richardson 
136*99a2dd95SBruce Richardson /**
137*99a2dd95SBruce Richardson  * Create a new ACL context.
138*99a2dd95SBruce Richardson  *
139*99a2dd95SBruce Richardson  * @param param
140*99a2dd95SBruce Richardson  *   Parameters used to create and initialise the ACL context.
141*99a2dd95SBruce Richardson  * @return
142*99a2dd95SBruce Richardson  *   Pointer to ACL context structure that is used in future ACL
143*99a2dd95SBruce Richardson  *   operations, or NULL on error, with error code set in rte_errno.
144*99a2dd95SBruce Richardson  *   Possible rte_errno errors include:
145*99a2dd95SBruce Richardson  *   - EINVAL - invalid parameter passed to function
146*99a2dd95SBruce Richardson  */
147*99a2dd95SBruce Richardson struct rte_acl_ctx *
148*99a2dd95SBruce Richardson rte_acl_create(const struct rte_acl_param *param);
149*99a2dd95SBruce Richardson 
150*99a2dd95SBruce Richardson /**
151*99a2dd95SBruce Richardson  * Find an existing ACL context object and return a pointer to it.
152*99a2dd95SBruce Richardson  *
153*99a2dd95SBruce Richardson  * @param name
154*99a2dd95SBruce Richardson  *   Name of the ACL context as passed to rte_acl_create()
155*99a2dd95SBruce Richardson  * @return
156*99a2dd95SBruce Richardson  *   Pointer to ACL context or NULL if object not found
157*99a2dd95SBruce Richardson  *   with rte_errno set appropriately. Possible rte_errno values include:
158*99a2dd95SBruce Richardson  *    - ENOENT - value not available for return
159*99a2dd95SBruce Richardson  */
160*99a2dd95SBruce Richardson struct rte_acl_ctx *
161*99a2dd95SBruce Richardson rte_acl_find_existing(const char *name);
162*99a2dd95SBruce Richardson 
163*99a2dd95SBruce Richardson /**
164*99a2dd95SBruce Richardson  * De-allocate all memory used by ACL context.
165*99a2dd95SBruce Richardson  *
166*99a2dd95SBruce Richardson  * @param ctx
167*99a2dd95SBruce Richardson  *   ACL context to free
168*99a2dd95SBruce Richardson  */
169*99a2dd95SBruce Richardson void
170*99a2dd95SBruce Richardson rte_acl_free(struct rte_acl_ctx *ctx);
171*99a2dd95SBruce Richardson 
172*99a2dd95SBruce Richardson /**
173*99a2dd95SBruce Richardson  * Add rules to an existing ACL context.
174*99a2dd95SBruce Richardson  * This function is not multi-thread safe.
175*99a2dd95SBruce Richardson  *
176*99a2dd95SBruce Richardson  * @param ctx
177*99a2dd95SBruce Richardson  *   ACL context to add patterns to.
178*99a2dd95SBruce Richardson  * @param rules
179*99a2dd95SBruce Richardson  *   Array of rules to add to the ACL context.
180*99a2dd95SBruce Richardson  *   Note that all fields in rte_acl_rule structures are expected
181*99a2dd95SBruce Richardson  *   to be in host byte order.
182*99a2dd95SBruce Richardson  *   Each rule expected to be in the same format and not exceed size
183*99a2dd95SBruce Richardson  *   specified at ACL context creation time.
184*99a2dd95SBruce Richardson  * @param num
185*99a2dd95SBruce Richardson  *   Number of elements in the input array of rules.
186*99a2dd95SBruce Richardson  * @return
187*99a2dd95SBruce Richardson  *   - -ENOMEM if there is no space in the ACL context for these rules.
188*99a2dd95SBruce Richardson  *   - -EINVAL if the parameters are invalid.
189*99a2dd95SBruce Richardson  *   - Zero if operation completed successfully.
190*99a2dd95SBruce Richardson  */
191*99a2dd95SBruce Richardson int
192*99a2dd95SBruce Richardson rte_acl_add_rules(struct rte_acl_ctx *ctx, const struct rte_acl_rule *rules,
193*99a2dd95SBruce Richardson 	uint32_t num);
194*99a2dd95SBruce Richardson 
195*99a2dd95SBruce Richardson /**
196*99a2dd95SBruce Richardson  * Delete all rules from the ACL context.
197*99a2dd95SBruce Richardson  * This function is not multi-thread safe.
198*99a2dd95SBruce Richardson  * Note that internal run-time structures are not affected.
199*99a2dd95SBruce Richardson  *
200*99a2dd95SBruce Richardson  * @param ctx
201*99a2dd95SBruce Richardson  *   ACL context to delete rules from.
202*99a2dd95SBruce Richardson  */
203*99a2dd95SBruce Richardson void
204*99a2dd95SBruce Richardson rte_acl_reset_rules(struct rte_acl_ctx *ctx);
205*99a2dd95SBruce Richardson 
206*99a2dd95SBruce Richardson /**
207*99a2dd95SBruce Richardson  * Analyze set of rules and build required internal run-time structures.
208*99a2dd95SBruce Richardson  * This function is not multi-thread safe.
209*99a2dd95SBruce Richardson  *
210*99a2dd95SBruce Richardson  * @param ctx
211*99a2dd95SBruce Richardson  *   ACL context to build.
212*99a2dd95SBruce Richardson  * @param cfg
213*99a2dd95SBruce Richardson  *   Pointer to struct rte_acl_config - defines build parameters.
214*99a2dd95SBruce Richardson  * @return
215*99a2dd95SBruce Richardson  *   - -ENOMEM if couldn't allocate enough memory.
216*99a2dd95SBruce Richardson  *   - -EINVAL if the parameters are invalid.
217*99a2dd95SBruce Richardson  *   - Negative error code if operation failed.
218*99a2dd95SBruce Richardson  *   - Zero if operation completed successfully.
219*99a2dd95SBruce Richardson  */
220*99a2dd95SBruce Richardson int
221*99a2dd95SBruce Richardson rte_acl_build(struct rte_acl_ctx *ctx, const struct rte_acl_config *cfg);
222*99a2dd95SBruce Richardson 
223*99a2dd95SBruce Richardson /**
224*99a2dd95SBruce Richardson  * Delete all rules from the ACL context and
225*99a2dd95SBruce Richardson  * destroy all internal run-time structures.
226*99a2dd95SBruce Richardson  * This function is not multi-thread safe.
227*99a2dd95SBruce Richardson  *
228*99a2dd95SBruce Richardson  * @param ctx
229*99a2dd95SBruce Richardson  *   ACL context to reset.
230*99a2dd95SBruce Richardson  */
231*99a2dd95SBruce Richardson void
232*99a2dd95SBruce Richardson rte_acl_reset(struct rte_acl_ctx *ctx);
233*99a2dd95SBruce Richardson 
234*99a2dd95SBruce Richardson /**
235*99a2dd95SBruce Richardson  *  Available implementations of ACL classify.
236*99a2dd95SBruce Richardson  */
237*99a2dd95SBruce Richardson enum rte_acl_classify_alg {
238*99a2dd95SBruce Richardson 	RTE_ACL_CLASSIFY_DEFAULT = 0,
239*99a2dd95SBruce Richardson 	RTE_ACL_CLASSIFY_SCALAR = 1,  /**< generic implementation. */
240*99a2dd95SBruce Richardson 	RTE_ACL_CLASSIFY_SSE = 2,     /**< requires SSE4.1 support. */
241*99a2dd95SBruce Richardson 	RTE_ACL_CLASSIFY_AVX2 = 3,    /**< requires AVX2 support. */
242*99a2dd95SBruce Richardson 	RTE_ACL_CLASSIFY_NEON = 4,    /**< requires NEON support. */
243*99a2dd95SBruce Richardson 	RTE_ACL_CLASSIFY_ALTIVEC = 5,    /**< requires ALTIVEC support. */
244*99a2dd95SBruce Richardson 	RTE_ACL_CLASSIFY_AVX512X16 = 6,  /**< requires AVX512 support. */
245*99a2dd95SBruce Richardson 	RTE_ACL_CLASSIFY_AVX512X32 = 7,  /**< requires AVX512 support. */
246*99a2dd95SBruce Richardson };
247*99a2dd95SBruce Richardson 
248*99a2dd95SBruce Richardson /**
249*99a2dd95SBruce Richardson  * Perform search for a matching ACL rule for each input data buffer.
250*99a2dd95SBruce Richardson  * Each input data buffer can have up to *categories* matches.
251*99a2dd95SBruce Richardson  * That implies that results array should be big enough to hold
252*99a2dd95SBruce Richardson  * (categories * num) elements.
253*99a2dd95SBruce Richardson  * Also categories parameter should be either one or multiple of
254*99a2dd95SBruce Richardson  * RTE_ACL_RESULTS_MULTIPLIER and can't be bigger than RTE_ACL_MAX_CATEGORIES.
255*99a2dd95SBruce Richardson  * If more than one rule is applicable for given input buffer and
256*99a2dd95SBruce Richardson  * given category, then rule with highest priority will be returned as a match.
257*99a2dd95SBruce Richardson  * Note, that it is a caller's responsibility to ensure that input parameters
258*99a2dd95SBruce Richardson  * are valid and point to correct memory locations.
259*99a2dd95SBruce Richardson  *
260*99a2dd95SBruce Richardson  * @param ctx
261*99a2dd95SBruce Richardson  *   ACL context to search with.
262*99a2dd95SBruce Richardson  * @param data
263*99a2dd95SBruce Richardson  *   Array of pointers to input data buffers to perform search.
264*99a2dd95SBruce Richardson  *   Note that all fields in input data buffers supposed to be in network
265*99a2dd95SBruce Richardson  *   byte order (MSB).
266*99a2dd95SBruce Richardson  * @param results
267*99a2dd95SBruce Richardson  *   Array of search results, *categories* results per each input data buffer.
268*99a2dd95SBruce Richardson  * @param num
269*99a2dd95SBruce Richardson  *   Number of elements in the input data buffers array.
270*99a2dd95SBruce Richardson  * @param categories
271*99a2dd95SBruce Richardson  *   Number of maximum possible matches for each input buffer, one possible
272*99a2dd95SBruce Richardson  *   match per category.
273*99a2dd95SBruce Richardson  * @return
274*99a2dd95SBruce Richardson  *   zero on successful completion.
275*99a2dd95SBruce Richardson  *   -EINVAL for incorrect arguments.
276*99a2dd95SBruce Richardson  */
277*99a2dd95SBruce Richardson extern int
278*99a2dd95SBruce Richardson rte_acl_classify(const struct rte_acl_ctx *ctx,
279*99a2dd95SBruce Richardson 		 const uint8_t **data,
280*99a2dd95SBruce Richardson 		 uint32_t *results, uint32_t num,
281*99a2dd95SBruce Richardson 		 uint32_t categories);
282*99a2dd95SBruce Richardson 
283*99a2dd95SBruce Richardson /**
284*99a2dd95SBruce Richardson  * Perform search using specified algorithm for a matching ACL rule for
285*99a2dd95SBruce Richardson  * each input data buffer.
286*99a2dd95SBruce Richardson  * Each input data buffer can have up to *categories* matches.
287*99a2dd95SBruce Richardson  * That implies that results array should be big enough to hold
288*99a2dd95SBruce Richardson  * (categories * num) elements.
289*99a2dd95SBruce Richardson  * Also categories parameter should be either one or multiple of
290*99a2dd95SBruce Richardson  * RTE_ACL_RESULTS_MULTIPLIER and can't be bigger than RTE_ACL_MAX_CATEGORIES.
291*99a2dd95SBruce Richardson  * If more than one rule is applicable for given input buffer and
292*99a2dd95SBruce Richardson  * given category, then rule with highest priority will be returned as a match.
293*99a2dd95SBruce Richardson  * Note, that it is a caller's responsibility to ensure that input parameters
294*99a2dd95SBruce Richardson  * are valid and point to correct memory locations.
295*99a2dd95SBruce Richardson  *
296*99a2dd95SBruce Richardson  * @param ctx
297*99a2dd95SBruce Richardson  *   ACL context to search with.
298*99a2dd95SBruce Richardson  * @param data
299*99a2dd95SBruce Richardson  *   Array of pointers to input data buffers to perform search.
300*99a2dd95SBruce Richardson  *   Note that all fields in input data buffers supposed to be in network
301*99a2dd95SBruce Richardson  *   byte order (MSB).
302*99a2dd95SBruce Richardson  * @param results
303*99a2dd95SBruce Richardson  *   Array of search results, *categories* results per each input data buffer.
304*99a2dd95SBruce Richardson  * @param num
305*99a2dd95SBruce Richardson  *   Number of elements in the input data buffers array.
306*99a2dd95SBruce Richardson  * @param categories
307*99a2dd95SBruce Richardson  *   Number of maximum possible matches for each input buffer, one possible
308*99a2dd95SBruce Richardson  *   match per category.
309*99a2dd95SBruce Richardson  * @param alg
310*99a2dd95SBruce Richardson  *   Algorithm to be used for the search.
311*99a2dd95SBruce Richardson  *   It is the caller responsibility to ensure that the value refers to the
312*99a2dd95SBruce Richardson  *   existing algorithm, and that it could be run on the given CPU.
313*99a2dd95SBruce Richardson  * @return
314*99a2dd95SBruce Richardson  *   zero on successful completion.
315*99a2dd95SBruce Richardson  *   -EINVAL for incorrect arguments.
316*99a2dd95SBruce Richardson  */
317*99a2dd95SBruce Richardson extern int
318*99a2dd95SBruce Richardson rte_acl_classify_alg(const struct rte_acl_ctx *ctx,
319*99a2dd95SBruce Richardson 		 const uint8_t **data,
320*99a2dd95SBruce Richardson 		 uint32_t *results, uint32_t num,
321*99a2dd95SBruce Richardson 		 uint32_t categories,
322*99a2dd95SBruce Richardson 		 enum rte_acl_classify_alg alg);
323*99a2dd95SBruce Richardson 
324*99a2dd95SBruce Richardson /*
325*99a2dd95SBruce Richardson  * Override the default classifier function for a given ACL context.
326*99a2dd95SBruce Richardson  * @param ctx
327*99a2dd95SBruce Richardson  *   ACL context to change classify function for.
328*99a2dd95SBruce Richardson  * @param alg
329*99a2dd95SBruce Richardson  *   New default classify algorithm for given ACL context.
330*99a2dd95SBruce Richardson  *   It is the caller responsibility to ensure that the value refers to the
331*99a2dd95SBruce Richardson  *   existing algorithm, and that it could be run on the given CPU.
332*99a2dd95SBruce Richardson  *   The max SIMD bitwidth value in EAL must also allow for the chosen algorithm.
333*99a2dd95SBruce Richardson  * @return
334*99a2dd95SBruce Richardson  *   - -EINVAL if the parameters are invalid.
335*99a2dd95SBruce Richardson  *   - -ENOTSUP requested algorithm is not supported by given platform.
336*99a2dd95SBruce Richardson  *   - Zero if operation completed successfully.
337*99a2dd95SBruce Richardson  */
338*99a2dd95SBruce Richardson extern int
339*99a2dd95SBruce Richardson rte_acl_set_ctx_classify(struct rte_acl_ctx *ctx,
340*99a2dd95SBruce Richardson 	enum rte_acl_classify_alg alg);
341*99a2dd95SBruce Richardson 
342*99a2dd95SBruce Richardson /**
343*99a2dd95SBruce Richardson  * Dump an ACL context structure to the console.
344*99a2dd95SBruce Richardson  *
345*99a2dd95SBruce Richardson  * @param ctx
346*99a2dd95SBruce Richardson  *   ACL context to dump.
347*99a2dd95SBruce Richardson  */
348*99a2dd95SBruce Richardson void
349*99a2dd95SBruce Richardson rte_acl_dump(const struct rte_acl_ctx *ctx);
350*99a2dd95SBruce Richardson 
351*99a2dd95SBruce Richardson /**
352*99a2dd95SBruce Richardson  * Dump all ACL context structures to the console.
353*99a2dd95SBruce Richardson  */
354*99a2dd95SBruce Richardson void
355*99a2dd95SBruce Richardson rte_acl_list_dump(void);
356*99a2dd95SBruce Richardson 
357*99a2dd95SBruce Richardson #ifdef __cplusplus
358*99a2dd95SBruce Richardson }
359*99a2dd95SBruce Richardson #endif
360*99a2dd95SBruce Richardson 
361*99a2dd95SBruce Richardson #endif /* _RTE_ACL_H_ */
362