2011-07-05 10:21:27 +00:00
|
|
|
/* VTY interface for sysmoBTS */
|
|
|
|
|
|
|
|
/* (C) 2011 by Harald Welte <laforge@gnumonks.org>
|
2012-05-12 06:38:00 +00:00
|
|
|
* (C) 2012 by Holger Hans Peter Freyther
|
2011-07-05 10:21:27 +00:00
|
|
|
*
|
|
|
|
* 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>
|
2011-09-19 18:46:51 +00:00
|
|
|
#include <ctype.h>
|
2011-07-05 10:21:27 +00:00
|
|
|
|
|
|
|
#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 <osmo-bts/gsm_data.h>
|
|
|
|
#include <osmo-bts/logging.h>
|
2011-10-12 11:36:22 +00:00
|
|
|
#include <osmo-bts/vty.h>
|
2011-07-05 10:21:27 +00:00
|
|
|
|
|
|
|
#include "femtobts.h"
|
|
|
|
#include "l1_if.h"
|
|
|
|
|
2012-04-19 17:47:55 +00:00
|
|
|
#define TRX_STR "Transceiver related commands\n" "TRX number\n"
|
|
|
|
|
2011-09-09 12:10:57 +00:00
|
|
|
#define SHOW_TRX_STR \
|
|
|
|
SHOW_STR \
|
2012-04-19 17:47:55 +00:00
|
|
|
TRX_STR
|
2012-07-25 11:18:28 +00:00
|
|
|
#define DSP_TRACE_F_STR "DSP Trace Flag\n"
|
|
|
|
#define DO_LOWER 1
|
2011-09-09 12:10:57 +00:00
|
|
|
|
2011-07-05 10:21:27 +00:00
|
|
|
static struct gsm_bts *vty_bts;
|
|
|
|
|
|
|
|
/* This generates the logging command string for VTY. */
|
|
|
|
const char *vty_cmd_string_from_valstr(const struct value_string *vals,
|
2012-07-25 11:18:28 +00:00
|
|
|
const char *prefix, const char *sep,
|
|
|
|
const char *end, int do_lower)
|
2011-07-05 10:21:27 +00:00
|
|
|
{
|
2011-09-09 12:10:57 +00:00
|
|
|
int len = 0, offset = 0, ret, rem;
|
2011-07-05 10:21:27 +00:00
|
|
|
int size = strlen(prefix);
|
|
|
|
const struct value_string *vs;
|
|
|
|
char *str;
|
|
|
|
|
|
|
|
for (vs = vals; vs->value || vs->str; vs++)
|
|
|
|
size += strlen(vs->str) + 1;
|
|
|
|
|
|
|
|
rem = size;
|
|
|
|
str = talloc_zero_size(vty_bts, size);
|
|
|
|
if (!str)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
ret = snprintf(str + offset, rem, prefix);
|
|
|
|
if (ret < 0)
|
|
|
|
goto err;
|
|
|
|
OSMO_SNPRINTF_RET(ret, rem, offset, len);
|
|
|
|
|
|
|
|
for (vs = vals; vs->value || vs->str; vs++) {
|
|
|
|
if (vs->str) {
|
|
|
|
int j, name_len = strlen(vs->str)+1;
|
|
|
|
char name[name_len];
|
|
|
|
|
|
|
|
for (j = 0; j < name_len; j++)
|
2012-07-25 11:18:28 +00:00
|
|
|
name[j] = do_lower ?
|
|
|
|
tolower(vs->str[j]) : vs->str[j];
|
2011-07-05 10:21:27 +00:00
|
|
|
|
|
|
|
name[name_len-1] = '\0';
|
2012-07-25 11:18:28 +00:00
|
|
|
ret = snprintf(str + offset, rem, "%s%s", name, sep);
|
2011-07-05 10:21:27 +00:00
|
|
|
if (ret < 0)
|
|
|
|
goto err;
|
|
|
|
OSMO_SNPRINTF_RET(ret, rem, offset, len);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
offset--; /* to remove the trailing | */
|
|
|
|
rem++;
|
|
|
|
|
2012-07-25 11:18:28 +00:00
|
|
|
ret = snprintf(str + offset, rem, end);
|
2011-07-05 10:21:27 +00:00
|
|
|
if (ret < 0)
|
|
|
|
goto err;
|
|
|
|
OSMO_SNPRINTF_RET(ret, rem, offset, len);
|
|
|
|
err:
|
|
|
|
str[size-1] = '\0';
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
2011-10-12 11:36:22 +00:00
|
|
|
/* configuration */
|
|
|
|
|
2012-03-18 22:24:12 +00:00
|
|
|
DEFUN(cfg_trx_gsmtap_sapi, cfg_trx_gsmtap_sapi_cmd,
|
|
|
|
"HIDDEN", "HIDDEN")
|
|
|
|
{
|
|
|
|
struct gsm_bts_trx *trx = vty->index;
|
|
|
|
struct femtol1_hdl *fl1h = trx_femtol1_hdl(trx);
|
|
|
|
int sapi;
|
|
|
|
|
2012-07-05 13:29:25 +00:00
|
|
|
sapi = get_string_value(femtobts_l1sapi_names, argv[0]);
|
2012-03-18 22:24:12 +00:00
|
|
|
|
|
|
|
fl1h->gsmtap_sapi_mask |= (1 << sapi);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN(cfg_trx_no_gsmtap_sapi, cfg_trx_no_gsmtap_sapi_cmd,
|
|
|
|
"HIDDEN", "HIDDEN")
|
|
|
|
{
|
|
|
|
struct gsm_bts_trx *trx = vty->index;
|
|
|
|
struct femtol1_hdl *fl1h = trx_femtol1_hdl(trx);
|
|
|
|
int sapi;
|
|
|
|
|
2012-07-05 13:29:25 +00:00
|
|
|
sapi = get_string_value(femtobts_l1sapi_names, argv[0]);
|
2012-03-18 22:24:12 +00:00
|
|
|
|
|
|
|
fl1h->gsmtap_sapi_mask &= ~(1 << sapi);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2011-10-12 11:36:22 +00:00
|
|
|
DEFUN(cfg_trx_clkcal_def, cfg_trx_clkcal_def_cmd,
|
|
|
|
"clock-calibration default",
|
|
|
|
"Set the clock calibration value\n" "Default Clock DAC value\n")
|
|
|
|
{
|
|
|
|
struct gsm_bts_trx *trx = vty->index;
|
|
|
|
struct femtol1_hdl *fl1h = trx_femtol1_hdl(trx);
|
|
|
|
|
|
|
|
fl1h->clk_cal = 0xffff;
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2012-06-05 07:22:11 +00:00
|
|
|
#ifdef HW_SYSMOBTS_V1
|
2011-10-12 11:36:22 +00:00
|
|
|
DEFUN(cfg_trx_clkcal, cfg_trx_clkcal_cmd,
|
|
|
|
"clock-calibration <0-4095>",
|
|
|
|
"Set the clock calibration value\n" "Clock DAC value\n")
|
|
|
|
{
|
|
|
|
unsigned int clkcal = atoi(argv[0]);
|
|
|
|
struct gsm_bts_trx *trx = vty->index;
|
|
|
|
struct femtol1_hdl *fl1h = trx_femtol1_hdl(trx);
|
|
|
|
|
2011-11-07 13:02:02 +00:00
|
|
|
fl1h->clk_cal = clkcal & 0xfff;
|
2011-10-12 11:36:22 +00:00
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
2012-06-05 07:22:11 +00:00
|
|
|
#else
|
|
|
|
DEFUN(cfg_trx_clkcal, cfg_trx_clkcal_cmd,
|
|
|
|
"clock-calibration <-4095-4095>",
|
|
|
|
"Set the clock calibration value\n" "Offset in PPB\n")
|
|
|
|
{
|
|
|
|
int clkcal = atoi(argv[0]);
|
|
|
|
struct gsm_bts_trx *trx = vty->index;
|
|
|
|
struct femtol1_hdl *fl1h = trx_femtol1_hdl(trx);
|
|
|
|
|
|
|
|
fl1h->clk_cal = clkcal;
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
#endif
|
2011-10-12 11:36:22 +00:00
|
|
|
|
2012-03-17 13:08:51 +00:00
|
|
|
DEFUN(cfg_trx_clksrc, cfg_trx_clksrc_cmd,
|
|
|
|
"clock-source (tcxo|ocxo|ext|gps)",
|
2012-05-12 06:48:50 +00:00
|
|
|
"Set the clock source value\n"
|
|
|
|
"Use the TCXO\n"
|
|
|
|
"Use the OCXO\n"
|
|
|
|
"Use an external clock\n"
|
|
|
|
"Use the GPS pps\n")
|
2012-03-17 13:08:51 +00:00
|
|
|
{
|
|
|
|
struct gsm_bts_trx *trx = vty->index;
|
|
|
|
struct femtol1_hdl *fl1h = trx_femtol1_hdl(trx);
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
rc = get_string_value(femtobts_clksrc_names, argv[0]);
|
|
|
|
if (rc < 0)
|
|
|
|
return CMD_WARNING;
|
|
|
|
|
|
|
|
fl1h->clk_src = rc;
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2011-10-12 11:36:22 +00:00
|
|
|
/* runtime */
|
2011-07-05 10:21:27 +00:00
|
|
|
|
2012-03-17 13:08:51 +00:00
|
|
|
DEFUN(show_trx_clksrc, show_trx_clksrc_cmd,
|
|
|
|
"show trx <0-0> clock-source",
|
|
|
|
SHOW_TRX_STR "Display the clock source for this TRX")
|
|
|
|
{
|
|
|
|
int trx_nr = atoi(argv[0]);
|
|
|
|
struct gsm_bts_trx *trx = gsm_bts_trx_num(vty_bts, trx_nr);
|
|
|
|
struct femtol1_hdl *fl1h;
|
|
|
|
|
|
|
|
if (!trx)
|
|
|
|
return CMD_WARNING;
|
|
|
|
|
|
|
|
fl1h = trx_femtol1_hdl(trx);
|
|
|
|
|
|
|
|
vty_out(vty, "TRX Clock Source: %s%s",
|
|
|
|
get_value_string(femtobts_clksrc_names, fl1h->clk_src),
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2011-07-05 10:21:27 +00:00
|
|
|
DEFUN(show_dsp_trace_f, show_dsp_trace_f_cmd,
|
|
|
|
"show trx <0-0> dsp-trace-flags",
|
2011-09-09 12:10:57 +00:00
|
|
|
SHOW_TRX_STR "Display the current setting of the DSP trace flags")
|
2011-07-05 10:21:27 +00:00
|
|
|
{
|
|
|
|
int trx_nr = atoi(argv[0]);
|
|
|
|
struct gsm_bts_trx *trx = gsm_bts_trx_num(vty_bts, trx_nr);
|
|
|
|
struct femtol1_hdl *fl1h;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (!trx)
|
|
|
|
return CMD_WARNING;
|
|
|
|
|
|
|
|
fl1h = trx_femtol1_hdl(trx);
|
|
|
|
|
|
|
|
vty_out(vty, "Femto L1 DSP trace flags:%s", VTY_NEWLINE);
|
|
|
|
for (i = 0; i < ARRAY_SIZE(femtobts_tracef_names); i++) {
|
|
|
|
const char *endis;
|
|
|
|
|
|
|
|
if (femtobts_tracef_names[i].value == 0 &&
|
|
|
|
femtobts_tracef_names[i].str == NULL)
|
|
|
|
break;
|
|
|
|
|
|
|
|
if (fl1h->dsp_trace_f & femtobts_tracef_names[i].value)
|
|
|
|
endis = "enabled";
|
|
|
|
else
|
|
|
|
endis = "disabled";
|
|
|
|
|
|
|
|
vty_out(vty, "DSP Trace %-15s %s%s",
|
|
|
|
femtobts_tracef_names[i].str, endis,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2012-04-19 17:47:55 +00:00
|
|
|
DEFUN(dsp_trace_f, dsp_trace_f_cmd, "HIDDEN", TRX_STR)
|
2011-07-05 10:21:27 +00:00
|
|
|
{
|
|
|
|
int trx_nr = atoi(argv[0]);
|
|
|
|
struct gsm_bts_trx *trx = gsm_bts_trx_num(vty_bts, trx_nr);
|
|
|
|
struct femtol1_hdl *fl1h;
|
|
|
|
unsigned int flag ;
|
|
|
|
|
|
|
|
if (!trx) {
|
|
|
|
vty_out(vty, "Cannot find TRX number %u%s",
|
|
|
|
trx_nr, VTY_NEWLINE);
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
|
|
|
|
fl1h = trx_femtol1_hdl(trx);
|
|
|
|
flag = get_string_value(femtobts_tracef_names, argv[1]);
|
|
|
|
l1if_set_trace_flags(fl1h, fl1h->dsp_trace_f | flag);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2012-04-19 17:47:55 +00:00
|
|
|
DEFUN(no_dsp_trace_f, no_dsp_trace_f_cmd, "HIDDEN", NO_STR TRX_STR)
|
2011-07-05 10:21:27 +00:00
|
|
|
{
|
|
|
|
int trx_nr = atoi(argv[0]);
|
|
|
|
struct gsm_bts_trx *trx = gsm_bts_trx_num(vty_bts, trx_nr);
|
|
|
|
struct femtol1_hdl *fl1h;
|
|
|
|
unsigned int flag ;
|
|
|
|
|
|
|
|
if (!trx) {
|
|
|
|
vty_out(vty, "Cannot find TRX number %u%s",
|
|
|
|
trx_nr, VTY_NEWLINE);
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
|
|
|
|
fl1h = trx_femtol1_hdl(trx);
|
|
|
|
flag = get_string_value(femtobts_tracef_names, argv[1]);
|
|
|
|
l1if_set_trace_flags(fl1h, fl1h->dsp_trace_f & ~flag);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2011-09-09 12:10:57 +00:00
|
|
|
DEFUN(show_sys_info, show_sys_info_cmd,
|
|
|
|
"show trx <0-0> system-information",
|
|
|
|
SHOW_TRX_STR "Display information about system\n")
|
|
|
|
{
|
|
|
|
int trx_nr = atoi(argv[0]);
|
|
|
|
struct gsm_bts_trx *trx = gsm_bts_trx_num(vty_bts, trx_nr);
|
|
|
|
struct femtol1_hdl *fl1h;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (!trx) {
|
|
|
|
vty_out(vty, "Cannot find TRX number %u%s",
|
|
|
|
trx_nr, VTY_NEWLINE);
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
fl1h = trx_femtol1_hdl(trx);
|
|
|
|
|
|
|
|
vty_out(vty, "DSP Version: %u.%u.%u, FPGA Version: %u.%u.%u%s",
|
|
|
|
fl1h->hw_info.dsp_version[0],
|
|
|
|
fl1h->hw_info.dsp_version[1],
|
|
|
|
fl1h->hw_info.dsp_version[2],
|
|
|
|
fl1h->hw_info.fpga_version[0],
|
|
|
|
fl1h->hw_info.fpga_version[1],
|
|
|
|
fl1h->hw_info.fpga_version[2], VTY_NEWLINE);
|
|
|
|
|
|
|
|
vty_out(vty, "GSM Band Support: ");
|
2012-04-13 23:03:28 +00:00
|
|
|
for (i = 0; i < sizeof(fl1h->hw_info.band_support); i++) {
|
2011-09-09 12:10:57 +00:00
|
|
|
if (fl1h->hw_info.band_support & (1 << i))
|
|
|
|
vty_out(vty, "%s ", gsm_band_name(1 << i));
|
|
|
|
}
|
|
|
|
vty_out(vty, "%s", VTY_NEWLINE);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2012-04-19 17:22:53 +00:00
|
|
|
DEFUN(activate_lchan, activate_lchan_cmd,
|
|
|
|
"trx <0-0> <0-7> (activate|deactivate) <0-7>",
|
2012-04-19 17:47:55 +00:00
|
|
|
TRX_STR
|
2012-04-19 17:22:53 +00:00
|
|
|
"Timeslot number\n"
|
2012-04-19 17:47:55 +00:00
|
|
|
"Activate Logical Channel\n"
|
|
|
|
"Deactivate Logical Channel\n"
|
2012-04-19 17:22:53 +00:00
|
|
|
"Logical Channel Number\n" )
|
|
|
|
{
|
|
|
|
int trx_nr = atoi(argv[0]);
|
|
|
|
int ts_nr = atoi(argv[1]);
|
|
|
|
int lchan_nr = atoi(argv[3]);
|
|
|
|
struct gsm_bts_trx *trx = gsm_bts_trx_num(vty_bts, trx_nr);
|
|
|
|
struct gsm_bts_trx_ts *ts = &trx->ts[ts_nr];
|
|
|
|
struct gsm_lchan *lchan = &ts->lchan[lchan_nr];
|
|
|
|
|
|
|
|
if (!strcmp(argv[2], "activate"))
|
|
|
|
lchan_activate(lchan);
|
|
|
|
else
|
|
|
|
lchan_deactivate(lchan);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2012-04-19 18:19:21 +00:00
|
|
|
DEFUN(set_tx_power, set_tx_power_cmd,
|
|
|
|
"trx <0-0> tx-power <-110-23>",
|
|
|
|
TRX_STR
|
|
|
|
"Set transmit power (override BSC)\n"
|
|
|
|
"Transmit power in dBm\n")
|
|
|
|
{
|
|
|
|
int trx_nr = atoi(argv[0]);
|
|
|
|
int power = atoi(argv[1]);
|
|
|
|
struct gsm_bts_trx *trx = gsm_bts_trx_num(vty_bts, trx_nr);
|
|
|
|
struct femtol1_hdl *fl1h = trx_femtol1_hdl(trx);
|
|
|
|
|
|
|
|
l1if_set_txpower(fl1h, (float) power);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2012-04-19 20:29:07 +00:00
|
|
|
DEFUN(loopback, loopback_cmd,
|
|
|
|
"trx <0-0> <0-7> loopback <0-1>",
|
|
|
|
TRX_STR
|
|
|
|
"Timeslot number\n"
|
|
|
|
"Set TCH loopback\n"
|
|
|
|
"Logical Channel Number\n")
|
|
|
|
{
|
|
|
|
int trx_nr = atoi(argv[0]);
|
|
|
|
int ts_nr = atoi(argv[1]);
|
|
|
|
int lchan_nr = atoi(argv[2]);
|
|
|
|
struct gsm_bts_trx *trx = gsm_bts_trx_num(vty_bts, trx_nr);
|
|
|
|
struct gsm_bts_trx_ts *ts = &trx->ts[ts_nr];
|
|
|
|
struct gsm_lchan *lchan = &ts->lchan[lchan_nr];
|
|
|
|
|
|
|
|
lchan->loopback = 1;
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN(no_loopback, no_loopback_cmd,
|
|
|
|
"no trx <0-0> <0-7> loopback <0-1>",
|
|
|
|
NO_STR TRX_STR
|
|
|
|
"Timeslot number\n"
|
|
|
|
"Set TCH loopback\n"
|
|
|
|
"Logical Channel Number\n")
|
|
|
|
{
|
|
|
|
int trx_nr = atoi(argv[0]);
|
|
|
|
int ts_nr = atoi(argv[1]);
|
|
|
|
int lchan_nr = atoi(argv[2]);
|
|
|
|
struct gsm_bts_trx *trx = gsm_bts_trx_num(vty_bts, trx_nr);
|
|
|
|
struct gsm_bts_trx_ts *ts = &trx->ts[ts_nr];
|
|
|
|
struct gsm_lchan *lchan = &ts->lchan[lchan_nr];
|
|
|
|
|
|
|
|
lchan->loopback = 0;
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-10-12 11:36:22 +00:00
|
|
|
void bts_model_config_write_bts(struct vty *vty, struct gsm_bts *bts)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2012-07-05 13:29:25 +00:00
|
|
|
/* FIXME: move to libosmocore ? */
|
|
|
|
static char buf_casecnvt[256];
|
|
|
|
char *osmo_str_tolower(const char *in)
|
|
|
|
{
|
|
|
|
int len, i;
|
|
|
|
|
|
|
|
if (!in)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
len = strlen(in);
|
|
|
|
if (len > sizeof(buf_casecnvt))
|
|
|
|
len = sizeof(buf_casecnvt);
|
|
|
|
|
|
|
|
for (i = 0; i < len; i++) {
|
|
|
|
buf_casecnvt[i] = tolower(in[i]);
|
|
|
|
if (in[i] == '\0')
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (i < sizeof(buf_casecnvt))
|
|
|
|
buf_casecnvt[i] = '\0';
|
|
|
|
|
|
|
|
/* just to make sure we're always zero-terminated */
|
|
|
|
buf_casecnvt[sizeof(buf_casecnvt)-1] = '\0';
|
|
|
|
|
|
|
|
return buf_casecnvt;
|
|
|
|
}
|
|
|
|
|
2011-10-12 11:36:22 +00:00
|
|
|
void bts_model_config_write_trx(struct vty *vty, struct gsm_bts_trx *trx)
|
|
|
|
{
|
|
|
|
struct femtol1_hdl *fl1h = trx_femtol1_hdl(trx);
|
2012-07-05 13:29:25 +00:00
|
|
|
int i;
|
2011-10-12 11:36:22 +00:00
|
|
|
|
2012-06-05 07:22:11 +00:00
|
|
|
vty_out(vty, " clock-calibration %d%s", fl1h->clk_cal,
|
2011-10-12 11:36:22 +00:00
|
|
|
VTY_NEWLINE);
|
2012-05-12 06:38:00 +00:00
|
|
|
vty_out(vty, " clock-source %s%s",
|
|
|
|
get_value_string(femtobts_clksrc_names, fl1h->clk_src),
|
|
|
|
VTY_NEWLINE);
|
2012-07-05 13:29:25 +00:00
|
|
|
|
|
|
|
for (i = 0; i < 32; i++) {
|
|
|
|
if (fl1h->gsmtap_sapi_mask & (1 << i)) {
|
|
|
|
const char *name = get_value_string(femtobts_l1sapi_names, i);
|
|
|
|
vty_out(vty, " gsmtap-sapi %s%s", osmo_str_tolower(name),
|
|
|
|
VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
}
|
2011-10-12 11:36:22 +00:00
|
|
|
}
|
2011-07-05 10:21:27 +00:00
|
|
|
|
2011-09-19 18:46:51 +00:00
|
|
|
int bts_model_vty_init(struct gsm_bts *bts)
|
2011-07-05 10:21:27 +00:00
|
|
|
{
|
|
|
|
vty_bts = bts;
|
|
|
|
|
|
|
|
/* runtime-patch the command strings with debug levels */
|
|
|
|
dsp_trace_f_cmd.string = vty_cmd_string_from_valstr(femtobts_tracef_names,
|
2012-07-25 11:18:28 +00:00
|
|
|
"trx <0-0> dsp-trace-flag (",
|
|
|
|
"|",")", DO_LOWER);
|
|
|
|
dsp_trace_f_cmd.doc = vty_cmd_string_from_valstr(femtobts_tracef_docs,
|
|
|
|
TRX_STR DSP_TRACE_F_STR,
|
|
|
|
"\n", "", 0);
|
|
|
|
|
2011-07-05 10:21:27 +00:00
|
|
|
no_dsp_trace_f_cmd.string = vty_cmd_string_from_valstr(femtobts_tracef_names,
|
2012-07-25 11:18:28 +00:00
|
|
|
"no trx <0-0> dsp-trace-flag (",
|
|
|
|
"|",")", DO_LOWER);
|
|
|
|
no_dsp_trace_f_cmd.doc = vty_cmd_string_from_valstr(femtobts_tracef_docs,
|
|
|
|
NO_STR TRX_STR DSP_TRACE_F_STR,
|
|
|
|
"\n", "", 0);
|
|
|
|
|
2012-03-18 22:24:12 +00:00
|
|
|
cfg_trx_gsmtap_sapi_cmd.string = vty_cmd_string_from_valstr(femtobts_l1sapi_names,
|
2012-07-25 11:18:28 +00:00
|
|
|
"gsmtap-sapi (",
|
|
|
|
"|",")", DO_LOWER);
|
|
|
|
cfg_trx_gsmtap_sapi_cmd.doc = vty_cmd_string_from_valstr(femtobts_l1sapi_names,
|
|
|
|
"GSMTAP SAPI\n",
|
|
|
|
"\n", "", 0);
|
|
|
|
|
2012-03-18 22:24:12 +00:00
|
|
|
cfg_trx_no_gsmtap_sapi_cmd.string = vty_cmd_string_from_valstr(femtobts_l1sapi_names,
|
2012-07-25 11:18:28 +00:00
|
|
|
"no gsmtap-sapi (",
|
|
|
|
"|",")", DO_LOWER);
|
|
|
|
cfg_trx_no_gsmtap_sapi_cmd.doc = vty_cmd_string_from_valstr(femtobts_l1sapi_names,
|
|
|
|
NO_STR "GSMTAP SAPI\n",
|
|
|
|
"\n", "", 0);
|
2011-07-05 10:21:27 +00:00
|
|
|
|
|
|
|
install_element_ve(&show_dsp_trace_f_cmd);
|
2011-09-09 12:10:57 +00:00
|
|
|
install_element_ve(&show_sys_info_cmd);
|
2012-03-17 13:08:51 +00:00
|
|
|
install_element_ve(&show_trx_clksrc_cmd);
|
2011-07-05 10:21:27 +00:00
|
|
|
install_element_ve(&dsp_trace_f_cmd);
|
|
|
|
install_element_ve(&no_dsp_trace_f_cmd);
|
|
|
|
|
2012-04-19 17:22:53 +00:00
|
|
|
install_element(ENABLE_NODE, &activate_lchan_cmd);
|
2012-04-19 18:19:21 +00:00
|
|
|
install_element(ENABLE_NODE, &set_tx_power_cmd);
|
2012-04-19 17:22:53 +00:00
|
|
|
|
2012-04-19 20:29:07 +00:00
|
|
|
install_element(ENABLE_NODE, &loopback_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_loopback_cmd);
|
|
|
|
|
2011-10-12 11:36:22 +00:00
|
|
|
install_element(TRX_NODE, &cfg_trx_clkcal_cmd);
|
|
|
|
install_element(TRX_NODE, &cfg_trx_clkcal_def_cmd);
|
2012-03-17 13:08:51 +00:00
|
|
|
install_element(TRX_NODE, &cfg_trx_clksrc_cmd);
|
2012-03-18 22:24:12 +00:00
|
|
|
install_element(TRX_NODE, &cfg_trx_gsmtap_sapi_cmd);
|
|
|
|
install_element(TRX_NODE, &cfg_trx_no_gsmtap_sapi_cmd);
|
2011-10-12 11:36:22 +00:00
|
|
|
|
2011-07-05 10:21:27 +00:00
|
|
|
return 0;
|
|
|
|
}
|