aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmo-bts/bts.h6
-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
5 files changed, 65 insertions, 9 deletions
diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h
index ffaeb577..ccbcf9a0 100644
--- a/include/osmo-bts/bts.h
+++ b/include/osmo-bts/bts.h
@@ -283,7 +283,11 @@ struct gsm_bts {
} fn_stats;
/* Radio Link Timeout counter. -1 disables timeout for
* lab/measurement purpose */
- int radio_link_timeout;
+ struct {
+ int oml; /* value communicated by BSC in OML */
+ int current; /* actual currently applied value */
+ bool vty_override; /* OML value overridden by VTY */
+ } radio_link_timeout;
int ul_power_target; /* Uplink Rx power target */
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);