gsm_data_shared: introduce 'struct gsm_abis_mo'

... as a common wrapper around nm_attr and nm_state
diff --git a/openbsc/src/libbsc/abis_nm.c b/openbsc/src/libbsc/abis_nm.c
index f2220a7..0c3fff5 100644
--- a/openbsc/src/libbsc/abis_nm.c
+++ b/openbsc/src/libbsc/abis_nm.c
@@ -150,17 +150,17 @@
 	);
 }
 
-/* obtain the gsm_nm_state data structure for a given object instance */
-static struct gsm_nm_state *
-objclass2nmstate(struct gsm_bts *bts, uint8_t obj_class,
-		 struct abis_om_obj_inst *obj_inst)
+/* obtain the MO structure for a given object instance */
+static struct gsm_abis_mo *
+objclass2mo(struct gsm_bts *bts, uint8_t obj_class,
+	    struct abis_om_obj_inst *obj_inst)
 {
 	struct gsm_bts_trx *trx;
-	struct gsm_nm_state *nm_state = NULL;
+	struct gsm_abis_mo *mo = NULL;
 
 	switch (obj_class) {
 	case NM_OC_BTS:
-		nm_state = &bts->nm_state;
+		mo = &bts->mo;
 		break;
 	case NM_OC_RADIO_CARRIER:
 		if (obj_inst->trx_nr >= bts->num_trx) {
@@ -168,7 +168,7 @@
 			return NULL;
 		}
 		trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);
-		nm_state = &trx->nm_state;
+		mo = &trx->mo;
 		break;
 	case NM_OC_BASEB_TRANSC:
 		if (obj_inst->trx_nr >= bts->num_trx) {
@@ -176,7 +176,7 @@
 			return NULL;
 		}
 		trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);
-		nm_state = &trx->bb_transc.nm_state;
+		mo = &trx->bb_transc.mo;
 		break;
 	case NM_OC_CHANNEL:
 		if (obj_inst->trx_nr >= bts->num_trx) {
@@ -186,52 +186,66 @@
 		trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);
 		if (obj_inst->ts_nr >= TRX_NR_TS)
 			return NULL;
-		nm_state = &trx->ts[obj_inst->ts_nr].nm_state;
+		mo = &trx->ts[obj_inst->ts_nr].mo;
 		break;
 	case NM_OC_SITE_MANAGER:
-		nm_state = &bts->site_mgr.nm_state;
+		mo = &bts->site_mgr.mo;
 		break;
 	case NM_OC_BS11:
 		switch (obj_inst->bts_nr) {
 		case BS11_OBJ_CCLK:
-			nm_state = &bts->bs11.cclk.nm_state;
+			mo = &bts->bs11.cclk.mo;
 			break;
 		case BS11_OBJ_BBSIG:
 			if (obj_inst->ts_nr > bts->num_trx)
 				return NULL;
 			trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);
-			nm_state = &trx->bs11.bbsig.nm_state;
+			mo = &trx->bs11.bbsig.mo;
 			break;
 		case BS11_OBJ_PA:
 			if (obj_inst->ts_nr > bts->num_trx)
 				return NULL;
 			trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);
-			nm_state = &trx->bs11.pa.nm_state;
+			mo = &trx->bs11.pa.mo;
 			break;
 		default:
 			return NULL;
 		}
 	case NM_OC_BS11_RACK:
-		nm_state = &bts->bs11.rack.nm_state;
+		mo = &bts->bs11.rack.mo;
 		break;
 	case NM_OC_BS11_ENVABTSE:
 		if (obj_inst->trx_nr >= ARRAY_SIZE(bts->bs11.envabtse))
 			return NULL;
-		nm_state = &bts->bs11.envabtse[obj_inst->trx_nr].nm_state;
+		mo = &bts->bs11.envabtse[obj_inst->trx_nr].mo;
 		break;
 	case NM_OC_GPRS_NSE:
-		nm_state = &bts->gprs.nse.nm_state;
+		mo = &bts->gprs.nse.mo;
 		break;
 	case NM_OC_GPRS_CELL:
-		nm_state = &bts->gprs.cell.nm_state;
+		mo = &bts->gprs.cell.mo;
 		break;
 	case NM_OC_GPRS_NSVC:
 		if (obj_inst->trx_nr >= ARRAY_SIZE(bts->gprs.nsvc))
 			return NULL;
-		nm_state = &bts->gprs.nsvc[obj_inst->trx_nr].nm_state;
+		mo = &bts->gprs.nsvc[obj_inst->trx_nr].mo;
 		break;
 	}
-	return nm_state;
+	return mo;
+}
+
+/* obtain the gsm_nm_state data structure for a given object instance */
+static struct gsm_nm_state *
+objclass2nmstate(struct gsm_bts *bts, uint8_t obj_class,
+		 struct abis_om_obj_inst *obj_inst)
+{
+	struct gsm_abis_mo *mo;
+
+	mo = objclass2mo(bts, obj_class, obj_inst);
+	if (!mo)
+		return NULL;
+
+	return &mo->nm_state;
 }
 
 /* obtain the in-memory data structure of a given object instance */
@@ -2626,7 +2640,7 @@
 {
 	int new_state = locked ? NM_STATE_LOCKED : NM_STATE_UNLOCKED;
 
-	trx->nm_state.administrative = new_state;
+	trx->mo.nm_state.administrative = new_state;
 	if (!trx->bts || !trx->bts->oml_link)
 		return;