arehbein has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bts/+/32354 )
Change subject: gsm_objclass2obj(): Change signature so we can obtain a nack cause in case of error ......................................................................
gsm_objclass2obj(): Change signature so we can obtain a nack cause in case of error
Related: OS#5961 Related: OS#5967 Change-Id: If734ea2c8cae4c1f99b02520dffa4e3862a67745 --- M include/osmo-bts/oml.h M src/common/oml.c M src/osmo-bts-trx/trx_provision_fsm.c 3 files changed, 35 insertions(+), 22 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/54/32354/1
diff --git a/include/osmo-bts/oml.h b/include/osmo-bts/oml.h index 9c01010..2e7b949 100644 --- a/include/osmo-bts/oml.h +++ b/include/osmo-bts/oml.h @@ -83,7 +83,7 @@
struct gsm_nm_state *gsm_objclass2nmstate(struct gsm_bts *bts, uint8_t obj_class, const struct abis_om_obj_inst *obj_inst); -void *gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class, +void *gsm_objclass2obj(enum abis_nm_nack_cause *c, struct gsm_bts *bts, uint8_t obj_class, const struct abis_om_obj_inst *obj_inst);
#endif // _OML_H */ diff --git a/src/common/oml.c b/src/common/oml.c index af6b19d..09ed6ea 100644 --- a/src/common/oml.c +++ b/src/common/oml.c @@ -1103,7 +1103,7 @@
/* Step 1: Resolve MO by obj_class/obj_inst */ mo = gsm_objclass2mo(&c, bts, foh->obj_class, &foh->obj_inst); - obj = gsm_objclass2obj(bts, foh->obj_class, &foh->obj_inst); + obj = gsm_objclass2obj(&c, bts, foh->obj_class, &foh->obj_inst); if (!mo || !obj) return oml_fom_ack_nack(msg, c);
@@ -1149,7 +1149,7 @@
/* Step 1: Resolve MO by obj_class/obj_inst */ mo = gsm_objclass2mo(&c, bts, foh->obj_class, &foh->obj_inst); - obj = gsm_objclass2obj(bts, foh->obj_class, &foh->obj_inst); + obj = gsm_objclass2obj(&c, bts, foh->obj_class, &foh->obj_inst); if (!mo || !obj) return oml_fom_ack_nack(msg, c);
@@ -1492,7 +1492,7 @@
/* Resolve MO by obj_class/obj_inst */ mo = gsm_objclass2mo(&c, bts, foh->obj_class, &foh->obj_inst); - obj = gsm_objclass2obj(bts, foh->obj_class, &foh->obj_inst); + obj = gsm_objclass2obj(&c, bts, foh->obj_class, &foh->obj_inst); if (!mo || !obj) return oml_fom_ack_nack(msg, c);
@@ -1796,37 +1796,34 @@
/* obtain the in-memory data structure of a given object instance */ void * -gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class, +gsm_objclass2obj(enum abis_nm_nack_cause *c, struct gsm_bts *bts, uint8_t obj_class, const struct abis_om_obj_inst *obj_inst) { struct gsm_bts_trx *trx; void *obj = NULL; + /* Handle finding TRX number first */ + switch (obj_class) { + case NM_OC_RADIO_CARRIER: + case NM_OC_BASEB_TRANSC: + case NM_OC_CHANNEL: + if (!(trx = gsm_bts_trx_num(bts, obj_inst->trx_nr))) + goto nm_nack_objinst_unkn; + break; + }
switch (obj_class) { case NM_OC_BTS: obj = bts; break; case NM_OC_RADIO_CARRIER: - if (obj_inst->trx_nr >= bts->num_trx) { - return NULL; - } - trx = gsm_bts_trx_num(bts, obj_inst->trx_nr); obj = trx; break; case NM_OC_BASEB_TRANSC: - if (obj_inst->trx_nr >= bts->num_trx) { - return NULL; - } - trx = gsm_bts_trx_num(bts, obj_inst->trx_nr); obj = &trx->bb_transc; break; case NM_OC_CHANNEL: - if (obj_inst->trx_nr >= bts->num_trx) { - return NULL; - } - trx = gsm_bts_trx_num(bts, obj_inst->trx_nr); 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: @@ -1834,7 +1831,7 @@ 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: @@ -1842,11 +1839,15 @@ 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_objinst_unkn: + *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 8b20b10..38ca18f 100644 --- a/src/osmo-bts-trx/trx_provision_fsm.c +++ b/src/osmo-bts-trx/trx_provision_fsm.c @@ -327,6 +327,7 @@ { struct nm_statechg_signal_data *nsd; struct gsm_bts_trx *trx; + enum abis_nm_nack_cause c;
if (subsys != SS_GLOBAL) return -EINVAL; @@ -340,7 +341,7 @@ 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(&c, nsd->mo->bts, nsd->mo->obj_class, &nsd->mo->obj_inst); l1if_trx_start_power_ramp(trx, NULL); } return 0;