arehbein has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bts/+/32075 )
Change subject: gsm_objclass2mo(): Change signature so we can obtain a nack cause in case of error ......................................................................
gsm_objclass2mo(): Change signature so we can obtain a nack cause in case of error
Depends on change (osmo-bts): Ia538e3f3d416408f69f9d8e6c8c746eddd9f005a
Change dependency can be removed if we adapt the function signature of the function removed by it; however that seems like unnecessary work for no good reason.
Related: OS#5961 Related: OS#5967 Change-Id: I37e6b23ed95260a8188910cf9754faffcba519c5 --- M include/osmo-bts/oml.h M src/common/oml.c M src/osmo-bts-lc15/oml.c M src/osmo-bts-omldummy/bts_model.c M src/osmo-bts-trx/l1_if.c M src/osmo-bts-virtual/bts_model.c 6 files changed, 49 insertions(+), 18 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/75/32075/1
diff --git a/include/osmo-bts/oml.h b/include/osmo-bts/oml.h index 90c9077..5ba3281 100644 --- a/include/osmo-bts/oml.h +++ b/include/osmo-bts/oml.h @@ -76,8 +76,9 @@ void gsm_mo_init(struct gsm_abis_mo *mo, struct gsm_bts *bts, uint8_t obj_class, uint8_t p1, uint8_t p2, uint8_t p3);
-struct gsm_abis_mo *gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class, - const struct abis_om_obj_inst *obj_inst); +struct gsm_abis_mo * +gsm_objclass2mo(enum abis_nm_nack_cause *c, struct gsm_bts *bts, uint8_t obj_class, + const struct abis_om_obj_inst *obj_inst);
struct gsm_nm_state *gsm_objclass2nmstate(struct gsm_bts *bts, uint8_t obj_class, const struct abis_om_obj_inst *obj_inst); diff --git a/src/common/oml.c b/src/common/oml.c index 61635ec..06b2b15 100644 --- a/src/common/oml.c +++ b/src/common/oml.c @@ -507,6 +507,7 @@ const struct gsm_abis_mo *mo; struct tlv_parsed tp; int rc; + enum abis_nm_nack_cause c;
if (!foh || !bts) return -EINVAL; @@ -514,7 +515,7 @@ DEBUGPFOH(DOML, foh, "Rx GET ATTR\n");
/* Determine which OML object is addressed */ - mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + mo = gsm_objclass2mo(&c, bts, foh->obj_class, &foh->obj_inst); if (!mo) { LOGPFOH(DOML, LOGL_ERROR, foh, "Get Attributes for unknown Object Instance\n"); return oml_fom_ack_nack(msg, NM_NACK_OBJINST_UNKN); @@ -1013,14 +1014,16 @@ struct abis_om_fom_hdr *foh = msgb_l3(msg); struct gsm_abis_mo *mo; void *obj; + enum abis_nm_nack_cause c; +
DEBUGPFOH(DOML, foh, "Rx OPSTART\n");
/* Step 1: Resolve MO by obj_class/obj_inst */ - mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + mo = gsm_objclass2mo(&c, bts, foh->obj_class, &foh->obj_inst); obj = gsm_objclass2obj(bts, foh->obj_class, &foh->obj_inst); if (!mo || !obj) - return oml_fom_ack_nack(msg, NM_NACK_OBJINST_UNKN); + return oml_fom_ack_nack(msg, c);
/* Step 2: Do some global dependency/consistency checking */ if (mo->nm_state.operational == NM_OPSTATE_ENABLED) { @@ -1040,6 +1043,7 @@ uint8_t adm_state; void *obj; int rc; + enum abis_nm_nack_cause c;
DEBUGPFOH(DOML, foh, "Rx CHG ADM STATE\n");
@@ -1057,10 +1061,10 @@ adm_state = *TLVP_VAL(&tp, NM_ATT_ADM_STATE);
/* Step 1: Resolve MO by obj_class/obj_inst */ - mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + mo = gsm_objclass2mo(&c, bts, foh->obj_class, &foh->obj_inst); obj = gsm_objclass2obj(bts, foh->obj_class, &foh->obj_inst); if (!mo || !obj) - return oml_fom_ack_nack(msg, NM_NACK_OBJINST_UNKN); + return oml_fom_ack_nack(msg, c);
/* Step 2: Do some global dependency/consistency checking */ if (mo->nm_state.administrative == adm_state) { @@ -1374,24 +1378,25 @@ struct tlv_parsed tp, *tp_merged; void *obj; int rc; + enum abis_nm_nack_cause c;
DEBUGPFOH(DOML, foh, "Rx IPA SET ATTR\n");
rc = oml_tlv_parse(&tp, foh->data, msgb_l3len(msg) - sizeof(*foh)); if (rc < 0) { - mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + mo = gsm_objclass2mo(&c, bts, foh->obj_class, &foh->obj_inst); if (!mo) - return oml_fom_ack_nack(msg, NM_NACK_OBJINST_UNKN); + return oml_fom_ack_nack(msg, c); oml_tx_failure_event_rep(mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UNSUP_ATTR, "New value for IPAC Set Attribute not supported\n"); return oml_fom_ack_nack(msg, NM_NACK_INCORR_STRUCT); }
/* Resolve MO by obj_class/obj_inst */ - mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + mo = gsm_objclass2mo(&c, bts, foh->obj_class, &foh->obj_inst); obj = gsm_objclass2obj(bts, foh->obj_class, &foh->obj_inst); if (!mo || !obj) - return oml_fom_ack_nack(msg, NM_NACK_OBJINST_UNKN); + return oml_fom_ack_nack(msg, c);
rc = oml_ipa_mo_set_attr(bts, mo, obj, &tp); if (rc == 0) { @@ -1607,10 +1612,12 @@ mo->nm_state.administrative = NM_STATE_LOCKED; }
-/* obtain the MO structure for a given object instance */ +/* Obtain the MO structure for a given object instance + * \param[out] c nack cause for reply in case of error + */ struct gsm_abis_mo * -gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class, - const struct abis_om_obj_inst *obj_inst) +gsm_objclass2mo(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; struct gsm_abis_mo *mo = NULL; @@ -1621,8 +1628,10 @@ case NM_OC_CHANNEL: case NM_OC_GPRS_NSVC: if (obj_inst->trx_nr >= bts->num_trx) + *c = NM_NACK_OBJINST_UNKN; return NULL; if (!(trx = gsm_bts_trx_num(bts, obj_inst->trx_nr))) + *c = NM_NACK_OBJINST_UNKN; return NULL; break; } @@ -1639,6 +1648,7 @@ break; case NM_OC_CHANNEL: if (obj_inst->ts_nr >= TRX_NR_TS) + *c = NM_NACK_OBJINST_UNKN; return NULL; mo = &trx->ts[obj_inst->ts_nr].mo; break; @@ -1653,6 +1663,7 @@ break; case NM_OC_GPRS_NSVC: if (obj_inst->trx_nr >= ARRAY_SIZE(bts->gprs.nsvc)) + *c = NM_NACK_OBJINST_UNKN; return NULL; mo = &bts->gprs.nsvc[obj_inst->trx_nr].mo; break; diff --git a/src/osmo-bts-lc15/oml.c b/src/osmo-bts-lc15/oml.c index 675e3fe..aea9903 100644 --- a/src/osmo-bts-lc15/oml.c +++ b/src/osmo-bts-lc15/oml.c @@ -1831,7 +1831,8 @@ struct tlv_parsed *new_attr, int kind, void *obj) { struct abis_om_fom_hdr *foh = msgb_l3(msg); - struct gsm_abis_mo *mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + enum abis_nm_nack_cause c; + struct gsm_abis_mo *mo = gsm_objclass2mo(&c, bts, foh->obj_class, &foh->obj_inst); struct nm_fsm_ev_setattr_data ev_data = { .msg = msg, .cause = 0, diff --git a/src/osmo-bts-omldummy/bts_model.c b/src/osmo-bts-omldummy/bts_model.c index 46fa84b..767272e 100644 --- a/src/osmo-bts-omldummy/bts_model.c +++ b/src/osmo-bts-omldummy/bts_model.c @@ -97,7 +97,8 @@ struct tlv_parsed *new_attr, int kind, void *obj) { struct abis_om_fom_hdr *foh = msgb_l3(msg); - struct gsm_abis_mo *mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + enum abis_nm_nack_cause c; + struct gsm_abis_mo *mo = gsm_objclass2mo(&c, bts, foh->obj_class, &foh->obj_inst); struct nm_fsm_ev_setattr_data ev_data = { .msg = msg, .cause = 0, diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c index 2ed1868..d23442a 100644 --- a/src/osmo-bts-trx/l1_if.c +++ b/src/osmo-bts-trx/l1_if.c @@ -552,7 +552,8 @@ struct tlv_parsed *new_attr, int kind, void *obj) { struct abis_om_fom_hdr *foh = msgb_l3(msg); - struct gsm_abis_mo *mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + enum abis_nm_nack_cause c; + struct gsm_abis_mo *mo = gsm_objclass2mo(&c, bts, foh->obj_class, &foh->obj_inst); struct nm_fsm_ev_setattr_data ev_data = { .msg = msg, .cause = 0, diff --git a/src/osmo-bts-virtual/bts_model.c b/src/osmo-bts-virtual/bts_model.c index 64e2f8d..440ddb7 100644 --- a/src/osmo-bts-virtual/bts_model.c +++ b/src/osmo-bts-virtual/bts_model.c @@ -132,7 +132,8 @@ struct tlv_parsed *new_attr, int kind, void *obj) { struct abis_om_fom_hdr *foh = msgb_l3(msg); - struct gsm_abis_mo *mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + enum abis_nm_nack_cause c; + struct gsm_abis_mo *mo = gsm_objclass2mo(&c, bts, foh->obj_class, &foh->obj_inst); struct nm_fsm_ev_setattr_data ev_data = { .msg = msg, .cause = 0,