/* * Looks for random keys which * ALL can fit in hash table (no errors) */ static int get_input_keys(unsigned with_pushes, unsigned table_index) { unsigned i, j; unsigned bucket_idx, incr, success = 1; uint8_t k = 0; int32_t ret; const uint32_t bucket_bitmask = NUM_BUCKETS - 1; /* Reset all arrays */ for (i = 0; i < MAX_ENTRIES; i++) slot_taken[i] = 0; for (i = 0; i < NUM_BUCKETS; i++) buckets[i] = 0; for (j = 0; j < hashtest_key_lens[table_index]; j++) keys[0][j] = 0; /* * Add only entries that are not duplicated and that fits in the table * (cannot store more than BUCKET_SIZE entries in a bucket). * Regardless a key has been added correctly or not (success), * the next one to try will be increased by 1. */ for (i = 0; i < KEYS_TO_ADD;) { incr = 0; if (i != 0) { keys[i][0] = ++k; /* Overflow, need to increment the next byte */ if (keys[i][0] == 0) incr = 1; for (j = 1; j < hashtest_key_lens[table_index]; j++) { /* Do not increase next byte */ if (incr == 0) if (success == 1) keys[i][j] = keys[i - 1][j]; else keys[i][j] = keys[i][j]; /* Increase next byte by one */ else { if (success == 1) keys[i][j] = keys[i-1][j] + 1; else keys[i][j] = keys[i][j] + 1; if (keys[i][j] == 0) incr = 1; else incr = 0; } } } success = 0; signatures[i] = rte_hash_hash(h[table_index], keys[i]); bucket_idx = signatures[i] & bucket_bitmask; /* * If we are not inserting keys in secondary location, * when bucket is full, do not try to insert the key */ if (with_pushes == 0) if (buckets[bucket_idx] == BUCKET_SIZE) continue; /* If key can be added, leave in successful key arrays "keys" */ ret = rte_hash_add_key_with_hash(h[table_index], keys[i], signatures[i]); if (ret >= 0) { /* If key is already added, ignore the entry and do not store */ if (slot_taken[ret]) continue; else { /* Store the returned position and mark slot as taken */ slot_taken[ret] = 1; positions[i] = ret; buckets[bucket_idx]++; success = 1; i++; } } } /* Reset the table, so we can measure the time to add all the entries */ rte_hash_free(h[table_index]); h[table_index] = rte_hash_create(&ut_params); return 0; }
int32_t rte_hash_lookup(const struct rte_hash *h, const void *key) { RETURN_IF_TRUE(((h == NULL) || (key == NULL)), -EINVAL); return __rte_hash_lookup_with_hash(h, key, rte_hash_hash(h, key)); }