IPv6,ip地址的长度扩充到了128bits,DPDK中通过LPM6的库来支持IPv6。LPM6的实现和LPM非常类似。推荐阅读上一篇文章https://blog.csdn.net/blizzardoner/article/details/96196041来理解基本的LPM实现方法。
与LPM相似,LPM6也使用了tbl24和tbl8两个数据结构来实现查找规则,差别是LPM中使用1级tbl24,1级tbl8来完成最多32bit的LPM查找,而LPM6中则使用1级tbl24和最多13级tbl8来实现查找规则。对于IPv6来讲,大多数子网长度应该是小于等于48bits的,所以一般情况下查找需要小于4次内存访问,1次tbl24,3次tbl8。那么问题来了,为什么不使用两级tbl24,而是一级tbl24加上3级tbl8呢?每个tbl8所占用的内存为1KBytes,3级tbl8占用3KBytes,而每个tbl24占用64MBytes,所以是红tbl8将会极大程度上节省内存空间,代价是可能有比较多次的内存访问。
解下来我们依次看看LPM6的实现细节:
第一,表象的组成:
- 一个tbl24,有2^24个表项组成,占用64MBytes内存空间
- 若干个tbl8,有2^8个表象组成,每个tbl8占用1KBytes内存空间
/** Tbl entry structure. It is the same for both tbl24 and tbl8 */
struct rte_lpm6_tbl_entry {
uint32_t next_hop: 2