summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author郑超 <[email protected]>2019-01-26 12:41:29 +0800
committer郑超 <[email protected]>2019-01-26 12:41:29 +0800
commit4fd98e58765981cf6582646484eec5115763cee0 (patch)
treea6273d0acb5d90dfdc7cfcb9eb30f4e9c1630e68
parent09915767df04668a26a7303c34d85c9c0d228acd (diff)
parentb2b0184d8579df0f757d3ed98660bd20f3a79a5d (diff)
Merge branch 'bugfix-del-htable-error' into 'master'
Bugfix del htable error See merge request tango/kni!2
-rw-r--r--kni_comm.c6
-rw-r--r--kni_comm.h4
-rw-r--r--kni_entry.c45
-rw-r--r--kni_entry.h3
-rw-r--r--kni_intercept.c10
5 files changed, 37 insertions, 31 deletions
diff --git a/kni_comm.c b/kni_comm.c
index 99febad..8acb30a 100644
--- a/kni_comm.c
+++ b/kni_comm.c
@@ -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;
diff --git a/kni_comm.h b/kni_comm.h
index 4b580ff..c05b523 100644
--- a/kni_comm.h
+++ b/kni_comm.h
@@ -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