WIP: More WCDMA/RRC decoding
diff --git a/src/diag_log_wcdma.c b/src/diag_log_wcdma.c
index 0c3b2b2..858e857 100644
--- a/src/diag_log_wcdma.c
+++ b/src/diag_log_wcdma.c
@@ -1,14 +1,96 @@
 #include <stdio.h>
 
+#include <osmocom/core/utils.h>
+
 #include "diag_log.h"
 #include "protocol/diag_log_gsm.h"
 #include "protocol/diag_log_wcdma.h"
 
+static const struct value_string rrc_states[] = {
+	{ DIAG_UMTS_RRC_STATE_DISCONNECTED,	"DISCONNETED" },
+	{ DIAG_UMTS_RRC_STATE_CONNETING,	"CONNECTING" },
+	{ DIAG_UMTS_RRC_STATE_CELL_FACH,	"CELL_FACH" },
+	{ DIAG_UMTS_RRC_STATE_CELL_DCH,		"CELL_DCH" },
+	{ DIAG_UMTS_RRC_STATE_CELL_PCH,		"CELL_PCH" },
+	{ DIAG_UMTS_RRC_STATE_URA_PCH,		"URA_PCH" },
+	{ 0, NULL }
+};
+
+static const struct value_string rrc_procedures[] = {
+	{ DIAG_UMTS_RRC_PROC_CSP,	"Cell Selection" },
+	{ DIAG_UMTS_RRC_PROC_SIB,	"SIB Processing" },
+	{ DIAG_UMTS_RRC_PROC_PG2,	"Paging Type 2" },
+	{ DIAG_UMTS_RRC_PROC_MCMR,	"Measurement Control Reporting" },
+	{ DIAG_UMTS_RRC_PROC_RCE,	"RRC Connection Establishment" },
+	{ DIAG_UMTS_RRC_PROC_RCR,	"RRC Connection Release" },
+	{ DIAG_UMTS_RRC_PROC_UECI,	"UE Capability Information" },
+	{ DIAG_UMTS_RRC_PROC_UECE,	"UE Capability Enquiry" },
+	{ DIAG_UMTS_RRC_PROC_IDT,	"Initial Direct Transfer" },
+	{ DIAG_UMTS_RRC_PROC_UDT,	"Uplink Direct Transfer" },
+	{ DIAG_UMTS_RRC_PROC_DDT,	"Downlink Direct Transfer" },
+	{ DIAG_UMTS_RRC_PROC_SCR,	"Signaling Connection Release" },
+	{ DIAG_UMTS_RRC_PROC_SCRR,	"Signalling connection Release Request" },
+	{ DIAG_UMTS_RRC_PROC_CC,	"Counter Check" },
+	{ DIAG_UMTS_RRC_PROC_RBE,	"Radio Bearer Establishment" },
+	{ DIAG_UMTS_RRC_PROC_RBRC,	"Radio Bearer Re-configuration" },
+	{ DIAG_UMTS_RRC_PROC_RBR,	"Radio Bearer Release" },
+	{ DIAG_UMTS_RRC_PROC_TCR,	"Transport Channel Re-configuration" },
+	{ DIAG_UMTS_RRC_PROC_PCR,	"Physical Channel Re-configuration" },
+	{ DIAG_UMTS_RRC_PROC_TFC,	"Transport Format Combination Control" },
+	{ DIAG_UMTS_RRC_PROC_CU,	"Cell Update" },
+	{ DIAG_UMTS_RRC_PROC_UU,	"URA Update" },
+	{ DIAG_UMTS_RRC_PROC_UMI,	"UTRAN Mobility Information" },
+	{ DIAG_UMTS_RRC_PROC_ASU,	"Active Set Update" },
+	{ DIAG_UMTS_RRC_PROC_ISHFU,	"Inter-System Handover from UTRAN" },
+	{ DIAG_UMTS_RRC_PROC_USHTU,	"Inter-System Handover to UTRAN" },
+	{ DIAG_UMTS_RRC_PROC_ISCFU,	"Inter-System Cell Reselection from UTRAN" },
+	{ DIAG_UMTS_RRC_PROC_ISCTU,	"Inter-System Cell Reselection to UTRAN" },
+	{ DIAG_UMTS_RRC_PROC_PG1,	"Paging Type 1" },
+	{ DIAG_UMTS_RRC_PROC_SMC,	"Security Mode Command" },
+	{ 0, NULL }
+};
+
+static const struct value_string rrc_fail_causes[] = {
+	{ DIAG_UMTS_RRC_FAIL_CFG_UNSUP,		"Configuration Unsupported" },
+	{ DIAG_UMTS_RRC_FAIL_PHY_CHAN_FAIL,	"Physical Channel Failure" },
+	{ DIAG_UMTS_RRC_FAIL_INCOMP_SIM_RECONF,	"Incompatible Simultaneous Reconfig" },
+	{ DIAG_UMTS_RRC_FAIL_PROT_ERR,		"Protocol Error" },
+	{ DIAG_UMTS_RRC_FAIL_COMP_RT_ERR,	"Compressed Mode Runtime Error" },
+	{ DIAG_UTMS_RRC_FAIL_CELL_RESEL,	"Cell Reselection" },
+	{ DIAG_UMTS_RRC_FAIL_INVAL_CFG,		"Invalid Configuration" },
+	{ DIAG_UMTS_RRC_FAIL_CFG_INCOMPLETE,	"Configuration Incomplete" },
+	{ DIAG_UMTS_RRC_FAIL_UNSUP_MEAS,	"Unsupported Measurement" },
+	{ 0, NULL }
+};
+
+static const struct value_string rrc_prot_errs[] = {
+	{ DIAG_UMTS_RRC_PERR_ASN1_ENC_ERR,	"ASN.1 violation / encoding error" },
+	{ DIAG_UMTS_RRC_PERR_BAD_MSG_TYPE,	"Not existing or not implemented message type" },
+	{ DIAG_UMTS_RRC_PERR_IMCOMP_RX_STATE,	"Message incompatible with Rx state" },
+	{ DIAG_UMTS_RRC_PERR_BAD_IE,		"IE Value not understood" },
+	{ DIAG_UMTS_RRC_PERR_COND_IE_ERR,	"Conditional IE error" },
+	{ DIAG_UMTS_RRC_PERR_BAD_MSG_EXT,	"Message extension not undersetood" },
+	{ 0, NULL }
+};
+
+static const struct value_string rrc_chan_types[] = {
+	{ DIAG_UMTS_RRC_CHT_UL_CCCH,	"CCCH(Uplink)" },
+	{ DIAG_UMTS_RRC_CHT_UL_DCCH,	"DCCH(Uplink)" },
+	{ DIAG_UMTS_RRC_CHT_DL_CCCH,	"CCCH(Downlink)" },
+	{ DIAG_UMTS_RRC_CHT_DL_DCCH,	"DCCH(Downlink)" },
+	{ DIAG_UMTS_RRC_CHT_DL_BCCH_BCH,"BCCH/BCH" },
+	{ DIAG_UMTS_RRC_CHT_DL_BCCH_FACH, "BCCH/FACH" },
+	{ DIAG_UMTS_RRC_CHT_DL_PCCH,	"PCCH" },
+	{ 0, NULL }
+};
+
 static void handle_rrc_sig_msg(struct log_hdr *lh, struct msgb *msg)
 {
 	struct diag_umts_rrc_msg *rrm = (struct diag_umts_rrc_msg *) msgb_data(msg);
 
-	printf("RRC: %u %u %u: %s\n", rrm->chan_type, rrm->rb_id, rrm->length,
+	printf("RRC: %s %u %u: %s\n",
+		get_value_string(rrc_chan_types, rrm->chan_type),
+		rrm->rb_id, rrm->length,
 		osmo_hexdump(msgb_data(msg), rrm->length));
 }
 
diff --git a/src/protocol/diag_log_wcdma.h b/src/protocol/diag_log_wcdma.h
index 26e7986..f728f64 100644
--- a/src/protocol/diag_log_wcdma.h
+++ b/src/protocol/diag_log_wcdma.h
@@ -25,6 +25,83 @@
 	DIAG_UMTS_RRC_CHT_DL_PCCH	= 6,
 };
 
