suricata针对一些小的线程共享空间采用多种storage,比如Host storage,这个数据区就是存储阈值option实现时一些共享数据:
threshold option-> type threshold , track by_dst, count 5, seconds 60
代表1分钟内命中5次后才会产生一个告警,那么时间戳,命中次数就会存储在这个小的加锁的命名空间。加锁因为多个线程会同时对该区域读写,命名意味着可以区分数据区种类。
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为其他的数据区指针。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。