pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-bts/+/32211 )
Change subject: nm: Apply OPSTART through NM FSMs
......................................................................
nm: Apply OPSTART through NM FSMs
This way we have further control on how to handle the OPSTART messages
received. For instance, NACK them if the NM object FSMs are not at the
expected correct state.
Related: OS#5992
Change-Id: I5df0bfb4cc812c11c7a00a8ffa882ae1915d562f
---
M include/osmo-bts/nm_common_fsm.h
M src/common/nm_bb_transc_fsm.c
M src/common/nm_bts_fsm.c
M src/common/nm_bts_sm_fsm.c
M src/common/nm_channel_fsm.c
M src/common/nm_common_fsm.c
M src/common/nm_radio_carrier_fsm.c
M src/common/oml.c
8 files changed, 56 insertions(+), 6 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/11/32211/1
diff --git a/include/osmo-bts/nm_common_fsm.h b/include/osmo-bts/nm_common_fsm.h
index 8861a93..f785e1d 100644
--- a/include/osmo-bts/nm_common_fsm.h
+++ b/include/osmo-bts/nm_common_fsm.h
@@ -31,6 +31,7 @@
enum nm_fsm_events {
NM_EV_SW_ACT,
NM_EV_RX_SETATTR, /* data: struct nm_fsm_ev_setattr_data */
+ NM_EV_RX_OPSTART,
NM_EV_OPSTART_ACK,
NM_EV_OPSTART_NACK,
NM_EV_SHUTDOWN_START,
diff --git a/src/common/nm_bb_transc_fsm.c b/src/common/nm_bb_transc_fsm.c
index 3d6b4e6..4853a94 100644
--- a/src/common/nm_bb_transc_fsm.c
+++ b/src/common/nm_bb_transc_fsm.c
@@ -134,6 +134,9 @@
((struct abis_om_fom_hdr *)msgb_l3(setattr_data->msg))->msg_type,
rc);
break;
+ case NM_EV_RX_OPSTART:
+ bts_model_opstart(trx->bts, &bb_transc->mo, bb_transc);
+ break;
case NM_EV_OPSTART_ACK:
bb_transc->mo.opstart_success = true;
oml_mo_opstart_ack(&bb_transc->mo);
@@ -250,6 +253,7 @@
[NM_BBTRANSC_ST_OP_DISABLED_OFFLINE] = {
.in_event_mask =
X(NM_EV_RX_SETATTR) |
+ X(NM_EV_RX_OPSTART) |
X(NM_EV_OPSTART_ACK) |
X(NM_EV_OPSTART_NACK) |
X(NM_EV_RSL_UP) |
diff --git a/src/common/nm_bts_fsm.c b/src/common/nm_bts_fsm.c
index 1726d90..3056404 100644
--- a/src/common/nm_bts_fsm.c
+++ b/src/common/nm_bts_fsm.c
@@ -122,6 +122,9 @@
((struct abis_om_fom_hdr *)msgb_l3(setattr_data->msg))->msg_type,
rc);
break;
+ case NM_EV_RX_OPSTART:
+ bts_model_opstart(bts, &bts->mo, bts);
+ break;
case NM_EV_OPSTART_ACK:
bts->mo.opstart_success = true;
oml_mo_opstart_ack(&bts->mo);
@@ -182,6 +185,7 @@
[NM_BTS_ST_OP_DISABLED_OFFLINE] = {
.in_event_mask =
X(NM_EV_RX_SETATTR) |
+ X(NM_EV_RX_OPSTART) |
X(NM_EV_OPSTART_ACK) |
X(NM_EV_OPSTART_NACK),
.out_state_mask =
diff --git a/src/common/nm_bts_sm_fsm.c b/src/common/nm_bts_sm_fsm.c
index ac3c00d..7b3e38d 100644
--- a/src/common/nm_bts_sm_fsm.c
+++ b/src/common/nm_bts_sm_fsm.c
@@ -98,6 +98,9 @@
((struct abis_om_fom_hdr *)msgb_l3(setattr_data->msg))->msg_type,
rc);
break;
+ case NM_EV_RX_OPSTART:
+ bts_model_opstart(NULL, &site_mgr->mo, site_mgr);
+ break;
case NM_EV_OPSTART_ACK:
site_mgr->mo.opstart_success = true;
oml_mo_opstart_ack(&site_mgr->mo);
@@ -158,6 +161,7 @@
[NM_BTS_SM_ST_OP_DISABLED_OFFLINE] = {
.in_event_mask =
X(NM_EV_RX_SETATTR) |
+ X(NM_EV_RX_OPSTART) |
X(NM_EV_OPSTART_ACK) |
X(NM_EV_OPSTART_NACK),
.out_state_mask =
diff --git a/src/common/nm_channel_fsm.c b/src/common/nm_channel_fsm.c
index 5385559..057a761 100644
--- a/src/common/nm_channel_fsm.c
+++ b/src/common/nm_channel_fsm.c
@@ -106,9 +106,12 @@
((struct abis_om_fom_hdr *)msgb_l3(setattr_data->msg))->msg_type,
rc);
break;
+ case NM_EV_RX_OPSTART:
+ LOGPFSML(fi, LOGL_NOTICE, "BSC trying to activate TS while still in
avail=dependency. "
+ "Allowing it to stay backward-compatible with older osmo-bts versions, but BSC
is wrong.\n");
+ bts_model_opstart(ts->trx->bts, &ts->mo, ts);
+ break;
case NM_EV_OPSTART_ACK:
- LOGPFSML(fi, LOGL_NOTICE, "BSC trying to activate TS while still in
avail=dependency. "
- "Allowing it to stay backward-compatible with older osmo-bts versions, but BSC
is wrong.\n");
ts->mo.opstart_success = true;
oml_mo_opstart_ack(&ts->mo);
nm_chan_fsm_state_chg(fi, NM_CHAN_ST_OP_ENABLED);
@@ -154,6 +157,9 @@
((struct abis_om_fom_hdr *)msgb_l3(setattr_data->msg))->msg_type,
rc);
break;
+ case NM_EV_RX_OPSTART:
+ bts_model_opstart(ts->trx->bts, &ts->mo, ts);
+ break;
case NM_EV_OPSTART_ACK:
ts->mo.opstart_success = true;
oml_mo_opstart_ack(&ts->mo);
@@ -229,8 +235,9 @@
[NM_CHAN_ST_OP_DISABLED_DEPENDENCY] = {
.in_event_mask =
X(NM_EV_RX_SETATTR) |
- X(NM_EV_OPSTART_ACK) | /* backward compatibility, buggy BSC */
- X(NM_EV_OPSTART_NACK) |
+ X(NM_EV_RX_OPSTART) | /* backward compatibility, buggy BSC */
+ X(NM_EV_OPSTART_ACK) | /* backward compatibility, buggy BSC */
+ X(NM_EV_OPSTART_NACK) | /* backward compatibility, buggy BSC */
X(NM_EV_BBTRANSC_ENABLED) |
X(NM_EV_RCARRIER_ENABLED) |
X(NM_EV_BBTRANSC_DISABLED) |
@@ -246,6 +253,7 @@
[NM_CHAN_ST_OP_DISABLED_OFFLINE] = {
.in_event_mask =
X(NM_EV_RX_SETATTR) |
+ X(NM_EV_RX_OPSTART) |
X(NM_EV_OPSTART_ACK) |
X(NM_EV_OPSTART_NACK) |
X(NM_EV_BBTRANSC_DISABLED) |
diff --git a/src/common/nm_common_fsm.c b/src/common/nm_common_fsm.c
index 5298e4d..f742357 100644
--- a/src/common/nm_common_fsm.c
+++ b/src/common/nm_common_fsm.c
@@ -26,6 +26,7 @@
const struct value_string nm_fsm_event_names[] = {
{ NM_EV_SW_ACT, "SW_ACT" },
{ NM_EV_RX_SETATTR, "RX_SETATTR" },
+ { NM_EV_RX_OPSTART, "RX_OPSTART" },
{ NM_EV_OPSTART_ACK, "OPSTART_ACK" },
{ NM_EV_OPSTART_NACK, "OPSTART_NACK" },
{ NM_EV_SHUTDOWN_START, "SHUTDOWN_START" },
diff --git a/src/common/nm_radio_carrier_fsm.c b/src/common/nm_radio_carrier_fsm.c
index 06ce98c..c3a4cb5 100644
--- a/src/common/nm_radio_carrier_fsm.c
+++ b/src/common/nm_radio_carrier_fsm.c
@@ -115,6 +115,9 @@
((struct abis_om_fom_hdr *)msgb_l3(setattr_data->msg))->msg_type,
rc);
break;
+ case NM_EV_RX_OPSTART:
+ bts_model_opstart(trx->bts, &trx->mo, trx);
+ break;
case NM_EV_OPSTART_ACK:
trx->mo.opstart_success = true;
oml_mo_opstart_ack(&trx->mo);
@@ -224,6 +227,7 @@
[NM_RCARRIER_ST_OP_DISABLED_OFFLINE] = {
.in_event_mask =
X(NM_EV_RX_SETATTR) |
+ X(NM_EV_RX_OPSTART) |
X(NM_EV_OPSTART_ACK) |
X(NM_EV_OPSTART_NACK) |
X(NM_EV_RSL_UP) |
diff --git a/src/common/oml.c b/src/common/oml.c
index 5ef3978..846bb23 100644
--- a/src/common/oml.c
+++ b/src/common/oml.c
@@ -1069,6 +1069,7 @@
struct abis_om_fom_hdr *foh = msgb_l3(msg);
struct gsm_abis_mo *mo;
void *obj;
+ int rc;
DEBUGPFOH(DOML, foh, "Rx OPSTART\n");
@@ -1084,8 +1085,17 @@
return oml_mo_opstart_ack(mo);
}
- /* Step 3: Ask BTS driver to apply the opstart */
- return bts_model_opstart(bts, mo, obj);
+ if (!mo->fi) {
+ /* Some NM objets still don't have FSMs implemented, such as
+ * NM_OC_GPRS_NSE, NM_OC_GPRS_CELL or NM_OC_GPRS_NSVC. For those, don't go through
FSM:
+ */
+ return bts_model_opstart(bts, mo, obj);
+ }
+
+ rc = osmo_fsm_inst_dispatch(mo->fi, NM_EV_RX_OPSTART, NULL);
+ if (rc < 0)
+ return oml_fom_ack_nack(msg, NM_NACK_CANT_PERFORM);
+ return rc;
}
static int oml_rx_chg_adm_state(struct gsm_bts *bts, struct msgb *msg)
--
To view, visit
https://gerrit.osmocom.org/c/osmo-bts/+/32211
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: I5df0bfb4cc812c11c7a00a8ffa882ae1915d562f
Gerrit-Change-Number: 32211
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: newchange