vpp hash tables 代码
时间: 2023-07-27 08:07:34 浏览: 145
以下是一个使用VPP中的hash table的示例代码:
```c
#include <vlib/vlib.h>
#include <vppinfra/hash.h>
typedef struct {
u32 key;
u32 value;
u32 hits;
} hash_test_entry_t;
typedef struct {
u32 next_index;
hash_test_entry_t *entries;
uword *hash;
} hash_test_main_t;
hash_test_main_t hash_test_main;
static clib_error_t *
hash_test_init (vlib_main_t *vm)
{
hash_test_main_t *htmp = &hash_test_main;
htmp->hash = hash_create (0, sizeof (uword));
return 0;
}
static uword
hash_test (vlib_main_t *vm,
vlib_node_runtime_t *node,
vlib_frame_t *frame)
{
hash_test_main_t *htmp = &hash_test_main;
hash_test_entry_t *e;
uword *p;
int i;
// 添加元素到hash table中
for (i = 0; i < 10; i++)
{
pool_get_aligned (htmp->entries, e, CLIB_CACHE_LINE_BYTES);
memset (e, 0, sizeof (*e));
e->key = i;
e->value = i * i;
hash_set (htmp->hash, i, e - htmp->entries);
}
// 查找元素
for (i = 0; i < 20; i++)
{
p = hash_get (htmp->hash, i);
if (p == 0)
continue;
e = vec_elt_at_index (htmp->entries, p[0]);
e->hits++;
}
// 删除元素
for (i = 0; i < 10; i++)
{
p = hash_get (htmp->hash, i);
if (p == 0)
continue;
e = vec_elt_at_index (htmp->entries, p[0]);
hash_unset (htmp->hash, i);
pool_put (htmp->entries, e);
}
return 0;
}
VLIB_REGISTER_NODE (hash_test_node) = {
.function = hash_test,
.type = VLIB_NODE_TYPE_INPUT,
.name = "hash-test",
};
VLIB_INIT_FUNCTION (hash_test_init);
```
这个示例代码展示了如何使用VPP中的hash table。在这个示例中,我们首先创建了一个hash table,然后向其中添加了一些元素。之后,我们对hash table进行了一些查找操作,对每个元素的“hits”字段进行了递增操作。最后,我们删除了所有元素。
阅读全文