Worker Mode线程调度
我们NIDS系统雏形版本目前采用的single模式,即Start One thread with each thread doing all the work,这里的实现可以类比suricata PCAP_FILE_DEV 模式,读取pcap文件并将其封装在Packet结构中,各个模块都靠packet结构传递,然后依次进行解码,重组,检测,解析,输出日志。
我们后续只需要将读取pcap的代码修改一下,对接dpdk的报文收发队列即可。
- suricata会根据命令行参数 ./suricata -r http.pcap --runmode single,得到当前激活的运行模式为RUNMODE_PCAP_file, "single"
- RunModeDispatch(),初始化运行模式,通过RUNMODE_PCAP_file, "single"可以得到对应RunMode中的RunModeFunc,进入当前运行模式的初始化函数RunModeFilePcapSingle()
- 从配置树中得到"pcap-file.file",pcap文件路径,然后会设置一些参数,包括线程是否绑核,检测线程较CPU核数的比率
- single worker模式下无需创建队列,只设置了上一级和下一级队列的处理函数(handler->TmqhInputPacketpool+TmqhOutputPacketpool),以及功能模块插槽(slots->TmThreadsSlotPktAcqLoop)
- 线程创建完毕后会注册到线程池中统一管理,并标识该线程local id
- 线程启动,依次执行线程插槽中各个模块的初始化函数,并为flowworker模块额外分配一个flow queue和packet queue,分配完毕后,依次执行线程处理函数PktAcqLoop或Fuc
ReceivePcapFile TMmodule
从packetpool中获取一个空的报文描述符,然后读取一个目录或单个文件,然后填充报文描述符
DecodePcapFile TMmodule
解码报文,分片重组,解码ip层,mac层,tcp/udp等,填充报文描述符
FlowWorker TMmodule
StreamTCP:跟踪维护tcp流,重组tcp报文
检测引擎匹配
日志输出
流程图如下