1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2017 Intel Corporation 3 */ 4 5 #ifndef RTE_MEMBER_SKETCH_H 6 #define RTE_MEMBER_SKETCH_H 7 8 #include <rte_vect.h> 9 #include <rte_ring_elem.h> 10 11 #ifdef __cplusplus 12 extern "C" { 13 #endif 14 15 #define NUM_ROW_SCALAR 5 16 #define INTERVAL (1 << 15) 17 18 #if !RTE_IS_POWER_OF_2(INTERVAL) 19 #error sketch INTERVAL macro must be a power of 2 20 #endif 21 22 int 23 rte_member_create_sketch(struct rte_member_setsum *ss, 24 const struct rte_member_parameters *params, 25 struct rte_ring *r); 26 27 int 28 rte_member_lookup_sketch(const struct rte_member_setsum *setsum, 29 const void *key, member_set_t *set_id); 30 31 int 32 rte_member_add_sketch(const struct rte_member_setsum *setsum, 33 const void *key, 34 member_set_t set_id); 35 36 int 37 rte_member_add_sketch_byte_count(const struct rte_member_setsum *ss, 38 const void *key, uint32_t byte_count); 39 40 void 41 sketch_update_scalar(const struct rte_member_setsum *ss, 42 const void *key, 43 uint32_t count); 44 45 uint64_t 46 sketch_lookup_scalar(const struct rte_member_setsum *ss, 47 const void *key); 48 49 void 50 sketch_delete_scalar(const struct rte_member_setsum *ss, 51 const void *key); 52 53 int 54 rte_member_delete_sketch(const struct rte_member_setsum *setsum, 55 const void *key); 56 57 int 58 rte_member_query_sketch(const struct rte_member_setsum *setsum, 59 const void *key, uint64_t *output); 60 61 void 62 rte_member_free_sketch(struct rte_member_setsum *ss); 63 64 void 65 rte_member_reset_sketch(const struct rte_member_setsum *setsum); 66 67 int 68 rte_member_report_heavyhitter_sketch(const struct rte_member_setsum *setsum, 69 void **key, uint64_t *count); 70 71 void 72 rte_member_update_heap(const struct rte_member_setsum *ss); 73 74 static __rte_always_inline uint64_t 75 count_min(const struct rte_member_setsum *ss, const uint32_t *hash_results) 76 { 77 uint64_t *count_array = ss->table; 78 uint64_t count; 79 uint32_t cur_row; 80 uint64_t min = UINT64_MAX; 81 82 for (cur_row = 0; cur_row < ss->num_row; cur_row++) { 83 uint64_t cnt = count_array[cur_row * ss->num_col + hash_results[cur_row]]; 84 85 if (cnt < min) 86 min = cnt; 87 } 88 count = min; 89 90 return count; 91 } 92 93 #ifdef __cplusplus 94 } 95 #endif 96 97 #endif /* RTE_MEMBER_SKETCH_H */ 98