{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.
diff --git a/src/hnbap_common.c b/src/hnbap_common.c
index 6c5812e..29b0f3b 100644
--- a/src/hnbap_common.c
+++ b/src/hnbap_common.c
@@ -115,6 +115,27 @@
 	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 @@
 {
 
 	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 @@
 	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 @@
 {
 
 	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 @@
 {
 
 	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 e3472ea..0e2ef6a 100644
--- a/src/ranap_common.c
+++ b/src/ranap_common.c
@@ -35,28 +35,15 @@
 	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 @@
 	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 @@
 					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 @@
 	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 3a5877c..8e2cc91 100644
--- a/src/rua_common.c
+++ b/src/rua_common.c
@@ -100,33 +100,48 @@
 	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 @@
 					   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 @@
 					   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,