DPDK20.05 hash表2 – rte_hash_add_key

该函数用来向 hash 表中添加表项。
本文以 DPDK 20.05 版本中的hash为例。

1、数据结构

1.1 union ipv4_5tuple_host

该数据结构为hash表中保存的ipv4类型的key结构,是一个128位的结构。

1.2 struct ipv4_5tuple

该结构通常为普通程序使用,可用在对外开放的接口中。
在添加key时,用户只需要填充该结构,之后程序将该结构转换为可以向hash表中插入的union ipv4_5tuple_host 结构。

1.3 union ipv6_5tuple_host

与 union ipv4_5tuple_host 类似,hash表中保存的ipv6的key结构。

1.4 struct ipv6_5tuple

与 struct ipv4_5tuple 类似。

1.5 struct ipv4_l3fwd_em_route

该结构包含两个成员变量,一个用来保存 ipv4 的五元组,另一个表示出接口的索引。

1.6 struct rte_hash_key

该结构用来保存键值对。

该结构通过和 union ipv4_5tuple_host 或 union ipv6_5tuple_host 构成 hash 表中的key entry:

2 key 的定义与转换

2.1 key 的定义

RTE_IPV4宏的定义如下:

将一个10进制表示的IPv4地址转换为32位无符号整数。

2.2 将 struct ipv4_5tuple 结构的key转换为 union ipv4_5tuple_host 结构

通过调用 convert_ipv4_5tuple(&entry.key, &newkey) 函数,将 struct ipv4_5tuple 结构的key转换为 union ipv4_5tuple_host 结构。entry与 newkey 两个结构分别定义如下:

convert_ipv4_5tuple() 函数的实现如下:

3、向hash表中插入key

3.1 rte_hash_add_key() 函数

该函数向 hash 表中添加新的key,返回的值取了为key所在的位置定义如下:

rte_hash_hash() 函数用来根据 key 的值计算hash值,得到的值在DPDK中被称为 signature。在示例l3fwd中使用了自定义的函数ipv4_hash_crc()和ipv6_hash_crc()。

3.2 __rte_hash_add_key_with_hash() 函数

3.2 search_and_update() 函数

该函数根据key从bucket中查找对应的entry,并更新它的data。
在调用该函数时,调用者需要自己加锁。

3.3 rte_hash_cuckoo_insert_mw() 函数

该函数用来从主次bucket中查找一个空闲的slot并将数据插入。
如果bucket中已经存在且key值完全一致,则返回1;如果插入成功,则返回0;
如果没有空闲slot,则返回 -1。

3.4 enqueue_slot_back() 函数

调用该函数将索引重新入队到cache/ring,因为slot没被使用,且可以留作后面使用。

3.5 rte_hash_get_last_bkt() 函数

该函数获取 lst_bkt 连接到的最后一个扩展bucket。

————————————————————

原创文章,转载请注明: 转载自孙希栋的博客

本文链接地址: 《DPDK20.05 hash表2 – rte_hash_add_key》

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Scroll Up