osmo-bts/src/osmo-bts-virtual/virtualbts_vty.c

203 lines
5.5 KiB
C

/* VTY interface for virtual OsmoBTS */
/* (C) 2015-2017 by Harald Welte <laforge@gnumonks.org>
* (C) 2017 Sebastian Stumpf <sebastian.stumpf87@googlemail.com>
* 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 <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <stdint.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <osmocom/core/msgb.h>
#include <osmocom/core/talloc.h>
#include <osmocom/core/select.h>
#include <osmocom/core/rate_ctr.h>
#include <osmocom/gsm/tlv.h>
#include <osmocom/vty/vty.h>
#include <osmocom/vty/command.h>
#include <osmocom/vty/misc.h>
#include <osmo-bts/gsm_data.h>
#include <osmo-bts/phy_link.h>
#include <osmo-bts/logging.h>
#include <osmo-bts/vty.h>
#include "virtual_um.h"
#define TRX_STR "Transceiver related commands\n" "TRX number\n"
#define SHOW_TRX_STR \
SHOW_STR \
TRX_STR
void bts_model_config_write_bts(struct vty *vty, const struct gsm_bts *bts)
{
}
void bts_model_config_write_trx(struct vty *vty, const struct gsm_bts_trx *trx)
{
}
void bts_model_config_write_phy_inst(struct vty *vty, const struct phy_instance *pinst)
{
}
void bts_model_config_write_phy(struct vty *vty, const struct phy_link *plink)
{
if (plink->u.virt.mcast_dev)
vty_out(vty, " virtual-um net-device %s%s",
plink->u.virt.mcast_dev, VTY_NEWLINE);
if (plink->u.virt.ttl != -1)
vty_out(vty, " virtual-um ttl %d%s",
plink->u.virt.ttl, VTY_NEWLINE);
if (strcmp(plink->u.virt.ms_mcast_group, DEFAULT_BTS_MCAST_GROUP))
vty_out(vty, " virtual-um ms-multicast-group %s%s",
plink->u.virt.ms_mcast_group, VTY_NEWLINE);
if (plink->u.virt.ms_mcast_port != DEFAULT_BTS_MCAST_PORT)
vty_out(vty, " virtual-um ms-udp-port %u%s",
plink->u.virt.ms_mcast_port, VTY_NEWLINE);
if (strcmp(plink->u.virt.bts_mcast_group, DEFAULT_MS_MCAST_GROUP))
vty_out(vty, " virtual-um bts-multicast-group %s%s",
plink->u.virt.bts_mcast_group, VTY_NEWLINE);
if (plink->u.virt.bts_mcast_port != DEFAULT_MS_MCAST_PORT)
vty_out(vty, " virtual-um bts-udp-port %u%s",
plink->u.virt.bts_mcast_port, VTY_NEWLINE);
}
#define VUM_STR "Virtual Um layer\n"
DEFUN(cfg_phy_ms_mcast_group, cfg_phy_ms_mcast_group_cmd,
"virtual-um ms-multicast-group GROUP",
VUM_STR "Configure the MS multicast group\n")
{
struct phy_link *plink = vty->index;
if (plink->state != PHY_LINK_SHUTDOWN) {
vty_out(vty, "Can only reconfigure a PHY link that is down%s",
VTY_NEWLINE);
return CMD_WARNING;
}
osmo_talloc_replace_string(plink, &plink->u.virt.ms_mcast_group, argv[0]);
return CMD_SUCCESS;
}
DEFUN(cfg_phy_ms_mcast_port, cfg_phy_ms_mcast_port_cmd,
"virtual-um ms-udp-port <0-65535>",
VUM_STR "Configure the MS UDP port\n")
{
struct phy_link *plink = vty->index;
if (plink->state != PHY_LINK_SHUTDOWN) {
vty_out(vty, "Can only reconfigure a PHY link that is down%s",
VTY_NEWLINE);
return CMD_WARNING;
}
plink->u.virt.ms_mcast_port = atoi(argv[0]);
return CMD_SUCCESS;
}
DEFUN(cfg_phy_bts_mcast_group, cfg_phy_bts_mcast_group_cmd,
"virtual-um bts-multicast-group GROUP",
VUM_STR "Configure the BTS multicast group\n")
{
struct phy_link *plink = vty->index;
if (plink->state != PHY_LINK_SHUTDOWN) {
vty_out(vty, "Can only reconfigure a PHY link that is down%s",
VTY_NEWLINE);
return CMD_WARNING;
}
osmo_talloc_replace_string(plink, &plink->u.virt.bts_mcast_group, argv[0]);
return CMD_SUCCESS;
}
DEFUN(cfg_phy_bts_mcast_port, cfg_phy_bts_mcast_port_cmd,
"virtual-um bts-udp-port <0-65535>",
VUM_STR "Configure the BTS UDP port\n")
{
struct phy_link *plink = vty->index;
if (plink->state != PHY_LINK_SHUTDOWN) {
vty_out(vty, "Can only reconfigure a PHY link that is down%s",
VTY_NEWLINE);
return CMD_WARNING;
}
plink->u.virt.bts_mcast_port = atoi(argv[0]);
return CMD_SUCCESS;
}
DEFUN(cfg_phy_mcast_dev, cfg_phy_mcast_dev_cmd,
"virtual-um net-device NETDEV",
VUM_STR "Configure the network device\n")
{
struct phy_link *plink = vty->index;
if (plink->state != PHY_LINK_SHUTDOWN) {
vty_out(vty, "Can only reconfigure a PHY link that is down%s",
VTY_NEWLINE);
return CMD_WARNING;
}
osmo_talloc_replace_string(plink, &plink->u.virt.mcast_dev, argv[0]);
return CMD_SUCCESS;
}
DEFUN(cfg_phy_mcast_ttl, cfg_phy_mcast_ttl_cmd,
"virtual-um ttl <0-255>",
VUM_STR "Configure the TTL for transmitted multicast GSMTAP packets\n")
{
struct phy_link *plink = vty->index;
if (plink->state != PHY_LINK_SHUTDOWN) {
vty_out(vty, "Can only reconfigure a PHY link that is down%s",
VTY_NEWLINE);
return CMD_WARNING;
}
plink->u.virt.ttl = atoi(argv[0]);
return CMD_SUCCESS;
}
int bts_model_vty_init(void *ctx)
{
install_element(PHY_NODE, &cfg_phy_ms_mcast_group_cmd);
install_element(PHY_NODE, &cfg_phy_ms_mcast_port_cmd);
install_element(PHY_NODE, &cfg_phy_bts_mcast_group_cmd);
install_element(PHY_NODE, &cfg_phy_bts_mcast_port_cmd);
install_element(PHY_NODE, &cfg_phy_mcast_dev_cmd);
install_element(PHY_NODE, &cfg_phy_mcast_ttl_cmd);
return 0;
}