我写了一个基于DPDK的程序,我不熟悉DPDK哈希库,所以我写了一个关于DPDK哈希的例子,代码是:

struct rte_hash *hash;
struct rte_hash_parameters params;
void *data;
int key;
int d;
int ret;
bzero (&params,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 (&params);
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/

10-14 22:07