aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2023-04-06 20:25:24 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2023-04-11 11:16:21 +0200
commitb07e19d18558cb79d0b24d6e9949486d2479f66d (patch)
tree30e7fbfc5cdd38b6bf1343befb3075682b39a5d3
parentc3e059ce04b0654f7bcc79e16666708b69b04cdf (diff)
Properly report all states through NM FSM upon OML link up
-rw-r--r--include/osmo-bts/nm_common_fsm.h1
-rw-r--r--src/common/bts.c30
-rw-r--r--src/common/bts_trx.c9
-rw-r--r--src/common/nm_bb_transc_fsm.c12
-rw-r--r--src/common/nm_bts_fsm.c11
-rw-r--r--src/common/nm_bts_sm_fsm.c5
-rw-r--r--src/common/nm_channel_fsm.c17
-rw-r--r--src/common/nm_common_fsm.c1
-rw-r--r--src/common/nm_gprs_cell_fsm.c5
-rw-r--r--src/common/nm_gprs_nse_fsm.c5
-rw-r--r--src/common/nm_gprs_nsvc_fsm.c5
-rw-r--r--src/common/nm_radio_carrier_fsm.c10
12 files changed, 66 insertions, 45 deletions
diff --git a/include/osmo-bts/nm_common_fsm.h b/include/osmo-bts/nm_common_fsm.h
index 4d444027..2735edec 100644
--- a/include/osmo-bts/nm_common_fsm.h
+++ b/include/osmo-bts/nm_common_fsm.h
@@ -36,6 +36,7 @@ enum nm_fsm_events {
NM_EV_OPSTART_NACK,
NM_EV_SHUTDOWN_START,
NM_EV_SHUTDOWN_FINISH,
+ NM_EV_OML_UP,
NM_EV_RSL_UP, /* RadioCarrier and BaseBand Transceiver only */
NM_EV_RSL_DOWN, /* RadioCarrier and BaseBand Transceiver only */
NM_EV_PHYLINK_UP, /* RadioCarrier and BaseBand Transceiver only */
diff --git a/src/common/bts.c b/src/common/bts.c
index 1154c6a2..72c29f85 100644
--- a/src/common/bts.c
+++ b/src/common/bts.c
@@ -410,33 +410,13 @@ int bts_init(struct gsm_bts *bts)
/* main link is established, send status report */
int bts_link_estab(struct gsm_bts *bts)
{
- int i, j;
+ LOGP(DOML, LOGL_INFO, "Main link established, sending NM Status\n");
- LOGP(DOML, LOGL_INFO, "Main link established, sending NM Status.\n");
-
- /* BTS SITE MGR becomes Offline (tx SW ACT Report) and dispatches same
- * event to its children objects (except TRX level and below, see comment
- * below)
- */
- osmo_fsm_inst_dispatch(bts->site_mgr->mo.fi, NM_EV_SW_ACT, NULL);
-
- /* TRX objects are SW_ACTed by the lower layers (bts_model) when they
- * become available. Since that may happen before the OML link becomes
- * established, we need to manually trigger tx of state reports to the BSC
- * so it learns current state and can go on bringing them up.
+ /* Signal OML UP to BTS SITE MGR. It will automatically SW_ACT repoort
+ * and become Disabled-Offline, then dispatch same event to its children
+ * objects.
*/
- for (i = 0; i < bts->num_trx; i++) {
- struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, i);
-
- oml_tx_state_changed(&trx->mo);
- oml_tx_state_changed(&trx->bb_transc.mo);
-
- for (j = 0; j < ARRAY_SIZE(trx->ts); j++) {
- struct gsm_bts_trx_ts *ts = &trx->ts[j];
-
- oml_tx_state_changed(&ts->mo);
- }
- }
+ osmo_fsm_inst_dispatch(bts->site_mgr->mo.fi, NM_EV_OML_UP, NULL);
return bts_model_oml_estab(bts);
}
diff --git a/src/common/bts_trx.c b/src/common/bts_trx.c
index 089f2289..251b6735 100644
--- a/src/common/bts_trx.c
+++ b/src/common/bts_trx.c
@@ -84,6 +84,7 @@ static void gsm_bts_trx_init_ts(struct gsm_bts_trx *trx)
trx->bb_transc.mo.fi->id, ts->nr);
gsm_mo_init(&ts->mo, trx->bts, NM_OC_CHANNEL,
trx->bts->nr, trx->nr, ts->nr);
+ oml_mo_state_init(&ts->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);
gsm_bts_trx_ts_init_lchan(ts);
}
@@ -156,14 +157,14 @@ struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts)
trx->mo.fi = osmo_fsm_inst_alloc(&nm_rcarrier_fsm, trx, trx,
LOGL_INFO, NULL);
osmo_fsm_inst_update_id_f(trx->mo.fi, "bts%d-trx%d", bts->nr, trx->nr);
- gsm_mo_init(&trx->mo, bts, NM_OC_RADIO_CARRIER,
- bts->nr, trx->nr, 0xff);
+ gsm_mo_init(&trx->mo, bts, NM_OC_RADIO_CARRIER, bts->nr, trx->nr, 0xff);
+ oml_mo_state_init(&trx->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);
trx->bb_transc.mo.fi = osmo_fsm_inst_alloc(&nm_bb_transc_fsm, trx, &trx->bb_transc,
LOGL_INFO, NULL);
osmo_fsm_inst_update_id_f(trx->bb_transc.mo.fi, "bts%d-trx%d", bts->nr, trx->nr);
- gsm_mo_init(&trx->bb_transc.mo, bts, NM_OC_BASEB_TRANSC,
- bts->nr, trx->nr, 0xff);
+ gsm_mo_init(&trx->bb_transc.mo, bts, NM_OC_BASEB_TRANSC, bts->nr, trx->nr, 0xff);
+ oml_mo_state_init(&trx->bb_transc.mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);
gsm_bts_trx_init_ts(trx);
diff --git a/src/common/nm_bb_transc_fsm.c b/src/common/nm_bb_transc_fsm.c
index 6fdddbef..d42130a2 100644
--- a/src/common/nm_bb_transc_fsm.c
+++ b/src/common/nm_bb_transc_fsm.c
@@ -77,6 +77,11 @@ static void st_op_disabled_notinstalled(struct osmo_fsm_inst *fi, uint32_t event
nm_bb_transc_fsm_state_chg(fi, NM_BBTRANSC_ST_OP_DISABLED_OFFLINE);
ev_dispatch_children(bb_transc, event);
return;
+ case NM_EV_OML_UP:
+ /* Report current state: */
+ oml_tx_state_changed(&bb_transc->mo);
+ ev_dispatch_children(bb_transc, event);
+ return;
case NM_EV_RSL_UP:
return;
case NM_EV_RSL_DOWN:
@@ -120,6 +125,11 @@ static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, voi
int rc;
switch (event) {
+ case NM_EV_OML_UP:
+ /* Report current state: */
+ oml_tx_state_changed(&bb_transc->mo);
+ ev_dispatch_children(bb_transc, event);
+ return;
case NM_EV_RX_SETATTR:
setattr_data = (struct nm_fsm_ev_setattr_data *)data;
rc = bts_model_apply_oml(trx->bts, setattr_data->msg,
@@ -238,6 +248,7 @@ static struct osmo_fsm_state nm_bb_transc_fsm_states[] = {
[NM_BBTRANSC_ST_OP_DISABLED_NOTINSTALLED] = {
.in_event_mask =
X(NM_EV_SW_ACT) |
+ X(NM_EV_OML_UP) |
X(NM_EV_RSL_UP) |
X(NM_EV_RSL_DOWN) |
X(NM_EV_PHYLINK_UP) |
@@ -252,6 +263,7 @@ static struct osmo_fsm_state nm_bb_transc_fsm_states[] = {
},
[NM_BBTRANSC_ST_OP_DISABLED_OFFLINE] = {
.in_event_mask =
+ X(NM_EV_OML_UP) |
X(NM_EV_RX_SETATTR) |
X(NM_EV_RX_OPSTART) |
X(NM_EV_OPSTART_ACK) |
diff --git a/src/common/nm_bts_fsm.c b/src/common/nm_bts_fsm.c
index 451530fa..eeec8f85 100644
--- a/src/common/nm_bts_fsm.c
+++ b/src/common/nm_bts_fsm.c
@@ -76,7 +76,8 @@ static void st_op_disabled_notinstalled(struct osmo_fsm_inst *fi, uint32_t event
struct gsm_bts_trx *trx;
switch (event) {
- case NM_EV_SW_ACT:
+ case NM_EV_OML_UP:
+ /* automatic SW_ACT upon OML link establishment: */
oml_mo_tx_sw_act_rep(&bts->mo);
llist_for_each_entry(trx, &bts->trx_list, list) {
@@ -93,11 +94,7 @@ static void st_op_disabled_notinstalled(struct osmo_fsm_inst *fi, uint32_t event
}
nm_bts_fsm_state_chg(fi, NM_BTS_ST_OP_DISABLED_OFFLINE);
-
- /* Avoid submitting NM_EV_SW_ACT to children NM objects
- * (RCARRIER, BBTRANSC), the lower layers (bts_model) are in charge
- * of submitting them once the TRX becomes available
- */
+ ev_dispatch_children(bts, event);
return;
default:
OSMO_ASSERT(0);
@@ -181,7 +178,7 @@ static void nm_bts_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *data
static struct osmo_fsm_state nm_bts_fsm_states[] = {
[NM_BTS_ST_OP_DISABLED_NOTINSTALLED] = {
.in_event_mask =
- X(NM_EV_SW_ACT),
+ X(NM_EV_OML_UP),
.out_state_mask =
X(NM_BTS_ST_OP_DISABLED_NOTINSTALLED) |
X(NM_BTS_ST_OP_DISABLED_OFFLINE),
diff --git a/src/common/nm_bts_sm_fsm.c b/src/common/nm_bts_sm_fsm.c
index 01f5f992..b6242fd9 100644
--- a/src/common/nm_bts_sm_fsm.c
+++ b/src/common/nm_bts_sm_fsm.c
@@ -69,7 +69,8 @@ static void st_op_disabled_notinstalled(struct osmo_fsm_inst *fi, uint32_t event
struct gsm_bts_sm *site_mgr = (struct gsm_bts_sm *)fi->priv;
switch (event) {
- case NM_EV_SW_ACT:
+ case NM_EV_OML_UP:
+ /* automatic SW_ACT upon OML link establishment: */
oml_mo_tx_sw_act_rep(&site_mgr->mo);
nm_bts_sm_fsm_state_chg(fi, NM_BTS_SM_ST_OP_DISABLED_OFFLINE);
ev_dispatch_children(site_mgr, event);
@@ -160,7 +161,7 @@ static void nm_bts_sm_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *d
static struct osmo_fsm_state nm_bts_sm_fsm_states[] = {
[NM_BTS_SM_ST_OP_DISABLED_NOTINSTALLED] = {
.in_event_mask =
- X(NM_EV_SW_ACT),
+ X(NM_EV_OML_UP),
.out_state_mask =
X(NM_BTS_SM_ST_OP_DISABLED_NOTINSTALLED) |
X(NM_BTS_SM_ST_OP_DISABLED_OFFLINE),
diff --git a/src/common/nm_channel_fsm.c b/src/common/nm_channel_fsm.c
index 9e22feea..7bc896a6 100644
--- a/src/common/nm_channel_fsm.c
+++ b/src/common/nm_channel_fsm.c
@@ -71,6 +71,10 @@ static void st_op_disabled_notinstalled(struct osmo_fsm_inst *fi, uint32_t event
struct gsm_bts_trx_ts *ts = (struct gsm_bts_trx_ts *)fi->priv;
switch (event) {
+ case NM_EV_OML_UP:
+ /* Report current state: */
+ oml_tx_state_changed(&ts->mo);
+ return;
case NM_EV_SW_ACT:
oml_mo_tx_sw_act_rep(&ts->mo);
if (ts_can_be_enabled(ts))
@@ -97,6 +101,10 @@ static void st_op_disabled_dependency(struct osmo_fsm_inst *fi, uint32_t event,
int rc;
switch (event) {
+ case NM_EV_OML_UP:
+ /* Report current state: */
+ oml_tx_state_changed(&ts->mo);
+ return;
case NM_EV_RX_SETATTR:
setattr_data = (struct nm_fsm_ev_setattr_data *)data;
rc = bts_model_apply_oml(ts->trx->bts, setattr_data->msg,
@@ -150,6 +158,10 @@ static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, voi
int rc;
switch (event) {
+ case NM_EV_OML_UP:
+ /* Report current state: */
+ oml_tx_state_changed(&ts->mo);
+ return;
case NM_EV_RX_SETATTR:
setattr_data = (struct nm_fsm_ev_setattr_data *)data;
rc = bts_model_apply_oml(ts->trx->bts, setattr_data->msg,
@@ -227,7 +239,8 @@ static void nm_chan_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *dat
static struct osmo_fsm_state nm_chan_fsm_states[] = {
[NM_CHAN_ST_OP_DISABLED_NOTINSTALLED] = {
.in_event_mask =
- X(NM_EV_SW_ACT),
+ X(NM_EV_SW_ACT) |
+ X(NM_EV_OML_UP),
.out_state_mask =
X(NM_CHAN_ST_OP_DISABLED_NOTINSTALLED) |
X(NM_CHAN_ST_OP_DISABLED_OFFLINE) |
@@ -238,6 +251,7 @@ static struct osmo_fsm_state nm_chan_fsm_states[] = {
},
[NM_CHAN_ST_OP_DISABLED_DEPENDENCY] = {
.in_event_mask =
+ X(NM_EV_OML_UP) |
X(NM_EV_RX_SETATTR) |
X(NM_EV_RX_OPSTART) | /* backward compatibility, buggy BSC */
X(NM_EV_OPSTART_ACK) | /* backward compatibility, buggy BSC */
@@ -256,6 +270,7 @@ static struct osmo_fsm_state nm_chan_fsm_states[] = {
},
[NM_CHAN_ST_OP_DISABLED_OFFLINE] = {
.in_event_mask =
+ X(NM_EV_OML_UP) |
X(NM_EV_RX_SETATTR) |
X(NM_EV_RX_OPSTART) |
X(NM_EV_OPSTART_ACK) |
diff --git a/src/common/nm_common_fsm.c b/src/common/nm_common_fsm.c
index 220ac767..e7a2ffe8 100644
--- a/src/common/nm_common_fsm.c
+++ b/src/common/nm_common_fsm.c
@@ -31,6 +31,7 @@ const struct value_string nm_fsm_event_names[] = {
{ NM_EV_OPSTART_NACK, "OPSTART_NACK" },
{ NM_EV_SHUTDOWN_START, "SHUTDOWN_START" },
{ NM_EV_SHUTDOWN_FINISH, "SHUTDOWN_FINISH" },
+ { NM_EV_OML_UP, "OML_UP" },
{ NM_EV_RSL_UP, "RSL_UP" },
{ NM_EV_RSL_DOWN, "RSL_DOWN" },
{ NM_EV_PHYLINK_UP, "PHYLINK_UP" },
diff --git a/src/common/nm_gprs_cell_fsm.c b/src/common/nm_gprs_cell_fsm.c
index aaebe598..cc3ece66 100644
--- a/src/common/nm_gprs_cell_fsm.c
+++ b/src/common/nm_gprs_cell_fsm.c
@@ -68,7 +68,8 @@ static void st_op_disabled_notinstalled(struct osmo_fsm_inst *fi, uint32_t event
struct gsm_gprs_cell *cell = (struct gsm_gprs_cell *)fi->priv;
switch (event) {
- case NM_EV_SW_ACT:
+ case NM_EV_OML_UP:
+ /* automatic SW_ACT upon OML link establishment: */
oml_mo_tx_sw_act_rep(&cell->mo);
if (gprs_cell_can_be_enabled(cell))
nm_gprs_cell_fsm_state_chg(fi, NM_GPRS_CELL_ST_OP_DISABLED_OFFLINE);
@@ -196,7 +197,7 @@ static void nm_gprs_cell_allstate(struct osmo_fsm_inst *fi, uint32_t event, void
static struct osmo_fsm_state nm_gprs_cell_fsm_states[] = {
[NM_GPRS_CELL_ST_OP_DISABLED_NOTINSTALLED] = {
.in_event_mask =
- X(NM_EV_SW_ACT),
+ X(NM_EV_OML_UP),
.out_state_mask =
X(NM_GPRS_CELL_ST_OP_DISABLED_NOTINSTALLED) |
X(NM_GPRS_CELL_ST_OP_DISABLED_DEPENDENCY) |
diff --git a/src/common/nm_gprs_nse_fsm.c b/src/common/nm_gprs_nse_fsm.c
index fa9c6515..42f30d83 100644
--- a/src/common/nm_gprs_nse_fsm.c
+++ b/src/common/nm_gprs_nse_fsm.c
@@ -82,7 +82,8 @@ static void st_op_disabled_notinstalled(struct osmo_fsm_inst *fi, uint32_t event
struct gsm_gprs_nse *nse = (struct gsm_gprs_nse *)fi->priv;
switch (event) {
- case NM_EV_SW_ACT:
+ case NM_EV_OML_UP:
+ /* automatic SW_ACT upon OML link establishment: */
oml_mo_tx_sw_act_rep(&nse->mo);
ev_dispatch_children(nse, event);
if (nse_can_be_enabled(nse))
@@ -216,7 +217,7 @@ static void nm_gprs_nse_allstate(struct osmo_fsm_inst *fi, uint32_t event, void
static struct osmo_fsm_state nm_gprs_nse_fsm_states[] = {
[NM_GPRS_NSE_ST_OP_DISABLED_NOTINSTALLED] = {
.in_event_mask =
- X(NM_EV_SW_ACT),
+ X(NM_EV_OML_UP),
.out_state_mask =
X(NM_GPRS_NSE_ST_OP_DISABLED_NOTINSTALLED) |
X(NM_GPRS_NSE_ST_OP_DISABLED_DEPENDENCY) |
diff --git a/src/common/nm_gprs_nsvc_fsm.c b/src/common/nm_gprs_nsvc_fsm.c
index 05d7ff16..2b45fc47 100644
--- a/src/common/nm_gprs_nsvc_fsm.c
+++ b/src/common/nm_gprs_nsvc_fsm.c
@@ -67,7 +67,8 @@ static void st_op_disabled_notinstalled(struct osmo_fsm_inst *fi, uint32_t event
struct gsm_gprs_nsvc *nsvc = (struct gsm_gprs_nsvc *)fi->priv;
switch (event) {
- case NM_EV_SW_ACT:
+ case NM_EV_OML_UP:
+ /* automatic SW_ACT upon OML link establishment: */
oml_mo_tx_sw_act_rep(&nsvc->mo);
if (gprs_nsvc_can_be_enabled(nsvc))
nm_gprs_nsvc_fsm_state_chg(fi, NM_GPRS_NSVC_ST_OP_DISABLED_OFFLINE);
@@ -195,7 +196,7 @@ static void nm_gprs_nsvc_allstate(struct osmo_fsm_inst *fi, uint32_t event, void
static struct osmo_fsm_state nm_gprs_nsvc_fsm_states[] = {
[NM_GPRS_NSVC_ST_OP_DISABLED_NOTINSTALLED] = {
.in_event_mask =
- X(NM_EV_SW_ACT),
+ X(NM_EV_OML_UP),
.out_state_mask =
X(NM_GPRS_NSVC_ST_OP_DISABLED_NOTINSTALLED) |
X(NM_GPRS_NSVC_ST_OP_DISABLED_DEPENDENCY) |
diff --git a/src/common/nm_radio_carrier_fsm.c b/src/common/nm_radio_carrier_fsm.c
index 0596a9c2..d7590bcf 100644
--- a/src/common/nm_radio_carrier_fsm.c
+++ b/src/common/nm_radio_carrier_fsm.c
@@ -65,6 +65,10 @@ static void st_op_disabled_notinstalled(struct osmo_fsm_inst *fi, uint32_t event
oml_mo_tx_sw_act_rep(&trx->mo);
nm_rcarrier_fsm_state_chg(fi, NM_RCARRIER_ST_OP_DISABLED_OFFLINE);
return;
+ case NM_EV_OML_UP:
+ /* Report current state: */
+ oml_tx_state_changed(&trx->mo);
+ return;
case NM_EV_RSL_UP:
return;
case NM_EV_RSL_DOWN:
@@ -106,6 +110,10 @@ static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, voi
int rc;
switch (event) {
+ case NM_EV_OML_UP:
+ /* Report current state: */
+ oml_tx_state_changed(&trx->mo);
+ return;
case NM_EV_RX_SETATTR:
setattr_data = (struct nm_fsm_ev_setattr_data *)data;
rc = bts_model_apply_oml(trx->bts, setattr_data->msg,
@@ -214,6 +222,7 @@ static struct osmo_fsm_state nm_rcarrier_fsm_states[] = {
[NM_RCARRIER_ST_OP_DISABLED_NOTINSTALLED] = {
.in_event_mask =
X(NM_EV_SW_ACT) |
+ X(NM_EV_OML_UP) |
X(NM_EV_RSL_UP) |
X(NM_EV_RSL_DOWN) |
X(NM_EV_PHYLINK_UP) |
@@ -228,6 +237,7 @@ static struct osmo_fsm_state nm_rcarrier_fsm_states[] = {
},
[NM_RCARRIER_ST_OP_DISABLED_OFFLINE] = {
.in_event_mask =
+ X(NM_EV_OML_UP) |
X(NM_EV_RX_SETATTR) |
X(NM_EV_RX_OPSTART) |
X(NM_EV_OPSTART_ACK) |