first dispatch of RUA into RANAP
This is becoming more and more of a hack, as asn1c + asn1tostruct.py
don't really deal well with the RANAP syntax :(
diff --git a/src/hnbgw_ranap.c b/src/hnbgw_ranap.c
new file mode 100644
index 0000000..44a920b
--- /dev/null
+++ b/src/hnbgw_ranap.c
@@ -0,0 +1,256 @@
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/utils.h>
+
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+#include "asn1helpers.h"
+
+#include "hnbgw.h"
+//#include "ranap_common.h"
+
+#include "ranap/RANAP_RANAP-PDU.h"
+#include "ranap/RANAP_ResetAcknowledge.h"
+#include "ranap/RANAP_Reset.h"
+#include "ranap/RANAP_ProtocolIE-ID.h"
+#include "ranap/RANAP_Cause.h"
+#include "ranap/RANAP_CN-DomainIndicator.h"
+#include "ranap/RANAP_GlobalRNC-ID.h"
+#include "ranap/RANAP_CriticalityDiagnostics.h"
+
+
+/***********************************************************************
+ * BEGIN auto-generated copy+pasted
+ ***********************************************************************/
+
+/* this is copy+pasted from the asn1tostruct generated code that doesn't
+ * compile as a whole */
+
+#define RANAP_DEBUG(x, args ...) DEBUGP(0, x, ## args)
+
+extern int asn1_xer_print;
+
+struct msgb *ranap_generate_successful_outcome(
+ e_RANAP_ProcedureCode procedureCode,
+ RANAP_Criticality_t criticality,
+ asn_TYPE_descriptor_t * td,
+ void *sptr);
+
+RANAP_IE_t *ranap_new_ie(RANAP_ProtocolIE_ID_t id, RANAP_Criticality_t criticality,
+ asn_TYPE_descriptor_t *type, void *sptr);
+
+#define RESETIES_RANAP_GLOBALRNC_ID_PRESENT (1 << 0)
+
+typedef struct RANAP_ResetIEs_s {
+ uint16_t presenceMask;
+ RANAP_Cause_t cause;
+ RANAP_CN_DomainIndicator_t cN_DomainIndicator;
+ RANAP_GlobalRNC_ID_t globalRNC_ID; ///< Optional field
+} RANAP_ResetIEs_t;
+
+#define RESETACKNOWLEDGEIES_RANAP_CRITICALITYDIAGNOSTICS_PRESENT (1 << 0)
+#define RESETACKNOWLEDGEIES_RANAP_GLOBALRNC_ID_PRESENT (1 << 1)
+
+typedef struct RANAP_ResetAcknowledgeIEs_s {
+ uint16_t presenceMask;
+ RANAP_CN_DomainIndicator_t cN_DomainIndicator;
+ RANAP_CriticalityDiagnostics_t criticalityDiagnostics; ///< Optional field
+ RANAP_GlobalRNC_ID_t globalRNC_ID; ///< Optional field
+} RANAP_ResetAcknowledgeIEs_t;
+
+int ranap_decode_reseties(
+ RANAP_ResetIEs_t *resetIEs,
+ ANY_t *any_p) {
+
+ RANAP_Reset_t reset;
+ RANAP_Reset_t *reset_p = &reset;
+ int i, decoded = 0;
+ int tempDecoded = 0;
+ assert(any_p != NULL);
+ assert(resetIEs != NULL);
+
+ RANAP_DEBUG("Decoding message RANAP_ResetIEs (%s:%d)\n", __FILE__, __LINE__);
+
+ ANY_to_type_aper(any_p, &asn_DEF_RANAP_Reset, (void**)&reset_p);
+
+ for (i = 0; i < reset_p->reset_ies.list.count; i++) {
+ RANAP_IE_t *ie_p;
+ ie_p = reset_p->reset_ies.list.array[i];
+ switch(ie_p->id) {
+ case RANAP_ProtocolIE_ID_id_Cause:
+ {
+ RANAP_Cause_t ranaP_Cause;
+ RANAP_Cause_t *ranaP_Cause_p = &ranaP_Cause;
+ tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_Cause, (void**)&ranaP_Cause_p);
+ if (tempDecoded < 0) {
+ RANAP_DEBUG("Decoding of IE cause failed\n");
+ return -1;
+ }
+ decoded += tempDecoded;
+ if (asn1_xer_print)
+ xer_fprint(stdout, &asn_DEF_RANAP_Cause, ranaP_Cause_p);
+ memcpy(&resetIEs->cause, ranaP_Cause_p, sizeof(RANAP_Cause_t));
+ } break;
+ case RANAP_ProtocolIE_ID_id_CN_DomainIndicator:
+ {
+ RANAP_CN_DomainIndicator_t ranaP_CNDomainIndicator;
+ RANAP_CN_DomainIndicator_t *ranaP_CNDomainIndicator_p = &ranaP_CNDomainIndicator;
+ tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_CN_DomainIndicator, (void**)&ranaP_CNDomainIndicator_p);
+ if (tempDecoded < 0) {
+ RANAP_DEBUG("Decoding of IE cN_DomainIndicator failed\n");
+ return -1;
+ }
+ decoded += tempDecoded;
+ if (asn1_xer_print)
+ xer_fprint(stdout, &asn_DEF_RANAP_CN_DomainIndicator, ranaP_CNDomainIndicator_p);
+ memcpy(&resetIEs->cN_DomainIndicator, ranaP_CNDomainIndicator_p, sizeof(RANAP_CN_DomainIndicator_t));
+ } break;
+ /* Optional field */
+ case RANAP_ProtocolIE_ID_id_GlobalRNC_ID:
+ {
+#if 0
+ RANAP_GlobalRNC_ID_t ranaP_GlobalRNCID;
+ RANAP_GlobalRNC_ID_t *ranaP_GlobalRNCID_p = &ranaP_GlobalRNCID;
+ resetIEs->presenceMask |= RESETIES_RANAP_GLOBALRNC_ID_PRESENT;
+ tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_GlobalRNC_ID, (void**)&ranaP_GlobalRNCID_p);
+ if (tempDecoded < 0) {
+ RANAP_DEBUG("Decoding of IE globalRNC_ID failed\n");
+ return -1;
+ }
+ decoded += tempDecoded;
+ if (asn1_xer_print)
+ xer_fprint(stdout, &asn_DEF_RANAP_GlobalRNC_ID, ranaP_GlobalRNCID_p);
+ memcpy(&resetIEs->globalRNC_ID, ranaP_GlobalRNCID_p, sizeof(RANAP_GlobalRNC_ID_t));
+#endif
+ } break;
+ default:
+ RANAP_DEBUG("Unknown protocol IE id (%d) for message reseties\n", (int)ie_p->id);
+ return -1;
+ }
+ }
+ return decoded;
+}
+
+int ranap_encode_resetacknowledgeies(
+ RANAP_ResetAcknowledge_t *resetAcknowledge,
+ RANAP_ResetAcknowledgeIEs_t *resetAcknowledgeIEs) {
+
+ RANAP_IE_t *ie;
+
+ if ((ie = ranap_new_ie(RANAP_ProtocolIE_ID_id_CN_DomainIndicator,
+ RANAP_Criticality_reject,
+ &asn_DEF_RANAP_CN_DomainIndicator,
+ &resetAcknowledgeIEs->cN_DomainIndicator)) == NULL) {
+ return -1;
+ }
+ ASN_SEQUENCE_ADD(&resetAcknowledge->resetAcknowledge_ies.list, ie);
+
+ /* Optional field */
+ if ((resetAcknowledgeIEs->presenceMask & RESETACKNOWLEDGEIES_RANAP_CRITICALITYDIAGNOSTICS_PRESENT)
+ == RESETACKNOWLEDGEIES_RANAP_CRITICALITYDIAGNOSTICS_PRESENT) {
+ if ((ie = ranap_new_ie(RANAP_ProtocolIE_ID_id_CriticalityDiagnostics,
+ RANAP_Criticality_ignore,
+ &asn_DEF_RANAP_CriticalityDiagnostics,
+ &resetAcknowledgeIEs->criticalityDiagnostics)) == NULL) {
+ return -1;
+ }
+ ASN_SEQUENCE_ADD(&resetAcknowledge->resetAcknowledge_ies.list, ie);
+ }
+
+ /* Optional field */
+ if ((resetAcknowledgeIEs->presenceMask & RESETACKNOWLEDGEIES_RANAP_GLOBALRNC_ID_PRESENT)
+ == RESETACKNOWLEDGEIES_RANAP_GLOBALRNC_ID_PRESENT) {
+ if ((ie = ranap_new_ie(RANAP_ProtocolIE_ID_id_GlobalRNC_ID,
+ RANAP_Criticality_ignore,
+ &asn_DEF_RANAP_GlobalRNC_ID,
+ &resetAcknowledgeIEs->globalRNC_ID)) == NULL) {
+ return -1;
+ }
+ ASN_SEQUENCE_ADD(&resetAcknowledge->resetAcknowledge_ies.list, ie);
+ }
+
+ return 0;
+}
+
+/***********************************************************************
+ * END auto-generated copy+pasted
+ ***********************************************************************/
+
+#if 0
+{
+ RANAP_ResetAcknowledgeIEs_s ies;
+
+ memset(&ies, 0, sizeof(ies));
+ ies.cN_DomainIndicator = RANAP_CN_DomainIndicator_cs_domain;
+
+ rc = ranap_encoderesetacknowledgeise(&ies, FIXME);
+}
+#endif
+
+static int ranap_rx_init_reset(struct hnb_context *hnb, ANY_t *in)
+{
+ RANAP_ResetIEs_t ies;
+ int rc;
+
+ rc = ranap_decode_reseties(&ies, in);
+ if (rc < 0)
+ return rc;
+
+ DEBUGP(DMAIN, "RESET.req\n");
+
+ return 0;
+}
+
+static int ranap_rx_initiating_msg(struct hnb_context *hnb, RANAP_InitiatingMessage_t *imsg)
+{
+ int rc;
+
+ switch (imsg->procedureCode) {
+ case RANAP_ProcedureCode_id_Reset:
+ rc = ranap_rx_init_reset(hnb, &imsg->value);
+ break;
+ }
+}
+
+static int _hnbgw_ranap_rx(struct hnb_context *hnb, RANAP_RANAP_PDU_t *pdu)
+{
+ int rc;
+
+ switch (pdu->present) {
+ case RANAP_RANAP_PDU_PR_initiatingMessage:
+ rc = ranap_rx_initiating_msg(hnb, &pdu->choice.initiatingMessage);
+ break;
+ case RANAP_RANAP_PDU_PR_successfulOutcome:
+ break;
+ case RANAP_RANAP_PDU_PR_unsuccessfulOutcome:
+ break;
+ default:
+ break;
+ }
+}
+
+
+int hnbgw_ranap_rx(struct msgb *msg, uint8_t *data, size_t len)
+{
+ RANAP_RANAP_PDU_t _pdu, *pdu = &_pdu;
+ asn_dec_rval_t dec_ret;
+ int rc;
+
+ memset(pdu, 0, sizeof(*pdu));
+ dec_ret = aper_decode(NULL,&asn_DEF_RANAP_RANAP_PDU, (void **) &pdu,
+ data, len, 0, 0);
+ if (dec_ret.code != RC_OK) {
+ LOGP(DMAIN, LOGL_ERROR, "Error in RANAP ASN.1 decode\n");
+ return rc;
+ }
+
+ rc = _hnbgw_ranap_rx(msg->dst, pdu);
+
+ return rc;
+}
+
+int hnbgw_ranap_init(void)
+{
+
+}