aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2021-11-13 21:44:11 +0100
committerHarald Welte <laforge@osmocom.org>2022-02-24 20:40:24 +0100
commit8fe920c19262f53b1f21a93887f787de6c30eb0f (patch)
treec859796db51e6bd3e45331864b32251eed510d75
parent218789e8338af397af755dd5bf0ec1fd3aaf67c3 (diff)
WIP: Add SCCP Unitdata load generation
-rw-r--r--examples/sccp_test_vty.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/examples/sccp_test_vty.c b/examples/sccp_test_vty.c
index 044ecf2..ee8f161 100644
--- a/examples/sccp_test_vty.c
+++ b/examples/sccp_test_vty.c
@@ -88,6 +88,74 @@ DEFUN(scu_unitdata_req, scu_unitdata_req_cmd,
return CMD_SUCCESS;
}
+struct load_test_ctx {
+ struct osmo_sccp_user *scu;
+ struct vty *vty;
+
+ struct osmo_timer_list timer;
+ char data[256];
+
+ unsigned int msu_size;
+ unsigned int total_num_msu;
+ unsigned int sent_msu;
+ unsigned int timer_interval_us;
+ struct timespec start_time;
+};
+
+static struct load_test_ctx g_ltc;
+
+static void load_test_timer_cb(void *ctx)
+{
+ struct vty *vty = g_ltc.vty;
+
+ osmo_sccp_tx_unitdata(g_ltc.scu, &g_calling_addr, &g_called_addr,
+ (const uint8_t *)g_ltc.data, g_ltc.msu_size);
+ g_ltc.sent_msu++;
+ if (g_ltc.sent_msu >= g_ltc.total_num_msu) {
+ struct timespec stop_time, expired_time;
+ float expired_timef;
+ osmo_clock_gettime(CLOCK_MONOTONIC, &stop_time);
+ timespecsub(&stop_time, &g_ltc.start_time, &expired_time);
+ expired_timef = expired_time.tv_sec;
+ expired_timef += (float) expired_time.tv_nsec / 1000000000.0f;
+
+ vty_out(vty, "SCCP Unitdata load test completed after %5.2f seconds (%5.2f MSU/s)%s",
+ expired_timef, g_ltc.sent_msu / expired_timef, VTY_NEWLINE);
+ return;
+ }
+ /* schedule for the next millisecond */
+ osmo_timer_schedule(&g_ltc.timer, 0, g_ltc.timer_interval_us);
+}
+
+DEFUN(scu_unitdata_load_test, scu_unitdata_load_test_cmd,
+ "unitdata-load-test msu-size <1-255> msu-count <1-4294967295> msu-per-second <1-1000000>",
+ "Run loadtest\n")
+{
+ struct osmo_sccp_user *scu = vty->index;
+ unsigned int msu_size = atoi(argv[0]);
+ unsigned int msu_count = atoi(argv[1]);
+ unsigned int msu_per_second = atoi(argv[2]);
+
+ if (osmo_timer_pending(&g_ltc.timer)) {
+ vty_out(vty, "Cannot start load test, it is alrady running%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ g_ltc.msu_size = msu_size;
+ g_ltc.total_num_msu = msu_count;
+ g_ltc.timer_interval_us = 1000000/msu_per_second;
+
+ g_ltc.scu = scu;
+ g_ltc.vty = vty;
+ g_ltc.sent_msu = 0;
+ osmo_timer_setup(&g_ltc.timer, load_test_timer_cb, NULL);
+ osmo_clock_gettime(CLOCK_MONOTONIC, &g_ltc.start_time);
+ load_test_timer_cb(NULL);
+ vty_out(vty, "SCCP Unitdata load test started%s", VTY_NEWLINE);
+
+ return CMD_SUCCESS;
+}
+
DEFUN(scu_disc_req, scu_disc_req_cmd,
"disconnect-req <0-16777216>",
"N-DISCONNT.req\n"
@@ -144,6 +212,7 @@ int sccp_test_user_vty_install(struct osmo_sccp_instance *inst, int ssn)
install_element(SCU_NODE, &scu_conn_resp_cmd);
install_element(SCU_NODE, &scu_data_req_cmd);
install_element(SCU_NODE, &scu_unitdata_req_cmd);
+ install_element(SCU_NODE, &scu_unitdata_load_test_cmd);
install_element(SCU_NODE, &scu_disc_req_cmd);
install_element(ENABLE_NODE, &scu_cmd);