suricata 3.1 源码分析18 (模块注册及初始化)
来源:互联网 发布:自我评价设计专业知乎 编辑:程序博客网 时间:2024/05/16 19:42
|Suricata支持多种数据包源:pcap(实时/文件)、nfq、ipfw、mpipe、af-packet、pfring、dag(实时/文件)、napatech。
每种数据包源的支持都对应于一个线程模块(Thread Module),得益于这种其模块化的架构,增加一个新的数据源支持只需要添加一个新的线程模块即可。
这里,我将主要记录最常见的pcap实时数据源的实现细节,包括相关数据结构、运行流程,以及与主框架和其他模块的交互等。
模块注册
TmModuleReceivePcapRegister函数用于实现pcap实时数据源的线程模块的注册,该函数在系统初始化阶段由RegisterAllModules函数所调用。函数内部唯一的工作就是填充TmModule类型的结构体变量:tmm_modules[TMM_RECEIVEPCAP]。下面是各字段的填充内容:
模块初始化
如上表所示,模块初始化由ReceivePcapThreadInit函数完成,其函数原型为:
TmEcode ReceivePcapThreadInit(ThreadVars *tv, void *initdata, void **data)
其中,tv参数对应该模块所嵌入的线程的ThreadVars,在使用某些与线程相关的函数时需要使用。
initdata参数是模块的初始化数据,在使用TmSlotSetFuncAppend向线程中嵌入模块时传入。对于这个模块,其初始数据是一个PcapIfaceConfig类型的结构体指针,而这个结构体是由运行模式(对应于这个模块的运行模式类型为RUNMODE_PCAP_DEV)初始化函数(例如如RunModeIdsPcapAutoFp)中的ParsePcapConfig通过查询配置节点树下的pcap节点信息所填充的。具体的一些重要配置信息包括:
最后一个data参数,是该初始化函数的结果输出。函数内部会新建一个PcapThreadVars结构体,作为本模块的内部上下文,其中部分字段是直接copy的PcapIfaceConfig,另一些重要字段包括:
在初始化函数返回时,填充好的PcapThreadVars结构体便传递给了包含该模块的slot的slot_data字段,该字段将做为参数传入后续的模块函数。
- suricata 3.1 源码分析18 (模块注册及初始化)
- suricata 3.1 源码分析23 (数据包解码模块注册及初始化)
- suricata 3.1 源码分析13 (流初始化)
- suricata 3.1 源码分析24 (数据包解码模块执行)
- suricata 3.1 源码分析31 (RespondReject)
- suricata 3.1 源码分析1
- suricata 3.1 源码分析2
- suricata 3.1 源码分析3
- suricata 3.1 源码分析4
- suricata 3.1 源码分析5
- suricata 3.1 源码分析6
- suricata 3.1 源码分析7
- suricata 3.1 源码分析8
- suricata 3.1 源码分析9
- suricata 3.1 源码分析10
- suricata 3.1 源码分析11
- suricata 3.1 源码分析12
- [Suricata-0] Suricata源码分析之IpsNFQ模式(1)
- 设计模式【2】:策略模式
- ubuntu 环境变量配置之后导致系统重启一直闪屏
- 一些常用的算法记录
- Python笔记——Unicode与16进制字符串相互转换
- 【Java】冒泡排序
- suricata 3.1 源码分析18 (模块注册及初始化)
- Python 学习笔记
- tp中 <include file="Public:header"/>
- HashMap简介
- javascript 编程(1)【小于整数m的带0,1的数字个数】
- sweet-alert-dialog在在android studio应用问题说明
- RabbitMQ使用
- 图像检索:基于内容的图像检索技术
- 开发工具问题笔记-运行android工程时出现Unsupported major.minor version 52.0错误