Introduce gsm_lchans_name() for human readable lchan state name

Also, use this new function to dump lchan state on VTY and to
improve readability of RSL log messages.
diff --git a/openbsc/src/abis_rsl.c b/openbsc/src/abis_rsl.c
index 6f13b4b..164d27d 100644
--- a/openbsc/src/abis_rsl.c
+++ b/openbsc/src/abis_rsl.c
@@ -940,8 +940,9 @@
 		return -EINVAL;
 
 	if (msg->lchan->state != LCHAN_S_ACT_REQ)
-		LOGP(DRSL, LOGL_NOTICE, "%s CHAN ACT ACK, but state %u\n",
-			gsm_lchan_name(msg->lchan), msg->lchan->state);
+		LOGP(DRSL, LOGL_NOTICE, "%s CHAN ACT ACK, but state %s\n",
+			gsm_lchan_name(msg->lchan),
+			gsm_lchans_name(msg->lchan->state));
 	msg->lchan->state = LCHAN_S_ACTIVE;
 
 	dispatch_signal(SS_LCHAN, S_LCHAN_ACTIVATE_ACK, msg->lchan);
@@ -1171,8 +1172,9 @@
 	case RSL_MT_RF_CHAN_REL_ACK:
 		DEBUGP(DRSL, "%s RF CHANNEL RELEASE ACK\n", ts_name);
 		if (msg->lchan->state != LCHAN_S_REL_REQ)
-			LOGP(DRSL, LOGL_NOTICE, "%s CHAN REL ACK but state=%u\n",
-				gsm_lchan_name(msg->lchan), msg->lchan->state);
+			LOGP(DRSL, LOGL_NOTICE, "%s CHAN REL ACK but state %s\n",
+				gsm_lchan_name(msg->lchan),
+				gsm_lchans_name(msg->lchan->state));
 		msg->lchan->state = LCHAN_S_NONE;
 		lchan_free(msg->lchan);
 		break;
@@ -1312,7 +1314,8 @@
 
 	if (lchan->state != LCHAN_S_NONE)
 		LOGP(DRSL, LOGL_NOTICE, "%s lchan_alloc() returned channel "
-		     "in state %u\n", gsm_lchan_name(lchan), lchan->state);
+		     "in state %s\n", gsm_lchan_name(lchan),
+		     gsm_lchans_name(lchan->state));
 	lchan->state = LCHAN_S_ACT_REQ;
 
 	ts_number = lchan->ts->nr;
diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c
index 7e62aa8..0dfd31f 100644
--- a/openbsc/src/gsm_data.c
+++ b/openbsc/src/gsm_data.c
@@ -88,6 +88,20 @@
 	return lchan_names[c];
 }
 
+static const struct value_string lchan_s_names[] = {
+	{ LCHAN_S_NONE,		"NONE" },
+	{ LCHAN_S_ACT_REQ,	"ACTIVATION REQUESTED" },
+	{ LCHAN_S_ACTIVE,	"ACTIVE" },
+	{ LCHAN_S_INACTIVE,	"INACTIVE" },
+	{ LCHAN_S_REL_REQ,	"RELEASE REQUESTED" },
+	{ 0,			NULL },
+};
+
+const char *gsm_lchans_name(enum gsm_lchan_state s)
+{
+	return get_value_string(lchan_s_names, s);
+}
+
 static const char *chreq_names[] = {
 	[GSM_CHREQ_REASON_EMERG]	= "EMERGENCY",
 	[GSM_CHREQ_REASON_PAG]		= "PAGING",
diff --git a/openbsc/src/vty_interface.c b/openbsc/src/vty_interface.c
index 59865d5..22284d8 100644
--- a/openbsc/src/vty_interface.c
+++ b/openbsc/src/vty_interface.c
@@ -571,7 +571,8 @@
 		lchan->nr, lchan->ts->nr, lchan->ts->trx->nr, 
 		lchan->ts->trx->bts->nr, gsm_lchant_name(lchan->type),
 		VTY_NEWLINE);
-	vty_out(vty, "  Use Count: %u%s", lchan->use_count, VTY_NEWLINE);
+	vty_out(vty, "  Use Count: %u, State: %s%s", lchan->use_count,
+		gsm_lchans_name(lchan->state), VTY_NEWLINE);
 	vty_out(vty, "  BS Power: %u dBm, MS Power: %u dBm%s",
 		lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red
 		- lchan->bs_power*2,