这篇文章是流新建的补充,主要是流新建过程也会检查流的超时时间,如果超时的话对这些超时的流也会进行处理,下边梳理一下这个地方对超时流的处理流程。
1. MoveToWorkQueue 函数
FlowHandlePacket-》FlowGetFlowFromHash-》MoveToWorkQueue
if (timedout) {
FromHashLockTO(f);//FLOWLOCK_WRLOCK(f);
if (f->use_cnt == 0) {
next_f = f->next;
MoveToWorkQueue(tv, fls, fb, f, prev_f);
/* flow stays locked, ownership xfer'd to MoveToWorkQueue */
goto flow_removed;
}
对于新建流的过程中检查到的超时流,看上述代码,会调用函数MoveToWorkQueue进行处理,这个函数根据协议和flow是否属于当前线程对flow进行了不同的处理。
static inline void MoveToWorkQueue(ThreadVars *tv, FlowLookupStruct *fls,
FlowBucket *fb, Flow *f, Flow *prev_f)
{
//首先设置flow终止标志,表示由于超时而终止
f->flow_end_flags |= FLOW_END_FLAG_TIMEOUT;
/* remove from hash... */
//这两个if内的语句