DPDK 25.03.0-rc0
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#include <rte_compat.h>
198#include <rte_common.h>
199#include <rte_dev.h>
200#include <rte_mbuf.h>
201
202#define RTE_REGEXDEV_NAME_MAX_LEN RTE_DEV_NAME_MAX_LEN
203
204extern int rte_regexdev_logtype;
205#define RTE_LOGTYPE_REGEXDEV rte_regexdev_logtype
206
207#define RTE_REGEXDEV_LOG_LINE(level, ...) \
208 RTE_LOG_LINE(level, REGEXDEV, "" __VA_ARGS__)
209
210/* Macros to check for valid port */
211#define RTE_REGEXDEV_VALID_DEV_ID_OR_ERR_RET(dev_id, retval) do { \
212 if (!rte_regexdev_is_valid_dev(dev_id)) { \
213 RTE_REGEXDEV_LOG_LINE(ERR, "Invalid dev_id=%u", dev_id); \
214 return retval; \
215 } \
216} while (0)
217
218#define RTE_REGEXDEV_VALID_DEV_ID_OR_RET(dev_id) do { \
219 if (!rte_regexdev_is_valid_dev(dev_id)) { \
220 RTE_REGEXDEV_LOG_LINE(ERR, "Invalid dev_id=%u", dev_id); \
221 return; \
222 } \
223} while (0)
224
238__rte_experimental
239int rte_regexdev_is_valid_dev(uint16_t dev_id);
240
251__rte_experimental
252uint8_t
254
268__rte_experimental
269int
270rte_regexdev_get_dev_id(const char *name);
271
272/* Enumerates RegEx device capabilities */
273#define RTE_REGEXDEV_CAPA_RUNTIME_COMPILATION_F (1ULL << 0)
282#define RTE_REGEXDEV_CAPA_SUPP_PCRE_START_ANCHOR_F (1ULL << 1)
293#define RTE_REGEXDEV_CAPA_SUPP_PCRE_ATOMIC_GROUPING_F (1ULL << 2)
305#define RTE_REGEXDEV_SUPP_PCRE_BACKTRACKING_CTRL_F (1ULL << 3)
313#define RTE_REGEXDEV_SUPP_PCRE_CALLOUTS_F (1ULL << 4)
323#define RTE_REGEXDEV_SUPP_PCRE_BACKREFERENCE_F (1ULL << 5)
331#define RTE_REGEXDEV_SUPP_PCRE_GREEDY_F (1ULL << 6)
340#define RTE_REGEXDEV_SUPP_PCRE_MATCH_ALL_F (1ULL << 7)
349#define RTE_REGEXDEV_SUPP_PCRE_LOOKAROUND_ASRT_F (1ULL << 8)
359#define RTE_REGEXDEV_SUPP_PCRE_MATCH_POINT_RST_F (1ULL << 9)
368#define RTE_REGEXDEV_SUPP_NEWLINE_CONVENTIONS_F (1ULL << 10)
380#define RTE_REGEXDEV_SUPP_PCRE_NEWLINE_SEQ_F (1ULL << 11)
388#define RTE_REGEXDEV_SUPP_PCRE_POSSESSIVE_QUALIFIERS_F (1ULL << 12)
398#define RTE_REGEXDEV_SUPP_PCRE_SUBROUTINE_REFERENCES_F (1ULL << 13)
407#define RTE_REGEXDEV_SUPP_PCRE_UTF_8_F (1ULL << 14)
413#define RTE_REGEXDEV_SUPP_PCRE_UTF_16_F (1ULL << 15)
419#define RTE_REGEXDEV_SUPP_PCRE_UTF_32_F (1ULL << 16)
425#define RTE_REGEXDEV_SUPP_PCRE_WORD_BOUNDARY_F (1ULL << 17)
432#define RTE_REGEXDEV_SUPP_PCRE_FORWARD_REFERENCES_F (1ULL << 18)
441#define RTE_REGEXDEV_SUPP_MATCH_AS_END_F (1ULL << 19)
451#define RTE_REGEXDEV_SUPP_CROSS_BUFFER_F (1ULL << 20)
467#define RTE_REGEXDEV_SUPP_MATCH_ALL_F (1ULL << 21)
476#define RTE_REGEXDEV_CAPA_QUEUE_PAIR_OOS_F (1ULL << 22)
485/* Enumerates PCRE rule flags */
486#define RTE_REGEX_PCRE_RULE_ALLOW_EMPTY_F (1ULL << 0)
494#define RTE_REGEX_PCRE_RULE_ANCHORED_F (1ULL << 1)
503#define RTE_REGEX_PCRE_RULE_CASELESS_F (1ULL << 2)
511#define RTE_REGEX_PCRE_RULE_DOTALL_F (1ULL << 3)
519#define RTE_REGEX_PCRE_RULE_DUPNAMES_F (1ULL << 4)
527#define RTE_REGEX_PCRE_RULE_EXTENDED_F (1ULL << 5)
535#define RTE_REGEX_PCRE_RULE_MATCH_UNSET_BACKREF_F (1ULL << 6)
543#define RTE_REGEX_PCRE_RULE_MULTILINE_F (1ULL << 7)
552#define RTE_REGEX_PCRE_RULE_NO_AUTO_CAPTURE_F (1ULL << 8)
562#define RTE_REGEX_PCRE_RULE_UCP_F (1ULL << 9)
570#define RTE_REGEX_PCRE_RULE_UNGREEDY_F (1ULL << 10)
579#define RTE_REGEX_PCRE_RULE_UTF_F (1ULL << 11)
588#define RTE_REGEX_PCRE_RULE_NEVER_BACKSLASH_C_F (1ULL << 12)
603 const char *driver_name;
604 struct rte_device *dev;
605 uint16_t max_matches;
613 uint16_t max_segs;
617 uint16_t max_groups;
621 uint64_t rule_flags;
625};
626
644__rte_experimental
645int
646rte_regexdev_info_get(uint8_t dev_id, struct rte_regexdev_info *dev_info);
647
648/* Enumerates RegEx device configuration flags */
649#define RTE_REGEXDEV_CFG_CROSS_BUFFER_SCAN_F (1ULL << 0)
662#define RTE_REGEXDEV_CFG_MATCH_AS_END_F (1ULL << 1)
672#define RTE_REGEXDEV_CFG_MATCH_ALL_F (1ULL << 2)
701 uint16_t nb_groups;
707 const char *rule_db;
716 uint32_t rule_db_len;
720};
721
743__rte_experimental
744int
745rte_regexdev_configure(uint8_t dev_id, const struct rte_regexdev_config *cfg);
746
747/* Enumerates RegEx queue pair configuration flags */
748#define RTE_REGEX_QUEUE_PAIR_CFG_OOS_F (1ULL << 0)
758struct rte_regex_ops;
759typedef void (*regexdev_stop_flush_t)(uint8_t dev_id, uint16_t qp_id,
760 struct rte_regex_ops *op);
769 uint16_t nb_desc;
779};
780
799__rte_experimental
800int
801rte_regexdev_queue_pair_setup(uint8_t dev_id, uint16_t queue_pair_id,
802 const struct rte_regexdev_qp_conf *qp_conf);
803
822__rte_experimental
823int
824rte_regexdev_start(uint8_t dev_id);
825
845__rte_experimental
846int
847rte_regexdev_stop(uint8_t dev_id);
848
861__rte_experimental
862int
863rte_regexdev_close(uint8_t dev_id);
864
865/* Device get/set attributes */
866
894};
895
915__rte_experimental
916int
917rte_regexdev_attr_get(uint8_t dev_id, enum rte_regexdev_attr_id attr_id,
918 void *attr_value);
919
939__rte_experimental
940int
941rte_regexdev_attr_set(uint8_t dev_id, enum rte_regexdev_attr_id attr_id,
942 const void *attr_value);
943
944/* Rule related APIs */
952
957 uint16_t group_id;
959 uint32_t rule_id;
961 const char *pcre_rule;
965 uint64_t rule_flags;
966 /* PCRE rule flags. Supported device specific PCRE rules enumerated
967 * in struct rte_regexdev_info::rule_flags. For successful rule
968 * database update, application needs to provide only supported
969 * rule flags.
970 * @See RTE_REGEX_PCRE_RULE_*, struct rte_regexdev_info::rule_flags
971 */
972};
973
1008__rte_experimental
1009int
1011 const struct rte_regexdev_rule *rules,
1012 uint32_t nb_rules);
1013
1030__rte_experimental
1031int
1033
1055__rte_experimental
1056int
1057rte_regexdev_rule_db_import(uint8_t dev_id, const char *rule_db,
1058 uint32_t rule_db_len);
1059
1080__rte_experimental
1081int
1082rte_regexdev_rule_db_export(uint8_t dev_id, char *rule_db);
1083
1084/* Extended statistics */
1086#define RTE_REGEXDEV_XSTATS_NAME_SIZE 64
1087
1095 uint16_t id;
1099};
1100
1120__rte_experimental
1121int
1123 struct rte_regexdev_xstats_map *xstats_map);
1124
1147__rte_experimental
1148int
1149rte_regexdev_xstats_get(uint8_t dev_id, const uint16_t *ids,
1150 uint64_t *values, uint16_t nb_values);
1151
1174__rte_experimental
1175int
1176rte_regexdev_xstats_by_name_get(uint8_t dev_id, const char *name,
1177 uint16_t *id, uint64_t *value);
1178
1198__rte_experimental
1199int
1200rte_regexdev_xstats_reset(uint8_t dev_id, const uint16_t *ids,
1201 uint16_t nb_ids);
1202
1216__rte_experimental
1217int
1219
1234__rte_experimental
1235int
1236rte_regexdev_dump(uint8_t dev_id, FILE *f);
1237
1238/* Fast path APIs */
1239
1246 union {
1247 uint64_t u64;
1248 struct {
1249 uint32_t rule_id:20;
1253 uint32_t group_id:12;
1259 union {
1260 uint16_t len;
1262 uint16_t end_offset;
1267 };
1268 };
1269 };
1270};
1271
1272/* Enumerates RegEx request flags. */
1273#define RTE_REGEX_OPS_REQ_GROUP_ID0_VALID_F (1 << 0)
1276#define RTE_REGEX_OPS_REQ_GROUP_ID1_VALID_F (1 << 1)
1279#define RTE_REGEX_OPS_REQ_GROUP_ID2_VALID_F (1 << 2)
1282#define RTE_REGEX_OPS_REQ_GROUP_ID3_VALID_F (1 << 3)
1285#define RTE_REGEX_OPS_REQ_STOP_ON_MATCH_F (1 << 4)
1288#define RTE_REGEX_OPS_REQ_MATCH_HIGH_PRIORITY_F (1 << 5)
1299/* Enumerates RegEx response flags. */
1300#define RTE_REGEX_OPS_RSP_PMI_SOJ_F (1 << 0)
1307#define RTE_REGEX_OPS_RSP_PMI_EOJ_F (1 << 1)
1314#define RTE_REGEX_OPS_RSP_MAX_SCAN_TIMEOUT_F (1 << 2)
1321#define RTE_REGEX_OPS_RSP_MAX_MATCH_F (1 << 3)
1328#define RTE_REGEX_OPS_RSP_MAX_PREFIX_F (1 << 4)
1335#define RTE_REGEX_OPS_RSP_RESOURCE_LIMIT_REACHED_F (1 << 4)
1345 /* W0 */
1346 uint16_t req_flags;
1350 uint16_t rsp_flags;
1356 uint16_t nb_matches;
1364 /* W1 */
1365 struct rte_mbuf *mbuf;
1367 /* W2 */
1368 uint16_t group_id0;
1374 uint16_t group_id1;
1379 uint16_t group_id2;
1384 uint16_t group_id3;
1390 /* W3 */
1391 union {
1392 uint64_t user_id;
1400 };
1401
1402 /* W4 */
1403 union {
1413 };
1414
1415 /* W5 */
1423};
1424
1425#include "rte_regexdev_core.h"
1426
1427#ifdef __cplusplus
1428extern "C" {
1429#endif
1430
1468__rte_experimental
1469static inline uint16_t
1470rte_regexdev_enqueue_burst(uint8_t dev_id, uint16_t qp_id,
1471 struct rte_regex_ops **ops, uint16_t nb_ops)
1472{
1473 struct rte_regexdev *dev = &rte_regex_devices[dev_id];
1474#ifdef RTE_LIBRTE_REGEXDEV_DEBUG
1475 RTE_REGEXDEV_VALID_DEV_ID_OR_ERR_RET(dev_id, -EINVAL);
1476 if (*dev->enqueue == NULL)
1477 return -ENOTSUP;
1478 if (qp_id >= dev->data->dev_conf.nb_queue_pairs) {
1479 RTE_REGEXDEV_LOG_LINE(ERR, "Invalid queue %d", qp_id);
1480 return -EINVAL;
1481 }
1482#endif
1483 return (*dev->enqueue)(dev, qp_id, ops, nb_ops);
1484}
1485
1528__rte_experimental
1529static inline uint16_t
1530rte_regexdev_dequeue_burst(uint8_t dev_id, uint16_t qp_id,
1531 struct rte_regex_ops **ops, uint16_t nb_ops)
1532{
1533 struct rte_regexdev *dev = &rte_regex_devices[dev_id];
1534#ifdef RTE_LIBRTE_REGEXDEV_DEBUG
1535 RTE_REGEXDEV_VALID_DEV_ID_OR_ERR_RET(dev_id, -EINVAL);
1536 if (*dev->dequeue == NULL)
1537 return -ENOTSUP;
1538 if (qp_id >= dev->data->dev_conf.nb_queue_pairs) {
1539 RTE_REGEXDEV_LOG_LINE(ERR, "Invalid queue %d", qp_id);
1540 return -EINVAL;
1541 }
1542#endif
1543 return (*dev->dequeue)(dev, qp_id, ops, nb_ops);
1544}
1545
1546#ifdef __cplusplus
1547}
1548#endif
1549
1550#endif /* _RTE_REGEXDEV_H_ */
__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:868
@ RTE_REGEXDEV_ATTR_MAX_PREFIX
Definition: rte_regexdev.h:887
@ RTE_REGEXDEV_ATTR_SOCKET_ID
Definition: rte_regexdev.h:869
@ RTE_REGEXDEV_ATTR_MAX_SCAN_TIMEOUT
Definition: rte_regexdev.h:881
@ RTE_REGEXDEV_ATTR_MAX_MATCHES
Definition: rte_regexdev.h:875
__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_is_valid_dev(uint16_t dev_id)
__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:759
__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:946
@ RTE_REGEX_RULE_OP_ADD
Definition: rte_regexdev.h:947
@ RTE_REGEX_RULE_OP_REMOVE
Definition: rte_regexdev.h:949
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)
__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:693
const char * rule_db
Definition: rte_regexdev.h:707
uint32_t regexdev_capa
Definition: rte_regexdev.h:619
uint16_t max_queue_pairs
Definition: rte_regexdev.h:607
uint32_t max_rules_per_group
Definition: rte_regexdev.h:615
uint16_t max_payload_size
Definition: rte_regexdev.h:609
const char * driver_name
Definition: rte_regexdev.h:603
uint16_t max_matches
Definition: rte_regexdev.h:605
struct rte_device * dev
Definition: rte_regexdev.h:604
regexdev_stop_flush_t cb
Definition: rte_regexdev.h:771
const char * pcre_rule
Definition: rte_regexdev.h:961
uint16_t pcre_rule_len
Definition: rte_regexdev.h:963
enum rte_regexdev_rule_op op
Definition: rte_regexdev.h:955
char name[RTE_REGEXDEV_XSTATS_NAME_SIZE]