DPDK  22.03.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
198 extern "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 
207 extern 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
241 int rte_regexdev_is_valid_dev(uint16_t dev_id);
242 
253 __rte_experimental
254 uint8_t
255 rte_regexdev_count(void);
256 
270 __rte_experimental
271 int
272 rte_regexdev_get_dev_id(const char *name);
273 
274 /* Enumerates RegEx device capabilities */
275 #define RTE_REGEXDEV_CAPA_RUNTIME_COMPILATION_F (1ULL << 0)
276 
284 #define RTE_REGEXDEV_CAPA_SUPP_PCRE_START_ANCHOR_F (1ULL << 1)
285 
295 #define RTE_REGEXDEV_CAPA_SUPP_PCRE_ATOMIC_GROUPING_F (1ULL << 2)
296 
307 #define RTE_REGEXDEV_SUPP_PCRE_BACKTRACKING_CTRL_F (1ULL << 3)
308 
315 #define RTE_REGEXDEV_SUPP_PCRE_CALLOUTS_F (1ULL << 4)
316 
325 #define RTE_REGEXDEV_SUPP_PCRE_BACKREFERENCE_F (1ULL << 5)
326 
333 #define RTE_REGEXDEV_SUPP_PCRE_GREEDY_F (1ULL << 6)
334 
342 #define RTE_REGEXDEV_SUPP_PCRE_MATCH_ALL_F (1ULL << 7)
343 
351 #define RTE_REGEXDEV_SUPP_PCRE_LOOKAROUND_ASRT_F (1ULL << 8)
352 
361 #define RTE_REGEXDEV_SUPP_PCRE_MATCH_POINT_RST_F (1ULL << 9)
362 
370 #define RTE_REGEXDEV_SUPP_NEWLINE_CONVENTIONS_F (1ULL << 10)
371 
382 #define RTE_REGEXDEV_SUPP_PCRE_NEWLINE_SEQ_F (1ULL << 11)
383 
390 #define RTE_REGEXDEV_SUPP_PCRE_POSSESSIVE_QUALIFIERS_F (1ULL << 12)
391 
400 #define RTE_REGEXDEV_SUPP_PCRE_SUBROUTINE_REFERENCES_F (1ULL << 13)
401 
409 #define RTE_REGEXDEV_SUPP_PCRE_UTF_8_F (1ULL << 14)
410 
415 #define RTE_REGEXDEV_SUPP_PCRE_UTF_16_F (1ULL << 15)
416 
421 #define RTE_REGEXDEV_SUPP_PCRE_UTF_32_F (1ULL << 16)
422 
427 #define RTE_REGEXDEV_SUPP_PCRE_WORD_BOUNDARY_F (1ULL << 17)
428 
434 #define RTE_REGEXDEV_SUPP_PCRE_FORWARD_REFERENCES_F (1ULL << 18)
435 
443 #define RTE_REGEXDEV_SUPP_MATCH_AS_END_F (1ULL << 19)
444 
453 #define RTE_REGEXDEV_SUPP_CROSS_BUFFER_F (1ULL << 20)
454 
469 #define RTE_REGEXDEV_SUPP_MATCH_ALL_F (1ULL << 21)
470 
478 #define RTE_REGEXDEV_CAPA_QUEUE_PAIR_OOS_F (1ULL << 22)
479 
487 /* Enumerates PCRE rule flags */
488 #define RTE_REGEX_PCRE_RULE_ALLOW_EMPTY_F (1ULL << 0)
489 
496 #define RTE_REGEX_PCRE_RULE_ANCHORED_F (1ULL << 1)
497 
505 #define RTE_REGEX_PCRE_RULE_CASELESS_F (1ULL << 2)
506 
513 #define RTE_REGEX_PCRE_RULE_DOTALL_F (1ULL << 3)
514 
521 #define RTE_REGEX_PCRE_RULE_DUPNAMES_F (1ULL << 4)
522 
529 #define RTE_REGEX_PCRE_RULE_EXTENDED_F (1ULL << 5)
530 
537 #define RTE_REGEX_PCRE_RULE_MATCH_UNSET_BACKREF_F (1ULL << 6)
538 
545 #define RTE_REGEX_PCRE_RULE_MULTILINE_F (1ULL << 7)
546 
554 #define RTE_REGEX_PCRE_RULE_NO_AUTO_CAPTURE_F (1ULL << 8)
555 
564 #define RTE_REGEX_PCRE_RULE_UCP_F (1ULL << 9)
565 
572 #define RTE_REGEX_PCRE_RULE_UNGREEDY_F (1ULL << 10)
573 
581 #define RTE_REGEX_PCRE_RULE_UTF_F (1ULL << 11)
582 
590 #define RTE_REGEX_PCRE_RULE_NEVER_BACKSLASH_C_F (1ULL << 12)
591 
605  const char *driver_name;
606  struct rte_device *dev;
607  uint16_t max_matches;
609  uint16_t max_queue_pairs;
617  uint16_t max_groups;
619  uint32_t regexdev_capa;
621  uint64_t rule_flags;
625 };
626 
644 __rte_experimental
645 int
646 rte_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)
650 
662 #define RTE_REGEXDEV_CFG_MATCH_AS_END_F (1ULL << 1)
663 
672 #define RTE_REGEXDEV_CFG_MATCH_ALL_F (1ULL << 2)
673 
680  uint16_t nb_max_matches;
687  uint16_t nb_queue_pairs;
701  uint16_t nb_groups;
707  const char *rule_db;
716  uint32_t rule_db_len;
718  uint32_t dev_cfg_flags;
720 };
721 
743 __rte_experimental
744 int
745 rte_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)
749 
758 struct rte_regex_ops;
759 typedef void (*regexdev_stop_flush_t)(uint8_t dev_id, uint16_t qp_id,
760  struct rte_regex_ops *op);
767  uint32_t qp_conf_flags;
769  uint16_t nb_desc;
779 };
780 
799 __rte_experimental
800 int
801 rte_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
823 int
824 rte_regexdev_start(uint8_t dev_id);
825 
845 __rte_experimental
846 int
847 rte_regexdev_stop(uint8_t dev_id);
848 
861 __rte_experimental
862 int
863 rte_regexdev_close(uint8_t dev_id);
864 
865 /* Device get/set attributes */
866 
894 };
895 
915 __rte_experimental
916 int
917 rte_regexdev_attr_get(uint8_t dev_id, enum rte_regexdev_attr_id attr_id,
918  void *attr_value);
919 
939 __rte_experimental
940 int
941 rte_regexdev_attr_set(uint8_t dev_id, enum rte_regexdev_attr_id attr_id,
942  const void *attr_value);
943 
944 /* Rule related APIs */
951 };
952 
957  uint16_t group_id;
959  uint32_t rule_id;
961  const char *pcre_rule;
963  uint16_t pcre_rule_len;
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
1009 int
1010 rte_regexdev_rule_db_update(uint8_t dev_id,
1011  const struct rte_regexdev_rule *rules,
1012  uint32_t nb_rules);
1013 
1030 __rte_experimental
1031 int
1033 
1055 __rte_experimental
1056 int
1057 rte_regexdev_rule_db_import(uint8_t dev_id, const char *rule_db,
1058  uint32_t rule_db_len);
1059 
1080 __rte_experimental
1081 int
1082 rte_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
1121 int
1122 rte_regexdev_xstats_names_get(uint8_t dev_id,
1123  struct rte_regexdev_xstats_map *xstats_map);
1124 
1147 __rte_experimental
1148 int
1149 rte_regexdev_xstats_get(uint8_t dev_id, const uint16_t *ids,
1150  uint64_t *values, uint16_t nb_values);
1151 
1174 __rte_experimental
1175 int
1176 rte_regexdev_xstats_by_name_get(uint8_t dev_id, const char *name,
1177  uint16_t *id, uint64_t *value);
1178 
1198 __rte_experimental
1199 int
1200 rte_regexdev_xstats_reset(uint8_t dev_id, const uint16_t *ids,
1201  uint16_t nb_ids);
1202 
1216 __rte_experimental
1217 int
1218 rte_regexdev_selftest(uint8_t dev_id);
1219 
1234 __rte_experimental
1235 int
1236 rte_regexdev_dump(uint8_t dev_id, FILE *f);
1237 
1238 /* Fast path APIs */
1239 
1246  RTE_STD_C11
1247  union {
1248  uint64_t u64;
1249  struct {
1250  uint32_t rule_id:20;
1254  uint32_t group_id:12;
1258  uint16_t start_offset;
1260  RTE_STD_C11
1261  union {
1262  uint16_t len;
1264  uint16_t end_offset;
1269  };
1270  };
1271  };
1272 };
1273 
1274 /* Enumerates RegEx request flags. */
1275 #define RTE_REGEX_OPS_REQ_GROUP_ID0_VALID_F (1 << 0)
1276 
1278 #define RTE_REGEX_OPS_REQ_GROUP_ID1_VALID_F (1 << 1)
1279 
1281 #define RTE_REGEX_OPS_REQ_GROUP_ID2_VALID_F (1 << 2)
1282 
1284 #define RTE_REGEX_OPS_REQ_GROUP_ID3_VALID_F (1 << 3)
1285 
1287 #define RTE_REGEX_OPS_REQ_STOP_ON_MATCH_F (1 << 4)
1288 
1290 #define RTE_REGEX_OPS_REQ_MATCH_HIGH_PRIORITY_F (1 << 5)
1291 
1301 /* Enumerates RegEx response flags. */
1302 #define RTE_REGEX_OPS_RSP_PMI_SOJ_F (1 << 0)
1303 
1309 #define RTE_REGEX_OPS_RSP_PMI_EOJ_F (1 << 1)
1310 
1316 #define RTE_REGEX_OPS_RSP_MAX_SCAN_TIMEOUT_F (1 << 2)
1317 
1323 #define RTE_REGEX_OPS_RSP_MAX_MATCH_F (1 << 3)
1324 
1330 #define RTE_REGEX_OPS_RSP_MAX_PREFIX_F (1 << 4)
1331 
1337 #define RTE_REGEX_OPS_RSP_RESOURCE_LIMIT_REACHED_F (1 << 4)
1338 
1347  /* W0 */
1348  uint16_t req_flags;
1352  uint16_t rsp_flags;
1358  uint16_t nb_matches;
1366  /* W1 */
1367  struct rte_mbuf *mbuf;
1369  /* W2 */
1370  uint16_t group_id0;
1376  uint16_t group_id1;
1381  uint16_t group_id2;
1386  uint16_t group_id3;
1392  /* W3 */
1393  RTE_STD_C11
1394  union {
1395  uint64_t user_id;
1401  void *user_ptr;
1403  };
1404 
1405  /* W4 */
1406  RTE_STD_C11
1407  union {
1408  uint64_t cross_buf_id;
1417  };
1418 
1419  /* W5 */
1420  struct rte_regexdev_match matches[];
1427 };
1428 
1429 #include "rte_regexdev_core.h"
1430 
1468 __rte_experimental
1469 static inline uint16_t
1470 rte_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  RTE_FUNC_PTR_OR_ERR_RET(*dev->enqueue, -ENOTSUP);
1477  if (qp_id >= dev->data->dev_conf.nb_queue_pairs) {
1478  RTE_REGEXDEV_LOG(ERR, "Invalid queue %d\n", qp_id);
1479  return -EINVAL;
1480  }
1481 #endif
1482  return (*dev->enqueue)(dev, qp_id, ops, nb_ops);
1483 }
1484 
1527 __rte_experimental
1528 static inline uint16_t
1529 rte_regexdev_dequeue_burst(uint8_t dev_id, uint16_t qp_id,
1530  struct rte_regex_ops **ops, uint16_t nb_ops)
1531 {
1532  struct rte_regexdev *dev = &rte_regex_devices[dev_id];
1533 #ifdef RTE_LIBRTE_REGEXDEV_DEBUG
1534  RTE_REGEXDEV_VALID_DEV_ID_OR_ERR_RET(dev_id, -EINVAL);
1535  RTE_FUNC_PTR_OR_ERR_RET(*dev->dequeue, -ENOTSUP);
1536  if (qp_id >= dev->data->dev_conf.nb_queue_pairs) {
1537  RTE_REGEXDEV_LOG(ERR, "Invalid queue %d\n", qp_id);
1538  return -EINVAL;
1539  }
1540 #endif
1541  return (*dev->dequeue)(dev, qp_id, ops, nb_ops);
1542 }
1543 
1544 #ifdef __cplusplus
1545 }
1546 #endif
1547 
1548 #endif /* _RTE_REGEXDEV_H_ */
__rte_experimental uint8_t rte_regexdev_count(void)
__rte_experimental int rte_regexdev_xstats_by_name_get(uint8_t dev_id, const char *name, uint16_t *id, uint64_t *value)
uint16_t group_id0
uint16_t max_queue_pairs
Definition: rte_regexdev.h:609
__rte_experimental int rte_regexdev_info_get(uint8_t dev_id, struct rte_regexdev_info *dev_info)
uint32_t nb_rules_per_group
Definition: rte_regexdev.h:693
#define RTE_REGEXDEV_XSTATS_NAME_SIZE
rte_regexdev_rule_op
Definition: rte_regexdev.h:946
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_experimental int rte_regexdev_queue_pair_setup(uint8_t dev_id, uint16_t queue_pair_id, const struct rte_regexdev_qp_conf *qp_conf)
uint16_t max_matches
Definition: rte_regexdev.h:607
__rte_experimental int rte_regexdev_dump(uint8_t dev_id, FILE *f)
__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_xstats_names_get(uint8_t dev_id, struct rte_regexdev_xstats_map *xstats_map)
__rte_experimental int rte_regexdev_xstats_reset(uint8_t dev_id, const uint16_t *ids, uint16_t nb_ids)
uint16_t nb_actual_matches
const char * rule_db
Definition: rte_regexdev.h:707
__rte_experimental int rte_regexdev_get_dev_id(const char *name)
uint16_t pcre_rule_len
Definition: rte_regexdev.h:963
uint16_t group_id2
__rte_experimental int rte_regexdev_close(uint8_t dev_id)
uint64_t cross_buf_id
void(* regexdev_stop_flush_t)(uint8_t dev_id, uint16_t qp_id, struct rte_regex_ops *op)
Definition: rte_regexdev.h:759
uint16_t group_id1
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)
uint32_t regexdev_capa
Definition: rte_regexdev.h:619
rte_regexdev_attr_id
Definition: rte_regexdev.h:868
uint16_t req_flags
__rte_experimental int rte_regexdev_xstats_get(uint8_t dev_id, const uint16_t *ids, uint64_t *values, uint16_t nb_values)
struct rte_mbuf * mbuf
uint32_t max_rules_per_group
Definition: rte_regexdev.h:615
uint16_t group_id3
__rte_experimental int rte_regexdev_stop(uint8_t dev_id)
__rte_experimental int rte_regexdev_rule_db_update(uint8_t dev_id, const struct rte_regexdev_rule *rules, uint32_t nb_rules)
__rte_experimental int rte_regexdev_start(uint8_t dev_id)
__rte_experimental int rte_regexdev_selftest(uint8_t dev_id)
uint16_t rsp_flags
#define RTE_STD_C11
Definition: rte_common.h:42
uint16_t max_payload_size
Definition: rte_regexdev.h:611
__rte_experimental int rte_regexdev_is_valid_dev(uint16_t dev_id)
__rte_experimental int rte_regexdev_rule_db_export(uint8_t dev_id, char *rule_db)
const char * driver_name
Definition: rte_regexdev.h:605
__rte_experimental int rte_regexdev_rule_db_compile_activate(uint8_t dev_id)
uint64_t user_id
regexdev_stop_flush_t cb
Definition: rte_regexdev.h:771
const char * pcre_rule
Definition: rte_regexdev.h:961
struct rte_device * dev
Definition: rte_regexdev.h:606
__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_import(uint8_t dev_id, const char *rule_db, uint32_t rule_db_len)
uint16_t nb_matches
__rte_experimental int rte_regexdev_configure(uint8_t dev_id, const struct rte_regexdev_config *cfg)
void * cross_buf_ptr