aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2020-10-05 15:49:35 +0000
committerHarald Welte <laforge@osmocom.org>2020-10-05 18:23:06 +0200
commit90e0c205b5ff4e94c7705cc8f81ccb510c0eb6df (patch)
treeb51b97833e432b692e5df6b0759def93d1118150 /src
parent17de4e708f92f0f06ef0ffc4c248c80352861f42 (diff)
bts: Add VTY command to manually override Radio Link Timeout
There are some situations where it is useful to be able to change the Radio Link Timeout at runtime, without restarting the BTS. This adds a new (hidden) command for this: "bts <0-255> radio-link-timeout (oml|infinite|<4-64>)" Change-Id: I64674a432cf7751b16d5d0b52f66766fa6e37028
Diffstat (limited to 'src')
-rw-r--r--src/common/bts.c3
-rw-r--r--src/common/l1sap.c10
-rw-r--r--src/common/oml.c8
-rw-r--r--src/common/vty.c47
4 files changed, 60 insertions, 8 deletions
diff --git a/src/common/bts.c b/src/common/bts.c
index c900428c..c121609d 100644
--- a/src/common/bts.c
+++ b/src/common/bts.c
@@ -324,7 +324,8 @@ int bts_init(struct gsm_bts *bts)
bts->t200_ms[i] = oml_default_t200_ms[i];
/* default RADIO_LINK_TIMEOUT */
- bts->radio_link_timeout = 32;
+ bts->radio_link_timeout.oml = 32;
+ bts->radio_link_timeout.current = bts->radio_link_timeout.oml;
/* Start with the site manager */
oml_mo_state_init(&bts->site_mgr.mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK);
diff --git a/src/common/l1sap.c b/src/common/l1sap.c
index ca1949a8..c9ec9bf0 100644
--- a/src/common/l1sap.c
+++ b/src/common/l1sap.c
@@ -1173,7 +1173,7 @@ static void radio_link_timeout(struct gsm_lchan *lchan, bool bad_frame)
struct gsm_bts *bts = lchan->ts->trx->bts;
/* Bypass radio link timeout if set to -1 */
- if (bts->radio_link_timeout < 0)
+ if (bts->radio_link_timeout.current < 0)
return;
/* if link loss criterion already reached */
@@ -1197,11 +1197,11 @@ static void radio_link_timeout(struct gsm_lchan *lchan, bool bad_frame)
return;
}
- if (lchan->s < bts->radio_link_timeout) {
+ if (lchan->s < bts->radio_link_timeout.current) {
/* count up radio link counter S */
int s = lchan->s + 2;
- if (s > bts->radio_link_timeout)
- s = bts->radio_link_timeout;
+ if (s > bts->radio_link_timeout.current)
+ s = bts->radio_link_timeout.current;
LOGPLCHAN(lchan, DMEAS, LOGL_DEBUG,
"increasing radio link timeout counter S=%d -> %d\n",
lchan->s, s);
@@ -1750,7 +1750,7 @@ int l1sap_chan_act(struct gsm_bts_trx *trx, uint8_t chan_nr, struct tlv_parsed *
}
}
- lchan->s = lchan->ts->trx->bts->radio_link_timeout;
+ lchan->s = lchan->ts->trx->bts->radio_link_timeout.current;
rc = l1sap_chan_act_dact_modify(trx, chan_nr, PRIM_INFO_ACTIVATE, 0);
if (rc)
diff --git a/src/common/oml.c b/src/common/oml.c
index 14fc80f3..9fca0085 100644
--- a/src/common/oml.c
+++ b/src/common/oml.c
@@ -605,12 +605,16 @@ static int oml_rx_set_bts_attr(struct gsm_bts *bts, struct msgb *msg)
case 0xFF: /* Osmocom specific Extension of TS 12.21 */
LOGPFOH(DOML, LOGL_NOTICE, foh, "WARNING: Radio Link Timeout "
"explicitly disabled, only use this for lab testing!\n");
- bts->radio_link_timeout = -1;
+ bts->radio_link_timeout.oml = -1;
+ if (!bts->radio_link_timeout.vty_override)
+ bts->radio_link_timeout.current = bts->radio_link_timeout.oml;
break;
case 0x01: /* Based on uplink SACCH (radio link timeout) */
if (TLVP_LEN(&tp, NM_ATT_CONN_FAIL_CRIT) >= 2 &&
val[1] >= 4 && val[1] <= 64) {
- bts->radio_link_timeout = val[1];
+ bts->radio_link_timeout.oml = val[1];
+ if (!bts->radio_link_timeout.vty_override)
+ bts->radio_link_timeout.current = bts->radio_link_timeout.oml;
break;
}
/* fall-through */
diff --git a/src/common/vty.c b/src/common/vty.c
index b662320c..0d62a0e7 100644
--- a/src/common/vty.c
+++ b/src/common/vty.c
@@ -855,6 +855,16 @@ static void bts_dump_vty_features(struct vty *vty, const struct gsm_bts *bts)
vty_out(vty, " (not available)%s", VTY_NEWLINE);
}
+static const char *stringify_radio_link_timeout(int val)
+{
+ static char buf[32];
+ if (val == -1)
+ snprintf(buf, sizeof(buf), "%s", "infinite");
+ else
+ snprintf(buf, sizeof(buf), "%d SACCH blocks", val);
+ return buf;
+}
+
static void bts_dump_vty(struct vty *vty, const struct gsm_bts *bts)
{
const struct gsm_bts_trx *trx;
@@ -902,6 +912,12 @@ static void bts_dump_vty(struct vty *vty, const struct gsm_bts *bts)
bts->oml_link ? "connected" : "disconnected", VTY_NEWLINE);
vty_out(vty, " PH-RTS.ind FN advance average: %d, min: %d, max: %d%s",
bts_get_avg_fn_advance(bts), bts->fn_stats.min, bts->fn_stats.max, VTY_NEWLINE);
+ vty_out(vty, " Radio Link Timeout (OML): %s%s",
+ stringify_radio_link_timeout(bts->radio_link_timeout.oml), VTY_NEWLINE);
+ if (bts->radio_link_timeout.vty_override) {
+ vty_out(vty, " Radio Link Timeout (OVERRIDE): %s%s",
+ stringify_radio_link_timeout(bts->radio_link_timeout.current), VTY_NEWLINE);
+ }
llist_for_each_entry(trx, &bts->trx_list, list) {
const struct phy_instance *pinst = trx_phy_instance(trx);
@@ -963,6 +979,36 @@ DEFUN(test_send_failure_event_report, test_send_failure_event_report_cmd, "test
return CMD_SUCCESS;
}
+DEFUN_HIDDEN(radio_link_timeout, radio_link_timeout_cmd, "bts <0-0> radio-link-timeout (oml|infinite|<4-64>)",
+ "BTS Specific Commands\n" BTS_NR_STR "Manually override Radio Link Timeout\n"
+ "Use value provided by BSC via A-bis OML (Connection Failure Criterion)\n"
+ "Use infinite timeout (DANGEROUS: only use during testing!)\n"
+ "Number of lost SACCH blocks\n")
+{
+ const struct gsm_network *net = gsmnet_from_vty(vty);
+ int bts_nr = atoi(argv[0]);
+ struct gsm_bts *bts = gsm_bts_num(net, bts_nr);
+
+ if (!bts) {
+ vty_out(vty, "%% can't find BTS '%s'%s", argv[0], VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ if (!strcmp(argv[1], "oml")) {
+ bts->radio_link_timeout.current = bts->radio_link_timeout.oml;
+ bts->radio_link_timeout.vty_override = false;
+ } else if (!strcmp(argv[1], "infinite")) {
+ bts->radio_link_timeout.current = -1;
+ bts->radio_link_timeout.vty_override = true;
+ vty_out(vty, "%% INFINITE RADIO LINK TIMEOUT, USE ONLY FOR BTS RF TESTING%s", VTY_NEWLINE);
+ } else {
+ bts->radio_link_timeout.current = atoi(argv[1]);
+ bts->radio_link_timeout.vty_override = true;
+ }
+
+ return CMD_SUCCESS;
+}
+
static void trx_dump_vty(struct vty *vty, const struct gsm_bts_trx *trx)
{
vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",
@@ -1756,6 +1802,7 @@ int bts_vty_init(struct gsm_bts *bts)
install_element(ENABLE_NODE, &bts_t_t_l_loopback_cmd);
install_element(ENABLE_NODE, &no_bts_t_t_l_loopback_cmd);
install_element(ENABLE_NODE, &test_send_failure_event_report_cmd);
+ install_element(ENABLE_NODE, &radio_link_timeout_cmd);
install_element(CONFIG_NODE, &cfg_phy_cmd);
install_node(&phy_node, config_write_phy);