From 81e4ee9347a6db55ab33fdc87eba965da1829e1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B4=94=E4=B8=80=E9=B8=A3?= Date: Tue, 25 Jun 2019 09:26:33 +0600 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DMESA=5Fhtable#3=E6=8F=90?= =?UTF-8?q?=E5=88=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/src/kni_entry.cpp | 113 ++++++++++++++++++++++++---------------- 1 file changed, 68 insertions(+), 45 deletions(-) diff --git a/entry/src/kni_entry.cpp b/entry/src/kni_entry.cpp index 059a120..2fa7107 100644 --- a/entry/src/kni_entry.cpp +++ b/entry/src/kni_entry.cpp @@ -438,64 +438,51 @@ static void keepalive_replay_htable_del(struct pme_info *pmeinfo){ // "keepalive_replay_htable", stream_addr); } } -static void judge_pme_destroy(struct pme_info *pmeinfo, int caller){ + +void stream_destroy(struct pme_info *pmeinfo){ + //sendlog void *logger = g_kni_handle->local_logger; int ret; + if(pmeinfo->do_log == 1){ + ret = log_generate(pmeinfo, logger); + if(ret < 0){ + KNI_LOG_ERROR(logger, "Failed at log_generate, stream traceid is %s", pmeinfo->stream_traceid); + } + else{ + KNI_LOG_DEBUG(logger, "Succeed at log_generate, stream traceid is %s", pmeinfo->stream_traceid); + } + } + //only intercetp stream need del htable + if(pmeinfo->action == KNI_ACTION_INTERCEPT){ + //del keepalive_replay_htable + if(g_kni_handle->keepalive_replay_switch == 1){ + keepalive_replay_htable_del(pmeinfo); + } + } + //free pme + pme_info_destroy(pmeinfo); +} + +static int judge_stream_destroy(struct pme_info *pmeinfo, int caller){ + void *logger = g_kni_handle->local_logger; + int can_destroy = 0; if(pmeinfo != NULL){ - void *logger = g_kni_handle->local_logger; pthread_mutex_lock(&(pmeinfo->lock)); if(caller == CALLER_SAPP){ - //KNI_LOG_DEBUG(logger, "set sapp_release = 1, caller is %d, stream_trace_id is %s, thread id is %p", - // caller, pmeinfo->stream_traceid, pthread_self()); pmeinfo->sapp_release = 1; } if(caller == CALLER_TFE){ - //KNI_LOG_DEBUG(logger, "set tfe_release = 1, caller is %d, stream_trace_id is %s, thread id is %p", - // caller, pmeinfo->stream_traceid, pthread_self()); pmeinfo->tfe_release = 1; } if(pmeinfo->sapp_release == 1 && pmeinfo->tfe_release == 1){ - //sendlog - if(pmeinfo->do_log == 1){ - ret = log_generate(pmeinfo, logger); - if(ret < 0){ - KNI_LOG_ERROR(logger, "Failed at log_generate, stream traceid is %s", pmeinfo->stream_traceid); - } - else{ - KNI_LOG_DEBUG(logger, "Succeed at log_generate, stream traceid is %s", pmeinfo->stream_traceid); - } - } - //only intercetp stream need del htable - if(pmeinfo->action == KNI_ACTION_INTERCEPT){ - //del traceid2pme htable - int key_size = strnlen(pmeinfo->stream_traceid, sizeof(pmeinfo->stream_traceid)); - ret = MESA_htable_del(g_kni_handle->traceid2pme_htable, (const unsigned char *)pmeinfo->stream_traceid, - key_size, NULL); - if(ret < 0){ - KNI_LOG_ERROR(logger, "MESA_htable: Failed at del, table is %s, key is %s, key_size is %d, ret is %d", - "traceid2pme_htable", pmeinfo->stream_traceid, key_size, ret); - FS_operate(g_kni_fs_handle->handle, g_kni_fs_handle->fields[KNI_FIELD_ID2PME_DEL_FAIL], 0, FS_OP_ADD, 1); - } - else{ - //KNI_LOG_DEBUG(logger, "MESA_htable: Succeed at del, table is %s, key is %s, key_size is %d", - // "traceid2pme_htable", pmeinfo->stream_traceid, key_size); - FS_operate(g_kni_fs_handle->handle, g_kni_fs_handle->fields[KNI_FIELD_ID2PME_DEL_SUCC], 0, FS_OP_ADD, 1); - } - //del keepalive_replay_htable - if(g_kni_handle->keepalive_replay_switch == 1){ - keepalive_replay_htable_del(pmeinfo); - } - } - //free pme - pme_info_destroy(pmeinfo); - return; + can_destroy = 1; } - //KNI_LOG_DEBUG(logger, "can not destroy pmeinfo, sapp_release = %d, tfe_release = %d", pmeinfo->sapp_release, pmeinfo->tfe_release); pthread_mutex_unlock(&(pmeinfo->lock)); } else{ - KNI_LOG_ERROR(logger, "Failed at judge_pme_info, pmeinfo is null"); + KNI_LOG_ERROR(logger, "Failed at judge_stream_destroy, pmeinfo is null"); } + return can_destroy; } static int protocol_identify(const struct streaminfo* stream, char *buf, int len, struct protocol_identify_result *result){ @@ -1036,11 +1023,33 @@ static char close_opstate(const struct streaminfo *stream, struct pme_info *pmei } } +static void traceid2pme_htable_del(struct pme_info *pmeinfo){ + //del traceid2pme htable + if(pmeinfo->action == KNI_ACTION_INTERCEPT){ + void *logger = g_kni_handle->local_logger; + int key_size = strnlen(pmeinfo->stream_traceid, sizeof(pmeinfo->stream_traceid)); + int ret; + ret = MESA_htable_del(g_kni_handle->traceid2pme_htable, (const unsigned char *)pmeinfo->stream_traceid, + key_size, NULL); + if(ret < 0){ + KNI_LOG_ERROR(logger, "MESA_htable: Failed at del, table is %s, key is %s, key_size is %d, ret is %d", + "traceid2pme_htable", pmeinfo->stream_traceid, key_size, ret); + FS_operate(g_kni_fs_handle->handle, g_kni_fs_handle->fields[KNI_FIELD_ID2PME_DEL_FAIL], 0, FS_OP_ADD, 1); + } + else{ + //KNI_LOG_DEBUG(logger, "MESA_htable: Succeed at del, table is %s, key is %s, key_size is %d", + // "traceid2pme_htable", pmeinfo->stream_traceid, key_size); + FS_operate(g_kni_fs_handle->handle, g_kni_fs_handle->fields[KNI_FIELD_ID2PME_DEL_SUCC], 0, FS_OP_ADD, 1); + } + } +} + //from syn extern "C" char kni_tcpall_entry(const struct streaminfo *stream, void** pme, int thread_seq, const void* a_packet){ void *logger = g_kni_handle->local_logger; int ret; + int can_destroy; struct pme_info *pmeinfo = *(struct pme_info **)pme; if(stream->addr.addrtype == ADDR_TYPE_IPV6){ FS_operate(g_kni_fs_handle->handle, g_kni_fs_handle->fields[KNI_FIELD_IPV6_STM], 0, FS_OP_ADD, 1); @@ -1103,7 +1112,11 @@ extern "C" char kni_tcpall_entry(const struct streaminfo *stream, void** pme, in } //sapp release: bypass or intercept if((ret & APP_STATE_DROPME)){ - judge_pme_destroy(pmeinfo, CALLER_SAPP); + can_destroy = judge_stream_destroy(pmeinfo, CALLER_SAPP); + if(can_destroy == 1){ + traceid2pme_htable_del(pmeinfo); + stream_destroy(pmeinfo); + } } return ret; @@ -1405,6 +1418,7 @@ static long traceid2pme_htable_search_cb(void *data, const uchar *key, uint size void *logger = args->logger; struct kni_cmsg *cmsg = args->cmsg; struct pme_info *pmeinfo = (struct pme_info*)data; + int can_destroy; if(pmeinfo != NULL){ wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_INTERCEPT_STATE, sizeof(pmeinfo->intercept_state), logger); wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_UPSTREAM_LATENCY, sizeof(pmeinfo->ssl_server_side_latency), logger); @@ -1416,7 +1430,11 @@ static long traceid2pme_htable_search_cb(void *data, const uchar *key, uint size wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_ERROR, sizeof(pmeinfo->ssl_error), logger); clock_gettime(CLOCK_REALTIME, &(pmeinfo->end_time)); KNI_LOG_DEBUG(logger, "recv cmsg from tfe, stream traceid is %s", pmeinfo->stream_traceid); - judge_pme_destroy(pmeinfo, CALLER_TFE); + can_destroy = judge_stream_destroy(pmeinfo, CALLER_TFE); + if(can_destroy == 1){ + traceid2pme_htable_del(pmeinfo); + stream_destroy(pmeinfo); + } } kni_cmsg_destroy(cmsg); return 0; @@ -1741,8 +1759,13 @@ extern "C" void kni_destroy(struct kni_handle *handle){ //ret: 1: the item can be eliminated; 0: the item can't be eliminated static int traceid2pme_htable_expire_notify_cb(void *data, int eliminate_type){ struct pme_info *pmeinfo = (struct pme_info*)data; + int can_destroy; if(pmeinfo->sapp_release == 1){ - judge_pme_destroy(pmeinfo, CALLER_TFE); + can_destroy = judge_stream_destroy(pmeinfo, CALLER_TFE); + if(can_destroy == 1){ + stream_destroy(pmeinfo); + return 1; + } } return 0; }