int Stream5ProcessTcp(Packet *p,Stream5LWSession *lwssn,
Stream5TcpPolicy*s5TcpPolicy, SessionKey *skey)
Packet *p 新抓到的包
Stream5LWSession *lwssn包所在的流
Stream5TcpPolicy *s5TcpPolicy流的规则参数,如最大字节数,段数,超时时间
SessionKey *skey流的键值
如果流存在,但是标志位(SSNFLAG_DROP_CLIENT|SSNFLAG_DROP_SERVER),则丢弃该包;
如果规则不存在,则为流建立规则;
//segment 1,流的建立
如果流为空
{
如果规则为三次握手
{
如果(有SYN标志,没有ACK标志)
{
建立新的lwssn
}
else
{
判断是否超时,没有超时则进入标志midstream_pickup_allowed:
超时了,就丢弃该包;
}
}
else //此处流还是空的
midstream_pickup_allowed:
{
如果(有SYN,和ACK),就建立流;
如果(包的数据 > 0), 就建立流;
如果(有TF_WSCALE标志,,SYN),就建立流;
其他情况不做处理
}
如果到此处流没建立,该包的处理就退出该函数;
}
else
{
有流存在,只打印一下log,流后续接下来会处理
}
//segment 2,流的处理
如果流的状态为超时,或者该包的时间戳大于流的超时时间
{
如果流的状态,SSNFLAG_RESET
{
清空该流,进行命中处理
ProcessTcp();
}
else其他情况
{
清空该流,进行命中处理
ProcessTcp()
}
}
else//
{
ProcessTcp();
}