BS11: add nm_state for EnveBTES, PA and BBSIG physical objects

diff --git a/include/openbsc/gsm_data.h b/include/openbsc/gsm_data.h
index d8b4c3e..e85adf8 100644
--- a/include/openbsc/gsm_data.h
+++ b/include/openbsc/gsm_data.h
@@ -224,6 +224,17 @@
 	} bb_transc;
 
 	u_int16_t arfcn;
+
+	union {
+		struct {
+			struct {
+				struct gsm_nm_state nm_state;
+			} bbsig;
+			struct {
+				struct gsm_nm_state nm_state;
+			} pa;
+		} bs11;
+	};
 	struct gsm_bts_trx_ts ts[TRX_NR_TS];
 };
 
@@ -274,6 +285,10 @@
 	u_int16_t available_slots;
 };
 
+struct gsm_envabtse {
+	struct gsm_nm_state nm_state;
+};
+
 /* One BTS */
 struct gsm_bts {
 	struct gsm_network *network;
@@ -323,7 +338,7 @@
 			struct {
 				struct gsm_nm_state nm_state;
 			} rack;
-
+			struct gsm_envabtse envabtse[4];
 		} bs11;
 	};
 	
diff --git a/src/abis_nm.c b/src/abis_nm.c
index 57d4159..cd1f444 100644
--- a/src/abis_nm.c
+++ b/src/abis_nm.c
@@ -472,6 +472,8 @@
 		return "GPRS NSVC0";
 	case NM_OC_GPRS_NSVC1:
 		return "GPRS NSVC1";
+	case NM_OC_BS11:
+		return "SIEMENSHW";
 	}
 
 	return "UNKNOWN";
@@ -566,12 +568,29 @@
 		case BS11_OBJ_CCLK:
 			nm_state = &bts->bs11.cclk.nm_state;
 			break;
+		case BS11_OBJ_BBSIG:
+			if (obj_inst->ts_nr > bts->num_trx)
+				return NULL;
+			trx = &bts->trx[obj_inst->ts_nr];
+			nm_state = &trx->bs11.bbsig.nm_state;
+			break;
+		case BS11_OBJ_PA:
+			if (obj_inst->ts_nr > bts->num_trx)
+				return NULL;
+			trx = &bts->trx[obj_inst->ts_nr];
+			nm_state = &trx->bs11.pa.nm_state;
+			break;
 		default:
 			return NULL;
 		}
 	case NM_OC_BS11_RACK:
 		nm_state = &bts->bs11.rack.nm_state;
 		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;
+		break;
 	}
 	return nm_state;
 }
@@ -650,6 +669,8 @@
 
 	DEBUGPC(DNM, "STATE CHG: ");
 
+	memset(&new_state, 0, sizeof(new_state));
+
 	nm_state = objclass2nmstate(bts, foh->obj_class, &foh->obj_inst);
 	if (!nm_state) {
 		DEBUGPC(DNM, "\n");