summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryangwei <[email protected]>2024-05-17 19:57:22 +0800
committeryangwei <[email protected]>2024-05-17 00:00:59 +0800
commit92f2088400aa9548014bbf749aee22d30e218d2e (patch)
treedb2d0bcc66da7ec20d97a42bcf51fb41c1cc2482
parent13d9d10f8317608fe55d9a671d97aaa4d58a70ad (diff)
🧪 test(packet injector test): upgrade plugin managerFeature-plugin-manager
-rw-r--r--test/CMakeLists.txt2
-rw-r--r--test/gtest_inject_tcp_rst.cpp6
-rw-r--r--test/packet_injector.cpp99
-rw-r--r--test/packet_injector_test_frame.cpp19
-rw-r--r--test/packet_injector_test_frame.h2
5 files changed, 53 insertions, 75 deletions
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 05edaac..5542957 100644
--- a/test/gtest_inject_tcp_rst.cpp
+++ b/test/gtest_inject_tcp_rst.cpp
@@ -26,7 +26,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",
};
@@ -58,7 +58,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",
};
@@ -90,7 +90,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 d174fa0..a95da0b 100644
--- a/test/packet_injector.cpp
+++ b/test/packet_injector.cpp
@@ -9,6 +9,7 @@
#include "logo.h"
#include "config.h"
+#include "stellar/session_mq.h"
#include "timestamp.h"
#include "id_generator.h"
#include "stellar_priv.h"
@@ -49,26 +50,28 @@ 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)
{
+ struct inject_rule *p_rule = &rule;
+ struct packet *pkt=(struct packet *)msg;
const struct tuple6 *tuple = session_get_tuple6(sess);
- if (rule->ip_type == 4 && memcmp(&tuple->src_addr.v4, &rule->v4, sizeof(struct in_addr)) && memcmp(&tuple->dst_addr.v4, &rule->v4, sizeof(struct in_addr)))
+ if (p_rule->ip_type == 4 && memcmp(&tuple->src_addr.v4, &p_rule->v4, sizeof(struct in_addr)) && memcmp(&tuple->dst_addr.v4, &p_rule->v4, sizeof(struct in_addr)))
{
return;
}
- if (rule->ip_type == 6 && memcmp(&tuple->src_addr.v6, &rule->v6, sizeof(struct in6_addr)) && memcmp(&tuple->dst_addr.v6, &rule->v6, sizeof(struct in6_addr)))
+ if (p_rule->ip_type == 6 && memcmp(&tuple->src_addr.v6, &p_rule->v6, sizeof(struct in6_addr)) && memcmp(&tuple->dst_addr.v6, &p_rule->v6, sizeof(struct in6_addr)))
{
return;
}
- if (rule->port != 0 && tuple->src_port != rule->port && tuple->dst_port != rule->port)
+ if (p_rule->port != 0 && tuple->src_port != p_rule->port && tuple->dst_port != p_rule->port)
{
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;
}
@@ -76,7 +79,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);
@@ -106,73 +109,19 @@ 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_manager_new_ctx(struct session *sess, void *plugin_env)
{
- 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
******************************************************************************/
@@ -370,7 +319,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)
{
@@ -378,6 +327,9 @@ int main(int argc, char **argv)
}
timestamp_update();
+ struct stellar st={runtime};
+ int sess_plug_id;
+ int tcp_topic_id, udp_topic_id;
signal(SIGINT, signal_handler);
signal(SIGQUIT, signal_handler);
@@ -410,8 +362,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");
@@ -425,6 +376,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");
@@ -459,10 +417,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 3a8e98c..ee03f07 100644
--- a/test/packet_injector_test_frame.cpp
+++ b/test/packet_injector_test_frame.cpp
@@ -133,6 +133,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)
{
@@ -175,8 +186,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)
{
@@ -200,4 +214,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 ade3f30..60c3ee9 100644
--- a/test/packet_injector_test_frame.h
+++ b/test/packet_injector_test_frame.h
@@ -28,7 +28,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;
};