diff options
Diffstat (limited to 'src/dns_decoder.cpp')
| -rw-r--r-- | src/dns_decoder.cpp | 59 |
1 files changed, 46 insertions, 13 deletions
diff --git a/src/dns_decoder.cpp b/src/dns_decoder.cpp index 8278c8d..4905642 100644 --- a/src/dns_decoder.cpp +++ b/src/dns_decoder.cpp @@ -1242,7 +1242,6 @@ void dns_decoder_entry(struct session *ss, uint8_t *payload, size_t payload_sz, HASH_FIND_INT(per_ss_ctx->trans_hash, &message_id, current_trans); if(current_trans!=NULL && data_msg->type==DNS_MESSAGE_QUERY) { - per_ss_ctx->trans_list_num--; dns_message_transaction_publish(ss, DNS_MESSAGE_TRANSACTION_END, plugin_env->dns.topic_id, current_trans->trans_idx); dns_decoder_session_transaction_del(per_ss_ctx, current_trans); current_trans=NULL; @@ -1305,8 +1304,44 @@ void dns_decoder_entry(struct session *ss, uint8_t *payload, size_t payload_sz, } } +int dns_decoder_transaction_end_in_closing(struct session *ss, void *per_session_ctx, void *plugin_env_str) +{ + enum session_state state=session_get_current_state(ss); + if(state!=SESSION_STATE_CLOSING) + { + return DNS_DECODER_FALSE; + } + + struct dns_decoder_context *per_ss_ctx=(struct dns_decoder_context *)per_session_ctx; + struct dns_decoder_plugin_env *plugin_env=(struct dns_decoder_plugin_env *)plugin_env_str; + + enum session_addr_type addr_type=SESSION_ADDR_TYPE_UNKNOWN; + session_get0_addr(ss, &addr_type); + const char *ip_version=(addr_type==SESSION_ADDR_TYPE_IPV4_TCP || addr_type==SESSION_ADDR_TYPE_IPV4_UDP) ? TAG_VALUE_IP_VERSION_IPV4 : TAG_VALUE_IP_VERSION_IPV6; + const char *ip_protocol=(addr_type==SESSION_ADDR_TYPE_IPV4_TCP || addr_type==SESSION_ADDR_TYPE_IPV6_TCP) ? TAG_VALUE_IP_PROTOCOL_TCP : TAG_VALUE_IP_PROTOCOL_UDP; + + size_t tag_offset=4; + const char *tag_key[tag_offset]={TAG_KEY_IP_VERSION, TAG_KEY_IP_PROTOCOL, TAG_KEY_MESSAGE_TYPE, TAG_KEY_MESSAGE_STATUS}; + const char *tag_value[tag_offset]={ip_version, ip_protocol, "transaction_end", "closing"}; + dns_decoder_local_file_counter_incby(plugin_env, LOCAL_STAT_COUNTER_SEND, tag_key, tag_value, tag_offset, per_ss_ctx->trans_list_num, session_get_current_thread_id(ss)); + + struct dns_transaction *current_trans=NULL, *tmp_trans=NULL; + HASH_ITER(hh, per_ss_ctx->trans_hash, current_trans, tmp_trans) + { + dns_message_transaction_publish(ss, DNS_MESSAGE_TRANSACTION_END, plugin_env->dns.topic_id, current_trans->trans_idx); + dns_decoder_session_transaction_del(per_ss_ctx, current_trans); + } + + return DNS_DECODER_TRUE; +} + void dns_udp_session_ingress_packet_cb(struct session *ss, int32_t topic_id, const void *msg, void *per_session_ctx, void *plugin_env_str) { + if(dns_decoder_transaction_end_in_closing(ss, per_session_ctx, plugin_env_str)==DNS_DECODER_TRUE) + { + return ; + } + size_t payload_sz=0; uint8_t *payload=(uint8_t *)session_get0_current_payload(ss, &payload_sz); if(payload_sz<DNS_HEADER_SIZE || payload==NULL) @@ -1319,6 +1354,11 @@ void dns_udp_session_ingress_packet_cb(struct session *ss, int32_t topic_id, con void dns_tcp_stream_session_segment_data_cb(struct session *ss, int32_t topic_id, const void *msg, void *per_session_ctx, void *plugin_env_str) { + if(dns_decoder_transaction_end_in_closing(ss, per_session_ctx, plugin_env_str)==DNS_DECODER_TRUE) + { + return ; + } + size_t segment_buff_sz=0; uint8_t *segment_buff=NULL; segment_buff=(uint8_t *)session_get0_current_payload(ss, &segment_buff_sz); @@ -1440,23 +1480,14 @@ void *dns_decoder_per_session_context_new(struct session *ss, void *plugin_env_s return NULL; } -void dns_decoder_per_session_context_free(struct session *ss, void *session_ctx, void *plugin_env_str) +void dns_decoder_per_session_context_free(struct session *ss, void *per_session_ctx, void *plugin_env_str) { - if(session_ctx==NULL) + if(per_session_ctx==NULL) { return ; } - struct dns_decoder_context *per_ss_ctx=(struct dns_decoder_context *)session_ctx; - struct dns_transaction *current_trans=NULL, *tmp_trans=NULL; - HASH_ITER(hh, per_ss_ctx->trans_hash, current_trans, tmp_trans) - { - dns_decoder_session_transaction_del(per_ss_ctx, current_trans); - } - - FREE(session_ctx); - - struct dns_decoder_plugin_env *plugin_env=(struct dns_decoder_plugin_env *)plugin_env_str; + FREE(per_session_ctx); enum session_addr_type addr_type=SESSION_ADDR_TYPE_UNKNOWN; session_get0_addr(ss, &addr_type); @@ -1465,6 +1496,8 @@ void dns_decoder_per_session_context_free(struct session *ss, void *session_ctx, const char *tag_key[3]={TAG_KEY_IP_VERSION, TAG_KEY_IP_PROTOCOL, "memory"}; const char *tag_value[3]={ip_version, ip_protocol, "ss_ctx"}; + + struct dns_decoder_plugin_env *plugin_env=(struct dns_decoder_plugin_env *)plugin_env_str; dns_decoder_local_file_counter_incby(plugin_env, LOCAL_STAT_COUNTER_FREE, tag_key, tag_value, 3, 1, session_get_current_thread_id(ss)); } |
