Snort之Stream5ProcessTcp()



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();

     }

你可能感兴趣的:(Snort之Stream5ProcessTcp())