osmo-bsc/src/osmo-bsc/gsm_timers_vty.c

118 lines
3.3 KiB
C

/* 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);
}
}