//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; }