aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMax <msuraev@sysmocom.de>2017-10-09 17:12:53 +0200
committerMax <msuraev@sysmocom.de>2017-10-09 18:42:15 +0200
commit3d049d27f5ab8d1b51bf02e752349df83774066c (patch)
treeecd4f4c64a1a699a4c7eb5c8e4148eb50c1e505e /src
parent081cebaa6ddf3abebb93025c7eb430f0c9844016 (diff)
OML: consider RSL link state
OML link state is available via vty ("sh bts 0" command) and ctrl ("oml-connection-state" RO variable). When showing OML link state, take into consideration RSL link state as well: if OML is up but RSL is missing show it as degraded. That's implemented via BTS model-specific functions (currently Sysmo- and Nano- BTS only) Change-Id: I5952fc59e4d82e0aa627ad91d20f964d9559a4c4 Related: OS#2486
Diffstat (limited to 'src')
-rw-r--r--src/libbsc/abis_nm.c28
-rw-r--r--src/libbsc/bsc_ctrl_commands.c5
-rw-r--r--src/libbsc/bsc_init.c1
-rw-r--r--src/libbsc/bsc_vty.c6
-rw-r--r--src/libbsc/bts_ipaccess_nanobts.c1
5 files changed, 35 insertions, 6 deletions
diff --git a/src/libbsc/abis_nm.c b/src/libbsc/abis_nm.c
index 9567cfa3a..f0dfe9e79 100644
--- a/src/libbsc/abis_nm.c
+++ b/src/libbsc/abis_nm.c
@@ -683,6 +683,34 @@ static int abis_nm_rx_lmt_event(struct msgb *mb)
return 0;
}
+static inline bool all_trx_rsl_connected(const struct gsm_bts *bts)
+{
+ const struct gsm_bts_trx *trx;
+
+ llist_for_each_entry(trx, &bts->trx_list, list) {
+ if (!trx->rsl_link)
+ return false;
+ }
+
+ return true;
+}
+
+char *get_oml_status(const struct gsm_bts *bts)
+{
+ if (bts->oml_link)
+ return all_trx_rsl_connected(bts) ? "connected" : "degraded";
+
+ return "disconnected";
+}
+
+char *get_model_oml_status(const struct gsm_bts *bts)
+{
+ if (bts->model->oml_status)
+ return bts->model->oml_status(bts);
+
+ return "unknown";
+}
+
void abis_nm_queue_send_next(struct gsm_bts *bts)
{
int wait = 0;
diff --git a/src/libbsc/bsc_ctrl_commands.c b/src/libbsc/bsc_ctrl_commands.c
index 7c2bfb5bd..d925e67e7 100644
--- a/src/libbsc/bsc_ctrl_commands.c
+++ b/src/libbsc/bsc_ctrl_commands.c
@@ -231,9 +231,10 @@ CTRL_CMD_DEFINE_RO(bts_chan_load, "channel-load");
static int get_bts_oml_conn(struct ctrl_cmd *cmd, void *data)
{
- struct gsm_bts *bts = cmd->node;
+ const struct gsm_bts *bts = cmd->node;
+
+ cmd->reply = get_model_oml_status(bts);
- cmd->reply = bts->oml_link ? "connected" : "disconnected";
return CTRL_CMD_REPLY;
}
diff --git a/src/libbsc/bsc_init.c b/src/libbsc/bsc_init.c
index f3e13e2d7..f5f265f14 100644
--- a/src/libbsc/bsc_init.c
+++ b/src/libbsc/bsc_init.c
@@ -38,6 +38,7 @@
#include <osmocom/bsc/common_bsc.h>
#include <osmocom/bsc/pcu_if.h>
#include <limits.h>
+#include <stdbool.h>
/* global pointer to the gsm network data structure */
extern struct gsm_network *bsc_gsmnet;
diff --git a/src/libbsc/bsc_vty.c b/src/libbsc/bsc_vty.c
index f1c78c8d8..43cb282a4 100644
--- a/src/libbsc/bsc_vty.c
+++ b/src/libbsc/bsc_vty.c
@@ -308,9 +308,8 @@ static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
paging_pending_requests_nr(bts),
bts->paging.available_slots, VTY_NEWLINE);
if (is_ipaccess_bts(bts)) {
- vty_out(vty, " OML Link state: ");
+ vty_out(vty, " OML Link state: %s", get_model_oml_status(bts));
if (bts->oml_link) {
- vty_out(vty, "connected");
if (bts->uptime) {
rc = clock_gettime(CLOCK_MONOTONIC, &tp);
if (rc == 0) { /* monotonic clock helps to ensure that conversion below is valid */
@@ -320,8 +319,7 @@ static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
sec % 60, VTY_NEWLINE);
}
}
- } else
- vty_out(vty, "disconnected.%s", VTY_NEWLINE);
+ }
} else {
vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
e1isl_dump_vty(vty, bts->oml_link);
diff --git a/src/libbsc/bts_ipaccess_nanobts.c b/src/libbsc/bts_ipaccess_nanobts.c
index 87ec7b2c0..dbb0e4ff1 100644
--- a/src/libbsc/bts_ipaccess_nanobts.c
+++ b/src/libbsc/bts_ipaccess_nanobts.c
@@ -52,6 +52,7 @@ struct gsm_bts_model bts_model_nanobts = {
.name = "nanobts",
.start = bts_model_nanobts_start,
.oml_rcvmsg = &abis_nm_rcvmsg,
+ .oml_status = &get_oml_status,
.e1line_bind_ops = bts_model_nanobts_e1line_bind_ops,
.nm_att_tlvdef = {
.def = {