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

Function table_lookup

dpdk/lib/table/rte_swx_table_em.c:498–601  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

496#define LUT_MATCH_POS 0x12131210
497
498static int
499table_lookup(void *table,
500 void *mailbox,
501 uint8_t **key,
502 uint64_t *action_id,
503 uint8_t **action_data,
504 size_t *entry_id,
505 int *hit)
506{
507 struct table *t = table;
508 struct mailbox *m = mailbox;
509
510 switch (m->state) {
511 case 0: {
512 uint8_t *input_key = &(*key)[t->params.key_offset];
513 struct bucket_extension *bkt;
514 uint32_t input_sig, bkt_id;
515
516 input_sig = t->params.hash_func(input_key, t->params.key_size, 0);
517 bkt_id = input_sig & (t->n_buckets - 1);
518 bkt = &t->buckets[bkt_id];
519 rte_prefetch0(bkt);
520
521 m->bkt = bkt;
522 m->input_sig = (input_sig >> 16) | 1;
523 m->state++;
524 return 0;
525 }
526
527 case 1: {
528 struct bucket_extension *bkt = m->bkt;
529 uint32_t input_sig = m->input_sig;
530 uint32_t bkt_sig0, bkt_sig1, bkt_sig2, bkt_sig3;
531 uint32_t mask0 = 0, mask1 = 0, mask2 = 0, mask3 = 0, mask_all;
532 uint32_t sig_match = LUT_MATCH;
533 uint32_t sig_match_many = LUT_MATCH_MANY;
534 uint32_t sig_match_pos = LUT_MATCH_POS;
535 uint32_t bkt_key_id;
536
537 bkt_sig0 = input_sig ^ bkt->sig[0];
538 if (!bkt_sig0)
539 mask0 = 1 << 0;
540
541 bkt_sig1 = input_sig ^ bkt->sig[1];
542 if (!bkt_sig1)
543 mask1 = 1 << 1;
544
545 bkt_sig2 = input_sig ^ bkt->sig[2];
546 if (!bkt_sig2)
547 mask2 = 1 << 2;
548
549 bkt_sig3 = input_sig ^ bkt->sig[3];
550 if (!bkt_sig3)
551 mask3 = 1 << 3;
552
553 mask_all = (mask0 | mask1) | (mask2 | mask3);
554 sig_match = (sig_match >> mask_all) & 1;
555 sig_match_many = (sig_match_many >> mask_all) & 1;

Callers

nothing calls this directly

Calls 4

table_keyFunction · 0.85
table_key_dataFunction · 0.85
table_lookup_unoptimizedFunction · 0.85
rte_prefetch0Function · 0.50

Tested by

no test coverage detected