l3fwd整个程序的逻辑并不十分复杂,而且网上也有许多讲解的文章,对于大部分人来说,要看懂并不难。不过,在程序exact match部分的逻辑中,涉及到了获取数据包5元组的操作,这个操作的具体实现在源码中只有短短的几行,而且涉及到了一些一般人平时相对较少接触到的知识,想要看懂并不是一件容易的事情。因而,本文将带你详细分析源码,彻底搞懂获取数据包5元组的实现逻辑!
1.前言
在进行源码分析之前,先做几点说明:
- 后面涉及的内容建立在你已经阅读过l3fwd源码并理解l3fwd的整体程序逻辑基础之上,如果你还没不理解l3fwd代码的整体逻辑的话,建议先搞懂整体的程序逻辑,再回来看这篇文章,理解实现细节。
- 源码分析以ipv4为例,ipv6的分析十分类似,留给读者做为练习自行分析。
2.源码分析
Step 1:定位程序中获取5元组逻辑的位置,位于函数em_get_ipv4_dst_port()中:
根据注释,可以发现,调用函数em_mask_key()后,即获得了我们需要的5元组,所以,我们首先进入em_mask_key()函数看看这个函数做了些什么