diff --git a/test/debug_plugin/debug_plugin.cpp b/test/debug_plugin/debug_plugin.cpp index 2260c6c..35e234f 100644 --- a/test/debug_plugin/debug_plugin.cpp +++ b/test/debug_plugin/debug_plugin.cpp @@ -58,6 +58,7 @@ static void log_print(int fd, const char *module, const char *fmt, ...) struct plugin_ctx { struct stellar *st; + char work_dir[1024]; int sess_exdata_idx; int sess_plug_id; int tcp_topic_id; @@ -69,7 +70,7 @@ struct plugin_ctx pthread_spinlock_t lock; // for hexdump thread safe }; -struct sess_exdta +struct session_exdata { uint64_t c2s_rx_pkts; uint64_t s2c_rx_pkts; @@ -82,14 +83,28 @@ struct sess_exdta uint64_t c2s_rx_tcp_bytes; uint64_t s2c_rx_tcp_bytes; + + int c2s_tcp_seg_hexdump_fd; + int s2c_tcp_seg_hexdump_fd; }; static void *on_sess_new(struct session *sess, void *plugin_ctx) { char buff[4096]; struct plugin_ctx *ctx = (struct plugin_ctx *)plugin_ctx; - struct sess_exdta *stat = (struct sess_exdta *)calloc(1, sizeof(struct sess_exdta)); - session_exdata_set(sess, ctx->sess_exdata_idx, stat); + struct session_exdata *exdata = (struct session_exdata *)calloc(1, sizeof(struct session_exdata)); + + if (session_get_type(sess) == SESSION_TYPE_TCP) + { + memset(buff, 0, sizeof(buff)); + sprintf(buff, "%s/log/debug_plugin_%s_c2s_segment", ctx->work_dir, session_get0_readable_addr(sess)); + ctx->c2s_tcp_seg_hexdump_fd = open(buff, O_WRONLY | O_APPEND | O_CREAT, 0644); + + memset(buff, 0, sizeof(buff)); + sprintf(buff, "%s/log/debug_plugin_%s_s2c_segment", ctx->work_dir, session_get0_readable_addr(sess)); + ctx->s2c_tcp_seg_hexdump_fd = open(buff, O_WRONLY | O_APPEND | O_CREAT, 0644); + } + session_exdata_set(sess, ctx->sess_exdata_idx, exdata); memset(buff, 0, sizeof(buff)); session_to_str(sess, 1, buff, sizeof(buff) - 1); @@ -102,7 +117,7 @@ static void on_sess_free(struct session *sess, void *sess_ctx, void *plugin_ctx) { char buff[4096]; struct plugin_ctx *ctx = (struct plugin_ctx *)plugin_ctx; - struct sess_exdta *stat = (struct sess_exdta *)session_exdata_get(sess, ctx->sess_exdata_idx); + struct session_exdata *exdata = (struct session_exdata *)session_exdata_get(sess, ctx->sess_exdata_idx); memset(buff, 0, sizeof(buff)); session_to_str(sess, 0, buff, sizeof(buff) - 1); @@ -113,10 +128,18 @@ static void on_sess_free(struct session *sess, void *sess_ctx, void *plugin_ctx) "C2S rx TCP segments: %6lu, C2S rx TCP bytes: %6lu\n" "S2C rx TCP segments: %6lu, S2C rx TCP bytes: %6lu\n", session_get_id(sess), session_get0_readable_addr(sess), - stat->c2s_rx_pkts, stat->c2s_rx_bytes, - stat->s2c_rx_pkts, stat->s2c_rx_bytes, - stat->c2s_rx_tcp_seg, stat->c2s_rx_tcp_bytes, - stat->s2c_rx_tcp_seg, stat->s2c_rx_tcp_bytes); + exdata->c2s_rx_pkts, exdata->c2s_rx_bytes, + exdata->s2c_rx_pkts, exdata->s2c_rx_bytes, + exdata->c2s_rx_tcp_seg, exdata->c2s_rx_tcp_bytes, + exdata->s2c_rx_tcp_seg, exdata->s2c_rx_tcp_bytes); + if (exdata->c2s_tcp_seg_hexdump_fd > 0) + { + close(exdata->c2s_tcp_seg_hexdump_fd); + } + if (exdata->s2c_tcp_seg_hexdump_fd > 0) + { + close(exdata->s2c_tcp_seg_hexdump_fd); + } } static void on_sess_udp_msg(struct session *sess, int topic_id, const void *msg, void *sess_ctx, void *plugin_ctx) @@ -129,16 +152,16 @@ static void on_sess_udp_msg(struct session *sess, int topic_id, const void *msg, char buff[4096]; struct packet *pkt = (struct packet *)msg; struct plugin_ctx *ctx = (struct plugin_ctx *)plugin_ctx; - struct sess_exdta *stat = (struct sess_exdta *)session_exdata_get(sess, ctx->sess_exdata_idx); + struct session_exdata *exdata = (struct session_exdata *)session_exdata_get(sess, ctx->sess_exdata_idx); if (session_get_current_flow_direction(sess) == FLOW_DIRECTION_C2S) { - stat->c2s_rx_pkts++; - stat->c2s_rx_bytes += packet_get_raw_len(pkt); + exdata->c2s_rx_pkts++; + exdata->c2s_rx_bytes += packet_get_raw_len(pkt); } else { - stat->s2c_rx_pkts++; - stat->s2c_rx_bytes += packet_get_raw_len(pkt); + exdata->s2c_rx_pkts++; + exdata->s2c_rx_bytes += packet_get_raw_len(pkt); } memset(buff, 0, sizeof(buff)); @@ -164,16 +187,16 @@ static void on_sess_tcp_msg(struct session *sess, int topic_id, const void *msg, char buff[4096]; struct packet *pkt = (struct packet *)msg; struct plugin_ctx *ctx = (struct plugin_ctx *)plugin_ctx; - struct sess_exdta *stat = (struct sess_exdta *)session_exdata_get(sess, ctx->sess_exdata_idx); + struct session_exdata *exdata = (struct session_exdata *)session_exdata_get(sess, ctx->sess_exdata_idx); if (session_get_current_flow_direction(sess) == FLOW_DIRECTION_C2S) { - stat->c2s_rx_pkts++; - stat->c2s_rx_bytes += packet_get_raw_len(pkt); + exdata->c2s_rx_pkts++; + exdata->c2s_rx_bytes += packet_get_raw_len(pkt); } else { - stat->s2c_rx_pkts++; - stat->s2c_rx_bytes += packet_get_raw_len(pkt); + exdata->s2c_rx_pkts++; + exdata->s2c_rx_bytes += packet_get_raw_len(pkt); } memset(buff, 0, sizeof(buff)); @@ -201,7 +224,7 @@ static void on_sess_tcp_stream_msg(struct session *sess, int topic_id, const voi struct plugin_ctx *ctx = (struct plugin_ctx *)plugin_ctx; const char *data = tcp_segment_get_data(seg); uint16_t len = tcp_segment_get_len(seg); - struct sess_exdta *stat = (struct sess_exdta *)session_exdata_get(sess, ctx->sess_exdata_idx); + struct session_exdata *exdata = (struct session_exdata *)session_exdata_get(sess, ctx->sess_exdata_idx); memset(buff, 0, sizeof(buff)); session_to_str(sess, 1, buff, sizeof(buff) - 1); @@ -210,21 +233,21 @@ static void on_sess_tcp_stream_msg(struct session *sess, int topic_id, const voi pthread_spin_lock(&ctx->lock); if (session_get_current_flow_direction(sess) == FLOW_DIRECTION_C2S) { - log_print(ctx->fd, "debug plugin", "rx C2S TCP segment: len: %d, data: %p\n", len, data); - hexdump_to_fd(ctx->fd, stat->c2s_rx_tcp_bytes, data, len); - hexdump_to_fd(ctx->c2s_tcp_seg_hexdump_fd, stat->c2s_rx_tcp_bytes, data, len); + log_print(ctx->fd, "debug plugin", "rx C2S TCP segment: len: %d, data: %p", len, data); + hexdump_to_fd(ctx->fd, exdata->c2s_rx_tcp_bytes, data, len); + hexdump_to_fd(ctx->c2s_tcp_seg_hexdump_fd, exdata->c2s_rx_tcp_bytes, data, len); - stat->c2s_rx_tcp_seg++; - stat->c2s_rx_tcp_bytes += len; + exdata->c2s_rx_tcp_seg++; + exdata->c2s_rx_tcp_bytes += len; } else { - log_print(ctx->fd, "debug plugin", "rx S2C TCP segment: len: %d, data: %p\n", len, data); - hexdump_to_fd(ctx->fd, stat->s2c_rx_tcp_bytes, data, len); - hexdump_to_fd(ctx->s2c_tcp_seg_hexdump_fd, stat->s2c_rx_tcp_bytes, data, len); + log_print(ctx->fd, "debug plugin", "rx S2C TCP segment: len: %d, data: %p", len, data); + hexdump_to_fd(ctx->fd, exdata->s2c_rx_tcp_bytes, data, len); + hexdump_to_fd(ctx->s2c_tcp_seg_hexdump_fd, exdata->s2c_rx_tcp_bytes, data, len); - stat->s2c_rx_tcp_seg++; - stat->s2c_rx_tcp_bytes += len; + exdata->s2c_rx_tcp_seg++; + exdata->s2c_rx_tcp_bytes += len; } pthread_spin_unlock(&ctx->lock); } @@ -244,10 +267,16 @@ extern "C" } ctx->fd = open("./log/debug_plugin_log", O_WRONLY | O_APPEND | O_CREAT, 0644); - ctx->c2s_tcp_seg_hexdump_fd = open("./log/debug_plugin_log_c2s_tcp_segment", O_WRONLY | O_APPEND | O_CREAT, 0644); - ctx->s2c_tcp_seg_hexdump_fd = open("./log/debug_plugin_log_s2c_tcp_segment", O_WRONLY | O_APPEND | O_CREAT, 0644); - if (ctx->fd == -1 || ctx->c2s_tcp_seg_hexdump_fd == -1 || ctx->s2c_tcp_seg_hexdump_fd == -1) + if (ctx->fd == -1) { + printf("[debug plugin] open log file failed: %s\n", strerror(errno)); + free(ctx); + return NULL; + } + if (getcwd(ctx->work_dir, sizeof(ctx->work_dir)) == NULL) + { + printf("[debug plugin] getcwd failed: %s\n", strerror(errno)); + close(ctx->fd); free(ctx); return NULL; } @@ -280,14 +309,6 @@ extern "C" { close(ctx->fd); } - if (ctx->c2s_tcp_seg_hexdump_fd > 0) - { - close(ctx->c2s_tcp_seg_hexdump_fd); - } - if (ctx->s2c_tcp_seg_hexdump_fd > 0) - { - close(ctx->s2c_tcp_seg_hexdump_fd); - } pthread_spin_destroy(&ctx->lock); free(ctx); }