MCPcopy Create free account
hub / github.com/F-Stack/f-stack / table_add

Function table_add

dpdk/lib/table/rte_swx_table_em.c:300–355  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

298}
299
300static int
301table_add(void *table, struct rte_swx_table_entry *entry)
302{
303 struct table *t = table;
304 struct bucket_extension *bkt0, *bkt, *bkt_prev;
305 uint32_t input_sig, bkt_id, i;
306
307 CHECK(t, EINVAL);
308 CHECK(entry, EINVAL);
309 CHECK(entry->key, EINVAL);
310
311 input_sig = t->params.hash_func(entry->key, t->params.key_size, 0);
312 bkt_id = input_sig & (t->n_buckets - 1);
313 bkt0 = &t->buckets[bkt_id];
314 input_sig = (input_sig >> 16) | 1;
315
316 /* Key is present in the bucket. */
317 for (bkt = bkt0; bkt; bkt = bkt->next)
318 for (i = 0; i < KEYS_PER_BUCKET; i++)
319 if (bkt_keycmp(t, bkt, entry->key, i, input_sig)) {
320 bkt_key_data_update(t, bkt, entry, i);
321 return 0;
322 }
323
324 /* Key is not present in the bucket. Bucket not full. */
325 for (bkt = bkt0, bkt_prev = NULL; bkt; bkt_prev = bkt, bkt = bkt->next)
326 for (i = 0; i < KEYS_PER_BUCKET; i++)
327 if (bkt_key_is_empty(bkt, i)) {
328 uint32_t new_bkt_key_id;
329
330 /* Allocate new key & install. */
331 CHECK(t->key_stack_tos, ENOSPC);
332 new_bkt_key_id = t->key_stack[--t->key_stack_tos];
333 bkt_key_install(t, bkt, entry, i, new_bkt_key_id, input_sig);
334 return 0;
335 }
336
337 /* Bucket full: extend bucket. */
338 if (t->bkt_ext_stack_tos && t->key_stack_tos) {
339 struct bucket_extension *new_bkt;
340 uint32_t new_bkt_id, new_bkt_key_id;
341
342 /* Allocate new bucket extension & install. */
343 new_bkt_id = t->bkt_ext_stack[--t->bkt_ext_stack_tos];
344 new_bkt = &t->buckets_ext[new_bkt_id];
345 memset(new_bkt, 0, sizeof(*new_bkt));
346 bkt_prev->next = new_bkt;
347
348 /* Allocate new key & install. */
349 new_bkt_key_id = t->key_stack[--t->key_stack_tos];
350 bkt_key_install(t, new_bkt, entry, 0, new_bkt_key_id, input_sig);
351 return 0;
352 }
353
354 CHECK(0, ENOSPC);
355}
356
357static int

Callers 1

table_createFunction · 0.85

Calls 5

bkt_keycmpFunction · 0.85
bkt_key_data_updateFunction · 0.85
bkt_key_is_emptyFunction · 0.85
bkt_key_installFunction · 0.85
memsetFunction · 0.85

Tested by

no test coverage detected