线程、槽和模块之间的关系[转]
suricata中tv、slot和tm的关系必须要搞清楚,汇总如下:
tv:ThreadVars类型,线程。
slot:TmSlot类型,槽。
tm:TmModule类型,模块。
下面必须要结合三者的定义,阅读代码的时候也关注下三者关系。
----------------------------------------
线程的定义:
typedef struct ThreadVars_ {
pthread_t t; // 线程id
char *name; // 线程name
char *thread_group_name; // 线程group name
SC_ATOMIC_DECLARE(unsigned short, flags); // 原子声明,不知道作用,暂且不管
uint8_t aof; // 线程遇到故障时怎么做
uint8_t type; // 线程类型,例如:TVT_PPT, TVT_MGMT
uint8_t restarted; // 线程重新启动失败的次数
Tmq *inq;
Tmq *outq;
void *outctx;
char *outqh_name
struct Packet_ * (*tmqh_in)(struct ThreadVars_ *);
void (*InShutdownHandler)(struct ThreadVars_ *);
void (*tmqh_out)(struct ThreadVars_ *, struct Packet_ *);
void *(*tm_func)(void *);
struct TmSlot_ *tm_slots;
uint8_t thread_setup_flags;
uint16_t cpu_affinity;
int thread_priority; // 线程优先级
SCPerfContext sc_perf_pctx;
SCPerfCounterArray *sc_perf_pca;
SCMutex *m;
SCCondT *cond;
uint8_t cap_flags;
struct ThreadVars_ *next;
struct ThreadVars_ *prev;
} ThreadVars;
-----------------------------------------
槽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;
-------------------------------------------------
模块定义:
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;
===============================================
将三者的定义放在一起目的是方便查看,其中部分变量目前还不清楚具体含义,日后补充。
三者之间关系如下图所示:
虽然上图画的比较山寨,但应该可以清楚的说明三者之间的关系了,每一个线程都包含一个slot的链表,每个slot结点都悬挂着不同的模块,程序执行的时候会遍历slot链表,按照加入链表的顺序执行模块。
---------------------------------->人生犹如负重致远,不可急于求成。
自律使人自由!