From b07e19d18558cb79d0b24d6e9949486d2479f66d Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Thu, 6 Apr 2023 20:25:24 +0200 Subject: [PATCH] Properly report all states through NM FSM upon OML link up Change-Id: Ic3358629d17baab46f467a1ab82eea1837ad7390 --- include/osmo-bts/nm_common_fsm.h | 1 + src/common/bts.c | 30 +++++------------------------- src/common/bts_trx.c | 9 +++++---- src/common/nm_bb_transc_fsm.c | 12 ++++++++++++ src/common/nm_bts_fsm.c | 11 ++++------- src/common/nm_bts_sm_fsm.c | 5 +++-- src/common/nm_channel_fsm.c | 17 ++++++++++++++++- src/common/nm_common_fsm.c | 1 + src/common/nm_gprs_cell_fsm.c | 5 +++-- src/common/nm_gprs_nse_fsm.c | 5 +++-- src/common/nm_gprs_nsvc_fsm.c | 5 +++-- src/common/nm_radio_carrier_fsm.c | 10 ++++++++++ 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 4d444027e..2735edec3 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 1154c6a26..72c29f854 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) + /* 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. */ - 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. - */ - 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 089f2289c..251b67357 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 6fdddbef6..d42130a26 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 451530fa4..eeec8f851 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 01f5f992a..b6242fd9c 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 9e22feeaf..7bc896a6a 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 220ac7677..e7a2ffe83 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 aaebe5980..cc3ece660 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 fa9c6515e..42f30d83f 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 05d7ff16c..2b45fc475 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 0596a9c27..d7590bcf2 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) |