aboutsummaryrefslogtreecommitdiffstats
path: root/src/ranap_common.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2015-12-16 20:17:26 +0100
committerHarald Welte <laforge@gnumonks.org>2015-12-16 20:17:26 +0100
commitcbaaeefe008a2ace0eb3d6287c12f33d521cbf23 (patch)
tree1613fb7b6d46c39de2e6e436cdb1bf94d709e129 /src/ranap_common.c
parent08d5da664740432b6933220b094787da9ca90ab8 (diff)
{rua,hnbap,ranap}_common: Add missing encoding functions
We used to only have those generator functions that we needed for the existing hnbgw code; Implement the missing encoders
Diffstat (limited to 'src/ranap_common.c')
-rw-r--r--src/ranap_common.c66
1 files changed, 37 insertions, 29 deletions
diff --git a/src/ranap_common.c b/src/ranap_common.c
index ce97899..e3472ea 100644
--- a/src/ranap_common.c
+++ b/src/ranap_common.c
@@ -35,36 +35,39 @@ static struct msgb *ranap_msgb_alloc(void)
return msgb_alloc(1024, "RANAP Tx");
}
-#if 0
-ssize_t ranap_generate_initiating_message(uint8_t ** buffer,
- uint32_t * length,
- e_RANAP_ProcedureCode procedureCode,
+struct msgb *ranap_generate_initiating_message(e_RANAP_ProcedureCode procedureCode,
RANAP_Criticality_t criticality,
- asn_TYPE_descriptor_t * td, void *sptr)
+ asn_TYPE_descriptor_t *td, void *sptr)
{
RANAP_RANAP_PDU_t pdu;
- ssize_t encoded;
+ struct msgb *msg = ranap_msgb_alloc();
+ asn_enc_rval_t rval;
+ int rc;
memset(&pdu, 0, sizeof(pdu));
pdu.present = RANAP_RANAP_PDU_PR_initiatingMessage;
pdu.choice.initiatingMessage.procedureCode = procedureCode;
pdu.choice.initiatingMessage.criticality = criticality;
- ANY_fromType_aper(&pdu.choice.initiatingMessage.value, td, sptr);
+ rc = ANY_fromType_aper(&pdu.choice.initiatingMessage.value, td, sptr);
+ if (rc < 0) {
+ LOGP(DMAIN, LOGL_ERROR, "Error in ANY_fromType_aper\n");
+ msgb_free(msg);
+ return NULL;
+ }
- if (asn1_xer_print)
- xer_fprint(stdout, &asn_DEF_RANAP_RAMAP_PDU, (void *)&pdu);
+ rval = aper_encode_to_buffer(&asn_DEF_RANAP_RANAP_PDU, &pdu,
+ msg->data, msgb_tailroom(msg));
+ if (rval.encoded < 0) {
+ LOGP(DMAIN, LOGL_ERROR, "Error encoding type: %s\n",
+ rval.failed_type->name);
- if ((encoded =
- aper_encode_to_new_buffer(&asn_DEF_RANAP_RANAP_PDU, 0, &pdu,
- (void **)buffer)) < 0) {
- return -1;
}
- *length = encoded;
- return encoded;
+ msgb_put(msg, rval.encoded/8);
+
+ return msg;
}
-#endif
struct msgb *ranap_generate_successful_outcome(
e_RANAP_ProcedureCode procedureCode,
@@ -102,36 +105,41 @@ struct msgb *ranap_generate_successful_outcome(
return msg;
}
-#if 0
-ssize_t ranap_generate_unsuccessful_outcome(uint8_t ** buffer,
- uint32_t * length,
+struct msgb *ranap_generate_unsuccessful_outcome(
e_RANAP_ProcedureCode procedureCode,
RANAP_Criticality_t criticality,
asn_TYPE_descriptor_t * td,
void *sptr)
{
-
RANAP_RANAP_PDU_t pdu;
- ssize_t encoded;
+ struct msgb *msg = ranap_msgb_alloc();
+ asn_enc_rval_t rval;
+ int rc;
memset(&pdu, 0, sizeof(pdu));
pdu.present = RANAP_RANAP_PDU_PR_unsuccessfulOutcome;
pdu.choice.successfulOutcome.procedureCode = procedureCode;
pdu.choice.successfulOutcome.criticality = criticality;
- ANY_fromType_aper(&pdu.choice.successfulOutcome.value, td, sptr);
+ rc = ANY_fromType_aper(&pdu.choice.successfulOutcome.value, td, sptr);
+ if (rc < 0) {
+ LOGP(DMAIN, LOGL_ERROR, "Error in ANY_fromType_aper\n");
+ msgb_free(msg);
+ return NULL;
+ }
- if ((encoded =
- aper_encode_to_new_buffer(&asn_DEF_RANAP_RANAP_PDU, 0, &pdu,
- (void **)buffer)) < 0) {
- return -1;
+ rval = aper_encode_to_buffer(&asn_DEF_RANAP_RANAP_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;
+ msgb_put(msg, rval.encoded/8);
- return encoded;
+ return msg;
}
-#endif
RANAP_IE_t *ranap_new_ie(RANAP_ProtocolIE_ID_t id,
RANAP_Criticality_t criticality,