pespin has uploaded this change for review.
nm: Apply BTS/TRX/TS OML Attributes through NM FSMs
This way we have further control on how to handle the SetAttr meessages
received. For instance, NACK them if the NM object FSMs are not at the expected
correct state.
Related: OS#5992
Change-Id: Id68868e25bbf96227ab6459fcd3c9181852ed28e
---
M include/osmo-bts/nm_common_fsm.h
M src/common/nm_bts_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
6 files changed, 83 insertions(+), 7 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/94/32194/1
diff --git a/include/osmo-bts/nm_common_fsm.h b/include/osmo-bts/nm_common_fsm.h
index 1f0accc..b1b779e 100644
--- a/include/osmo-bts/nm_common_fsm.h
+++ b/include/osmo-bts/nm_common_fsm.h
@@ -30,6 +30,7 @@
/* Common */
enum nm_fsm_events {
NM_EV_SW_ACT,
+ NM_EV_RX_SETATTR, /* data: struct nm_fsm_ev_setattr_data */
NM_EV_SETATTR_ACK, /* data: struct nm_fsm_ev_setattr_data */
NM_EV_SETATTR_NACK, /* data: struct nm_fsm_ev_setattr_data */
NM_EV_OPSTART_ACK,
@@ -51,7 +52,8 @@
struct nm_fsm_ev_setattr_data {
struct msgb *msg; /* msgb ownership is transferred to FSM */
- int cause;
+ struct tlv_parsed *tp;
+ int cause; /* set in NM_EV_SETATTR_(N)ACK */
};
diff --git a/src/common/nm_bts_fsm.c b/src/common/nm_bts_fsm.c
index ea3a6c3..47b91e4 100644
--- a/src/common/nm_bts_fsm.c
+++ b/src/common/nm_bts_fsm.c
@@ -111,8 +111,15 @@
{
struct gsm_bts *bts = (struct gsm_bts *)fi->priv;
struct nm_fsm_ev_setattr_data *setattr_data;
+ int rc;
switch (event) {
+ case NM_EV_RX_SETATTR:
+ setattr_data = (struct nm_fsm_ev_setattr_data *)data;
+ rc = bts_model_apply_oml(bts, setattr_data->msg, setattr_data->tp,
+ NM_OC_BTS, bts);
+ (void)rc;
+ break;
case NM_EV_SETATTR_ACK:
case NM_EV_SETATTR_NACK:
setattr_data = (struct nm_fsm_ev_setattr_data *)data;
@@ -178,6 +185,7 @@
},
[NM_BTS_ST_OP_DISABLED_OFFLINE] = {
.in_event_mask =
+ X(NM_EV_RX_SETATTR) |
X(NM_EV_SETATTR_ACK) |
X(NM_EV_SETATTR_NACK) |
X(NM_EV_OPSTART_ACK) |
diff --git a/src/common/nm_channel_fsm.c b/src/common/nm_channel_fsm.c
index 503ddfb..3abf941 100644
--- a/src/common/nm_channel_fsm.c
+++ b/src/common/nm_channel_fsm.c
@@ -94,8 +94,15 @@
{
struct gsm_bts_trx_ts *ts = (struct gsm_bts_trx_ts *)fi->priv;
struct nm_fsm_ev_setattr_data *setattr_data;
+ int rc;
switch (event) {
+ 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, setattr_data->tp,
+ NM_OC_CHANNEL, ts);
+ (void)rc;
+ break;
case NM_EV_SETATTR_ACK:
case NM_EV_SETATTR_NACK:
setattr_data = (struct nm_fsm_ev_setattr_data *)data;
@@ -138,8 +145,15 @@
{
struct gsm_bts_trx_ts *ts = (struct gsm_bts_trx_ts *)fi->priv;
struct nm_fsm_ev_setattr_data *setattr_data;
+ int rc;
switch (event) {
+ 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, setattr_data->tp,
+ NM_OC_CHANNEL, ts);
+ (void)rc;
+ break;
case NM_EV_SETATTR_ACK:
case NM_EV_SETATTR_NACK:
setattr_data = (struct nm_fsm_ev_setattr_data *)data;
@@ -220,6 +234,7 @@
},
[NM_CHAN_ST_OP_DISABLED_DEPENDENCY] = {
.in_event_mask =
+ X(NM_EV_RX_SETATTR) |
X(NM_EV_SETATTR_ACK) |
X(NM_EV_SETATTR_NACK) |
X(NM_EV_OPSTART_ACK) | /* backward compatibility, buggy BSC */
@@ -238,6 +253,7 @@
},
[NM_CHAN_ST_OP_DISABLED_OFFLINE] = {
.in_event_mask =
+ X(NM_EV_RX_SETATTR) |
X(NM_EV_SETATTR_ACK) |
X(NM_EV_SETATTR_NACK) |
X(NM_EV_OPSTART_ACK) |
diff --git a/src/common/nm_common_fsm.c b/src/common/nm_common_fsm.c
index be11bef..6a8d3d1 100644
--- a/src/common/nm_common_fsm.c
+++ b/src/common/nm_common_fsm.c
@@ -25,6 +25,7 @@
const struct value_string nm_fsm_event_names[] = {
{ NM_EV_SW_ACT, "SW_ACT" },
+ { NM_EV_SETATTR_ACK, "RX_SETATTR" },
{ NM_EV_SETATTR_ACK, "SETATTR_ACK" },
{ NM_EV_SETATTR_NACK, "SETATTR_NACK" },
{ NM_EV_OPSTART_ACK, "OPSTART_ACK" },
diff --git a/src/common/nm_radio_carrier_fsm.c b/src/common/nm_radio_carrier_fsm.c
index 88930dd..4513d6c 100644
--- a/src/common/nm_radio_carrier_fsm.c
+++ b/src/common/nm_radio_carrier_fsm.c
@@ -103,8 +103,15 @@
struct nm_fsm_ev_setattr_data *setattr_data;
bool phy_state_connected;
bool rsl_link_connected;
+ int rc;
switch (event) {
+ case NM_EV_RX_SETATTR:
+ setattr_data = (struct nm_fsm_ev_setattr_data *)data;
+ rc = bts_model_apply_oml(trx->bts, setattr_data->msg, setattr_data->tp,
+ NM_OC_RADIO_CARRIER, trx);
+ (void)rc;
+ break;
case NM_EV_SETATTR_ACK:
case NM_EV_SETATTR_NACK:
setattr_data = (struct nm_fsm_ev_setattr_data *)data;
@@ -219,6 +226,7 @@
},
[NM_RCARRIER_ST_OP_DISABLED_OFFLINE] = {
.in_event_mask =
+ X(NM_EV_RX_SETATTR) |
X(NM_EV_SETATTR_ACK) |
X(NM_EV_SETATTR_NACK) |
X(NM_EV_OPSTART_ACK) |
diff --git a/src/common/oml.c b/src/common/oml.c
index 5ffb6ff..b552e96 100644
--- a/src/common/oml.c
+++ b/src/common/oml.c
@@ -48,6 +48,7 @@
#include <osmo-bts/bts.h>
#include <osmo-bts/signal.h>
#include <osmo-bts/phy_link.h>
+#include <osmo-bts/nm_common_fsm.h>
#define LOGPFOH(ss, lvl, foh, fmt, args ...) LOGP(ss, lvl, "%s: " fmt, abis_nm_dump_foh(foh), ## args)
#define DEBUGPFOH(ss, foh, fmt, args ...) LOGPFOH(ss, LOGL_DEBUG, foh, fmt, ## args)
@@ -549,6 +550,7 @@
struct tlv_parsed tp, *tp_merged;
int rc, i;
const uint8_t *payload;
+ struct nm_fsm_ev_setattr_data ev_data;
DEBUGPFOH(DOML, foh, "Rx SET BTS ATTR\n");
@@ -742,8 +744,15 @@
}
}
- /* call into BTS driver to apply new attributes to hardware */
- return bts_model_apply_oml(bts, msg, tp_merged, NM_OC_BTS, bts);
+ ev_data = (struct nm_fsm_ev_setattr_data){
+ .msg = msg,
+ .tp = tp_merged,
+ };
+
+ rc = osmo_fsm_inst_dispatch(bts->mo.fi, NM_EV_RX_SETATTR, &ev_data);
+ if (rc < 0)
+ return oml_fom_ack_nack(msg, NM_NACK_CANT_PERFORM);
+ return rc;
}
/* 8.6.2 Set Radio Attributes has been received */
@@ -752,6 +761,7 @@
struct abis_om_fom_hdr *foh = msgb_l3(msg);
struct tlv_parsed tp, *tp_merged;
int rc;
+ struct nm_fsm_ev_setattr_data ev_data;
DEBUGPFOH(DOML, foh, "Rx SET RADIO CARRIER ATTR\n");
@@ -830,8 +840,17 @@
trx->arfcn = arfcn;
}
#endif
- /* call into BTS driver to apply new attributes to hardware */
- return bts_model_apply_oml(trx->bts, msg, tp_merged, NM_OC_RADIO_CARRIER, trx);
+
+ ev_data = (struct nm_fsm_ev_setattr_data){
+ .msg = msg,
+ .tp = tp_merged,
+ };
+
+ rc = osmo_fsm_inst_dispatch(trx->mo.fi, NM_EV_RX_SETATTR, &ev_data);
+ if (rc < 0)
+ return oml_fom_ack_nack(msg, NM_NACK_CANT_PERFORM);
+ return rc;
+
}
static int handle_chan_comb(struct gsm_bts_trx_ts *ts, const uint8_t comb)
@@ -927,6 +946,7 @@
struct gsm_bts *bts = ts->trx->bts;
struct tlv_parsed tp, *tp_merged;
int rc, i;
+ struct nm_fsm_ev_setattr_data ev_data;
DEBUGPFOH(DOML, foh, "Rx SET CHAN ATTR\n");
@@ -1035,8 +1055,15 @@
ts->hopping.hsn, ts->hopping.maio, ts->hopping.arfcn_num);
LOGPC(DOML, LOGL_INFO, ")\n");
- /* call into BTS driver to apply new attributes to hardware */
- return bts_model_apply_oml(bts, msg, tp_merged, NM_OC_CHANNEL, ts);
+ ev_data = (struct nm_fsm_ev_setattr_data){
+ .msg = msg,
+ .tp = tp_merged,
+ };
+
+ rc = osmo_fsm_inst_dispatch(ts->mo.fi, NM_EV_RX_SETATTR, &ev_data);
+ if (rc < 0)
+ return oml_fom_ack_nack(msg, NM_NACK_CANT_PERFORM);
+ return rc;
}
/* 8.9.2 Opstart has been received */
To view, visit change 32194. To unsubscribe, or for help writing mail filters, visit settings.