1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright 2018 Gaëtan Rivet 3 */ 4 5 #ifndef _RTE_CLASS_H_ 6 #define _RTE_CLASS_H_ 7 8 /** 9 * @file 10 * 11 * DPDK device class interface. 12 * 13 * This file describes the interface of the device class 14 * abstraction layer. 15 * 16 * A device class defines the type of function a device 17 * will be used for e.g.: Ethernet adapter (eth), 18 * cryptographic co-processor (crypto), etc. 19 */ 20 21 #include <rte_dev.h> 22 23 #ifdef __cplusplus 24 extern "C" { 25 #endif 26 27 /** Double linked list of classes */ 28 RTE_TAILQ_HEAD(rte_class_list, rte_class); 29 30 /** 31 * A structure describing a generic device class. 32 */ 33 struct rte_class { 34 RTE_TAILQ_ENTRY(rte_class) next; /**< Next device class in linked list */ 35 const char *name; /**< Name of the class */ 36 rte_dev_iterate_t dev_iterate; /**< Device iterator. */ 37 }; 38 39 /** 40 * Class comparison function. 41 * 42 * @param cls 43 * Class under test. 44 * 45 * @param data 46 * Data to compare against. 47 * 48 * @return 49 * 0 if the class matches the data. 50 * !0 if the class does not match. 51 * <0 if ordering is possible and the class is lower than the data. 52 * >0 if ordering is possible and the class is greater than the data. 53 */ 54 typedef int (*rte_class_cmp_t)(const struct rte_class *cls, const void *data); 55 56 /** 57 * Class iterator to find a particular class. 58 * 59 * This function compares each registered class to find one that matches 60 * the data passed as parameter. 61 * 62 * If the comparison function returns zero this function will stop iterating 63 * over any more classes. To continue a search the class of a previous search 64 * can be passed via the start parameter. 65 * 66 * @param start 67 * Starting point for the iteration. 68 * 69 * @param cmp 70 * Comparison function. 71 * 72 * @param data 73 * Data to pass to comparison function. 74 * 75 * @return 76 * A pointer to a rte_class structure or NULL in case no class matches 77 */ 78 struct rte_class * 79 rte_class_find(const struct rte_class *start, rte_class_cmp_t cmp, 80 const void *data); 81 82 /** 83 * Find the registered class for a given name. 84 */ 85 struct rte_class * 86 rte_class_find_by_name(const char *name); 87 88 /** 89 * Register a Class handle. 90 * 91 * @param cls 92 * A pointer to a rte_class structure describing the class 93 * to be registered. 94 */ 95 void rte_class_register(struct rte_class *cls); 96 97 /** 98 * Unregister a Class handle. 99 * 100 * @param cls 101 * A pointer to a rte_class structure describing the class 102 * to be unregistered. 103 */ 104 void rte_class_unregister(struct rte_class *cls); 105 106 /** 107 * Helper for Class registration. 108 * The constructor has lower priority than Bus constructors. 109 * The constructor has higher priority than PMD constructors. 110 */ 111 #define RTE_REGISTER_CLASS(nm, cls) \ 112 RTE_INIT_PRIO(classinitfn_ ##nm, CLASS) \ 113 {\ 114 (cls).name = RTE_STR(nm); \ 115 rte_class_register(&cls); \ 116 } 117 118 #define RTE_UNREGISTER_CLASS(nm, cls) \ 119 RTE_FINI_PRIO(classfinifn_ ##nm, CLASS) \ 120 { \ 121 rte_class_unregister(&cls); \ 122 } 123 124 #ifdef __cplusplus 125 } 126 #endif 127 128 #endif /* _RTE_CLASS_H_ */ 129