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