Back RUA/RANAP integration until RANAP Reset works for cs+ps

The hNodeB is now actively transmitting and we are getting up to the
HNBAP UE-REGISTER.req with the IMSI of the MS.
diff --git a/src/hnbap_common.c b/src/hnbap_common.c
index d13cb50..f3aa1a3 100644
--- a/src/hnbap_common.c
+++ b/src/hnbap_common.c
@@ -77,7 +77,7 @@
 		return NULL;
 	}
 
-	msgb_put(msg, rval.encoded);
+	msgb_put(msg, rval.encoded/8);
 
 	return msg;
 }
diff --git a/src/hnbgw_ranap.c b/src/hnbgw_ranap.c
index 44a920b..bad99c8 100644
--- a/src/hnbgw_ranap.c
+++ b/src/hnbgw_ranap.c
@@ -8,6 +8,7 @@
 #include "asn1helpers.h"
 
 #include "hnbgw.h"
+#include "hnbgw_rua.h"
 //#include "ranap_common.h"
 
 #include "ranap/RANAP_RANAP-PDU.h"
@@ -177,16 +178,37 @@
  * END auto-generated copy+pasted
  ***********************************************************************/
 
-#if 0
+static int ranap_tx_reset_ack(struct hnb_context *hnb,
+				RANAP_CN_DomainIndicator_t domain)
 {
-	RANAP_ResetAcknowledgeIEs_s ies;
+	RANAP_ResetAcknowledge_t out;
+	RANAP_ResetAcknowledgeIEs_t ies;
+	struct msgb *msg;
+	int rc;
 
 	memset(&ies, 0, sizeof(ies));
-	ies.cN_DomainIndicator = RANAP_CN_DomainIndicator_cs_domain;
+	ies.cN_DomainIndicator = domain;
 
-	rc = ranap_encoderesetacknowledgeise(&ies, FIXME);
+	memset(&out, 0, sizeof(out));
+	rc = ranap_encode_resetacknowledgeies(&out, &ies);
+	if (rc < 0) {
+		LOGP(DMAIN, LOGL_ERROR, "error encoding reset ack IEs: %d\n", rc);
+		return rc;
+	}
+
+	msg = ranap_generate_successful_outcome(RANAP_ProcedureCode_id_Reset,
+						RANAP_Criticality_reject,
+						&asn_DEF_RANAP_ResetAcknowledge,
+						&out);
+	if (!msg)
+		return -1;
+
+	msg->dst = hnb;
+
+	rc = rua_tx_udt(msg);
+
+	return rc;
 }
-#endif
 
 static int ranap_rx_init_reset(struct hnb_context *hnb, ANY_t *in)
 {
@@ -199,6 +221,8 @@
 
 	DEBUGP(DMAIN, "RESET.req\n");
 
+	ranap_tx_reset_ack(hnb, ies.cN_DomainIndicator);
+
 	return 0;
 }
 
diff --git a/src/hnbgw_rua.c b/src/hnbgw_rua.c
index 3af564b..69d5e69 100644
--- a/src/hnbgw_rua.c
+++ b/src/hnbgw_rua.c
@@ -21,73 +21,35 @@
 	return osmo_wqueue_enqueue(&ctx->wqueue, msg);
 }
 
