diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e7e3f36..6b9299d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,4 +1,4 @@ -add_executable(gtest_inject_tcp_rst gtest_inject_tcp_rst.cpp packet_injector_test_frame.cpp) +add_executable(gtest_inject_tcp_rst packet_injector.cpp gtest_inject_tcp_rst.cpp packet_injector_test_frame.cpp ) target_link_libraries(gtest_inject_tcp_rst core gtest) include(GoogleTest) diff --git a/test/gtest_inject_tcp_rst.cpp b/test/gtest_inject_tcp_rst.cpp index f3f2561..26b1d96 100644 --- a/test/gtest_inject_tcp_rst.cpp +++ b/test/gtest_inject_tcp_rst.cpp @@ -32,7 +32,7 @@ TEST(INJECT_IPV4_BASED_TCP_RST, AFTER_RECV_SYN_ACK) .s2c_output_pcap = "inject-192.0.2.110:80-192.0.2.211:59942-2.pcap", // packet injector command - .packet_injector_cmd = "./packet_injector -t tcp-rst -c s2c-packet -n 1", + .packet_injector_cmd = {"./packet_injector", "-t", "tcp-rst", "-c", "s2c-packet", "-n", "1"}, .diff_skip_pattern = "-I frame.time -I frame.time_epoch -I ip.id -I ip.ttl -I ip.checksum -I tcp.checksum -I tcp.window_size", }; @@ -68,7 +68,7 @@ TEST(INJECT_IPV4_BASED_TCP_RST, AFTER_RECV_SUB_ACK) .s2c_output_pcap = "inject-192.0.2.110:80-192.0.2.211:42242-2.pcap", // packet injector command - .packet_injector_cmd = "./packet_injector -t tcp-rst -c c2s-packet -n 2", + .packet_injector_cmd = {"./packet_injector", "-t", "tcp-rst", "-c", "c2s-packet", "-n", "2"}, .diff_skip_pattern = "-I frame.time -I frame.time_epoch -I ip.id -I ip.ttl -I ip.checksum -I tcp.checksum -I tcp.window_size", }; @@ -104,7 +104,7 @@ TEST(INJECT_IPV4_BASED_TCP_RST, AFTER_RECV_C2S_FIRST_PAYLOAD) .s2c_output_pcap = "inject-192.0.2.110:80-192.0.2.211:35116-2.pcap", // packet injector command - .packet_injector_cmd = "./packet_injector -t tcp-rst -c c2s-packet -n 3", + .packet_injector_cmd = {"./packet_injector", "-t", "tcp-rst", "-c", "c2s-packet", "-n", "3"}, .diff_skip_pattern = "-I frame.time -I frame.time_epoch -I ip.id -I ip.ttl -I ip.checksum -I tcp.checksum -I tcp.window_size", }; diff --git a/test/packet_injector.cpp b/test/packet_injector.cpp index ef73418..2a5f214 100644 --- a/test/packet_injector.cpp +++ b/test/packet_injector.cpp @@ -15,6 +15,7 @@ #include "session_priv.h" #include "inject_priv.h" #include "stellar/tuple.h" +#include "stellar/session_mq.h" #define MOCK_PLUGIN_LOG_DEBUG(format, ...) LOG_DEBUG("mock plugin", format, ##__VA_ARGS__) @@ -49,7 +50,7 @@ struct inject_rule uint64_t count_num; } rule; -static void inject_packet_plugin(struct session *sess, struct packet *pkt, struct inject_rule *rule) +static void inject_packet_plugin(struct session *sess, int topic_id, const void *msg, void *per_session_ctx, void *plugin_env) { char buffer[1024] = {0}; const struct tuple6 *tuple = session_get_tuple6(sess); @@ -71,11 +72,11 @@ static void inject_packet_plugin(struct session *sess, struct packet *pkt, struc { return; } - if (rule->count_dir == AFTER_RECV_C2S_N_PACKET && session_get_stat(sess, FLOW_DIRECTION_C2S, STAT_RAW_PACKETS_RECEIVED) != rule->count_num) + if (p_rule->count_dir == AFTER_RECV_C2S_N_PACKET && session_get_stat(sess, FLOW_DIRECTION_C2S, STAT_RAW_PACKETS_RECEIVED) != p_rule->count_num) { return; } - if (rule->count_dir == AFTER_RECV_S2C_N_PACKET && session_get_stat(sess, FLOW_DIRECTION_S2C, STAT_RAW_PACKETS_RECEIVED) != rule->count_num) + if (p_rule->count_dir == AFTER_RECV_S2C_N_PACKET && session_get_stat(sess, FLOW_DIRECTION_S2C, STAT_RAW_PACKETS_RECEIVED) != p_rule->count_num) { return; } @@ -84,7 +85,7 @@ static void inject_packet_plugin(struct session *sess, struct packet *pkt, struc { return; } - switch (rule->inject_type) + switch (p_rule->inject_type) { case INJECT_TYPE_TCP_RST: packet_set_action(pkt, PACKET_ACTION_DROP); @@ -121,73 +122,18 @@ static void inject_packet_plugin(struct session *sess, struct packet *pkt, struc * mock plugin manager ******************************************************************************/ -struct plugin_manager +void *plugin_manager_new_ctx(struct session *sess, void *plugin_env) { -}; - -void *plugin_manager_new_ctx(struct session *sess) -{ - return sess; + return NULL; } -void plugin_manager_free_ctx(void *ctx) +void plugin_manager_free_ctx(struct session *sess, void *ctx, void *plugin_env) { - struct session *sess = (struct session *)ctx; - char buff[4096] = {0}; session_to_json(sess, buff, sizeof(buff)); MOCK_PLUGIN_LOG_DEBUG("=> session: %s", buff); } -struct plugin_manager *plugin_manager_new(void) -{ - static struct plugin_manager mgr; - return &mgr; -} - -void plugin_manager_free(struct plugin_manager *mgr) -{ -} - -void plugin_manager_dispatch_session(struct plugin_manager *mgr, struct session *sess, struct packet *pkt) -{ - struct tcp_segment *seg; - enum session_type type = session_get_type(sess); - uint16_t thr_idx = stellar_get_current_thread_index(); - MOCK_PLUGIN_LOG_DEBUG("=> thread: %d, session: %lu %s, type: %s, state: %s, c2s packet received: %lu, s2c packet received: %lu", thr_idx, - session_get_id(sess), session_get_tuple6_str(sess), - session_type_to_str(type), session_state_to_str(session_get_state(sess)), - session_get_stat(sess, FLOW_DIRECTION_C2S, STAT_RAW_PACKETS_RECEIVED), - session_get_stat(sess, FLOW_DIRECTION_S2C, STAT_RAW_PACKETS_RECEIVED)); - - if (packet_is_ctrl(pkt)) - { - } - else - { - switch (type) - { - case SESSION_TYPE_TCP: - while ((seg = session_get_tcp_segment(sess)) != NULL) - { - session_free_tcp_segment(sess, seg); - } - break; - case SESSION_TYPE_UDP: - break; - default: - assert(0); - break; - } - - inject_packet_plugin(sess, pkt, &rule); - } -} - -void plugin_manager_dispatch_packet(struct plugin_manager *mgr, struct packet *pkt) -{ -} - /****************************************************************************** * main ******************************************************************************/ @@ -396,7 +342,7 @@ static int parse_cmdline(int argc, char **argv, struct inject_rule *rule) return 0; } -int main(int argc, char **argv) +int inject_packet_main(int argc, char **argv) { if (parse_cmdline(argc, argv, &rule) != 0) { @@ -404,6 +350,10 @@ int main(int argc, char **argv) } stellar_update_time_cache(); + struct stellar st = {runtime}; + int sess_plug_id; + int tcp_topic_id; + int udp_topic_id; signal(SIGINT, signal_handler); signal(SIGQUIT, signal_handler); @@ -436,8 +386,7 @@ int main(int argc, char **argv) STELLAR_LOG_ERROR("unable to create stellar stat"); goto error_out; } - - runtime->plug_mgr = plugin_manager_new(); + runtime->plug_mgr = plugin_manager_init(&st, "./stellar_plugin/spec.toml"); if (runtime->plug_mgr == NULL) { STELLAR_LOG_ERROR("unable to create plugin manager"); @@ -451,6 +400,13 @@ int main(int argc, char **argv) goto error_out; } + sess_plug_id = stellar_session_plugin_register(&st, plugin_manager_new_ctx, plugin_manager_free_ctx, NULL); + tcp_topic_id = stellar_session_mq_get_topic_id(&st, TOPIC_TCP); + udp_topic_id = stellar_session_mq_get_topic_id(&st, TOPIC_UDP); + + stellar_session_mq_subscribe(&st, tcp_topic_id, inject_packet_plugin, sess_plug_id); + stellar_session_mq_subscribe(&st, udp_topic_id, inject_packet_plugin, sess_plug_id); + if (stellar_thread_init(runtime, config) != 0) { STELLAR_LOG_ERROR("unable to init thread context"); @@ -486,10 +442,15 @@ error_out: stellar_thread_join(runtime, config); stellar_thread_clean(runtime, config); packet_io_free(runtime->packet_io); - plugin_manager_free(runtime->plug_mgr); + plugin_manager_exit(runtime->plug_mgr); stellar_stat_free(runtime->stat); STELLAR_LOG_STATE("stellar exit !!!\n"); log_free(); return 0; +} + +int __attribute__((weak)) main(int argc, char **argv) +{ + return inject_packet_main(argc, argv); } \ No newline at end of file diff --git a/test/packet_injector_test_frame.cpp b/test/packet_injector_test_frame.cpp index b26e945..3e6840b 100644 --- a/test/packet_injector_test_frame.cpp +++ b/test/packet_injector_test_frame.cpp @@ -129,6 +129,17 @@ static void expect_cmp_inject(const char *work_dir, stat(diff_txt_file_abs_path, &s); EXPECT_TRUE(s.st_size == 0); } +extern int inject_packet_main(int argc, char **argv); + +static int args_len(const char **args) +{ + int i = 0; + while (args[i] != NULL) + { + i++; + } + return i; +} void packet_injector_test_frame_run(struct packet_injector_case *test) { @@ -176,8 +187,11 @@ void packet_injector_test_frame_run(struct packet_injector_case *test) EXPECT_TRUE(replace_file_string(config_file_abs_path, "dumpfile_dir = \"/tmp/dumpfile/\"", temp) == 0); // run packet injector - system_cmd("cd %s && %s && cd ..", test->work_dir, test->packet_injector_cmd); - + //system_cmd("cd %s && %s && cd ..", test->work_dir, test->packet_injector_cmd); + char cwd[1024]; + getcwd(cwd, sizeof(cwd)); + chdir(test->work_dir); + inject_packet_main(args_len(test->packet_injector_cmd),(char**)test->packet_injector_cmd); // compare pcap if (test->c2s_output_pcap && test->c2s_expect_pcap) { @@ -201,4 +215,5 @@ void packet_injector_test_frame_run(struct packet_injector_case *test) { system_cmd("rm -rf %s", test->work_dir); } + chdir(cwd); } diff --git a/test/packet_injector_test_frame.h b/test/packet_injector_test_frame.h index beb977e..a04dd90 100644 --- a/test/packet_injector_test_frame.h +++ b/test/packet_injector_test_frame.h @@ -27,7 +27,7 @@ struct packet_injector_case const char *s2c_output_pcap; // packet injector command - const char *packet_injector_cmd; + const char *packet_injector_cmd[16]; const char *diff_skip_pattern; };