aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorarehbein <arehbein@sysmocom.de>2023-04-18 13:38:07 +0200
committerVadim Yanitskiy <vyanitskiy@sysmocom.de>2023-04-29 02:51:12 +0700
commitcf8736e9160315c3d85b97f4b498be1605f1f129 (patch)
treed4def7c5b307a7727a425de1cc0ace5b4c66be4f
parent204cd4d7e3c70f32fe83e93479e9ce3c96f60c14 (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.h3
-rw-r--r--src/common/oml.c44
-rw-r--r--src/osmo-bts-trx/trx_provision_fsm.c2
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;