DPDK 22.11.0-rc2
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_dev.h>
203#include <rte_mbuf.h>
204
205#define RTE_REGEXDEV_NAME_MAX_LEN RTE_DEV_NAME_MAX_LEN
206
207extern int rte_regexdev_logtype;
208
209#define RTE_REGEXDEV_LOG(level, ...) \
210 rte_log(RTE_LOG_ ## level, rte_regexdev_logtype, "" __VA_ARGS__)
211
212/* Macros to check for valid port */
213#define RTE_REGEXDEV_VALID_DEV_ID_OR_ERR_RET(dev_id, retval) do { \
214 if (!rte_regexdev_is_valid_dev(dev_id)) { \
215 RTE_REGEXDEV_LOG(ERR, "Invalid dev_id=%u\n", dev_id); \
216 return retval; \
217 } \
218} while (0)
219
220#define RTE_REGEXDEV_VALID_DEV_ID_OR_RET(dev_id) do { \
221 if (!rte_regexdev_is_valid_dev(dev_id)) { \
222 RTE_REGEXDEV_LOG(ERR, "Invalid dev_id=%u\n", dev_id); \
223 return; \
224 } \
225} while (0)
226
240__rte_experimental
241int rte_regexdev_is_valid_dev(uint16_t dev_id);
242
253__rte_experimental
254uint8_t
256
270__rte_experimental
271int
272rte_regexdev_get_dev_id(const char *name);
273
274/* Enumerates RegEx device capabilities */
275#define RTE_REGEXDEV_CAPA_RUNTIME_COMPILATION_F (1ULL << 0)
284#define RTE_REGEXDEV_CAPA_SUPP_PCRE_START_ANCHOR_F (1ULL << 1)
295#define RTE_REGEXDEV_CAPA_SUPP_PCRE_ATOMIC_GROUPING_F (1ULL << 2)
307#define RTE_REGEXDEV_SUPP_PCRE_BACKTRACKING_CTRL_F (1ULL << 3)
315#define RTE_REGEXDEV_SUPP_PCRE_CALLOUTS_F (1ULL << 4)
325#define RTE_REGEXDEV_SUPP_PCRE_BACKREFERENCE_F (1ULL << 5)
333#define RTE_REGEXDEV_SUPP_PCRE_GREEDY_F (1ULL << 6)
342#define RTE_REGEXDEV_SUPP_PCRE_MATCH_ALL_F (1ULL << 7)
351#define RTE_REGEXDEV_SUPP_PCRE_LOOKAROUND_ASRT_F (1ULL << 8)
361#define RTE_REGEXDEV_SUPP_PCRE_MATCH_POINT_RST_F (1ULL << 9)
370#define RTE_REGEXDEV_SUPP_NEWLINE_CONVENTIONS_F (1ULL << 10)
382#define RTE_REGEXDEV_SUPP_PCRE_NEWLINE_SEQ_F (1ULL << 11)
390#define RTE_REGEXDEV_SUPP_PCRE_POSSESSIVE_QUALIFIERS_F (1ULL << 12)
400#define RTE_REGEXDEV_SUPP_PCRE_SUBROUTINE_REFERENCES_F (1ULL << 13)
409#define RTE_REGEXDEV_SUPP_PCRE_UTF_8_F (1ULL << 14)
415#define RTE_REGEXDEV_SUPP_PCRE_UTF_16_F (1ULL << 15)
421#define RTE_REGEXDEV_SUPP_PCRE_UTF_32_F (1ULL << 16)
427#define RTE_REGEXDEV_SUPP_PCRE_WORD_BOUNDARY_F (1ULL << 17)
434#define RTE_REGEXDEV_SUPP_PCRE_FORWARD_REFERENCES_F (1ULL << 18)
443#define RTE_REGEXDEV_SUPP_MATCH_AS_END_F (1ULL << 19)
453#define RTE_REGEXDEV_SUPP_CROSS_BUFFER_F (1ULL << 20)
469#define RTE_REGEXDEV_SUPP_MATCH_ALL_F (1ULL << 21)
478#define RTE_REGEXDEV_CAPA_QUEUE_PAIR_OOS_F (1ULL << 22)
487/* Enumerates PCRE rule flags */
488#define RTE_REGEX_PCRE_RULE_ALLOW_EMPTY_F (1ULL << 0)
496#define RTE_REGEX_PCRE_RULE_ANCHORED_F (1ULL << 1)
505#define RTE_REGEX_PCRE_RULE_CASELESS_F (1ULL << 2)
513#define RTE_REGEX_PCRE_RULE_DOTALL_F (1ULL << 3)
521#define RTE_REGEX_PCRE_RULE_DUPNAMES_F (1ULL << 4)
529#define RTE_REGEX_PCRE_RULE_EXTENDED_F (1ULL << 5)
537#define RTE_REGEX_PCRE_RULE_MATCH_UNSET_BACKREF_F (1ULL << 6)
545#define RTE_REGEX_PCRE_RULE_MULTILINE_F (1ULL << 7)
554#define RTE_REGEX_PCRE_RULE_NO_AUTO_CAPTURE_F (1ULL << 8)
564#define RTE_REGEX_PCRE_RULE_UCP_F (1ULL << 9)
572#define RTE_REGEX_PCRE_RULE_UNGREEDY_F (1ULL << 10)
581#define RTE_REGEX_PCRE_RULE_UTF_F (1ULL << 11)
590#define RTE_REGEX_PCRE_RULE_NEVER_BACKSLASH_C_F (1ULL << 12)
605 const char *driver_name;
606 struct rte_device *dev;
607 uint16_t max_matches;
615 uint16_t max_segs;
619 uint16_t max_groups;
623 uint64_t rule_flags;
627};
628
646__rte_experimental
647int
648rte_regexdev_info_get(uint8_t dev_id, struct rte_regexdev_info *dev_info);
649
650/* Enumerates RegEx device configuration flags */
651#define RTE_REGEXDEV_CFG_CROSS_BUFFER_SCAN_F (1ULL << 0)
664#define RTE_REGEXDEV_CFG_MATCH_AS_END_F (1ULL << 1)
674#define RTE_REGEXDEV_CFG_MATCH_ALL_F (1ULL << 2)
703 uint16_t nb_groups;
709 const char *rule_db;
718 uint32_t rule_db_len;
722};
723
745__rte_experimental
746int
747rte_regexdev_configure(uint8_t dev_id, const struct rte_regexdev_config *cfg);
748
749/* Enumerates RegEx queue pair configuration flags */
750#define RTE_REGEX_QUEUE_PAIR_CFG_OOS_F (1ULL << 0)
760struct rte_regex_ops;
761typedef void (*regexdev_stop_flush_t)(uint8_t dev_id, uint16_t qp_id,
762 struct rte_regex_ops *op);
771 uint16_t nb_desc;
781};
782
801__rte_experimental
802int
803rte_regexdev_queue_pair_setup(uint8_t dev_id, uint16_t queue_pair_id,
804 const struct rte_regexdev_qp_conf *qp_conf);
805
824__rte_experimental
825int
826rte_regexdev_start(uint8_t dev_id);
827
847__rte_experimental
848int
849rte_regexdev_stop(uint8_t dev_id);
850
863__rte_experimental
864int
865rte_regexdev_close(uint8_t dev_id);
866
867/* Device get/set attributes */
868
896};
897
917__rte_experimental
918int
919rte_regexdev_attr_get(uint8_t dev_id, enum rte_regexdev_attr_id attr_id,
920 void *attr_value);
921
941__rte_experimental
942int
943rte_regexdev_attr_set(uint8_t dev_id, enum rte_regexdev_attr_id attr_id,
944 const void *attr_value);
945
946/* Rule related APIs */
954
959 uint16_t group_id;
961 uint32_t rule_id;
963 const char *pcre_rule;
967 uint64_t rule_flags;
968 /* PCRE rule flags. Supported device specific PCRE rules enumerated
969 * in struct rte_regexdev_info::rule_flags. For successful rule
970 * database update, application needs to provide only supported
971 * rule flags.
972 * @See RTE_REGEX_PCRE_RULE_*, struct rte_regexdev_info::rule_flags
973 */
974};
975
1010__rte_experimental
1011int
1013 const struct rte_regexdev_rule *rules,
1014 uint32_t nb_rules);
1015
1032__rte_experimental
1033int
1035
1057__rte_experimental
1058int
1059rte_regexdev_rule_db_import(uint8_t dev_id, const char *rule_db,
1060 uint32_t rule_db_len);
1061
1082__rte_experimental
1083int
1084rte_regexdev_rule_db_export(uint8_t dev_id, char *rule_db);
1085
1086/* Extended statistics */
1088#define RTE_REGEXDEV_XSTATS_NAME_SIZE 64
1089
1097 uint16_t id;
1101};
1102
1122__rte_experimental
1123int
1125 struct rte_regexdev_xstats_map *xstats_map);
1126
1149__rte_experimental
1150int
1151rte_regexdev_xstats_get(uint8_t dev_id, const uint16_t *ids,
1152 uint64_t *values, uint16_t nb_values);
1153
1176__rte_experimental
1177int
1178rte_regexdev_xstats_by_name_get(uint8_t dev_id, const char *name,
1179 uint16_t *id, uint64_t *value);
1180
1200__rte_experimental
1201int
1202rte_regexdev_xstats_reset(uint8_t dev_id, const uint16_t *ids,
1203 uint16_t nb_ids);
1204
1218__rte_experimental
1219int
1221
1236__rte_experimental
1237int
1238rte_regexdev_dump(uint8_t dev_id, FILE *f);
1239
1240/* Fast path APIs */
1241
1249 union {
1250 uint64_t u64;
1251 struct {
1252 uint32_t rule_id:20;
1256 uint32_t group_id:12;
1263 union {
1264 uint16_t len;
1266 uint16_t end_offset;
1271 };
1272 };
1273 };
1274};
1275
1276/* Enumerates RegEx request flags. */
1277#define RTE_REGEX_OPS_REQ_GROUP_ID0_VALID_F (1 << 0)
1280#define RTE_REGEX_OPS_REQ_GROUP_ID1_VALID_F (1 << 1)
1283#define RTE_REGEX_OPS_REQ_GROUP_ID2_VALID_F (1 << 2)
1286#define RTE_REGEX_OPS_REQ_GROUP_ID3_VALID_F (1 << 3)
1289#define RTE_REGEX_OPS_REQ_STOP_ON_MATCH_F (1 << 4)
1292#define RTE_REGEX_OPS_REQ_MATCH_HIGH_PRIORITY_F (1 << 5)
1303/* Enumerates RegEx response flags. */
1304#define RTE_REGEX_OPS_RSP_PMI_SOJ_F (1 << 0)
1311#define RTE_REGEX_OPS_RSP_PMI_EOJ_F (1 << 1)
1318#define RTE_REGEX_OPS_RSP_MAX_SCAN_TIMEOUT_F (1 << 2)
1325#define RTE_REGEX_OPS_RSP_MAX_MATCH_F (1 << 3)
1332#define RTE_REGEX_OPS_RSP_MAX_PREFIX_F (1 << 4)
1339#define RTE_REGEX_OPS_RSP_RESOURCE_LIMIT_REACHED_F (1 << 4)
1349 /* W0 */
1350 uint16_t req_flags;
1354 uint16_t rsp_flags;
1360 uint16_t nb_matches;
1368 /* W1 */
1369 struct rte_mbuf *mbuf;
1371 /* W2 */
1372 uint16_t group_id0;
1378 uint16_t group_id1;
1383 uint16_t group_id2;
1388 uint16_t group_id3;
1394 /* W3 */
1396 union {
1397 uint64_t user_id;
1405 };
1406
1407 /* W4 */
1409 union {
1419 };
1420
1421 /* W5 */
1429};
1430
1431#include "rte_regexdev_core.h"
1432
1470__rte_experimental
1471static inline uint16_t
1472rte_regexdev_enqueue_burst(uint8_t dev_id, uint16_t qp_id,
1473 struct rte_regex_ops **ops, uint16_t nb_ops)
1474{
1475 struct rte_regexdev *dev = &rte_regex_devices[dev_id];
1476#ifdef RTE_LIBRTE_REGEXDEV_DEBUG
1477 RTE_REGEXDEV_VALID_DEV_ID_OR_ERR_RET(dev_id, -EINVAL);
1478 if (*dev->enqueue == NULL)
1479 return -ENOTSUP;
1480 if (qp_id >= dev->data->dev_conf.nb_queue_pairs) {
1481 RTE_REGEXDEV_LOG(ERR, "Invalid queue %d\n", qp_id);
1482 return -EINVAL;
1483 }
1484#endif
1485 return (*dev->enqueue)(dev, qp_id, ops, nb_ops);
1486}
1487
1530__rte_experimental
1531static inline uint16_t
1532rte_regexdev_dequeue_burst(uint8_t dev_id, uint16_t qp_id,
1533 struct rte_regex_ops **ops, uint16_t nb_ops)
1534{
1535 struct rte_regexdev *dev = &rte_regex_devices[dev_id];
1536#ifdef RTE_LIBRTE_REGEXDEV_DEBUG
1537 RTE_REGEXDEV_VALID_DEV_ID_OR_ERR_RET(dev_id, -EINVAL);
1538 if (*dev->dequeue == NULL)
1539 return -ENOTSUP;
1540 if (qp_id >= dev->data->dev_conf.nb_queue_pairs) {
1541 RTE_REGEXDEV_LOG(ERR, "Invalid queue %d\n", qp_id);
1542 return -EINVAL;
1543 }
1544#endif
1545 return (*dev->dequeue)(dev, qp_id, ops, nb_ops);
1546}
1547
1548#ifdef __cplusplus
1549}
1550#endif
1551
1552#endif /* _RTE_REGEXDEV_H_ */
#define RTE_STD_C11
Definition: rte_common.h:39
__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:870
@ RTE_REGEXDEV_ATTR_MAX_PREFIX
Definition: rte_regexdev.h:889
@ RTE_REGEXDEV_ATTR_SOCKET_ID
Definition: rte_regexdev.h:871
@ RTE_REGEXDEV_ATTR_MAX_SCAN_TIMEOUT
Definition: rte_regexdev.h:883
@ RTE_REGEXDEV_ATTR_MAX_MATCHES
Definition: rte_regexdev.h:877
__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:761
__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:948
@ RTE_REGEX_RULE_OP_ADD
Definition: rte_regexdev.h:949
@ RTE_REGEX_RULE_OP_REMOVE
Definition: rte_regexdev.h:951
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:695
const char * rule_db
Definition: rte_regexdev.h:709
uint32_t regexdev_capa
Definition: rte_regexdev.h:621
uint16_t max_queue_pairs
Definition: rte_regexdev.h:609
uint32_t max_rules_per_group
Definition: rte_regexdev.h:617
uint16_t max_payload_size
Definition: rte_regexdev.h:611
const char * driver_name
Definition: rte_regexdev.h:605
uint16_t max_matches
Definition: rte_regexdev.h:607
struct rte_device * dev
Definition: rte_regexdev.h:606
regexdev_stop_flush_t cb
Definition: rte_regexdev.h:773
const char * pcre_rule
Definition: rte_regexdev.h:963
uint16_t pcre_rule_len
Definition: rte_regexdev.h:965
enum rte_regexdev_rule_op op
Definition: rte_regexdev.h:957
char name[RTE_REGEXDEV_XSTATS_NAME_SIZE]