《suricata中DPDK收发包线程模型和配置说明》中已经对收发包模型和和相关配置进行了说明,今天我们来分析一下DPDK收发包框架的源码。
跟其它方式收包一样,DPDK的收包也是增加了runmode-dpdk.c和source-dpdk.c两个文件:
1) runmode-dpdk.c在RunModeRegisterRunModes()函数中调用RunModeDpdkRegister()来注册DPDK的收包模式,大部分代码都是对DPDK的配置项读取和DPDK收包参数的配置。
2)source-dpdk.c在RegisterAllModules()函数中调用TmModuleReceiveDPDKRegister()和TmModuleDecodeDPDKRegister()来注册DPDK对应的收包和解码两个module,大部分代码是对这两个module提供的API函数的实现,包括收包前的初始化和收取报文,解码前的初始化和报文解码。
下面我们来看一下比较关键的部分代码,上面提到的DPDK注册收包模式和两个Module的函数调用栈如下,都是在main函数中初始化的时候注册的,另外还有从配置中读取DPDK配置相关的pcie地址。
初始化代码函数调用栈如下:
main
-->SuricataMain
-->InitGlobal
-->RunModeRegisterRunModes
-->RunModeDpdkRegister(注册了RunModeIdsDpdkWorkers和DPDKRunModeEnableIPS两个回调函数)
-->ParseInterfacesList
-->LiveBuildDeviceList
-->LiveBuildDeviceListCustom
-->LiveRegisterDeviceName(读取所有DPDK配置的pcie地址接口,放到pre_live_devices链表中)
-->PostConfLoadedSetup
-->LiveDeviceFinalize
-->LiveRegisterDevice(遍历pre_live_devices链表,读取pcie地址到live_devices链表中,后续提供网口pcie相关的函数都是从live_devices链表获取,比如LiveGetDeviceCount)
-->RegisterAllModules
-->TmModuleReceiveDPDKRegister
-->TmModuleDecodeDPDKRegister
RunModeDpdkRegister注册提供了RunModeIdsDpdkWorkers和DPDKRunModeEnableIPS两个回调函数,全局运行模式变量static RunModes runmodes[RUNMODE_USER_MAX]中的RunModeFunc和RunModeIsIPSEnabled函数指针分别指向这两个回调。这两个函数最终调用的函数栈如下:
main
-->SuricataMain
-->PostConfLoadedSetup
-->RunModeEngineIsIPS
-->DPDKRunModeEnableIPS(确认当前是不是IPS模式,默认是IDS)