suricata的模块和插槽

摘要:
void(*ThreadExitPrintStats)(ThreadVars*,Packet*,TmEcode(*Init)(void);无效(*注册测试)(无效);uint8_ tcap_标志;无效**);//模块初始化执行函数void(*SlotThreadExitPrintStats)(ThreadVars*,void*);slot_data);

参考资料

suricata官方文档https://suricata.readthedocs.io/en/latest/performance/runmodes.html#different-runmodes

suricata的源代码https://blog.csdn.net/shenwansangz/article/details/37900875?utm_medium=distribute.pc_relevant.none-task-blog-utm_term-3&spm=1001.2101.3001.4242

suricata的总体架构https://www.cnblogs.com/zlslch/p/7382176.html

suricata数据结构https://blog.csdn.net/gengzhikui1992/article/details/103031874?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param

原理

suricata是基于模块(TMmoudle)的,所谓模块是suricata中的数据结构:

typedef struct TmModule_ {
    char *name;          // 模块名称
    TmEcode (*ThreadInit)(ThreadVars *, void *, void **);
    void (*ThreadExitPrintStats)(ThreadVars *, void *);
    TmEcode (*ThreadDeinit)(ThreadVars *, void *);
    TmEcode (*Func)(ThreadVars *, Packet *, void *, PacketQueue *, PacketQueue *);
    TmEcode (*PktAcqLoop)(ThreadVars *, void *, void *);
    TmEcode (*Init)(void);
    TmEcode (*DeInit)(void);
    void (*RegisterTests)(void);
    uint8_t cap_flags;  
    uint8_t flags;
} TmModule;

每个模块代表一个特定的功能。
例如获取报文、解码报文、检测报文、记录日志这四个模块。
前一个模块的输出是后一个模块的输入,它们各自拥有一个线程。多线程是suricata具有较高性能的保证。
在这里插入图片描述
模块和模块之间的联系通过suricata中的插槽(slot)这一数据结构相连。

typedef struct TmSlot_ {

    ThreadVars *tv;                       // 拥有该slot的线程
    SC_ATOMIC_DECLARE(TmSlotFunc, SlotFunc);// 函数指针
    TmEcode (*PktAcqLoop)(ThreadVars *, void *, void *);      // 模块数据包获取函数
    TmEcode (*SlotThreadInit)(ThreadVars *, void *, void **); // 模块初始化执行函数
    void (*SlotThreadExitPrintStats)(ThreadVars *, void *);   // 模块退出打印函数
    TmEcode (*SlotThreadDeinit)(ThreadVars *, void *);        // 模块清理执行函数
    void *slot_initdata;  // 数据存储
    SC_ATOMIC_DECLARE(void *, slot_data);
    PacketQueue slot_pre_pq;
    PacketQueue slot_post_pq;
    int tm_id;  // tm ID
    int id;     // slot ID
    struct TmSlot_ *slot_next;
} TmSlot;

每个线程运行一个slot对象,slot负责管理其上的模块。包括该模块的初始化,以及对模块数据包的获取和模块的退出和清理。
数据从一个模块到另一个模块是通过slot结构体中的 struct TmSlot_* 指针指向下一个slot,并将数据包输入至下一个slot管理的TmModule上。
在这里插入图片描述
图中有3个插槽,每个插槽各有一个模块,3个插槽各自启动了一个线程。类似生产者和消费者原理,模块i是模块i-1的消费者,模块i-1是模块i的生产者。使用模块-插槽结构的好处是便于添加中间组件对数据包进行处理。同时模块化也便于利用多线程。

suricata的模块需要被注册,注册函数名为 TmModuleXXXRegister(void),模块被注册后便被存入全局数组 TmModule tmm_modules[TMM_SIZE]中。该数组使用了枚举-索引方式。用枚举的方式对数组每个位命名。

typedef enum{
TMM_DECODEDFQ,
TMM_XXXX
};

枚举数正好对应TMM数组的index。

运行模式(run-mode)

在suricata中,线程,模块和队列排列在一起的方式称作运行方式。

suricata如何封包捕获?

suricata中的AF_PACKET和PF_RING方法可以捕获数据包。

免责声明:文章转载自《suricata的模块和插槽》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇LeetCode刷题--20.有效的括号(简单)MAC下MAMP安装php扩展教程记录下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python源码剖析之编译Python

在剖析源码的过程中,最好的学习方法是不断根据掌握的知识修改Python源代码,以印证自己的知识和猜想。 一、Python总体架构   在最高的层次上,Python的整体架构可以分为三个主要部分,如上图,左边的Core Modules(内置模块)、Library(库)以及User-defined Modules(用户自定义模块)。   在图的右边,是Pyt...

Python3常用标准库

趁着有时间,把一些我用过的常用标准库进行整理和复习。 time 用法 说明 time.time() 返回时间戳(从1970年1月1日00:00:00开始计算) time.localtime() 返回当前时间的结构化时间(struct_time)对象,可以用.tm_year等获取年等数据 time.gmtime() 返回世界标准时间的结构化...

STM32 LED闪烁 初学笔记

LED的硬件电路 我的电路: LED 共阴极指的是LED共同的接点是GND(接地),而共阳极指的是LED共同的接点是电源。LED亮灯的条件是两端有电势差。 1.共阴极: 当LED另一端接入5V电源的时候,与另一端产生电势差因此会有电流从正极流到GND,最后会亮灯 当LED另一端接入0V的时候,则不会产生电势差也就不会亮灯。 优点是符合人类的正向思维,送...

Commit Monitor–svn监控工具

SVN更改通知的工具,在这里分享给大家。 自己负责的模块代码有时被同事修改,但是没有知会,也不容易了解到具体的改动内容,可能造成各种各样的问题。这里推荐一个工具Commit Monitor,可以监控svn仓库的提交记录,并及时通知,非常方便。一切尽在掌握。 下载地址,开源软件,可以放心~ http://code.google.com/p/commitmon...

MyEclipse的多模块Maven web(ssm框架整合)

  Maven的多模块可以让项目结构更明确,提高功能的内聚,降低项目的耦合度,真正的体现出分层这一概念。   我们在操作中,要明白为什么这样做,要了解到更深的层次,这样,我们就不限于个别软件了。   话不多说,直入主题:   如果对Maven还不够熟悉,请看该博客:Maven基础   整个项目做完之后的结构是这样的:         在开始之前我放出这两张...

IDEA中导入多个包自动合并为星号

  IDEA中导入同一个包下的几个class会自动合并为星号,如下图。可以通过设置让其不自动合并为星号。 1、选择File→Settings→Editor→Code style→Java,再点击右边的Imports,将Class count to use import with '*'的数量调高即可。 还可以设置一些规则: Names count to...