WIP: add some early code for generating required RANAP messages
diff --git a/src/tests/test-ranap.c b/src/tests/test-ranap.c
new file mode 100644
index 0000000..c8e0280
--- /dev/null
+++ b/src/tests/test-ranap.c
@@ -0,0 +1,207 @@
+
+
+/* This is just some non-compiling work in progress code to generate the
+ * minimum set of RANAP messages that the core network side needs to send
+ * towards the RNC */
+
+int ranap_tx_dt(uint8_t sapi, const uint8_t *nas, unsigned int nas_len)
+{
+	RANAP_DirectTransferIEs_t ies;
+	RANAP_DirectTransfer_t dt;
+	struct msgb *msg;
+	int rc;
+
+	memset(&ies, 0, sizeof(ies));
+
+	/* only SAPI optional field shall be present for CN->RNC */
+	ies.presenceMask = DIRECTTRANSFERIES_RANAP_SAPI_PRESENT;
+
+	if (sapi == 3)
+		ies.sapi = RANAP_SAPI_sapi_3;
+	else
+		ies.sapi = RANAP_SAPI_sapi_0;
+
+	ies.nas_pdu.buf = nas;
+	ies.nas_pdu.size = nas_len;
+
+	rc = ranap_encode_directtransferies(&dt, &ies);
+
+	msg = ranap_generate_initiating_message(RANAP_ProcedureCode_id_DirectTransfer,
+						RANAP_Criticality_reject,
+						&asn_DEF_RANAP_DirectTransfer,
+						&dt);
+	/* FIXME: Hand that to RUA or SCCP */
+}
+
+static const enum RANAP_IntegrityProtectionAlgorithm ip_alg[2] = {
+	RANAP_IntegrityProtectionAlgorithm_standard_UMTS_integrity_algorithm_UIA1,
+	RANAP_IntegrityProtectionAlgorithm_standard_UMTS_integrity_algorithm_UIA2,
+};
+
+static const enum RANAP_EncryptionAlgorithm enc_alg[2] = {
+	RANAP_EncryptionAlgorithm_standard_UMTS_encryption_algorithm_UEA1,
+	RANAP_EncryptionAlgorithm_standard_UMTS_encryption_algorithm_UEA2,
+};
+
+int ranap_tx_sec_mod_cmd(void)
+{
+	RANAP_SecurityModeCommandIEs_t ies;
+	RANAP_SecurityModeCommand_t out;
+	struct msgb *msg;
+	int rc;
+
+	memset(&ies, 0, sizeof(ies));
+
+	ies.presenceMask = SECURITYMODECOMMANDIES_RANAP_ENCRYPTIONINFORMATION_PRESENT;
+
+	ASN_SEQUENCE_ADD(&ies.integrityProtectionInformation.permittedAlgorithms, &ip_alg[0]);
+	ASN_SEQUENCE_ADD(&ies.integrityProtectionInformation.permittedAlgorithms, &ip_alg[1]);
+
+	ies.integrityProtectionInformation.key; /* FIXME */
+	if (0) {
+		ASN_SEQUENCE_ADD(&ies.encryptionInformation.permittedAlgorithms, &enc_alg[0]);
+		ASN_SEQUENCE_ADD(&ies.encryptionInformation.permittedAlgorithms, &enc_alg[1]);
+		ies.encryptionInformation.key; /* FIXME */
+	}
+	ies.keyStatus = RANAP_KeyStatus_new;	/* FIXME */
+
+	rc = ranap_encode_securitymodecommandies(&out, &ies);
+
+	asn_sequence_empty(&ies.integrityProtectionInformation.permittedAlgorithms);
+	asn_sequence_empty(&ies.encryptionInformation.permittedAlgorithms);
+
+	msg = ranap_generate_initiating_message(RANAP_ProcedureCode_id_SecurityModeControl,
+						RANAP_Criticality_reject,
+						&asn_DEF_RANAP_SecurityModeCommand,
+						&out);
+}
+
+int ranap_tx_common_id(const char *imsi)
+{
+	RANAP_CommonID_IEs_t ies;
+	RANAP_CommonID_t out;
+	struct msgb *msg;
+	int rc;
+
+	memset(&ies, 0, sizeof(ies));
+
+	if (imsi) {
+		ies.permanentNAS_UE_ID.present = RANAP_PermanentNAS_UE_ID_PR_iMSI;
+		ies.permanentNAS_UE_ID.choice.iMSI; /* FIXME */
+	} else
+		ies.permanentNAS_UE_ID.present = RANAP_PermanentNAS_UE_ID_PR_NOTHING;
+
+	rc = ranap_encode_commonidies(&out, &ies);
+
+	msg = ranap_generate_initiating_message(RANAP_ProcedureCode_id_CommonID,
+						RANAP_Criticality_ignore,
+						&asn_DEF_RANAP_CommonID,
+						&out);
+}
+
+int ranap_tx_iu_rel_cmd(RANAP_Cause_t cause)
+{
+	RANAP_Iu_ReleaseCommandIEs_t ies;
+	RANAP_Iu_ReleaseCommand_t out;
+	struct msgb *msg;
+	int rc;
+
+	memset(&ies, 0, sizeof(ies));
+
+	ies.cause = cause;
+
+	rc = ranap_encode_iu_releasecommandies(&out, &ies);
+
+	msg = ranap_generate_initiating_message(RANAP_ProcedureCode_id_Iu_Release,
+						RANAP_Criticality_reject,
+						&asn_DEF_RANAP_ReleaseCommand,
+						&out);
+}
+
+int ranap_tx_paging_cmd(const char *imsi, uint32_t *tmsi, uint32_t cause)
+{
+	RANAP_PagingIEs_s ies;
+	RANAP_Paging_t out;
+
+	memset(&ies, 0, sizeof(ies));
+
+	if (is_ps)
+		ies.cN_DomainIndicator = RANAP_CN_DomainIndicator_ps_domain;
+	else
+		ies.cN_DomainIndicator = RANAP_CN_DomainIndicator_cs_domain;
+
+	ies.permanentNAS_UE_ID; /* FIXME */
+
+	if (tmsi) {
+		ies.presenceMask |= PAGINGIES_RANAP_TEMPORARYUE_ID_PRESENT;
+		if (is_ps) {
+			ies.temporaryUE_ID.present = RANAP_TemporaryUE_ID_PR_p_TMSI;
+			ies.temporaryUE_ID.choice.tMSI;
+		} else {
+			ies.temporaryUE_ID.present = RANAP_TemporaryUE_ID_PR_tMSI;
+			ies.temporaryUE_ID.choice.p_TMSI;
+		}
+	}
+
+	if (cause) {
+		ies.presenceMask |= PAGINGIES_RANAP_PAGINGCAUSE_PRESENT;
+		ies.pagingCause = cause;
+	}
+
+	rc = ranap_encode_iu_pagingies(&out, &ies);
+
+	msg = ranap_generate_initiating_message(RANAP_ProcedureCode_id_Iu_Paging,
+						RANAP_Criticality_reject,
+						&asn_DEF_RANAP_Paging,
+						&out);
+}
+
+
+
+static RANAP_RAB_Parameters_t rab_par_voice = {
+	.trafficClass = RANAP_TrafficClass_conversational,
+	.rAB_AsymmetryIndicator = ANAP_RAB_AsymmetryIndicator_symmetric_bidirectional
+	.maxBitrate = ,
+	.deliveryOrder = RANAP_DeliveryOrder_delivery_order_not_requested
+	.maxSDU_Size = 1234,
+	.sDU_Parameters = ,
+};
+
+static RANAP_UserPlaneInformation_t rab_upl_voice = {
+	.userPlaneMode = RANAP_UserPlaneMode_transparent_mode,
+	.uP_ModeVersions = FIXME,
+};
+
+int ranap_tx_rab_assign()
+{
+	RANAP_ProtocolIE_FieldPair_t *pair;
+	RANAP_RAB_AssignmentRequestIEs_t ies;
+	RANAP_RAB_AssignmentRequest_t out;
+
+
+	memset(&ies, 0, sizeof(ies));
+
+	ies.presenceMask = RAB_ASSIGNMENTREQUESTIES_RANAP_RAB_SETUPORMODIFYLIST_PRESENT;
+	/* RANAP_RAB_IE_ContainerPairList_t */
+
+	RANAP_RAB_SetupOrModifyItemFirst_t first;
+
+	first.rAB_ID = FIXME;
+	first.nAS_SynchronisationIndicator = FIXME;
+	first.rAB_Parameters = &rab_par_voice;
+	first.userPlaneInformation = &rab_upl_voice;
+	first.transportLayerInformation = NULL;
+
+	RANAP_RAB_SetupOrModifyItemSecond_t second;
+
+
+	pair = ranap_new_ie_pair(RANAP_ProtocolIE_ID_id_RAB_SetupOrModifyItem,
+				 RANAP_Criticality_reject,
+				 SetupOrModifyItemFirst, &first,
+				 RANAP_Criticality_ignore,
+				 SetupOrModifyItemSecond, &second);
+
+	ASN_SEQUENCE_ADD(&ies.raB_SetupOrModifyList.list, pair);
+
+	rc = ranap_encode_rab_assignmentrequesties(&out, &ies);
+}