68 lines
1.7 KiB
C++
68 lines
1.7 KiB
C++
|
|
|
|
|
|
|
|
|
|
|
|
//syn包开始回调
|
|
extern "C" char kni_tcpall_entry(const struct streaminfo* pstream, void** pme, int thread_seq, const void* a_packet){
|
|
//当前包bypass, 剩下包bypass
|
|
char ret = APP_STATE_FAWPKT|APP_STATE_DROPME;
|
|
struct kni_ipv6_hdr* ipv6_hdr = NULL;
|
|
struct kni_pme_info *pmeinfo = *(struct kni_pme_info **)pme;
|
|
if(pstream->addr.addrtype==ADDR_TYPE_IPV6){
|
|
ipv6_hdr = (struct kni_ipv6_hdr*)a_packet;
|
|
if((a_packet != NULL) && (ipv6_hdr->ip6_nex_hdr != NEXTHDR_TCP)){
|
|
kni_filestate2_set(thread_seq,FS_DROP_IPV6OPT,0,1);
|
|
return ret;
|
|
}
|
|
}
|
|
switch(pstream->pktstate){
|
|
case OP_STATE_PENDING:
|
|
kni_filestate2_set(thread_seq,FS_PENDING,0,1);
|
|
kni_filestate2_set(thread_seq,FS_PMENUM,0,1);
|
|
*pme=pmeinfo=kni_pmeinfo_new();
|
|
ret=kni_pending_opstate(pstream, pmeinfo, thread_seq, a_packet, PROTO_TYPE_TCP);
|
|
break;
|
|
|
|
case OP_STATE_DATA:
|
|
ret=kni_data_opstate(pstream, pmeinfo, thread_seq,a_packet, PROTO_TYPE_TCP);
|
|
break;
|
|
|
|
case OP_STATE_CLOSE:
|
|
if(a_packet == NULL)
|
|
{
|
|
kni_filestate2_set(thread_seq,FS_CLOSE_TIMEOUT,0,1);
|
|
}
|
|
else
|
|
{
|
|
kni_filestate2_set(thread_seq,FS_CLOSE_FIN,0,1);
|
|
}
|
|
|
|
ret=kni_close_opstate(pstream,(struct kni_pme_info*)*pme,thread_seq,a_packet,PROTO_TYPE_TCP);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if((ret&APP_STATE_DROPME)&& pmeinfo!=NULL)
|
|
{
|
|
kni_filestate2_set(thread_seq,FS_PMENUM,0,-1);
|
|
kni_free_pmeinfo(pmeinfo);
|
|
*pme=NULL;
|
|
|
|
if(pstream->pktstate != OP_STATE_CLOSE)
|
|
{
|
|
kni_filestate2_set(thread_seq,FS_CLOSE_DROPME,0,1);
|
|
}
|
|
}
|
|
|
|
clock_gettime(CLOCK_MONOTONIC, &end);
|
|
|
|
elapse=(end.tv_sec-start.tv_sec)*1000000+(end.tv_nsec-start.tv_nsec)/1000;
|
|
FS_operate(g_kni_fs2_info.handler, g_kni_fs2_info.metric_sapp_proc, 0, FS_OP_SET, elapse);
|
|
|
|
return ret;
|
|
|
|
} |