aboutsummaryrefslogtreecommitdiffstats
path: root/src/common/nm_channel_fsm.c
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2023-04-03 18:38:55 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2023-04-05 13:21:14 +0200
commitc4a17d35ecea72c0b50bc1ac030a6693f8be8262 (patch)
treed77a5c277dfcb700b8874ca0890f7e3c13b14b04 /src/common/nm_channel_fsm.c
parentc12bc93db8c968700c18a25d6a85a23f77fbf555 (diff)
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. The originating msgs are now kept owned and freed by the OML layer (oml.c), and the NM FSMs only uses them and create new OML msgb when answering with ACK/NACK. Related: OS#5992 Change-Id: Id68868e25bbf96227ab6459fcd3c9181852ed28e
Diffstat (limited to 'src/common/nm_channel_fsm.c')
-rw-r--r--src/common/nm_channel_fsm.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/common/nm_channel_fsm.c b/src/common/nm_channel_fsm.c
index 503ddfb9..557d5b98 100644
--- a/src/common/nm_channel_fsm.c
+++ b/src/common/nm_channel_fsm.c
@@ -94,13 +94,20 @@ static void st_op_disabled_dependency(struct osmo_fsm_inst *fi, uint32_t event,
{
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;
ts->mo.setattr_success = setattr_data->cause == 0;
- oml_fom_ack_nack(setattr_data->msg, setattr_data->cause);
+ oml_fom_ack_nack_copy_msg(setattr_data->msg, setattr_data->cause);
break;
case NM_EV_OPSTART_ACK:
LOGPFSML(fi, LOGL_NOTICE, "BSC trying to activate TS while still in avail=dependency. "
@@ -138,13 +145,20 @@ static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, voi
{
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;
ts->mo.setattr_success = setattr_data->cause == 0;
- oml_fom_ack_nack(setattr_data->msg, setattr_data->cause);
+ oml_fom_ack_nack_copy_msg(setattr_data->msg, setattr_data->cause);
break;
case NM_EV_OPSTART_ACK:
ts->mo.opstart_success = true;
@@ -220,6 +234,7 @@ static struct osmo_fsm_state nm_chan_fsm_states[] = {
},
[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 @@ static struct osmo_fsm_state nm_chan_fsm_states[] = {
},
[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) |