diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2023-04-03 18:38:55 +0200 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2023-04-05 13:21:14 +0200 |
commit | c4a17d35ecea72c0b50bc1ac030a6693f8be8262 (patch) | |
tree | d77a5c277dfcb700b8874ca0890f7e3c13b14b04 /src/common/nm_channel_fsm.c | |
parent | c12bc93db8c968700c18a25d6a85a23f77fbf555 (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.c | 20 |
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) | |