这篇文章主要对流表初始化用到的主要函数进行注释。
首先说明一下流管理线程的启动:
流管理线程创建,每个管理线程都可以启动多个,默认各启动一个。
老化线程:main-》SuricataMain-》RunModeDispatch-》FlowManagerThreadSpawn
回收线程:main-》SuricataMain-》RunModeDispatch-》FlowRecyclerThreadSpawn
1. FlowInitConfig函数,其实这个函数比较简单,没有多少注释
/** \brief initialize the configuration
* \warning Not thread safe */
void FlowInitConfig(char quiet)
{
SCLogDebug("initializing flow engine...");
memset(&flow_config, 0, sizeof(flow_config));
SC_ATOMIC_INIT(flow_flags); //流的状态的一些标志,比如进入紧急模式会设置紧急标志FLOW_EMERGENCY
SC_ATOMIC_INIT(flow_memuse); //flow占用的内存bytes
SC_ATOMIC_INIT(flow_prune_idx); //获取flow时,当空闲flow用尽,且flow内存到达上限时,就会调用FlowGetUsed从全局变量flow_hash中的bucket上找一个引用计数为0的flow(不考虑是否超时),这个变量决定从哪个bucket上查找这个flow,这个变量的值每次加5。
SC_ATOMIC_INIT(flow_config.memcap);//flow的内存使用上限
FlowQueueInit(&flow_recycle_q); //就一个memset
/* set defaults */
flow_config.hash_rand = (uint32_t)RandomGet();
flow_config.hash_size = FLOW_DEFAULT_HASHSIZE; //预分配flow bucket的总个数
flow_config.prealloc = FLOW_DEFAULT_PREALLOC; //预分配flow总个数
SC_ATOMIC_SET(flow_config.memcap, FLOW_DEFAULT_MEMCAP);//定义成原