diff options
| author | 郑超 <[email protected]> | 2019-01-26 12:41:29 +0800 |
|---|---|---|
| committer | 郑超 <[email protected]> | 2019-01-26 12:41:29 +0800 |
| commit | 4fd98e58765981cf6582646484eec5115763cee0 (patch) | |
| tree | a6273d0acb5d90dfdc7cfcb9eb30f4e9c1630e68 | |
| parent | 09915767df04668a26a7303c34d85c9c0d228acd (diff) | |
| parent | b2b0184d8579df0f757d3ed98660bd20f3a79a5d (diff) | |
Merge branch 'bugfix-del-htable-error' into 'master'
Bugfix del htable error
See merge request tango/kni!2
| -rw-r--r-- | kni_comm.c | 6 | ||||
| -rw-r--r-- | kni_comm.h | 4 | ||||
| -rw-r--r-- | kni_entry.c | 45 | ||||
| -rw-r--r-- | kni_entry.h | 3 | ||||
| -rw-r--r-- | kni_intercept.c | 10 |
5 files changed, 37 insertions, 31 deletions
@@ -59,7 +59,7 @@ char* kni_memncasemem(const char *strsrc,int len1,const char *substr,int len2) -int kni_log_info(char* module,const struct layer_addr* addr,unsigned short protocol,char* domain,char* scan_result,char* action,struct kni_pme_info* pmeinfo) +int kni_log_info(const char* module,const struct layer_addr* addr,unsigned short protocol,char* domain,char* scan_result,char* action,struct kni_pme_info* pmeinfo) { unsigned short sport=0; unsigned short dport=0; @@ -113,7 +113,7 @@ int kni_log_info(char* module,const struct layer_addr* addr,unsigned short proto -int kni_log_debug(int level,char* module,const void* a_packet,const char* format,...) +int kni_log_debug(int level, const char* module,const void* a_packet,const char* format,...) { if(level<g_kni_comminfo.logger_level) { @@ -199,7 +199,7 @@ int kni_log_debug(int level,char* module,const void* a_packet,const char* format -int kni_log_debug_bak(int level,char* module,const void* a_packet,char* content) +int kni_log_debug_bak(int level,const char* module,const void* a_packet,char* content) { unsigned short sport=0; unsigned short dport=0; @@ -82,8 +82,8 @@ struct kni_fs2_info -int kni_log_info(char* module,const struct layer_addr* addr,unsigned short protocol,char* domain,char* scan_result,char* action,struct kni_pme_info* pmeinfo); -int kni_log_debug(int level,char* module,const void* a_packet,const char * format,...); +int kni_log_info(const char* module,const struct layer_addr* addr,unsigned short protocol,char* domain,char* scan_result,char* action,struct kni_pme_info* pmeinfo); +int kni_log_debug(int level, const char* module,const void* a_packet,const char * format,...); int kni_get_ipaddr_v4(void* a_packet,struct stream_tuple4_v4* ipaddr); int kni_get_ipaddr_v6(void* a_packet,struct stream_tuple4_v6* ipaddr); diff --git a/kni_entry.c b/kni_entry.c index 2c2d948..ee2ce92 100644 --- a/kni_entry.c +++ b/kni_entry.c @@ -24,19 +24,17 @@ char g_kni_cardname[KNI_CARD_NUM][KNI_CONF_MAXLEN]; int g_kni_threadseq[KNI_MAX_THREADNUM]; -int kni_init_pmeinfo(void** pme) +struct kni_pme_info* kni_pmeinfo_new(void) { struct kni_pme_info* pmeinfo=ALLOC(struct kni_pme_info, 1); pmeinfo->tun_index = -1; - *pme=pmeinfo; - return 0; + return pmeinfo; } -int kni_free_pmeinfo(void** pme) +int kni_free_pmeinfo(struct kni_pme_info* pmeinfo) { - struct kni_pme_info* pmeinfo=(struct kni_pme_info*)*pme; Maat_clean_status(&(pmeinfo->mid)); free(pmeinfo); @@ -243,14 +241,14 @@ int kni_htable_add(const struct streaminfo* pstream,const void* a_packet,struct ret = MESA_htable_add(g_kni_structinfo.htable_to_tun_v4,(unsigned char*)&(pmeinfo->ipv4_addr),sizeof(struct stream_tuple4_v4),(void*)datainfo); if(ret == MESA_HTABLE_RET_DUP_ITEM) { - kni_log_debug(RLOG_LV_FATAL,(char*)"kni_htable_add dup",a_packet,"-5"); + kni_log_debug(RLOG_LV_FATAL, "kni_htable_add dup",a_packet,"-5"); free(datainfo); datainfo=NULL; return -1; } else if(ret < 0) { - kni_log_debug(RLOG_LV_FATAL,(char*)"kni_htable_add",a_packet,"IPv4 MESA_htable_add() error,ret:%d",ret); + kni_log_debug(RLOG_LV_FATAL, "kni_htable_add",a_packet,"IPv4 MESA_htable_add() error,ret:%d",ret); free(datainfo); datainfo=NULL; return -1; @@ -699,6 +697,10 @@ char kni_first_tcpdata(const struct streaminfo* pstream,const void* a_packet,str MESA_handle_runtime_log(g_kni_comminfo.logger,RLOG_LV_INFO,"tcp_repair_process","tcp_repair_process() error!"); return ret; } + else + { + pmeinfo->is_tcp_repaired=1; + } clock_gettime(CLOCK_MONOTONIC, &end); @@ -959,7 +961,7 @@ char kni_close_opstate(const struct streaminfo* pstream,struct kni_pme_info* pme ret=kni_data_opstate(pstream,pmeinfo,thread_seq,a_packet,protocol); } //del htable - if(pmeinfo->action==KNI_ACTION_MONITOR) + if(pmeinfo->action==KNI_ACTION_MONITOR&&pmeinfo->is_tcp_repaired==1) { kni_htable_del(pstream,pmeinfo,a_packet); } @@ -975,6 +977,7 @@ extern "C" char kni_udp_entry(const struct streaminfo* pstream,void** pme,int th { 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((g_kni_switch_info.replace_switch == 0) && (g_kni_switch_info.ratelimit_switch == 0)) { @@ -997,28 +1000,27 @@ extern "C" char kni_udp_entry(const struct streaminfo* pstream,void** pme,int th switch(pstream->opstate) { case OP_STATE_PENDING: - kni_init_pmeinfo(pme); - ret=kni_pending_opstate(pstream,(struct kni_pme_info*)*pme,thread_seq,a_packet,PROTO_TYPE_UDP); + *pme=pmeinfo=kni_pmeinfo_new(); + ret=kni_pending_opstate(pstream, pmeinfo, thread_seq, a_packet, PROTO_TYPE_UDP); break; case OP_STATE_DATA: - ret=kni_data_opstate(pstream,(struct kni_pme_info*)*pme,thread_seq,a_packet,PROTO_TYPE_UDP); + ret=kni_data_opstate(pstream, pmeinfo, thread_seq, a_packet, PROTO_TYPE_UDP); break; case OP_STATE_CLOSE: - ret=kni_close_opstate(pstream,(struct kni_pme_info*)*pme,thread_seq,a_packet,PROTO_TYPE_UDP); + ret=kni_close_opstate(pstream, pmeinfo, thread_seq, a_packet, PROTO_TYPE_UDP); break; default: break; } - if((ret&APP_STATE_DROPME)&&(*pme!=NULL)) + if((ret&APP_STATE_DROPME)&& pmeinfo!=NULL) { - kni_free_pmeinfo(pme); - *pme=NULL; + kni_free_pmeinfo(pmeinfo); } - + *pme=NULL; return ret; } @@ -1028,6 +1030,7 @@ extern "C" char kni_tcpall_entry(const struct streaminfo* pstream,void** pme,int { 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; struct timespec start, end; @@ -1059,12 +1062,12 @@ extern "C" char kni_tcpall_entry(const struct streaminfo* pstream,void** pme,int case OP_STATE_PENDING: kni_filestate2_set(thread_seq,FS_PENDING,0,1); kni_filestate2_set(thread_seq,FS_PMENUM,0,1); - kni_init_pmeinfo(pme); - ret=kni_pending_opstate(pstream,(struct kni_pme_info*)*pme,thread_seq,a_packet,PROTO_TYPE_TCP); + *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,(struct kni_pme_info*)*pme,thread_seq,a_packet,PROTO_TYPE_TCP); + ret=kni_data_opstate(pstream, pmeinfo, thread_seq,a_packet, PROTO_TYPE_TCP); break; case OP_STATE_CLOSE: @@ -1084,10 +1087,10 @@ extern "C" char kni_tcpall_entry(const struct streaminfo* pstream,void** pme,int break; } - if((ret&APP_STATE_DROPME)&&(*pme!=NULL)) + if((ret&APP_STATE_DROPME)&& pmeinfo!=NULL) { kni_filestate2_set(thread_seq,FS_PMENUM,0,-1); - kni_free_pmeinfo(pme); + kni_free_pmeinfo(pmeinfo); *pme=NULL; if(pstream->pktstate != OP_STATE_CLOSE) diff --git a/kni_entry.h b/kni_entry.h index d05fc37..4e2cbdb 100644 --- a/kni_entry.h +++ b/kni_entry.h @@ -126,7 +126,7 @@ //lqueue info -#define KNI_THREAD_SAFE 1 +#define KNI_THREAD_SAFE 16 #define KNI_USLEEP_TIME 10 #define KNI_LQUEUE_MAXNUM 100000 @@ -356,6 +356,7 @@ struct kni_pme_info //test int tun_index; //end + int is_tcp_repaired; int action; int cfg_id; int keyring_id; diff --git a/kni_intercept.c b/kni_intercept.c index 11cee23..38d29e8 100644 --- a/kni_intercept.c +++ b/kni_intercept.c @@ -351,7 +351,7 @@ int tun_alloc_mq(char *dev, int queues, int *fds,char* tun_path) tun_error(i,fds); return -1; } - +/* //20180618 add set noblock flag= fcntl(fd, F_GETFL, 0); if(flag<0) @@ -363,7 +363,7 @@ int tun_alloc_mq(char *dev, int queues, int *fds,char* tun_path) { MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_INIT,"fcntl():setfl error,errno is:%d,%s",errno,strerror(errno)); } - +*/ //end fds[i] = fd; @@ -906,7 +906,7 @@ int tun_read_data(int fd, char* buffer, size_t size) int ret=0; int max_fd = 0; - +/* if(g_kni_switch_info.write_listq_switch == 0) { fd_set alive_readfd; @@ -926,7 +926,7 @@ int tun_read_data(int fd, char* buffer, size_t size) return 0; } } - +*/ recv_len = read(fd, buffer, size); if(recv_len <0) { @@ -1488,6 +1488,8 @@ int tcp_repair_process(const struct streaminfo* pstream,const void* a_packet,str if(ret<0) { kni_filestate2_set(0,FS_REPAIR_SEND_ERR,0,2); + close(g_kni_comminfo.fd_domain); + g_kni_comminfo.fd_domain=-1; g_kni_comminfo.kni_mode_cur=KNI_MODE_BYPASS; } else |
