/* (C) 2018-2019 by sysmocom s.f.m.c. GmbH
* All Rights Reserved
*
* Author: Harald Welte, Philipp Maier
*
* 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 .
*
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
struct cmd_node cfg_sgs_node = {
CFG_SGS_NODE,
"%s(config-sgs)# ",
1
};
DEFUN(cfg_sgs, cfg_sgs_cmd,
"sgs",
"Configure the SGs interface\n")
{
vty->index = g_sgs;
vty->node = CFG_SGS_NODE;
return CMD_SUCCESS;
}
DEFUN(cfg_sgs_local_ip, cfg_sgs_local_ip_cmd,
"local-ip A.B.C.D",
"Set the Local IP Address of the SGs interface\n"
"Local IP Address of the SGs interface\n")
{
struct sgs_state *sgs = vty->index;
int rc;
osmo_strlcpy(sgs->cfg.local_addr, argv[0], sizeof(sgs->cfg.local_addr));
osmo_stream_srv_link_set_addr(sgs->srv_link, sgs->cfg.local_addr);
if (vty->type != VTY_FILE) {
rc = sgs_server_open(sgs);
if (rc < 0)
return CMD_WARNING;
}
return CMD_SUCCESS;
}
DEFUN(cfg_sgs_local_port, cfg_sgs_local_port_cmd,
"local-port <0-65535>",
"Set the local SCTP port of the SGs interface\n"
"Local SCTP port of the SGs interface\n")
{
struct sgs_state *sgs = vty->index;
int rc;
sgs->cfg.local_port = atoi(argv[0]);
osmo_stream_srv_link_set_port(sgs->srv_link, sgs->cfg.local_port);
if (vty->type != VTY_FILE) {
rc = sgs_server_open(sgs);
if (rc < 0)
return CMD_WARNING;
}
return CMD_SUCCESS;
}
DEFUN(cfg_sgs_vlr_name, cfg_sgs_vlr_name_cmd,
"vlr-name FQDN",
"Set the SGs VLR Name as per TS 29.118 9.4.22\n"
"Fully-Qualified Domain Name of this VLR\n")
{
struct sgs_state *sgs = vty->index;
osmo_strlcpy(sgs->cfg.vlr_name, argv[0], sizeof(sgs->cfg.vlr_name));
return CMD_SUCCESS;
}
DEFUN(cfg_sgs_timer, cfg_sgs_timer_cmd,
"timer (ts5|ts6-2|ts7|ts11|ts14|ts15) <1-120>",
"Configure SGs Timer\n"
"Paging procedure guard timer\n"
"TMSI reallocation guard timer\n"
"Non-EPS alert procedure guard timer\n"
"VLR reset guard timer\n"
"UE fallback prcoedure timer\n"
"MO UE fallback procedure guard timer\n"
"Time in seconds\n")
{
struct sgs_state *sgs = vty->index;
unsigned int i;
for (i = 0; i < ARRAY_SIZE(sgs->cfg.timer); i++) {
if (!strcasecmp(argv[0], vlr_sgs_state_timer_name(i))) {
sgs->cfg.timer[i] = atoi(argv[1]);
return CMD_SUCCESS;
}
}
return CMD_WARNING;
}
DEFUN(cfg_sgs_counter, cfg_sgs_counter_cmd,
"counter (ns7|ns11) <0-255>",
"Configure SGs Counter\n"
"Non-EPS alert request retry counter\n"
"VLR reset retry counter\n" "Counter value\n")
{
struct sgs_state *sgs = vty->index;
unsigned int i = 0;
for (i = 0; i < ARRAY_SIZE(sgs->cfg.counter); i++) {
if (!strcasecmp(argv[0], vlr_sgs_state_counter_name(i))) {
sgs->cfg.counter[i] = atoi(argv[1]);
return CMD_SUCCESS;
}
}
return CMD_WARNING;
}
DEFUN(show_sgs_conn, show_sgs_conn_cmd,
"show sgs-connections", SHOW_STR
"Show SGs interface connections / MMEs\n")
{
struct sgs_connection *sgc;
llist_for_each_entry(sgc, &g_sgs->conn_list, entry) {
vty_out(vty, " %s %s%s", sgc->sockname, sgc->mme ? sgc->mme->fqdn : "", VTY_NEWLINE);
}
return CMD_SUCCESS;
}
static int config_write_sgs(struct vty *vty)
{
struct sgs_state *sgs = g_sgs;
unsigned int i;
char str_buf[256];
vty_out(vty, "sgs%s", VTY_NEWLINE);
vty_out(vty, " local-port %u%s", sgs->cfg.local_port, VTY_NEWLINE);
vty_out(vty, " local-ip %s%s", sgs->cfg.local_addr, VTY_NEWLINE);
vty_out(vty, " vlr-name %s%s", sgs->cfg.vlr_name, VTY_NEWLINE);
for (i = 0; i < ARRAY_SIZE(sgs->cfg.timer); i++) {
if (sgs->cfg.timer[i] == sgs_state_timer_defaults[i])
continue;
osmo_str_tolower_buf(str_buf, sizeof(str_buf), vlr_sgs_state_timer_name(i));
vty_out(vty, " timer %s %u%s", str_buf, sgs->cfg.timer[i], VTY_NEWLINE);
}
for (i = 0; i < ARRAY_SIZE(sgs->cfg.counter); i++) {
if (sgs->cfg.counter[i] == sgs_state_counter_defaults[i])
continue;
osmo_str_tolower_buf(str_buf, sizeof(str_buf), vlr_sgs_state_counter_name(i));
vty_out(vty, " counter %s %u%s", str_buf, sgs->cfg.counter[i], VTY_NEWLINE);
}
return CMD_SUCCESS;
}
void sgs_vty_init(void)
{
/* configuration commands / nodes */
install_element(CONFIG_NODE, &cfg_sgs_cmd);
install_node(&cfg_sgs_node, config_write_sgs);
install_element(CFG_SGS_NODE, &cfg_sgs_local_ip_cmd);
install_element(CFG_SGS_NODE, &cfg_sgs_local_port_cmd);
install_element(CFG_SGS_NODE, &cfg_sgs_timer_cmd);
install_element(CFG_SGS_NODE, &cfg_sgs_counter_cmd);
install_element(CFG_SGS_NODE, &cfg_sgs_vlr_name_cmd);
install_element_ve(&show_sgs_conn_cmd);
}