DPDK 21.11.0
rte_regexdev.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2019 Marvell International Ltd.
3 * Copyright 2020 Mellanox Technologies, Ltd
4 * Copyright(c) 2020 Intel Corporation
5 */
6
7#ifndef _RTE_REGEXDEV_H_
8#define _RTE_REGEXDEV_H_
9
197#ifdef __cplusplus
198extern "C" {
199#endif
200
201#include <rte_common.h>
202#include <rte_config.h>
203#include <rte_dev.h>
204#include <rte_errno.h>
205#include <rte_mbuf.h>
206#include <rte_memory.h>
207
208#define RTE_REGEXDEV_NAME_MAX_LEN RTE_DEV_NAME_MAX_LEN
209
210extern int rte_regexdev_logtype;
211
212#define RTE_REGEXDEV_LOG(level, ...) \
213 rte_log(RTE_LOG_ ## level, rte_regexdev_logtype, "" __VA_ARGS__)
214
215/* Macros to check for valid port */
216#define RTE_REGEXDEV_VALID_DEV_ID_OR_ERR_RET(dev_id, retval) do { \
217 if (!rte_regexdev_is_valid_dev(dev_id)) { \
218 RTE_REGEXDEV_LOG(ERR, "Invalid dev_id=%u\n", dev_id); \
219 return retval; \
220 } \
221} while (0)
222
223#define RTE_REGEXDEV_VALID_DEV_ID_OR_RET(dev_id) do { \
224 if (!rte_regexdev_is_valid_dev(dev_id)) { \
225 RTE_REGEXDEV_LOG(ERR, "Invalid dev_id=%u\n", dev_id); \
226 return; \
227 } \
228} while (0)
229
240int rte_regexdev_is_valid_dev(uint16_t dev_id);
241
252__rte_experimental
253uint8_t
255
269__rte_experimental
270int
271rte_regexdev_get_dev_id(const char *name);
272
273/* Enumerates RegEx device capabilities */
274#define RTE_REGEXDEV_CAPA_RUNTIME_COMPILATION_F (1ULL << 0)
283#define RTE_REGEXDEV_CAPA_SUPP_PCRE_START_ANCHOR_F (1ULL << 1)
294#define RTE_REGEXDEV_CAPA_SUPP_PCRE_ATOMIC_GROUPING_F (1ULL << 2)
306#define RTE_REGEXDEV_SUPP_PCRE_BACKTRACKING_CTRL_F (1ULL << 3)
314#define RTE_REGEXDEV_SUPP_PCRE_CALLOUTS_F (1ULL << 4)
324#define RTE_REGEXDEV_SUPP_PCRE_BACKREFERENCE_F (1ULL << 5)
332#define RTE_REGEXDEV_SUPP_PCRE_GREEDY_F (1ULL << 6)
341#define RTE_REGEXDEV_SUPP_PCRE_MATCH_ALL_F (1ULL << 7)
350#define RTE_REGEXDEV_SUPP_PCRE_LOOKAROUND_ASRT_F (1ULL << 8)
360#define RTE_REGEXDEV_SUPP_PCRE_MATCH_POINT_RST_F (1ULL << 9)
369#define RTE_REGEXDEV_SUPP_NEWLINE_CONVENTIONS_F (1ULL << 10)
381#define RTE_REGEXDEV_SUPP_PCRE_NEWLINE_SEQ_F (1ULL << 11)
389#define RTE_REGEXDEV_SUPP_PCRE_POSSESSIVE_QUALIFIERS_F (1ULL << 12)
399#define RTE_REGEXDEV_SUPP_PCRE_SUBROUTINE_REFERENCES_F (1ULL << 13)
408#define RTE_REGEXDEV_SUPP_PCRE_UTF_8_F (1ULL << 14)
414#define RTE_REGEXDEV_SUPP_PCRE_UTF_16_F (1ULL << 15)
420#define RTE_REGEXDEV_SUPP_PCRE_UTF_32_F (1ULL << 16)
426#define RTE_REGEXDEV_SUPP_PCRE_WORD_BOUNDARY_F (1ULL << 17)
433#define RTE_REGEXDEV_SUPP_PCRE_FORWARD_REFERENCES_F (1ULL << 18)
442#define RTE_REGEXDEV_SUPP_MATCH_AS_END_F (1ULL << 19)
452#define RTE_REGEXDEV_SUPP_CROSS_BUFFER_F (1ULL << 20)
468#define RTE_REGEXDEV_SUPP_MATCH_ALL_F (1ULL << 21)
477#define RTE_REGEXDEV_CAPA_QUEUE_PAIR_OOS_F (1ULL << 22)
486/* Enumerates PCRE rule flags */
487#define RTE_REGEX_PCRE_RULE_ALLOW_EMPTY_F (1ULL << 0)
495#define RTE_REGEX_PCRE_RULE_ANCHORED_F (1ULL << 1)
504#define RTE_REGEX_PCRE_RULE_CASELESS_F (1ULL << 2)
512#define RTE_REGEX_PCRE_RULE_DOTALL_F (1ULL << 3)
520#define RTE_REGEX_PCRE_RULE_DUPNAMES_F (1ULL << 4)
528#define RTE_REGEX_PCRE_RULE_EXTENDED_F (1ULL << 5)
536#define RTE_REGEX_PCRE_RULE_MATCH_UNSET_BACKREF_F (1ULL << 6)
544#define RTE_REGEX_PCRE_RULE_MULTILINE_F (1ULL << 7)
553#define RTE_REGEX_PCRE_RULE_NO_AUTO_CAPTURE_F (1ULL << 8)
563#define RTE_REGEX_PCRE_RULE_UCP_F (1ULL << 9)
571#define RTE_REGEX_PCRE_RULE_UNGREEDY_F (1ULL << 10)
580#define RTE_REGEX_PCRE_RULE_UTF_F (1ULL << 11)
589#define RTE_REGEX_PCRE_RULE_NEVER_BACKSLASH_C_F (1ULL << 12)
604 const char *driver_name;
605 struct rte_device *dev;
606 uint16_t max_matches;
616 uint16_t max_groups;
620 uint64_t rule_flags;
624};
625
643__rte_experimental
644int
645rte_regexdev_info_get(uint8_t dev_id, struct rte_regexdev_info *dev_info);
646
647/* Enumerates RegEx device configuration flags */
648#define RTE_REGEXDEV_CFG_CROSS_BUFFER_SCAN_F (1ULL << 0)
661#define RTE_REGEXDEV_CFG_MATCH_AS_END_F (1ULL << 1)
671#define RTE_REGEXDEV_CFG_MATCH_ALL_F (1ULL << 2)
700 uint16_t nb_groups;
706 const char *rule_db;
715 uint32_t rule_db_len;
719};
720
742__rte_experimental
743int
744rte_regexdev_configure(uint8_t dev_id, const struct rte_regexdev_config *cfg);
745
746/* Enumerates RegEx queue pair configuration flags */
747#define RTE_REGEX_QUEUE_PAIR_CFG_OOS_F (1ULL << 0)
757struct rte_regex_ops;
758typedef void (*regexdev_stop_flush_t)(uint8_t dev_id, uint16_t qp_id,
759 struct rte_regex_ops *op);
768 uint16_t nb_desc;
778};
779
798__rte_experimental
799int
800rte_regexdev_queue_pair_setup(uint8_t dev_id, uint16_t queue_pair_id,
801 const struct rte_regexdev_qp_conf *qp_conf);
802
821__rte_experimental
822int
823rte_regexdev_start(uint8_t dev_id);
824
844__rte_experimental
845int
846rte_regexdev_stop(uint8_t dev_id);
847
860__rte_experimental
861int
862rte_regexdev_close(uint8_t dev_id);
863
864/* Device get/set attributes */
865
893};
894
914__rte_experimental
915int
916rte_regexdev_attr_get(uint8_t dev_id, enum rte_regexdev_attr_id attr_id,
917 void *attr_value);
918
938__rte_experimental
939int
940rte_regexdev_attr_set(uint8_t dev_id, enum rte_regexdev_attr_id attr_id,
941 const void *attr_value);
942
943/* Rule related APIs */
951
956 uint16_t group_id;
958 uint32_t rule_id;
960 const char *pcre_rule;
964 uint64_t rule_flags;
965 /* PCRE rule flags. Supported device specific PCRE rules enumerated
966 * in struct rte_regexdev_info::rule_flags. For successful rule
967 * database update, application needs to provide only supported
968 * rule flags.
969 * @See RTE_REGEX_PCRE_RULE_*, struct rte_regexdev_info::rule_flags
970 */
971};
972
1007__rte_experimental
1008int
1010 const struct rte_regexdev_rule *rules,
1011 uint32_t nb_rules);
1012
1029__rte_experimental
1030int
1032
1054__rte_experimental
1055int
1056rte_regexdev_rule_db_import(uint8_t dev_id, const char *rule_db,
1057 uint32_t rule_db_len);
1058
1079__rte_experimental
1080int
1081rte_regexdev_rule_db_export(uint8_t dev_id, char *rule_db);
1082
1083/* Extended statistics */
1085#define RTE_REGEXDEV_XSTATS_NAME_SIZE 64
1086
1094 uint16_t id;
1098};
1099
1119__rte_experimental
1120int
1122 struct rte_regexdev_xstats_map *xstats_map);
1123
1146__rte_experimental
1147int
1148rte_regexdev_xstats_get(uint8_t dev_id, const uint16_t *ids,
1149 uint64_t *values, uint16_t nb_values);
1150
1173__rte_experimental
1174int
1175rte_regexdev_xstats_by_name_get(uint8_t dev_id, const char *name,
1176 uint16_t *id, uint64_t *value);
1177
1197__rte_experimental
1198int
1199rte_regexdev_xstats_reset(uint8_t dev_id, const uint16_t *ids,
1200 uint16_t nb_ids);
1201
1215__rte_experimental
1216int
1218
1233__rte_experimental
1234int
1235rte_regexdev_dump(uint8_t dev_id, FILE *f);
1236
1237/* Fast path APIs */
1238
1246 union {
1247 uint64_t u64;
1248 struct {
1249 uint32_t rule_id:20;
1253 uint32_t group_id:12;
1260 union {
1261 uint16_t len;
1263 uint16_t end_offset;
1268 };
1269 };
1270 };
1271};
1272
1273/* Enumerates RegEx request flags. */
1274#define RTE_REGEX_OPS_REQ_GROUP_ID0_VALID_F (1 << 0)
1277#define RTE_REGEX_OPS_REQ_GROUP_ID1_VALID_F (1 << 1)
1280#define RTE_REGEX_OPS_REQ_GROUP_ID2_VALID_F (1 << 2)
1283#define RTE_REGEX_OPS_REQ_GROUP_ID3_VALID_F (1 << 3)
1286#define RTE_REGEX_OPS_REQ_STOP_ON_MATCH_F (1 << 4)
1289#define RTE_REGEX_OPS_REQ_MATCH_HIGH_PRIORITY_F (1 << 5)
1300/* Enumerates RegEx response flags. */
1301#define RTE_REGEX_OPS_RSP_PMI_SOJ_F (1 << 0)
1308#define RTE_REGEX_OPS_RSP_PMI_EOJ_F (1 << 1)
1315#define RTE_REGEX_OPS_RSP_MAX_SCAN_TIMEOUT_F (1 << 2)
1322#define RTE_REGEX_OPS_RSP_MAX_MATCH_F (1 << 3)
1329#define RTE_REGEX_OPS_RSP_MAX_PREFIX_F (1 << 4)
1336#define RTE_REGEX_OPS_RSP_RESOURCE_LIMIT_REACHED_F (1 << 4)
1346 /* W0 */
1347 uint16_t req_flags;
1351 uint16_t rsp_flags;
1357 uint16_t nb_matches;
1365 /* W1 */
1366 struct rte_mbuf *mbuf;
1368 /* W2 */
1369 uint16_t group_id0;
1375 uint16_t group_id1;
1380 uint16_t group_id2;
1385 uint16_t group_id3;
1391 /* W3 */
1393 union {
1394 uint64_t user_id;
1402 };
1403
1404 /* W4 */
1406 union {
1416 };
1417
1418 /* W5 */
1426};
1427
1428#include "rte_regexdev_core.h"
1429
1467__rte_experimental
1468static inline uint16_t
1469rte_regexdev_enqueue_burst(uint8_t dev_id, uint16_t qp_id,
1470 struct rte_regex_ops **ops, uint16_t nb_ops)
1471{
1472 struct rte_regexdev *dev = &rte_regex_devices[dev_id];
1473#ifdef RTE_LIBRTE_REGEXDEV_DEBUG
1474 RTE_REGEXDEV_VALID_DEV_ID_OR_ERR_RET(dev_id, -EINVAL);
1475 RTE_FUNC_PTR_OR_ERR_RET(*dev->enqueue, -ENOTSUP);
1476 if (qp_id >= dev->data->dev_conf.nb_queue_pairs) {
1477 RTE_REGEXDEV_LOG(ERR, "Invalid queue %d\n", qp_id);
1478 return -EINVAL;
1479 }
1480#endif
1481 return (*dev->enqueue)(dev, qp_id, ops, nb_ops);
1482}
1483
1526__rte_experimental
1527static inline uint16_t
1528rte_regexdev_dequeue_burst(uint8_t dev_id, uint16_t qp_id,
1529 struct rte_regex_ops **ops, uint16_t nb_ops)
1530{
1531 struct rte_regexdev *dev = &rte_regex_devices[dev_id];
1532#ifdef RTE_LIBRTE_REGEXDEV_DEBUG
1533 RTE_REGEXDEV_VALID_DEV_ID_OR_ERR_RET(dev_id, -EINVAL);
1534 RTE_FUNC_PTR_OR_ERR_RET(*dev->dequeue, -ENOTSUP);
1535 if (qp_id >= dev->data->dev_conf.nb_queue_pairs) {
1536 RTE_REGEXDEV_LOG(ERR, "Invalid queue %d\n", qp_id);
1537 return -EINVAL;
1538 }
1539#endif
1540 return (*dev->dequeue)(dev, qp_id, ops, nb_ops);
1541}
1542
1543#ifdef __cplusplus
1544}
1545#endif
1546
1547#endif /* _RTE_REGEXDEV_H_ */
#define RTE_STD_C11
Definition: rte_common.h:42
__rte_experimental int rte_regexdev_rule_db_compile_activate(uint8_t dev_id)
__rte_experimental int rte_regexdev_close(uint8_t dev_id)
__rte_experimental uint8_t rte_regexdev_count(void)
__rte_experimental int rte_regexdev_get_dev_id(const char *name)
__rte_experimental int rte_regexdev_info_get(uint8_t dev_id, struct rte_regexdev_info *dev_info)
__rte_experimental int rte_regexdev_dump(uint8_t dev_id, FILE *f)
__rte_experimental int rte_regexdev_stop(uint8_t dev_id)
__rte_experimental int rte_regexdev_queue_pair_setup(uint8_t dev_id, uint16_t queue_pair_id, const struct rte_regexdev_qp_conf *qp_conf)
static __rte_experimental uint16_t rte_regexdev_enqueue_burst(uint8_t dev_id, uint16_t qp_id, struct rte_regex_ops **ops, uint16_t nb_ops)
rte_regexdev_attr_id
Definition: rte_regexdev.h:867
@ RTE_REGEXDEV_ATTR_MAX_PREFIX
Definition: rte_regexdev.h:886
@ RTE_REGEXDEV_ATTR_SOCKET_ID
Definition: rte_regexdev.h:868
@ RTE_REGEXDEV_ATTR_MAX_SCAN_TIMEOUT
Definition: rte_regexdev.h:880
@ RTE_REGEXDEV_ATTR_MAX_MATCHES
Definition: rte_regexdev.h:874
__rte_experimental int rte_regexdev_selftest(uint8_t dev_id)
__rte_experimental int rte_regexdev_xstats_reset(uint8_t dev_id, const uint16_t *ids, uint16_t nb_ids)
__rte_experimental int rte_regexdev_xstats_names_get(uint8_t dev_id, struct rte_regexdev_xstats_map *xstats_map)
__rte_experimental int rte_regexdev_xstats_get(uint8_t dev_id, const uint16_t *ids, uint64_t *values, uint16_t nb_values)
__rte_experimental int rte_regexdev_xstats_by_name_get(uint8_t dev_id, const char *name, uint16_t *id, uint64_t *value)
__rte_experimental int rte_regexdev_rule_db_export(uint8_t dev_id, char *rule_db)
__rte_experimental int rte_regexdev_rule_db_import(uint8_t dev_id, const char *rule_db, uint32_t rule_db_len)
void(* regexdev_stop_flush_t)(uint8_t dev_id, uint16_t qp_id, struct rte_regex_ops *op)
Definition: rte_regexdev.h:758
__rte_experimental int rte_regexdev_attr_get(uint8_t dev_id, enum rte_regexdev_attr_id attr_id, void *attr_value)
__rte_experimental int rte_regexdev_rule_db_update(uint8_t dev_id, const struct rte_regexdev_rule *rules, uint32_t nb_rules)
rte_regexdev_rule_op
Definition: rte_regexdev.h:945
@ RTE_REGEX_RULE_OP_ADD
Definition: rte_regexdev.h:946
@ RTE_REGEX_RULE_OP_REMOVE
Definition: rte_regexdev.h:948
static __rte_experimental uint16_t rte_regexdev_dequeue_burst(uint8_t dev_id, uint16_t qp_id, struct rte_regex_ops **ops, uint16_t nb_ops)
__rte_experimental int rte_regexdev_configure(uint8_t dev_id, const struct rte_regexdev_config *cfg)
__rte_experimental int rte_regexdev_attr_set(uint8_t dev_id, enum rte_regexdev_attr_id attr_id, const void *attr_value)
int rte_regexdev_is_valid_dev(uint16_t dev_id)
__rte_experimental int rte_regexdev_start(uint8_t dev_id)
#define RTE_REGEXDEV_XSTATS_NAME_SIZE
uint64_t user_id
uint16_t rsp_flags
void * cross_buf_ptr
uint16_t nb_matches
uint16_t group_id0
uint16_t nb_actual_matches
uint64_t cross_buf_id
struct rte_mbuf * mbuf
uint16_t req_flags
uint16_t group_id2
uint16_t group_id3
uint16_t group_id1
struct rte_regexdev_match matches[]
uint32_t nb_rules_per_group
Definition: rte_regexdev.h:692
const char * rule_db
Definition: rte_regexdev.h:706
uint32_t regexdev_capa
Definition: rte_regexdev.h:618
uint16_t max_queue_pairs
Definition: rte_regexdev.h:608
uint32_t max_rules_per_group
Definition: rte_regexdev.h:614
uint16_t max_payload_size
Definition: rte_regexdev.h:610
const char * driver_name
Definition: rte_regexdev.h:604
uint16_t max_matches
Definition: rte_regexdev.h:606
struct rte_device * dev
Definition: rte_regexdev.h:605
regexdev_stop_flush_t cb
Definition: rte_regexdev.h:770
const char * pcre_rule
Definition: rte_regexdev.h:960
uint16_t pcre_rule_len
Definition: rte_regexdev.h:962
enum rte_regexdev_rule_op op
Definition: rte_regexdev.h:954
char name[RTE_REGEXDEV_XSTATS_NAME_SIZE]