网络入侵检测系统之 Suricata(九)--Storage 实现详解
suricata 针对一些小的线程共享空间采用多种 storage,比如 Host storage,这个数据区就是存储阈值 option 实现时一些共享数据:
代表 1 分钟内命中 5 次后才会产生一个告警,那么时间戳,命中次数就会存储在这个小的加锁的命名空间。加锁因为多个线程会同时对该区域读写,命名意味着可以区分数据区种类。
storage 注册
storage 数据区由注册函数,将需要创建的数据区摘要存储起来,这一步并非真实分配空间。
例如 storag_list->"threshold 20 字节 mallco free"->"test 8 字节 myalloc my free"->... ...
2. host storage
数据区的真实创建需要用到下面的结构体 Host,我理解它是一种钥匙,上电时会预分配一些 host 对象,创建 host 对象时,并非只分配 sizeof(host),而是多分配出若干个 void *,这个数量和注册 storage 数据区一致。后面这个 host 通过偏移 sizeof(host)+id,这样就能找到各个数据区了,每个 host 都会分配自己的数据区,彼此不干扰。因为,Host 对象是加锁的,所以取得 host 时会有 HostGetHostFromHash 和 HostRelease 的操作。
3. Host storage 分配数据区流程
Host 对象负责数据区的读写,它可以调用注册的 malloc 分配 size 的字节数,也可以 set 为其他的数据区指针。
版权声明: 本文为 InfoQ 作者【于顾而言】的原创文章。
原文链接:【http://xie.infoq.cn/article/cb156ded5c454bd320ec0cf1f】。文章转载请联系作者。
评论