OML: consider administrative state when reporting

Report state as degraded if BTS or any of its TRX are administratively
locked.

Change-Id: Ic9ee998d972ca870ce5d039c3ed95edb6ba8b36f
Related: OS#2486
diff --git a/src/libbsc/abis_nm.c b/src/libbsc/abis_nm.c
index b7391a1..295cefd 100644
--- a/src/libbsc/abis_nm.c
+++ b/src/libbsc/abis_nm.c
@@ -683,13 +683,18 @@
 	return 0;
 }
 
-bool all_trx_rsl_connected(const struct gsm_bts *bts)
+bool all_trx_rsl_connected_unlocked(const struct gsm_bts *bts)
 {
 	const struct gsm_bts_trx *trx;
 
+	if (bts->mo.nm_state.administrative == NM_STATE_LOCKED)
+		return false;
+
 	llist_for_each_entry(trx, &bts->trx_list, list) {
 		if (!trx->rsl_link)
 			return false;
+		if (trx->mo.nm_state.administrative == NM_STATE_LOCKED)
+			return false;
 	}
 
 	return true;
diff --git a/src/libbsc/bts_ipaccess_nanobts.c b/src/libbsc/bts_ipaccess_nanobts.c
index 9e273f5..03bb708 100644
--- a/src/libbsc/bts_ipaccess_nanobts.c
+++ b/src/libbsc/bts_ipaccess_nanobts.c
@@ -50,7 +50,7 @@
 static char *get_oml_status(const struct gsm_bts *bts)
 {
 	if (bts->oml_link)
-		return all_trx_rsl_connected(bts) ? "connected" : "degraded";
+		return all_trx_rsl_connected_unlocked(bts) ? "connected" : "degraded";
 
 	return "disconnected";
 }