#include <stdio.h>
#include <rte_eal.h>
#include <rte_hash.h>
#include <rte_jhash.h>
#include <rte_malloc.h>
#define HASH_KEY_COUNT 20
struct net_key {
uint32_t sip;
uint32_t dip;
uint16_t sport;
uint16_t dport;
char proto;
};
static struct rte_hash *create_hash_table(const char *name) {
struct rte_hash_parameters *params = rte_malloc("rte_hash_parameters", sizeof(struct rte_hash_parameters), 0);
if (!params) return NULL;
memset(params, 0, sizeof(struct rte_hash_parameters));
params->name = name;
params->entries = 8192; //哈希表长度
params->key_len = sizeof(struct net_key);
params->hash_func = rte_jhash;
params->hash_func_init_val = 0; //一般设置为0
params->socket_id = rte_socket_id();
struct rte_hash *hash = rte_hash_create(params);
return hash;
}
static void print_key(struct net_key *key) {
printf("sip:%x, dip:%x, sport:%x, dport:%x, proto:%d\n",
key->sip, key->dip, key->sport, key->dport, key->proto);
}
int main(int argc, char *argv[]) {
rte_eal_init(argc, argv);
/*
* 哈希插入的方法:(其中的hash是自己计算出来再插入的)
* key
* key hash
* key data
* key hash data
*/
struct rte_hash *hash = create_hash_table("hash_table");
int i = 0;
for(i = 0; i < HASH_KEY_COUNT; i++) {
struct net_key nk = {0};
nk.sip = 0x11111111 + i;
nk.dip = 0x22222222 + i;
nk.sport = 0x3333 + i;
nk.dport = 0x4444 + i;
nk.proto = i % 2;
if (i % 4 == 0) {
//插入key, 该key不需要申请动态内存
rte_hash_add_key(hash, &nk);
} else if (i %4 == 1) {
//插入key+hash
hash_sig_t hash_value = rte_hash_hash(hash, &nk);
rte_hash_add_key_with_hash(hash, &nk, hash_value);
} else if (i % 4 == 2) {
//插入key data, data地址不能为局部的,避免失效
uint32_t *tmp = rte_malloc("tmp", sizeof(uint32_t), 0);
*tmp = i;
rte_hash_add_key_data(hash, &nk, tmp);
} else if (i % 4 == 3) {
//插入key hash data
hash_sig_t hash_value = rte_hash_hash(hash, &nk);
uint32_t *tmp = rte_malloc("tmp", sizeof(uint32_t), 0);
*tmp = i;
rte_hash_add_key_with_hash_data(hash, &nk, hash_value, tmp);
}
}
for (i = 0; i < HASH_KEY_COUNT; i++) {
struct net_key nk = {0};
nk.sip = 0x11111111 + i;
nk.dip = 0x22222222 + i;
nk.sport = 0x3333 + i;
nk.dport = 0x4444 + i;
nk.proto = i % 2;
int idx = rte_hash_lookup(hash, &nk);
printf("hash look up-->sip:%x idx:%d\n", nk.sip, idx);
//rte_hash_del_key(hash, &nk);
}
struct net_key *key = NULL;
void *value = NULL;
uint32_t next = 0;
//遍历所有哈希节点
while(rte_hash_iterate(hash, (const void**)&key, &value, &next) >= 0) {
if (value != NULL) {
printf("value: %d \t", *(uint32_t*)value);
}
print_key(key);
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.