diff options
author | arehbein <arehbein@sysmocom.de> | 2023-04-18 13:38:07 +0200 |
---|---|---|
committer | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2023-04-29 02:51:12 +0700 |
commit | cf8736e9160315c3d85b97f4b498be1605f1f129 (patch) | |
tree | d4def7c5b307a7727a425de1cc0ace5b4c66be4f | |
parent | 204cd4d7e3c70f32fe83e93479e9ce3c96f60c14 (diff) |
gsm_objclass2obj(): Change signature/set NACK cause
- Add out-parameter to enable returning a NACK cause (ignored if NULL)
- Return appropriate NACK cause if TRX number is unknown (fixes OS#5967
together with change I37e6b23ed95260a8188910cf9754faffcba519c5)
Change-Id: If734ea2c8cae4c1f99b02520dffa4e3862a67745
Related: OS#5961, OS#5967
-rw-r--r-- | include/osmo-bts/oml.h | 3 | ||||
-rw-r--r-- | src/common/oml.c | 44 | ||||
-rw-r--r-- | src/osmo-bts-trx/trx_provision_fsm.c | 2 |
3 files changed, 30 insertions, 19 deletions
diff --git a/include/osmo-bts/oml.h b/include/osmo-bts/oml.h index add00c89..c35122e4 100644 --- a/include/osmo-bts/oml.h +++ b/include/osmo-bts/oml.h @@ -82,6 +82,7 @@ struct gsm_abis_mo *gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class, enum abis_nm_nack_cause *c); void *gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class, - const struct abis_om_obj_inst *obj_inst); + const struct abis_om_obj_inst *obj_inst, + enum abis_nm_nack_cause *c); #endif // _OML_H */ diff --git a/src/common/oml.c b/src/common/oml.c index 6bdb49bd..7ab1bc24 100644 --- a/src/common/oml.c +++ b/src/common/oml.c @@ -1103,8 +1103,8 @@ static int oml_rx_opstart(struct gsm_bts *bts, struct msgb *msg) /* Step 1: Resolve MO by obj_class/obj_inst */ if ((mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst, &c)) == NULL) return oml_fom_ack_nack(msg, c); - if ((obj = gsm_objclass2obj(bts, foh->obj_class, &foh->obj_inst)) == NULL) - return oml_fom_ack_nack(msg, NM_NACK_OBJINST_UNKN); + if ((obj = gsm_objclass2obj(bts, foh->obj_class, &foh->obj_inst, &c)) == NULL) + return oml_fom_ack_nack(msg, c); /* Step 2: Do some global dependency/consistency checking */ if (mo->nm_state.operational == NM_OPSTATE_ENABLED) { @@ -1149,8 +1149,8 @@ static int oml_rx_chg_adm_state(struct gsm_bts *bts, struct msgb *msg) /* Step 1: Resolve MO by obj_class/obj_inst */ if ((mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst, &c)) == NULL) return oml_fom_ack_nack(msg, c); - if ((obj = gsm_objclass2obj(bts, foh->obj_class, &foh->obj_inst)) == NULL) - return oml_fom_ack_nack(msg, NM_NACK_OBJINST_UNKN); + if ((obj = gsm_objclass2obj(bts, foh->obj_class, &foh->obj_inst, &c)) == NULL) + return oml_fom_ack_nack(msg, c); /* Step 2: Do some global dependency/consistency checking */ if (mo->nm_state.administrative == adm_state) { @@ -1491,8 +1491,8 @@ static int oml_ipa_set_attr(struct gsm_bts *bts, struct msgb *msg) /* Resolve MO by obj_class/obj_inst */ if ((mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst, &c)) == NULL) return oml_fom_ack_nack(msg, c); - if ((obj = gsm_objclass2obj(bts, foh->obj_class, &foh->obj_inst)) == NULL) - return oml_fom_ack_nack(msg, NM_NACK_OBJINST_UNKN); + if ((obj = gsm_objclass2obj(bts, foh->obj_class, &foh->obj_inst, &c)) == NULL) + return oml_fom_ack_nack(msg, c); switch (mo->obj_class) { @@ -1793,10 +1793,11 @@ nm_nack_objinst_unkn: return NULL; } -/* obtain the in-memory data structure of a given object instance */ -void * -gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class, - const struct abis_om_obj_inst *obj_inst) +/* Obtain the in-memory data structure of a given object instance + * \param[out] c nack cause for reply in case of error. Ignored if NULL */ +void *gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class, + const struct abis_om_obj_inst *obj_inst, + enum abis_nm_nack_cause *c) { struct gsm_bts_trx *trx; void *obj = NULL; @@ -1807,19 +1808,19 @@ gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class, break; case NM_OC_RADIO_CARRIER: if (!(trx = gsm_bts_trx_num(bts, obj_inst->trx_nr))) - return NULL; + goto nm_nack_trxnr_unkn; obj = trx; break; case NM_OC_BASEB_TRANSC: if (!(trx = gsm_bts_trx_num(bts, obj_inst->trx_nr))) - return NULL; + goto nm_nack_trxnr_unkn; obj = &trx->bb_transc; break; case NM_OC_CHANNEL: if (!(trx = gsm_bts_trx_num(bts, obj_inst->trx_nr))) - return NULL; + goto nm_nack_trxnr_unkn; if (obj_inst->ts_nr >= TRX_NR_TS) - return NULL; + goto nm_nack_objinst_unkn; obj = &trx->ts[obj_inst->ts_nr]; break; case NM_OC_SITE_MANAGER: @@ -1827,7 +1828,7 @@ gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class, break; case NM_OC_GPRS_NSE: if (obj_inst->bts_nr > 0) - return NULL; + goto nm_nack_objinst_unkn; obj = &g_bts_sm->gprs.nse; break; case NM_OC_GPRS_CELL: @@ -1835,11 +1836,20 @@ gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class, break; case NM_OC_GPRS_NSVC: if (obj_inst->bts_nr > 0) - return NULL; + goto nm_nack_objinst_unkn; if (obj_inst->trx_nr >= ARRAY_SIZE(g_bts_sm->gprs.nse.nsvc)) - return NULL; + goto nm_nack_objinst_unkn; obj = &g_bts_sm->gprs.nse.nsvc[obj_inst->trx_nr]; break; } return obj; + +nm_nack_trxnr_unkn: + if (c != NULL) + *c = NM_NACK_TRXNR_UNKN; + return NULL; +nm_nack_objinst_unkn: + if (c != NULL) + *c = NM_NACK_OBJINST_UNKN; + return NULL; } diff --git a/src/osmo-bts-trx/trx_provision_fsm.c b/src/osmo-bts-trx/trx_provision_fsm.c index 8b20b100..27310102 100644 --- a/src/osmo-bts-trx/trx_provision_fsm.c +++ b/src/osmo-bts-trx/trx_provision_fsm.c @@ -340,7 +340,7 @@ static int trx_prov_fsm_signal_cb(unsigned int subsys, unsigned int signal, return 0; if (nsd->old_state != NM_OPSTATE_ENABLED && nsd->new_state == NM_OPSTATE_ENABLED) { - trx = gsm_objclass2obj(nsd->mo->bts, nsd->mo->obj_class, &nsd->mo->obj_inst); + trx = gsm_objclass2obj(nsd->mo->bts, nsd->mo->obj_class, &nsd->mo->obj_inst, NULL); l1if_trx_start_power_ramp(trx, NULL); } return 0; |