From ae555ab98b27c33ebbc77edb6aff146c4f9bae97 Mon Sep 17 00:00:00 2001 From: liuxueli Date: Wed, 25 Dec 2019 15:27:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BB=9F=E8=AE=A1=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/tsg_statistic.h | 6 + src/tsg_statistic.cpp | 289 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 295 insertions(+) create mode 100644 inc/tsg_statistic.h create mode 100644 src/tsg_statistic.cpp diff --git a/inc/tsg_statistic.h b/inc/tsg_statistic.h new file mode 100644 index 0000000..9abe6ad --- /dev/null +++ b/inc/tsg_statistic.h @@ -0,0 +1,6 @@ +#ifndef __TSG_STATISTIC_H__ +#define __TSG_STATISTIC_H__ + +int tsg_set_policy_flow(struct streaminfo *a_stream, Maat_rule_t *p_result, int thread_seq); + +#endif diff --git a/src/tsg_statistic.cpp b/src/tsg_statistic.cpp new file mode 100644 index 0000000..bb47c42 --- /dev/null +++ b/src/tsg_statistic.cpp @@ -0,0 +1,289 @@ +#include +#include +#include + +#include +#include +#include + +#include "tsg_entry.h" +#include "tsg_send_log.h" +#include "tsg_send_log_internal.h" + +tsg_statis_para_t g_tsg_statis_para; + +int tsg_set_policy_flow(struct streaminfo *a_stream, Maat_rule_t *p_result, int thread_seq) +{ + struct _traffic_info *traffic_info=NULL; + + if(g_tsg_statis_para.cycle<=0) + { + return 0; + } + + if(a_stream==NULL || p_result==NULL) + { + return -1; + } + + traffic_info=&g_tsg_statis_para.traffic_info[thread_seq][(int)p_result->action]; + + traffic_info->con_num++; + traffic_info->in_bytes+=a_stream->ptcpdetail->clientbytes; + traffic_info->in_packets+=a_stream->ptcpdetail->clientpktnum; + + traffic_info->out_bytes+=a_stream->ptcpdetail->serverbytes; + traffic_info->out_packets+=a_stream->ptcpdetail->serverpktnum; + + return 0; +} + +static int _set_traffic_info(struct _traffic_info *from, struct _traffic_info *to, int action, int thread_num) +{ + tsg_statis_field_id_t con_num_id=STATIS_UNKNOWN; + tsg_statis_field_id_t in_bytes_id=STATIS_UNKNOWN; + tsg_statis_field_id_t in_packets_id=STATIS_UNKNOWN; + tsg_statis_field_id_t out_bytes_id=STATIS_UNKNOWN; + tsg_statis_field_id_t out_packets_id=STATIS_UNKNOWN; + + long long con_num_sum=0; + long long in_bytes_sum=0,in_packets_sum=0; + long long out_bytes_sum=0,out_packets_sum=0; + + for(int i=0; icon_num+=con_num_sum; + to->in_bytes+=in_bytes_sum; + to->in_packets+=in_packets_sum; + to->out_bytes+=out_bytes_sum; + to->out_packets+=out_packets_sum; + } + + switch(action) + { + case TSG_ACTION_BYPASS: + con_num_id=STATIS_ALLOW_CON_NUM; + in_bytes_id=STATIS_ALLOW_IN_BYTES; + in_packets_id=STATIS_ALLOW_IN_PACKETS; + out_bytes_id=STATIS_ALLOW_OUT_BYTES; + out_packets_id=STATIS_ALLOW_OUT_PACKETS; + break; + case TSG_ACTION_DENY: + con_num_id=STATIS_DENY_CON_NUM; + in_bytes_id=STATIS_DENY_IN_BYTES; + in_packets_id=STATIS_DENY_IN_PACKETS; + out_bytes_id=STATIS_DENY_OUT_BYTES; + out_packets_id=STATIS_DENY_OUT_PACKETS; + break; + case TSG_ACTION_MONITOR: + con_num_id=STATIS_MONITOR_CON_NUM; + in_bytes_id=STATIS_MONITOR_IN_BYTES; + in_packets_id=STATIS_MONITOR_IN_PACKETS; + out_bytes_id=STATIS_MONITOR_OUT_BYTES; + out_packets_id=STATIS_MONITOR_OUT_PACKETS; + break; + case TSG_ACTION_INTERCEPT: + con_num_id=STATIS_INTERCEPT_CON_NUM; + in_bytes_id=STATIS_INTERCEPT_IN_BYTES; + in_packets_id=STATIS_INTERCEPT_IN_PACKETS; + out_bytes_id=STATIS_INTERCEPT_OUT_BYTES; + out_packets_id=STATIS_INTERCEPT_OUT_PACKETS; + break; + case TSG_ACTION_NONE: + con_num_id=STATIS_DEFAULT_CON_NUM; + in_bytes_id=STATIS_DEFAULT_IN_BYTES; + in_packets_id=STATIS_DEFAULT_IN_PACKETS; + out_bytes_id=STATIS_DEFAULT_OUT_BYTES; + out_packets_id=STATIS_DEFAULT_OUT_PACKETS; + + con_num_sum+=from->con_num; + in_bytes_sum+=from->in_bytes; + in_packets_sum+=from->in_packets; + out_bytes_sum+=from->out_bytes; + out_packets_sum+=from->out_packets; + break; + case -1: + con_num_id=STATIS_TOTAL_CON_NUM; + in_bytes_id=STATIS_TOTAL_IN_BYTES; + in_packets_id=STATIS_TOTAL_IN_PACKETS; + out_bytes_id=STATIS_TOTAL_OUT_BYTES; + out_packets_id=STATIS_TOTAL_OUT_PACKETS; + + con_num_sum+=from->con_num; + in_bytes_sum+=from->in_bytes; + in_packets_sum+=from->in_packets; + out_bytes_sum+=from->out_bytes; + out_packets_sum+=from->out_packets; + break; + default: + return 0; + break; + } + + FS_operate(g_tsg_statis_para.fs2_handle, g_tsg_statis_para.fs_field_id[con_num_id], 0, FS_OP_SET, con_num_sum); + FS_operate(g_tsg_statis_para.fs2_handle, g_tsg_statis_para.fs_field_id[in_bytes_id], 0, FS_OP_SET, in_bytes_sum); + FS_operate(g_tsg_statis_para.fs2_handle, g_tsg_statis_para.fs_field_id[in_packets_id], 0, FS_OP_SET, in_packets_sum); + FS_operate(g_tsg_statis_para.fs2_handle, g_tsg_statis_para.fs_field_id[out_bytes_id], 0, FS_OP_SET, out_bytes_sum); + FS_operate(g_tsg_statis_para.fs2_handle, g_tsg_statis_para.fs_field_id[out_packets_id], 0, FS_OP_SET, out_packets_sum); + + return 0; +} +static void *tsg_statistic_thread(void *arg) +{ + long long value=0; + int value_len=sizeof(value); + int thread_num=get_thread_count(); + struct _traffic_info policy_traffic_info; + struct _traffic_info total_traffic_info; + struct _traffic_info default_traffic_info; + + FS_start(g_tsg_para.fs2_handle); + + while(1) + { + memset(&policy_traffic_info, 0, sizeof(policy_traffic_info)); + memset(&total_traffic_info, 0, sizeof(total_traffic_info)); + memset(&default_traffic_info, 0, sizeof(default_traffic_info)); + + value=0; + value_len=sizeof(value); + sapp_get_platform_opt(SPO_TCP_STREAM_NEW, (void *)&value, &value_len); + FS_operate(g_tsg_statis_para.fs2_handle, g_tsg_statis_para.fs_field_id[STATIS_NEW_CON_NUM], 0, FS_OP_SET, value); + total_traffic_info.con_num+=value; + + value=0; + value_len=sizeof(value); + sapp_get_platform_opt(SPO_TCP_STREAM_LIVE, (void *)&value, &value_len); + FS_operate(g_tsg_statis_para.fs2_handle, g_tsg_statis_para.fs_field_id[STATIS_LIVE_CON_NUM], 0, FS_OP_SET, value); + total_traffic_info.con_num+=value; + + value=0; + value_len=sizeof(value); + sapp_get_platform_opt(SPO_TCP_STREAM_CLOSE, (void *)&value, &value_len); + FS_operate(g_tsg_statis_para.fs2_handle, g_tsg_statis_para.fs_field_id[STATIS_CLOSE_CON_NUM], 0, FS_OP_SET, value); + total_traffic_info.con_num+=value; + + value_len=sizeof(total_traffic_info.out_bytes); + sapp_get_platform_opt(SPO_TOTAL_EGRESS_BYTE, (void *)&total_traffic_info.out_bytes, &value_len); + + value_len=sizeof(total_traffic_info.out_bytes); + sapp_get_platform_opt(SPO_TOTAL_EGRESS_BYTE, (void *)&total_traffic_info.out_bytes, &value_len); + + _set_traffic_info(g_tsg_statis_para.traffic_info[TSG_ACTION_BYPASS], &policy_traffic_info, TSG_ACTION_BYPASS, thread_num); + _set_traffic_info(g_tsg_statis_para.traffic_info[TSG_ACTION_DENY], &policy_traffic_info, TSG_ACTION_DENY, thread_num); + _set_traffic_info(g_tsg_statis_para.traffic_info[TSG_ACTION_MONITOR], &policy_traffic_info, TSG_ACTION_MONITOR, thread_num); + _set_traffic_info(g_tsg_statis_para.traffic_info[TSG_ACTION_INTERCEPT], &policy_traffic_info, TSG_ACTION_INTERCEPT, thread_num); + + + _set_traffic_info(&total_traffic_info, NULL, -1, 0); + _set_traffic_info(&default_traffic_info, NULL, TSG_ACTION_NONE, 0); + + sleep(g_tsg_statis_para.cycle); + } + + return NULL; +} + + +int tsg_statistic_init(const char *conffile, void *logger) +{ + int i=0,value=0,thread_num=0; + unsigned short fs_server_port=0; + char app_name[MAX_STRING_LEN]={0}; + char fs_server_ip[MAX_IPV4_LEN]={0}; + char fs_output_path[MAX_STRING_LEN*4]={0}; + + memset(&g_tsg_statis_para, 0, sizeof(g_tsg_statis_para)); + + MESA_load_profile_int_def(conffile, "STATISTIC", "CYCLE", &g_tsg_statis_para.cycle, 30); + if(g_tsg_statis_para.cycle<=0) + { + MESA_handle_runtime_log(logger, RLOG_LV_FATAL, "STATISTIC", "Disabale traffic statistic"); + return 0; + } + + + thread_num=get_thread_count(); + for(i=0; i 0 && strlen(fs_server_ip) > 0) + { + FS_set_para(g_tsg_statis_para.fs2_handle, STATS_SERVER_IP,fs_server_ip, strlen(fs_server_ip)+1); + FS_set_para(g_tsg_statis_para.fs2_handle, STATS_SERVER_PORT,&(fs_server_port), sizeof(fs_server_port)); + } + + g_tsg_statis_para.fs_field_id[STATIS_ENTRANCE_ID]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"entrance_id"); + g_tsg_statis_para.fs_field_id[STATIS_TOTAL_CON_NUM]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"total_conn_num"); + g_tsg_statis_para.fs_field_id[STATIS_NEW_CON_NUM]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"new_conn_num"); + g_tsg_statis_para.fs_field_id[STATIS_LIVE_CON_NUM]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"live_conn_num"); + g_tsg_statis_para.fs_field_id[STATIS_CLOSE_CON_NUM]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"close_conn_num"); + g_tsg_statis_para.fs_field_id[STATIS_TOTAL_IN_BYTES]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"total_in_bytes"); + g_tsg_statis_para.fs_field_id[STATIS_TOTAL_OUT_BYTES]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"total_out_bytes"); + g_tsg_statis_para.fs_field_id[STATIS_TOTAL_IN_PACKETS]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"total_in_packets"); + g_tsg_statis_para.fs_field_id[STATIS_TOTAL_OUT_PACKETS]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"total_out_packets"); + + g_tsg_statis_para.fs_field_id[STATIS_DEFAULT_CON_NUM]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"default_conn_num"); + g_tsg_statis_para.fs_field_id[STATIS_DEFAULT_IN_BYTES]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"default_in_bytes"); + g_tsg_statis_para.fs_field_id[STATIS_DEFAULT_OUT_BYTES]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"default_out_bytes"); + g_tsg_statis_para.fs_field_id[STATIS_DEFAULT_IN_PACKETS]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"default_in_packets"); + g_tsg_statis_para.fs_field_id[STATIS_DEFAULT_OUT_PACKETS]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"default_out_packets"); + + g_tsg_statis_para.fs_field_id[STATIS_ALLOW_CON_NUM]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"allow_conn_num"); + g_tsg_statis_para.fs_field_id[STATIS_ALLOW_IN_BYTES]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"allow_in_bytes"); + g_tsg_statis_para.fs_field_id[STATIS_ALLOW_OUT_BYTES]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"allow_out_bytes"); + g_tsg_statis_para.fs_field_id[STATIS_ALLOW_IN_PACKETS]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"allow_in_packets"); + g_tsg_statis_para.fs_field_id[STATIS_ALLOW_OUT_PACKETS]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"allow_out_packets"); + + g_tsg_statis_para.fs_field_id[STATIS_DENY_CON_NUM]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"deny_conn_num"); + g_tsg_statis_para.fs_field_id[STATIS_DENY_IN_BYTES]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"deny_in_bytes"); + g_tsg_statis_para.fs_field_id[STATIS_DENY_OUT_BYTES]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"deny_out_bytes"); + g_tsg_statis_para.fs_field_id[STATIS_DENY_IN_PACKETS]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"deny_in_packets"); + g_tsg_statis_para.fs_field_id[STATIS_DENY_OUT_PACKETS]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"deny_out_packets"); + + g_tsg_statis_para.fs_field_id[STATIS_MONITOR_CON_NUM]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"monitor_conn_num"); + g_tsg_statis_para.fs_field_id[STATIS_MONITOR_IN_BYTES]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"monitor_in_bytes"); + g_tsg_statis_para.fs_field_id[STATIS_MONITOR_OUT_BYTES]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"monitor_out_bytes"); + g_tsg_statis_para.fs_field_id[STATIS_MONITOR_IN_PACKETS]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"monitor_in_packets"); + g_tsg_statis_para.fs_field_id[STATIS_MONITOR_OUT_PACKETS]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"monitor_out_packets"); + + g_tsg_statis_para.fs_field_id[STATIS_INTERCEPT_CON_NUM]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"intercept_conn_num"); + g_tsg_statis_para.fs_field_id[STATIS_INTERCEPT_IN_BYTES]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"intercept_in_bytes"); + g_tsg_statis_para.fs_field_id[STATIS_INTERCEPT_OUT_BYTES]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"intercept_out_bytes"); + g_tsg_statis_para.fs_field_id[STATIS_INTERCEPT_IN_PACKETS]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"intercept_in_packets"); + g_tsg_statis_para.fs_field_id[STATIS_INTERCEPT_OUT_PACKETS]=FS_register(g_tsg_para.fs2_handle, FS_STYLE_FIELD, FS_CALC_SPEED, (char *)"intercept_out_packets"); + + pthread_t stat_thread_t; + pthread_create(&stat_thread_t, NULL, tsg_statistic_thread, NULL); + + + return 0; +}