+enum diag_umts_rrc_state {
+	DIAG_UMTS_RRC_STATE_DISCONNECTED	= 0,
+	DIAG_UMTS_RRC_STATE_CONNETING		= 1,
+	DIAG_UMTS_RRC_STATE_CELL_FACH		= 2,
+	DIAG_UMTS_RRC_STATE_CELL_DCH		= 3,
+	DIAG_UMTS_RRC_STATE_CELL_PCH		= 4,
+	DIAG_UMTS_RRC_STATE_URA_PCH		= 5,
+	DIAG_UMTS_RRC_STATE_WILDCARD		= 6,
+};
+
+/* LOG_WCDMA_RRC_STATES_C */
+struct diag_umts_rrc_state_msg {
+	uint8_t 	rrc_state;
+} __attribute__((packed));
+
+enum diag_umts_rrc_procedure {
+	DIAG_UMTS_RRC_PROC_CSP		= 0,
+	DIAG_UMTS_RRC_PROC_SIB		= 1,
+	DIAG_UMTS_RRC_PROC_PG2		= 2,
+	DIAG_UMTS_RRC_PROC_MCMR		= 3,
+	DIAG_UMTS_RRC_PROC_RCE		= 4,
+	DIAG_UMTS_RRC_PROC_RCR		= 5,
+	DIAG_UMTS_RRC_PROC_UECI		= 6,
+	DIAG_UMTS_RRC_PROC_UECE		= 7,
+	DIAG_UMTS_RRC_PROC_IDT		= 8,
+	DIAG_UMTS_RRC_PROC_UDT		= 9,
+	DIAG_UMTS_RRC_PROC_DDT		= 10,
+	DIAG_UMTS_RRC_PROC_SCR		= 11,
+	DIAG_UMTS_RRC_PROC_SCRR		= 12,
+	DIAG_UMTS_RRC_PROC_CC		= 13,
+	DIAG_UMTS_RRC_PROC_RBE		= 14,
+	DIAG_UMTS_RRC_PROC_RBRC		= 15,
+	DIAG_UMTS_RRC_PROC_RBR		= 16,
+	DIAG_UMTS_RRC_PROC_TCR		= 17,
+	DIAG_UMTS_RRC_PROC_PCR		= 18,
+	DIAG_UMTS_RRC_PROC_TFC		= 19,
+	DIAG_UMTS_RRC_PROC_CU		= 20,
+	DIAG_UMTS_RRC_PROC_UU		= 21,
+	DIAG_UMTS_RRC_PROC_UMI		= 22,
+	DIAG_UMTS_RRC_PROC_ASU		= 23,
+	DIAG_UMTS_RRC_PROC_ISHFU	= 24,
+	DIAG_UMTS_RRC_PROC_USHTU	= 25,
+	DIAG_UMTS_RRC_PROC_ISCFU	= 26,
+	DIAG_UMTS_RRC_PROC_ISCTU	= 27,
+	DIAG_UMTS_RRC_PROC_PG1		= 28,
+	DIAG_UMTS_RRC_PROC_SMC		= 29,
+};
+
+enum diag_umts_rrc_fail_cause {
+	DIAG_UMTS_RRC_FAIL_CFG_UNSUP		= 0,
+	DIAG_UMTS_RRC_FAIL_PHY_CHAN_FAIL	= 1,
+	DIAG_UMTS_RRC_FAIL_INCOMP_SIM_RECONF	= 2,
+	DIAG_UMTS_RRC_FAIL_PROT_ERR		= 3,
+	DIAG_UMTS_RRC_FAIL_COMP_RT_ERR		= 4,
+	DIAG_UTMS_RRC_FAIL_CELL_RESEL		= 5,
+	DIAG_UMTS_RRC_FAIL_INVAL_CFG		= 6,
+	DIAG_UMTS_RRC_FAIL_CFG_INCOMPLETE	= 7,
+	DIAG_UMTS_RRC_FAIL_UNSUP_MEAS		= 8,
+};
+
+enum diag_umts_rrc_prot_err {
+	DIAG_UMTS_RRC_PERR_ASN1_ENC_ERR		= 0,
+	DIAG_UMTS_RRC_PERR_BAD_MSG_TYPE		= 1,
+	DIAG_UMTS_RRC_PERR_IMCOMP_RX_STATE	= 2,
+	DIAG_UMTS_RRC_PERR_BAD_IE		= 3,
+	DIAG_UMTS_RRC_PERR_COND_IE_ERR		= 4,
+	DIAG_UMTS_RRC_PERR_BAD_MSG_EXT		= 5,
+};
+
+/* LOG_WCDMA_RRC_PROTOCOL_ERRORS_C */
+struct diag_umts_rrc_prot_err_msg {
+	uint8_t		rrc_state;
+	uint8_t		rrc_procedure;
+	uint8_t		failure_cause;
+	uint8_t		prot_err_cause;
+} __attribute__((packed));
+
 /* LOG_WCDMA_SIGNALING_MSG_C */
 struct diag_umts_rrc_msg {
 	uint8_t		chan_type;