-static const struct value_string rua_cause_radio_vals[] = {
-	{ RUA_CauseRadioNetwork_normal,		 "normal" },
-	{ RUA_CauseRadioNetwork_connect_failed,	 "connect failed" },
-	{ RUA_CauseRadioNetwork_network_release, "network release" },
-	{ RUA_CauseRadioNetwork_unspecified,	 "unspecified" },
-	{ 0, NULL }
-};
-
-static const struct value_string rua_cause_transp_vals[] = {
-	{ RUA_CauseTransport_transport_resource_unavailable, "resource unavailable" },
-	{ RUA_CauseTransport_unspecified, "unspecified" },
-	{ 0, NULL }
-};
-
-static const struct value_string rua_cause_prot_vals[] = {
-	{ RUA_CauseProtocol_transfer_syntax_error, "syntax error" },
-	{ RUA_CauseProtocol_abstract_syntax_error_reject,
-		"abstract syntax error; reject" },
-	{ RUA_CauseProtocol_abstract_syntax_error_ignore_and_notify,
-		"abstract syntax error; ignore and notify" },
-	{ RUA_CauseProtocol_message_not_compatible_with_receiver_state,
-		"message not compatible with receiver state" },
-	{ RUA_CauseProtocol_semantic_error, "semantic error" },
-	{ RUA_CauseProtocol_unspecified, "unspecified" },
-	{ RUA_CauseProtocol_abstract_syntax_error_falsely_constructed_message,
-		"falsely constructed message" },
-	{ 0, NULL }
-};
-
-static const struct value_string rua_cause_misc_vals[] = {
-	{ RUA_CauseMisc_processing_overload,	"processing overload" },
-	{ RUA_CauseMisc_hardware_failure,	"hardware failure" },
-	{ RUA_CauseMisc_o_and_m_intervention,	"OAM intervention" },
-	{ RUA_CauseMisc_unspecified, 		"unspecified" },
-	{ 0, NULL }
-};
-
-static char *rua_cause_str(RUA_Cause_t *cause)
+int rua_tx_udt(struct msgb *inmsg)
 {
-	static char buf[32];
+	RUA_ConnectionlessTransfer_t out;
+	RUA_ConnectionlessTransferIEs_t ies;
+	struct msgb *msg;
+	int rc;
 
-	switch (cause->present) {
-	case RUA_Cause_PR_radioNetwork:
-		snprintf(buf, sizeof(buf), "radio(%s)",
-			 get_value_string(rua_cause_radio_vals,
-					 cause->choice.radioNetwork));
-		break;
-	case RUA_Cause_PR_transport:
-		snprintf(buf, sizeof(buf), "transport(%s)",
-			get_value_string(rua_cause_transp_vals,
-					cause->choice.transport));
-		break;
-	case RUA_Cause_PR_protocol:
-		snprintf(buf, sizeof(buf), "protocol(%s)",
-			get_value_string(rua_cause_prot_vals,
-					cause->choice.protocol));
-		break;
-	case RUA_Cause_PR_misc:
-		snprintf(buf, sizeof(buf), "misc(%s)",
-			get_value_string(rua_cause_misc_vals,
-					cause->choice.misc));
-		break;
-	}
-	return buf;
+	memset(&ies, 0, sizeof(ies));
+	ies.ranaP_Message.buf = inmsg->data;
+	ies.ranaP_Message.size = msgb_length(inmsg);
+
+	/* FIXME: msgb_free(msg)? ownership not yet clear */
+
+	memset(&out, 0, sizeof(out));
+	rc = rua_encode_connectionlesstransferies(&out, &ies);
+	if (rc < 0)
+		return rc;
+
+	msg = rua_generate_initiating_message(RUA_ProcedureCode_id_ConnectionlessTransfer,
+					      RUA_Criticality_reject,
+					      &asn_DEF_RUA_ConnectionlessTransfer,
+					      &out);
+	msg->dst = inmsg->dst;
+
+	DEBUGP(DMAIN, "transmitting RUA payload of %u bytes\n", msgb_length(msg));
+
+	return hnbgw_rua_tx(msg->dst, msg);
 }
 
-
 static int rua_rx_init_connect(struct msgb *msg, ANY_t *in)
 {
 	RUA_ConnectIEs_t ies;
diff --git a/src/hnbgw_rua.h b/src/hnbgw_rua.h
index 97c35f0..69b2382 100644
--- a/src/hnbgw_rua.h
+++ b/src/hnbgw_rua.h
@@ -4,3 +4,5 @@
 
 int hnbgw_rua_rx(struct hnb_context *hnb, struct msgb *msg);
 int hnbgw_rua_init(void);
+
+int rua_tx_udt(struct msgb *inmsg);
diff --git a/src/ranap_common.c b/src/ranap_common.c
index 7be7c95..dc86a7a 100644
--- a/src/ranap_common.c
+++ b/src/ranap_common.c
@@ -77,7 +77,7 @@
 		return NULL;
 	}
 
-	msgb_put(msg, rval.encoded);
+	msgb_put(msg, rval.encoded/8);
 
 	return msg;
 }
diff --git a/src/rua_common.c b/src/rua_common.c
index 637cd72..8f4da12 100644
--- a/src/rua_common.c
+++ b/src/rua_common.c
@@ -7,41 +7,106 @@
 
 extern int asn1_xer_print;
 
