arehbein has uploaded this change for review.

View Change

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,

To view, visit change 32075. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: I37e6b23ed95260a8188910cf9754faffcba519c5
Gerrit-Change-Number: 32075
Gerrit-PatchSet: 1
Gerrit-Owner: arehbein <arehbein@sysmocom.de>
Gerrit-MessageType: newchange