aboutsummaryrefslogtreecommitdiffstats
path: root/src/osmo-bsc/gsm_timers_vty.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osmo-bsc/gsm_timers_vty.c')
-rw-r--r--src/osmo-bsc/gsm_timers_vty.c117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/osmo-bsc/gsm_timers_vty.c b/src/osmo-bsc/gsm_timers_vty.c
new file mode 100644
index 0000000..8a13259
--- /dev/null
+++ b/src/osmo-bsc/gsm_timers_vty.c
@@ -0,0 +1,117 @@
+/* Implementation to configure Tnnn timers in VTY */
+/* (C) 2018 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+ *
+ * Author: Neels Hofmeyr <neels@hofmeyr.de>
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <string.h>
+
+#include <osmocom/vty/vty.h>
+#include <osmocom/vty/command.h>
+
+#include <osmocom/bsc/gsm_timers.h>
+
+/* Global singleton list used for the VTY configuration. See T_defs_vty_init(). */
+static struct T_def *g_vty_T_defs = NULL;
+
+/* Parse an argument like "T1234", "t1234" or "1234" and return the corresponding T_def entry from
+ * g_vty_T_defs, if any. */
+static struct T_def *parse_T_arg(struct vty *vty, const char *T_str)
+{
+ int T;
+ struct T_def *d;
+
+ if (T_str[0] == 't' || T_str[0] == 'T')
+ T_str++;
+ T = atoi(T_str);
+
+ d = T_def_get_entry(g_vty_T_defs, T);
+ if (!d)
+ vty_out(vty, "No such timer: T%d%s", T, VTY_NEWLINE);
+ return d;
+}
+
+/* Installed in the VTY on T_defs_vty_init(). */
+DEFUN(cfg_timer, cfg_timer_cmd,
+ "timer TNNNN (default|<1-65535>)",
+ "Configure GSM Timers\n"
+ "T-number, optionally preceded by 't' or 'T'."
+ "See also 'show timer' for a list of available timers.\n"
+ "Set to default timer value\n" "Timer value\n")
+{
+ const char *val_str = argv[1];
+ struct T_def *d;
+
+ d = parse_T_arg(vty, argv[0]);
+ if (!d)
+ return CMD_WARNING;
+
+ if (!strcmp(val_str, "default"))
+ d->val = d->default_val;
+ else
+ d->val = atoi(val_str);
+ vty_out(vty, "T%d = %u %s (%s)%s", d->T, d->val, T_unit_name(d->unit), d->desc, VTY_NEWLINE);
+ return CMD_SUCCESS;
+}
+
+/* Print a T_def to the VTY. */
+static void show_one_timer(struct vty *vty, struct T_def *d)
+{
+ vty_out(vty, "T%d = %u %s (default = %u %s) \t%s%s",
+ d->T, d->val, T_unit_name(d->unit),
+ d->default_val, T_unit_name(d->unit), d->desc, VTY_NEWLINE);
+}
+
+/* Installed in the VTY on T_defs_vty_init(). */
+DEFUN(show_timer, show_timer_cmd,
+ "show timer [TNNNN]",
+ SHOW_STR "GSM Timers\n"
+ "Specific timer to show, or all timers if omitted.\n")
+{
+ struct T_def *d;
+
+ if (argc) {
+ d = parse_T_arg(vty, argv[0]);
+ if (!d)
+ return CMD_WARNING;
+ show_one_timer(vty, d);
+ return CMD_SUCCESS;
+ }
+
+ for_each_T_def(d, g_vty_T_defs)
+ show_one_timer(vty, d);
+ return CMD_SUCCESS;
+}
+
+/* Install GSM timer configuration commands in the VTY. */
+void T_defs_vty_init(struct T_def *T_defs, int cfg_parent_node)
+{
+ install_element_ve(&show_timer_cmd);
+ install_element(cfg_parent_node, &cfg_timer_cmd);
+}
+
+/* Write GSM timer configuration to the vty. */
+void T_defs_vty_write(struct vty *vty, const char *indent)
+{
+ struct T_def *d;
+ for_each_T_def(d, g_vty_T_defs) {
+ if (d->val != d->default_val)
+ vty_out(vty, "%stimer t%d %u%s", indent, d->T, d->val, VTY_NEWLINE);
+ }
+}