RSL: add rsl_ipac_msg_name() for ipa specific RSL extension names
diff --git a/include/osmocom/gsm/rsl.h b/include/osmocom/gsm/rsl.h
index efe557f..712d17b 100644
--- a/include/osmocom/gsm/rsl.h
+++ b/include/osmocom/gsm/rsl.h
@@ -33,6 +33,7 @@
 const char *rsl_err_name(uint8_t err);
 const char *rsl_rlm_cause_name(uint8_t err);
 const char *rsl_msg_name(uint8_t err);
+const char *rsl_ipac_msg_name(uint8_t msg_type);
 
 /* Section 3.3.2.3 TS 05.02. I think this looks like a table */
 int rsl_ccch_conf_to_bs_cc_chans(int ccch_conf);
diff --git a/src/gsm/rsl.c b/src/gsm/rsl.c
index 1dafd6d..db276a2 100644
--- a/src/gsm/rsl.c
+++ b/src/gsm/rsl.c
@@ -346,6 +346,42 @@
 	return get_value_string(rsl_msgt_names, msg_type);
 }
 
+/*! \brief ip.access specific */
+static const struct value_string rsl_ipac_msgt_names[] = {
+	{ RSL_MT_IPAC_PDCH_ACT,		"IPAC_PDCH_ACT" },
+	{ RSL_MT_IPAC_PDCH_ACT_ACK,	"IPAC_PDCH_ACT_ACK" },
+	{ RSL_MT_IPAC_PDCH_ACT_NACK,	"IPAC_PDCH_ACT_NACK" },
+	{ RSL_MT_IPAC_PDCH_DEACT,	"IPAC_PDCH_DEACT" },
+	{ RSL_MT_IPAC_PDCH_DEACT_ACK,	"IPAC_PDCH_DEACT_ACK" },
+	{ RSL_MT_IPAC_PDCH_DEACT_NACK,	"IPAC_PDCH_DEACT_NACK" },
+	{ RSL_MT_IPAC_CONNECT_MUX,	"IPAC_CONNECT_MUX" },
+	{ RSL_MT_IPAC_CONNECT_MUX_ACK,	"IPAC_CONNECT_MUX_ACK" },
+	{ RSL_MT_IPAC_CONNECT_MUX_NACK,	"IPAC_CONNECT_MUX_NACK" },
+	{ RSL_MT_IPAC_BIND_MUX,		"IPAC_BIND_MUX" },
+	{ RSL_MT_IPAC_BIND_MUX_ACK,	"IPAC_BIND_MUX_ACK" },
+	{ RSL_MT_IPAC_BIND_MUX_NACK,	"IPAC_BIND_MUX_NACK" },
+	{ RSL_MT_IPAC_DISC_MUX,		"IPAC_DISC_MUX" },
+	{ RSL_MT_IPAC_DISC_MUX_ACK,	"IPAC_DISC_MUX_ACK" },
+	{ RSL_MT_IPAC_DISC_MUX_NACK,	"IPAC_DISC_MUX_NACK" },
+	{ RSL_MT_IPAC_CRCX,		"IPAC_CRCX" },
+	{ RSL_MT_IPAC_CRCX_ACK,		"IPAC_CRCX_ACK" },
+	{ RSL_MT_IPAC_CRCX_NACK,	"IPAC_CRCX_NACK" },
+	{ RSL_MT_IPAC_MDCX,		"IPAC_MDCX" },
+	{ RSL_MT_IPAC_MDCX_ACK,		"IPAC_MDCX_ACK" },
+	{ RSL_MT_IPAC_MDCX_NACK,	"IPAC_MDCX_NACK" },
+	{ RSL_MT_IPAC_DLCX_IND,		"IPAC_DLCX_IND" },
+	{ RSL_MT_IPAC_DLCX,		"IPAC_DLCX" },
+	{ RSL_MT_IPAC_DLCX_ACK,		"IPAC_DLCX_ACK" },
+	{ RSL_MT_IPAC_DLCX_NACK,	"IPAC_DLCX_NACK" },
+	{ 0, NULL }
+};
+
+/*! \brief Get human-readable name of ip.access RSL msg type */
+const char *rsl_ipac_msg_name(uint8_t msg_type)
+{
+	return get_value_string(rsl_ipac_msgt_names, msg_type);
+}
+
 static const struct value_string rsl_rlm_cause_strs[] = {
 	{ RLL_CAUSE_T200_EXPIRED,	"Timer T200 expired (N200+1) times" },
 	{ RLL_CAUSE_REEST_REQ,		"Re-establishment request" },