summaryrefslogtreecommitdiffstats
path: root/openbsc/src/libmsc
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-06-12 01:52:27 +0200
committerHarald Welte <laforge@gnumonks.org>2017-07-10 18:27:32 +0000
commit9244d110b8ae66b2691f9879ee0b6a0cbe113bae (patch)
treec14446e2789728e8e07e52f0b50b2f00422e240a /openbsc/src/libmsc
parent7cb44209eac4651d5fc65e07f74bc5325f110ea4 (diff)
Add VTY commands for experimentation with TS 04.14 commands
TS 04.14 (TS 44.014) specifies a series of commands specific to conformance testing. Let's add some VTY commands to play (at least initially) with closing and opening voice loops in the MS. Change-Id: I38b1ee9dbf26f5689c38cb83b1b3c5e9eaad7678
Diffstat (limited to 'openbsc/src/libmsc')
-rw-r--r--openbsc/src/libmsc/vty_interface_layer3.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/openbsc/src/libmsc/vty_interface_layer3.c b/openbsc/src/libmsc/vty_interface_layer3.c
index 042da9c5a..4a99cf19e 100644
--- a/openbsc/src/libmsc/vty_interface_layer3.c
+++ b/openbsc/src/libmsc/vty_interface_layer3.c
@@ -47,6 +47,7 @@
#include <openbsc/debug.h>
#include <openbsc/vty.h>
#include <openbsc/gsm_04_80.h>
+#include <openbsc/gsm_04_14.h>
#include <openbsc/chan_alloc.h>
#include <openbsc/sms_queue.h>
#include <openbsc/mncc_int.h>
@@ -482,6 +483,97 @@ DEFUN(subscriber_ussd_notify,
return CMD_SUCCESS;
}
+static int loop_by_char(uint8_t ch)
+{
+ switch (ch) {
+ case 'a':
+ return GSM414_LOOP_A;
+ case 'b':
+ return GSM414_LOOP_B;
+ case 'c':
+ return GSM414_LOOP_C;
+ case 'd':
+ return GSM414_LOOP_D;
+ case 'e':
+ return GSM414_LOOP_E;
+ case 'f':
+ return GSM414_LOOP_F;
+ case 'i':
+ return GSM414_LOOP_I;
+ }
+ return -1;
+}
+
+DEFUN(subscriber_mstest_close,
+ subscriber_mstest_close_cmd,
+ "subscriber " SUBSCR_TYPES " ID ms-test close-loop (a|b|c|d|e|f|i)",
+ SUBSCR_HELP "Send a TS 04.14 MS Test Command to subscriber\n"
+ "Close a TCH Loop inside the MS\n"
+ "Loop Type A\n"
+ "Loop Type B\n"
+ "Loop Type C\n"
+ "Loop Type D\n"
+ "Loop Type E\n"
+ "Loop Type F\n"
+ "Loop Type I\n")
+{
+ struct gsm_subscriber_connection *conn;
+ struct gsm_network *gsmnet = gsmnet_from_vty(vty);
+ struct gsm_subscriber *subscr = get_subscr_by_argv(gsmnet, argv[0], argv[1]);
+ const char *loop_str;
+ int loop_mode;
+
+ if (!subscr) {
+ vty_out(vty, "%% No subscriber found for %s %s%s",
+ argv[0], argv[1], VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ loop_str = argv[2];
+ loop_mode = loop_by_char(loop_str[0]);
+
+ conn = connection_for_subscr(subscr);
+ if (!conn) {
+ vty_out(vty, "%% An active connection is required for %s %s%s",
+ argv[0], argv[1], VTY_NEWLINE);
+ subscr_put(subscr);
+ return CMD_WARNING;
+ }
+
+ gsm0414_tx_close_tch_loop_cmd(conn, loop_mode);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(subscriber_mstest_open,
+ subscriber_mstest_open_cmd,
+ "subscriber " SUBSCR_TYPES " ID ms-test open-loop",
+ SUBSCR_HELP "Send a TS 04.14 MS Test Command to subscriber\n"
+ "Open a TCH Loop inside the MS\n")
+{
+ struct gsm_subscriber_connection *conn;
+ struct gsm_network *gsmnet = gsmnet_from_vty(vty);
+ struct gsm_subscriber *subscr = get_subscr_by_argv(gsmnet, argv[0], argv[1]);
+
+ if (!subscr) {
+ vty_out(vty, "%% No subscriber found for %s %s%s",
+ argv[0], argv[1], VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ conn = connection_for_subscr(subscr);
+ if (!conn) {
+ vty_out(vty, "%% An active connection is required for %s %s%s",
+ argv[0], argv[1], VTY_NEWLINE);
+ subscr_put(subscr);
+ return CMD_WARNING;
+ }
+
+ gsm0414_tx_open_loop_cmd(conn);
+
+ return CMD_SUCCESS;
+}
+
DEFUN(ena_subscr_delete,
ena_subscr_delete_cmd,
"subscriber " SUBSCR_TYPES " ID delete",
@@ -1166,6 +1258,8 @@ int bsc_vty_init_extra(void)
install_element_ve(&subscriber_silent_call_start_cmd);
install_element_ve(&subscriber_silent_call_stop_cmd);
install_element_ve(&subscriber_ussd_notify_cmd);
+ install_element_ve(&subscriber_mstest_close_cmd);
+ install_element_ve(&subscriber_mstest_open_cmd);
install_element_ve(&subscriber_update_cmd);
install_element_ve(&show_stats_cmd);
install_element_ve(&show_smsqueue_cmd);