将DPDK移植到snort上的DAQ
来源:互联网 发布:潘石屹 三段婚姻 知乎 编辑:程序博客网 时间:2024/06/05 06:39
DAQ 与Snort
在snort-daq中,daq的控制流程是这样的。
如上所述,Snort在初始化的时候载入了daq。这个时候snort的所调用的api是daq_load_modules
。也就是说,这个时候在主线程没有启动网卡,初始化实例的操作。
在初始化整个snort之后(载入配置,载入daq及其他各个模块等等)。snort就进入了分析的阶段了。这个阶段的主角是 pig
,或者说更本质的,是pig
下的analyzer
。
Snort下面开n个pig
线程。pig
线程下面调用analyzer
来进行包解析。
包解析的过程中是在pig
线程中多线程并行进行的。每一个analyzer
下面都初始化一个daq instance
并调用acquire
进行抓包并分析。每一个daq instance
下面都有一个或多个网卡来获取数据。因为目的主要是介绍daq,所以怎么解析就不提了。
从上图和上面的介绍就可以看得出来,一个snort下面有多个daq instance
并行运行。每一个daq instance
都会进行初始化操作,占用系统资源,获取网卡,抓包,调用callback
,之间相互独立。并且是单线程的。
DAQ与DPDK
如上面所介绍的。DAQ在设计的时候是单线程的。在本身的实现的几个模块中(Netmap,pcap等等)完全没有涉及到多线程的事情。在snort中的调用也是单线程并行调用的,相互之间各不影响。而Inter的DPDK在多线程方面则有限制。它所初始化的EAL
层只能初始化一次。一个程序中只能运行一个dpdk主程序。所以就没有办法在snort中使用多线程。因为如果在snort中使用了多线程。那么实际上每个线程都会去尝试初始化dpdk的EAL
。那么就会出错,导致最后只有一个线程能够成功初始化并启动。
所以如果要想实现一个支持snort多线程的daq。就需要修改daq中api的逻辑。
在实现中,利用线程id来绑定网卡。
在daq的content中加入了一个nic
-threadid
的映射表。然后每个网卡都有一个独立的instance
存储原本在daq_content
中的信息。然后在线程调用daq相关函数的时候,都会先利用threadid来进行检索这个instance
进行操作。通过这个方法就能够将dpdk中的各个网卡独立运行。
Github地址
daq_dpdk
基于的是dpdk16.04
, daq2.1.0
,snort 3.0 a04
.
使用方法在项目主页中。
- 将DPDK移植到snort上的DAQ
- Snort的TILE64移植
- Snort的TILE64移植
- 将STemWin移植到在STM32F103RCT6上的FreeRTOS上
- 如何将自己编译的系统移植到G1上
- 将J2ME游戏移植到OPhone上的指导
- 将Launcher3移植到车载上遇到的问题
- 将DHT11移植到Linux系统上的一些问题
- 将directFB移植到Android系统上
- 将directFB移植到Android系统上
- 将boa移植到Android平台上
- 将Android移植到ODroid上
- 将Win32程序移植到Linux上
- 将SQLite移植到ARM上
- 将LMbench移植到Android上
- 将Android移植到ODroid上
- 将SQLite移植到ARM上
- 将SQLite移植到ARM板上
- Comet4jHelloWorld 带参数变动查询
- ubuntu 打开eclipse出现A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be ... 解决方法
- CentOS 7.2 安装PostgreSQL 9.5.2
- android shape的使用
- 支持向量机系列三:Kernel
- 将DPDK移植到snort上的DAQ
- 开发应该做好自测
- 多重部分和问题
- 对CompletionService封装,实现快速处理业务任务并汇总结果
- 支持向量机系列四:Outliers
- 单调递增最长子序列
- MongoDB权限管理之用户名和密码的操作
- 结构体内存对齐的补充说明与总结
- HDU 5795 A Simple Nim SG函数打表找规律