fixeria has submitted this change. ( 
https://gerrit.osmocom.org/c/osmo-bts/+/32354 )

Change subject: gsm_objclass2obj(): Change signature/set NACK cause
......................................................................

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
---
M include/osmo-bts/oml.h
M src/common/oml.c
M src/osmo-bts-trx/trx_provision_fsm.c
3 files changed, 44 insertions(+), 19 deletions(-)

Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, but someone else must approve
  laforge: Looks good to me, but someone else must approve
  fixeria: Looks good to me, approved




diff --git a/include/osmo-bts/oml.h b/include/osmo-bts/oml.h
index add00c8..c35122e 100644
--- a/include/osmo-bts/oml.h
+++ b/include/osmo-bts/oml.h
@@ -82,6 +82,7 @@
                                    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 6bdb49b..7ab1bc2 100644
--- a/src/common/oml.c
+++ b/src/common/oml.c
@@ -1103,8 +1103,8 @@
        /* 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 @@
        /* 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 @@
        /* 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 @@
        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 @@
                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 @@
                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 @@
                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 8b20b10..2731010 100644
--- a/src/osmo-bts-trx/trx_provision_fsm.c
+++ b/src/osmo-bts-trx/trx_provision_fsm.c
@@ -340,7 +340,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(nsd->mo->bts, nsd->mo->obj_class, 
&nsd->mo->obj_inst, NULL);
                l1if_trx_start_power_ramp(trx, NULL);
        }
        return 0;

--
To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/32354
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: If734ea2c8cae4c1f99b02520dffa4e3862a67745
Gerrit-Change-Number: 32354
Gerrit-PatchSet: 4
Gerrit-Owner: arehbein <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <[email protected]>
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>
Gerrit-MessageType: merged

Reply via email to