我写了一个基于DPDK的程序,我不熟悉DPDK哈希库,所以我写了一个关于DPDK哈希的例子,代码是:
struct rte_hash *hash;
struct rte_hash_parameters params;
void *data;
int key;
int d;
int ret;
bzero (¶ms,sizeof (params));
params.name = NULL;
params.entries = 500;
params.key_len = sizeof (int);
params.hash_func = rte_jhash;
params.hash_func_init_val = 0;
hash = rte_hash_create (¶ms);
if (!hash) {
fprintf (stderr,"rte_hash_create failed\n");
return;
}
key = 0;
data = NULL;
key = 1;
d = 1;
//add 1/1 to hash table
rte_hash_add_key_data (hash,&key,(void *) (long) d);
key = 2;
d = 2;
//add 2/2 to hash table
rte_hash_add_key_data (hash,&key,(void *) (long) d);
key = 2;
//I want to lookup with key = 2
//But it failed.
ret = rte_hash_lookup_data (hash,&key,&data);
if (ret) {
if (ret == ENOENT) {
fprintf (stderr,"find failed\n");
return;
}
if (ret == EINVAL) {
fprintf (stderr,"parameter invalid");
return;
}
fprintf (stderr,"lookup failed");
return;
}
在上面的代码中,我将1/1和2/2添加到哈希表中。
但是键为2的rte_hash_lookup_数据失败。如何处理此问题?
谢谢您。
最佳答案
此函数的文档似乎有点误导。它表示成功时将返回ret=0,但所有代码示例都表明您应该检查:(ret < 0)
例如,请参见
http://dpdk.org/doc/api/examples_2ipsec-secgw_2ipsec_8c-example.html#a2检查以确保ret为非阴性。
ret = rte_hash_lookup_data (hash,&key,&data);
if (ret < 0) { /* CHANGE THIS LINE */
//.... continue
当我运行您的代码并打印返回值
void *data
时,它按预期打印了2
,返回值为1
。由于错误值是负数,并且您会收到一个正数,因此我猜rte_hash_lookup_data
的文档应该更类似于rte_hash_lookup
的文档。所以您的查找/设置代码是正确的,您只需要更改
ret
值检查。关于c - 如何使用rte_hash_add_key_data?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41339871/