+static const struct value_string rua_cause_radio_vals[] = {
+	{ RUA_CauseRadioNetwork_normal,		 "normal" },
+	{ RUA_CauseRadioNetwork_connect_failed,	 "connect failed" },
+	{ RUA_CauseRadioNetwork_network_release, "network release" },
+	{ RUA_CauseRadioNetwork_unspecified,	 "unspecified" },
+	{ 0, NULL }
+};
+
+static const struct value_string rua_cause_transp_vals[] = {
+	{ RUA_CauseTransport_transport_resource_unavailable, "resource unavailable" },
+	{ RUA_CauseTransport_unspecified, "unspecified" },
+	{ 0, NULL }
+};
+
+static const struct value_string rua_cause_prot_vals[] = {
+	{ RUA_CauseProtocol_transfer_syntax_error, "syntax error" },
+	{ RUA_CauseProtocol_abstract_syntax_error_reject,
+		"abstract syntax error; reject" },
+	{ RUA_CauseProtocol_abstract_syntax_error_ignore_and_notify,
+		"abstract syntax error; ignore and notify" },
+	{ RUA_CauseProtocol_message_not_compatible_with_receiver_state,
+		"message not compatible with receiver state" },
+	{ RUA_CauseProtocol_semantic_error, "semantic error" },
+	{ RUA_CauseProtocol_unspecified, "unspecified" },
+	{ RUA_CauseProtocol_abstract_syntax_error_falsely_constructed_message,
+		"falsely constructed message" },
+	{ 0, NULL }
+};
+
+static const struct value_string rua_cause_misc_vals[] = {
+	{ RUA_CauseMisc_processing_overload,	"processing overload" },
+	{ RUA_CauseMisc_hardware_failure,	"hardware failure" },
+	{ RUA_CauseMisc_o_and_m_intervention,	"OAM intervention" },
+	{ RUA_CauseMisc_unspecified, 		"unspecified" },
+	{ 0, NULL }
+};
+
+char *rua_cause_str(RUA_Cause_t *cause)
+{
+	static char buf[32];
+
+	switch (cause->present) {
+	case RUA_Cause_PR_radioNetwork:
+		snprintf(buf, sizeof(buf), "radio(%s)",
+			 get_value_string(rua_cause_radio_vals,
+					 cause->choice.radioNetwork));
+		break;
+	case RUA_Cause_PR_transport:
+		snprintf(buf, sizeof(buf), "transport(%s)",
+			get_value_string(rua_cause_transp_vals,
+					cause->choice.transport));
+		break;
+	case RUA_Cause_PR_protocol:
+		snprintf(buf, sizeof(buf), "protocol(%s)",
+			get_value_string(rua_cause_prot_vals,
+					cause->choice.protocol));
+		break;
+	case RUA_Cause_PR_misc:
+		snprintf(buf, sizeof(buf), "misc(%s)",
+			get_value_string(rua_cause_misc_vals,
+					cause->choice.misc));
+		break;
+	}
+	return buf;
+}
+
+
 static struct msgb *rua_msgb_alloc(void)
 {
 	return msgb_alloc(1024, "RUA Tx");
 }
 
-#if 0
-ssize_t rua_generate_initiating_message(uint8_t ** buffer,
-					uint32_t * length,
+struct msgb *rua_generate_initiating_message(
 					e_RUA_ProcedureCode procedureCode,
 					RUA_Criticality_t criticality,
 					asn_TYPE_descriptor_t * td, void *sptr)
 {
 	RUA_RUA_PDU_t pdu;
+	struct msgb *msg = rua_msgb_alloc();
+	asn_enc_rval_t rval;
 	ssize_t encoded;
 
 	memset(&pdu, 0, sizeof(pdu));
-
 	pdu.present = RUA_RUA_PDU_PR_initiatingMessage;
 	pdu.choice.initiatingMessage.procedureCode = procedureCode;
 	pdu.choice.initiatingMessage.criticality = criticality;
 	ANY_fromType_aper(&pdu.choice.initiatingMessage.value, td, sptr);
 
-	if (asn1_xer_print)
-		xer_fprint(stdout, &asn_DEF_RUA_RUA_PDU, (void *)&pdu);
-
-	if ((encoded =
-	     aper_encode_to_new_buffer(&asn_DEF_RUA_RUA_PDU, 0, &pdu,
-				       (void **)buffer)) < 0) {
-		return -1;
+	rval = aper_encode_to_buffer(&asn_DEF_RUA_RUA_PDU, &pdu,
+				     msg->data, msgb_tailroom(msg));
+	if (rval.encoded < 0) {
+		LOGP(DMAIN, LOGL_ERROR, "Error encoding type %s\n", rval.failed_type->name);
+		msgb_free(msg);
+		return NULL;
 	}
 
-	*length = encoded;
-	return encoded;
+	msgb_put(msg, rval.encoded/8);
+
+	return msg;
 }
-#endif
 
 struct msgb *rua_generate_successful_outcome(
 					   e_RUA_ProcedureCode procedureCode,
@@ -74,7 +139,7 @@
 		return NULL;
 	}
 
-	msgb_put(msg, rval.encoded);
+	msgb_put(msg, rval.encoded/8);
 
 	return msg;
 }
diff --git a/src/rua_common.h b/src/rua_common.h
index cb5b2f4..0c9e786 100644
--- a/src/rua_common.h
+++ b/src/rua_common.h
@@ -48,6 +48,11 @@
 
 extern int asn1_xer_print;
 
+struct msgb *rua_generate_initiating_message(
+					e_RUA_ProcedureCode procedureCode,
+					RUA_Criticality_t criticality,
+					asn_TYPE_descriptor_t * td, void *sptr);
+
 struct msgb *rua_generate_successful_outcome(
 					   e_RUA_ProcedureCode procedureCode,
 					   RUA_Criticality_t criticality,
@@ -57,3 +62,4 @@
 RUA_IE_t *rua_new_ie(RUA_ProtocolIE_ID_t id, RUA_Criticality_t criticality,
 		     asn_TYPE_descriptor_t *type, void *sptr);
 
+char *rua_cause_str(RUA_Cause_t *cause);