From 8dacb07bafad4e2b2966453f9eb97696c0747124 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Wed, 16 Dec 2015 20:27:14 +0100 Subject: [PATCH] {hnbap,rua,ranap}_common.c: Reduce code duplicatioon There used to be a lot of code duplication between the code to generate initiating, successfulOutcome and unsuccessfulOutcome messages. Try to reduce that by callign a generic function. --- src/hnbap_common.c | 67 ++++++++++++++++------------------------- src/ranap_common.c | 72 +++++++++++++++++--------------------------- src/rua_common.c | 75 ++++++++++++++++++++-------------------------- 3 files changed, 85 insertions(+), 129 deletions(-) diff --git a/src/hnbap_common.c b/src/hnbap_common.c index 6c5812e5..29b0f3b3 100644 --- a/src/hnbap_common.c +++ b/src/hnbap_common.c @@ -115,6 +115,27 @@ static struct msgb *hnbap_msgb_alloc(void) return msgb_alloc(1024, "HNBAP Tx"); } +static struct msgb *_hnbap_gen_msg(HNBAP_PDU_t *pdu) +{ + struct msgb *msg = ranap_msgb_alloc(); + asn_enc_rval_t rval; + + if (!msg) + return NULL; + + rval = aper_encode_to_buffer(&asn_DEF_HNBAP_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_put(msg, rval.encoded/8); + + return msg; +} + struct msgb *hnbap_generate_initiating_message( e_ProcedureCode procedureCode, Criticality_t criticality, @@ -122,8 +143,6 @@ struct msgb *hnbap_generate_initiating_message( { HNBAP_PDU_t pdu; - struct msgb *msg = hnbap_msgb_alloc(); - asn_enc_rval_t rval; int rc; memset(&pdu, 0, sizeof(HNBAP_PDU_t)); @@ -134,20 +153,10 @@ struct msgb *hnbap_generate_initiating_message( 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; } - rval = aper_encode_to_buffer(&asn_DEF_HNBAP_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; - } - - msgb_put(msg, rval.encoded/8); - return msg; + return _hnbap_gen_msg(&pdu); } struct msgb *hnbap_generate_successful_outcome( @@ -158,32 +167,20 @@ struct msgb *hnbap_generate_successful_outcome( { HNBAP_PDU_t pdu; - struct msgb *msg = hnbap_msgb_alloc(); - asn_enc_rval_t rval; int rc; memset(&pdu, 0, sizeof(HNBAP_PDU_t)); + pdu.present = HNBAP_PDU_PR_successfulOutcome; pdu.choice.successfulOutcome.procedureCode = procedureCode; pdu.choice.successfulOutcome.criticality = criticality; 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; } - rval = aper_encode_to_buffer(&asn_DEF_HNBAP_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; - } - - msgb_put(msg, rval.encoded/8); - - return msg; + return _hnbap_gen_msg(&pdu); } struct msgb *hnbap_generate_unsuccessful_outcome( @@ -194,32 +191,20 @@ struct msgb *hnbap_generate_unsuccessful_outcome( { HNBAP_PDU_t pdu; - struct msgb *msg = hnbap_msgb_alloc(); - asn_enc_rval_t rval; int rc; memset(&pdu, 0, sizeof(HNBAP_PDU_t)); + pdu.present = HNBAP_PDU_PR_unsuccessfulOutcome; pdu.choice.unsuccessfulOutcome.procedureCode = procedureCode; pdu.choice.unsuccessfulOutcome.criticality = criticality; rc = ANY_fromType_aper(&pdu.choice.unsuccessfulOutcome.value, td, sptr); if (rc < 0) { LOGP(DMAIN, LOGL_ERROR, "Error in ANY_fromType_aper\n"); - msgb_free(msg); return NULL; } - rval = aper_encode_to_buffer(&asn_DEF_HNBAP_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; - } - - msgb_put(msg, rval.encoded/8); - - return msg; + return _hnbap_gen_msg(&pdu); } IE_t *hnbap_new_ie(ProtocolIE_ID_t id, diff --git a/src/ranap_common.c b/src/ranap_common.c index e3472ea2..0e2ef6a7 100644 --- a/src/ranap_common.c +++ b/src/ranap_common.c @@ -35,28 +35,15 @@ static struct msgb *ranap_msgb_alloc(void) return msgb_alloc(1024, "RANAP Tx"); } -struct msgb *ranap_generate_initiating_message(e_RANAP_ProcedureCode procedureCode, - RANAP_Criticality_t criticality, - asn_TYPE_descriptor_t *td, void *sptr) +static struct msgb *_ranap_gen_msg(RANAP_RANAP_PDU_t *pdu) { - RANAP_RANAP_PDU_t pdu; 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; - 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); + if (!msg) return NULL; - } - rval = aper_encode_to_buffer(&asn_DEF_RANAP_RANAP_PDU, &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", @@ -69,40 +56,48 @@ struct msgb *ranap_generate_initiating_message(e_RANAP_ProcedureCode procedureCo return msg; } +struct msgb *ranap_generate_initiating_message(e_RANAP_ProcedureCode procedureCode, + RANAP_Criticality_t criticality, + asn_TYPE_descriptor_t *td, void *sptr) +{ + RANAP_RANAP_PDU_t pdu; + int rc; + + memset(&pdu, 0, sizeof(pdu)); + + pdu.present = RANAP_RANAP_PDU_PR_initiatingMessage; + pdu.choice.initiatingMessage.procedureCode = procedureCode; + pdu.choice.initiatingMessage.criticality = criticality; + rc = ANY_fromType_aper(&pdu.choice.initiatingMessage.value, td, sptr); + if (rc < 0) { + LOGP(DMAIN, LOGL_ERROR, "Error in ANY_fromType_aper\n"); + return NULL; + } + + return _ranap_gen_msg(&pdu); +} + struct msgb *ranap_generate_successful_outcome( e_RANAP_ProcedureCode procedureCode, RANAP_Criticality_t criticality, asn_TYPE_descriptor_t * td, void *sptr) { - RANAP_RANAP_PDU_t pdu; - struct msgb *msg = ranap_msgb_alloc(); - asn_enc_rval_t rval; int rc; memset(&pdu, 0, sizeof(pdu)); + pdu.present = RANAP_RANAP_PDU_PR_successfulOutcome; pdu.choice.successfulOutcome.procedureCode = procedureCode; pdu.choice.successfulOutcome.criticality = criticality; 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; } - 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; - } - - msgb_put(msg, rval.encoded/8); - - return msg; + return _ranap_gen_msg(&pdu); } struct msgb *ranap_generate_unsuccessful_outcome( @@ -112,8 +107,6 @@ struct msgb *ranap_generate_unsuccessful_outcome( void *sptr) { RANAP_RANAP_PDU_t pdu; - struct msgb *msg = ranap_msgb_alloc(); - asn_enc_rval_t rval; int rc; memset(&pdu, 0, sizeof(pdu)); @@ -124,21 +117,10 @@ struct msgb *ranap_generate_unsuccessful_outcome( 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; } - 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; - } - - msgb_put(msg, rval.encoded/8); - - return msg; + return _ranap_gen_msg(&pdu); } RANAP_IE_t *ranap_new_ie(RANAP_ProtocolIE_ID_t id, diff --git a/src/rua_common.c b/src/rua_common.c index 3a5877c7..8e2cc91d 100644 --- a/src/rua_common.c +++ b/src/rua_common.c @@ -100,33 +100,48 @@ static struct msgb *rua_msgb_alloc(void) return msgb_alloc(1024, "RUA Tx"); } +static struct msgb *_rua_gen_msg(RUA_RUA_PDU_t *pdu) +{ + struct msgb *msg = rua_msgb_alloc(); + asn_enc_rval_t rval; + + if (!msg) + return NULL; + + 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_put(msg, rval.encoded/8); + + return msg; +} + + 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; + int rc; 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); - - 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); + rc = ANY_fromType_aper(&pdu.choice.initiatingMessage.value, td, sptr); + if (rc < 0) { + LOGP(DMAIN, LOGL_ERROR, "Error in ANY_fromType_aper\n"); return NULL; } - msgb_put(msg, rval.encoded/8); - - return msg; + return _rua_gen_msg(&pdu); } struct msgb *rua_generate_successful_outcome( @@ -135,34 +150,21 @@ struct msgb *rua_generate_successful_outcome( asn_TYPE_descriptor_t * td, void *sptr) { - RUA_RUA_PDU_t pdu; - struct msgb *msg = rua_msgb_alloc(); - asn_enc_rval_t rval; int rc; memset(&pdu, 0, sizeof(pdu)); + pdu.present = RUA_RUA_PDU_PR_successfulOutcome; pdu.choice.successfulOutcome.procedureCode = procedureCode; pdu.choice.successfulOutcome.criticality = criticality; 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; } - 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; - } - - msgb_put(msg, rval.encoded/8); - - return msg; + return _rua_gen_msg(&pdu); } struct msgb *rua_generate_unsuccessful_outcome( @@ -171,34 +173,21 @@ struct msgb *rua_generate_unsuccessful_outcome( asn_TYPE_descriptor_t * td, void *sptr) { - RUA_RUA_PDU_t pdu; - struct msgb *msg = rua_msgb_alloc(); - asn_enc_rval_t rval; int rc; memset(&pdu, 0, sizeof(pdu)); + pdu.present = RUA_RUA_PDU_PR_unsuccessfulOutcome; pdu.choice.unsuccessfulOutcome.procedureCode = procedureCode; pdu.choice.unsuccessfulOutcome.criticality = criticality; rc = ANY_fromType_aper(&pdu.choice.unsuccessfulOutcome.value, td, sptr); if (rc < 0) { LOGP(DMAIN, LOGL_ERROR, "Error in ANY_fromType_aper\n"); - msgb_free(msg); return NULL; } - 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; - } - - msgb_put(msg, rval.encoded/8); - - return msg; + return _rua_gen_msg(&pdu); } RUA_IE_t *rua_new_ie(RUA_ProtocolIE_ID_t id,