1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2017 Intel Corporation
7 #include <rte_string_fns.h>
9 #include <rte_eal_memconfig.h>
10 #include <rte_memory.h>
11 #include <rte_malloc.h>
12 #include <rte_errno.h>
14 #include "rte_member.h"
15 #include "rte_member_ht.h"
16 #include "rte_member_vbf.h"
18 int librte_member_logtype
;
20 TAILQ_HEAD(rte_member_list
, rte_tailq_entry
);
21 static struct rte_tailq_elem rte_member_tailq
= {
24 EAL_REGISTER_TAILQ(rte_member_tailq
)
26 struct rte_member_setsum
*
27 rte_member_find_existing(const char *name
)
29 struct rte_member_setsum
*setsum
= NULL
;
30 struct rte_tailq_entry
*te
;
31 struct rte_member_list
*member_list
;
33 member_list
= RTE_TAILQ_CAST(rte_member_tailq
.head
, rte_member_list
);
35 rte_rwlock_read_lock(RTE_EAL_TAILQ_RWLOCK
);
36 TAILQ_FOREACH(te
, member_list
, next
) {
37 setsum
= (struct rte_member_setsum
*) te
->data
;
38 if (strncmp(name
, setsum
->name
, RTE_MEMBER_NAMESIZE
) == 0)
41 rte_rwlock_read_unlock(RTE_EAL_TAILQ_RWLOCK
);
51 rte_member_free(struct rte_member_setsum
*setsum
)
53 struct rte_member_list
*member_list
;
54 struct rte_tailq_entry
*te
;
58 member_list
= RTE_TAILQ_CAST(rte_member_tailq
.head
, rte_member_list
);
59 rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK
);
60 TAILQ_FOREACH(te
, member_list
, next
) {
61 if (te
->data
== (void *)setsum
)
65 rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK
);
68 TAILQ_REMOVE(member_list
, te
, next
);
69 rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK
);
71 switch (setsum
->type
) {
72 case RTE_MEMBER_TYPE_HT
:
73 rte_member_free_ht(setsum
);
75 case RTE_MEMBER_TYPE_VBF
:
76 rte_member_free_vbf(setsum
);
85 struct rte_member_setsum
*
86 rte_member_create(const struct rte_member_parameters
*params
)
88 struct rte_tailq_entry
*te
;
89 struct rte_member_list
*member_list
;
90 struct rte_member_setsum
*setsum
;
98 if (params
->key_len
== 0 ||
99 params
->prim_hash_seed
== params
->sec_hash_seed
) {
101 RTE_MEMBER_LOG(ERR
, "Create setsummary with "
102 "invalid parameters\n");
106 member_list
= RTE_TAILQ_CAST(rte_member_tailq
.head
, rte_member_list
);
108 rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK
);
110 TAILQ_FOREACH(te
, member_list
, next
) {
112 if (strncmp(params
->name
, setsum
->name
,
113 RTE_MEMBER_NAMESIZE
) == 0)
120 goto error_unlock_exit
;
122 te
= rte_zmalloc("MEMBER_TAILQ_ENTRY", sizeof(*te
), 0);
124 RTE_MEMBER_LOG(ERR
, "tailq entry allocation failed\n");
125 goto error_unlock_exit
;
128 /* Create a new setsum structure */
129 setsum
= rte_zmalloc_socket(params
->name
,
130 sizeof(struct rte_member_setsum
), RTE_CACHE_LINE_SIZE
,
132 if (setsum
== NULL
) {
133 RTE_MEMBER_LOG(ERR
, "Create setsummary failed\n");
134 goto error_unlock_exit
;
136 strlcpy(setsum
->name
, params
->name
, sizeof(setsum
->name
));
137 setsum
->type
= params
->type
;
138 setsum
->socket_id
= params
->socket_id
;
139 setsum
->key_len
= params
->key_len
;
140 setsum
->num_set
= params
->num_set
;
141 setsum
->prim_hash_seed
= params
->prim_hash_seed
;
142 setsum
->sec_hash_seed
= params
->sec_hash_seed
;
144 switch (setsum
->type
) {
145 case RTE_MEMBER_TYPE_HT
:
146 ret
= rte_member_create_ht(setsum
, params
);
148 case RTE_MEMBER_TYPE_VBF
:
149 ret
= rte_member_create_vbf(setsum
, params
);
152 goto error_unlock_exit
;
155 goto error_unlock_exit
;
157 RTE_MEMBER_LOG(DEBUG
, "Creating a setsummary table with "
158 "mode %u\n", setsum
->type
);
160 te
->data
= (void *)setsum
;
161 TAILQ_INSERT_TAIL(member_list
, te
, next
);
162 rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK
);
168 rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK
);
173 rte_member_add(const struct rte_member_setsum
*setsum
, const void *key
,
176 if (setsum
== NULL
|| key
== NULL
)
179 switch (setsum
->type
) {
180 case RTE_MEMBER_TYPE_HT
:
181 return rte_member_add_ht(setsum
, key
, set_id
);
182 case RTE_MEMBER_TYPE_VBF
:
183 return rte_member_add_vbf(setsum
, key
, set_id
);
190 rte_member_lookup(const struct rte_member_setsum
*setsum
, const void *key
,
191 member_set_t
*set_id
)
193 if (setsum
== NULL
|| key
== NULL
|| set_id
== NULL
)
196 switch (setsum
->type
) {
197 case RTE_MEMBER_TYPE_HT
:
198 return rte_member_lookup_ht(setsum
, key
, set_id
);
199 case RTE_MEMBER_TYPE_VBF
:
200 return rte_member_lookup_vbf(setsum
, key
, set_id
);
207 rte_member_lookup_bulk(const struct rte_member_setsum
*setsum
,
208 const void **keys
, uint32_t num_keys
,
209 member_set_t
*set_ids
)
211 if (setsum
== NULL
|| keys
== NULL
|| set_ids
== NULL
)
214 switch (setsum
->type
) {
215 case RTE_MEMBER_TYPE_HT
:
216 return rte_member_lookup_bulk_ht(setsum
, keys
, num_keys
,
218 case RTE_MEMBER_TYPE_VBF
:
219 return rte_member_lookup_bulk_vbf(setsum
, keys
, num_keys
,
227 rte_member_lookup_multi(const struct rte_member_setsum
*setsum
, const void *key
,
228 uint32_t match_per_key
, member_set_t
*set_id
)
230 if (setsum
== NULL
|| key
== NULL
|| set_id
== NULL
)
233 switch (setsum
->type
) {
234 case RTE_MEMBER_TYPE_HT
:
235 return rte_member_lookup_multi_ht(setsum
, key
, match_per_key
,
237 case RTE_MEMBER_TYPE_VBF
:
238 return rte_member_lookup_multi_vbf(setsum
, key
, match_per_key
,
246 rte_member_lookup_multi_bulk(const struct rte_member_setsum
*setsum
,
247 const void **keys
, uint32_t num_keys
,
248 uint32_t max_match_per_key
, uint32_t *match_count
,
249 member_set_t
*set_ids
)
251 if (setsum
== NULL
|| keys
== NULL
|| set_ids
== NULL
||
255 switch (setsum
->type
) {
256 case RTE_MEMBER_TYPE_HT
:
257 return rte_member_lookup_multi_bulk_ht(setsum
, keys
, num_keys
,
258 max_match_per_key
, match_count
, set_ids
);
259 case RTE_MEMBER_TYPE_VBF
:
260 return rte_member_lookup_multi_bulk_vbf(setsum
, keys
, num_keys
,
261 max_match_per_key
, match_count
, set_ids
);
268 rte_member_delete(const struct rte_member_setsum
*setsum
, const void *key
,
271 if (setsum
== NULL
|| key
== NULL
)
274 switch (setsum
->type
) {
275 case RTE_MEMBER_TYPE_HT
:
276 return rte_member_delete_ht(setsum
, key
, set_id
);
277 /* current vBF implementation does not support delete function */
278 case RTE_MEMBER_TYPE_VBF
:
285 rte_member_reset(const struct rte_member_setsum
*setsum
)
289 switch (setsum
->type
) {
290 case RTE_MEMBER_TYPE_HT
:
291 rte_member_reset_ht(setsum
);
293 case RTE_MEMBER_TYPE_VBF
:
294 rte_member_reset_vbf(setsum
);
301 RTE_INIT(librte_member_init_log
)
303 librte_member_logtype
= rte_log_register("lib.member");
304 if (librte_member_logtype
>= 0)
305 rte_log_set_level(librte_member_logtype
, RTE_LOG_DEBUG
);