简介
Suricata支持多种数据包源:pcap(实时/文件)、nfq、ipfw、mpipe、af-packet、pfring、dag(实时/文件)、napatech。
每种数据包源的支持都对应于一个线程模块(Thread Module),得益于这种其模块化的架构,增加一个新的数据源支持只需要添加一个新的线程模块即可。
这里,我将主要记录最常见的pcap实时数据源的实现细节,包括相关数据结构、运行流程,以及与主框架和其他模块的交互等。
模块注册
TmModuleReceivePcapRegister函数用于实现pcap实时数据源的线程模块的注册,该函数在系统初始化阶段由RegisterAllModules函数所调用。函数内部唯一的工作就是填充TmModule类型的结构体变量:tmm_modules[TMM_RECEIVEPCAP]。下面是各字段的填充内容:
字段 | 填充值 | 含义及用处 |
name | "ReceivePcap" | 线程名字:目前没有看到代码中有对这个变量的使用。 |
ThreadInit | ReceivePcapThreadInit | 初始化函数:在_TmSlotSetFuncAppend中被传递给其所嵌入的slot的SlotThreadInit函数,而该函数将在线程执行函数(如TmThreadsSlotVar)中被调用。 |
Func | NULL | 模块执行函数:对于数据源模块,其执行函数为下面的PktAcqLoop。 |
PktAcqLoop | ReceivePcapLoop | 数据包获取函数:在TmThreadsSlotPktAcqLoop中被调用。 |
ThreadExitPrintStats | ReceivePcapThreadExitStats | 退出打印函数:用于打印模块统计信息,同样被赋给slot对应函数,然后在线程执行函数的退出阶段被调用。 |
ThreadDeinit | NULL | 清理函数:这里设成NULL可能是个BUG,因为存在一个正好用于这个目的却没有被引用过的函数:ReceivePcapThreadDeinit,其中调用pcap_close进行了清理。 |
RegisterTests | NULL | 注册测试函数:用来注册模块内部所编写的单元测试,在单元测试模式下,运行所有测试前将调用TmModuleRegisterTests函数先注册所有线程模块的单元测试函数。 |
cap_flags | SC_CAP_NET_RAW |