From 008a70c94c53cc1a0085b7177e7d36e717e98e52 Mon Sep 17 00:00:00 2001 From: Lionel Gauthier Date: Fri, 18 Apr 2014 11:32:55 +0000 Subject: [PATCH] git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5274 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- openair2/X2AP/x2ap_common.c | 107 +++++++++++++++++++++++++----------- openair2/X2AP/x2ap_common.h | 23 ++++---- 2 files changed, 87 insertions(+), 43 deletions(-) diff --git a/openair2/X2AP/x2ap_common.c b/openair2/X2AP/x2ap_common.c index 652173be13..ed6f7ca2c1 100755 --- a/openair2/X2AP/x2ap_common.c +++ b/openair2/X2AP/x2ap_common.c @@ -1,7 +1,7 @@ /******************************************************************************* Eurecom OpenAirInterface - Copyright(c) 1999 - 2012 Eurecom + Copyright(c) 1999 - 2014 Eurecom This program is free software; you can redistribute it and/or modify it under the terms and conditions of the GNU General Public License, @@ -30,26 +30,43 @@ /*! \file x2ap_common.c * \brief x2ap procedures for both eNB and MME - * \author Sebastien ROUX - * \date 2012 + * \author Sebastien ROUX , Lionel GAUTHIER + * \date 2014 * \version 0.1 */ #include #include "x2ap_common.h" +#include "X2AP-PDU.h" int asn_debug = 0; int asn1_xer_print = 0; +#if defined(EMIT_ASN_DEBUG_EXTERN) +inline void ASN_DEBUG(const char *fmt, ...) +{ + if (asn_debug) { + int adi = asn_debug_indent; + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "[ASN1]"); + while(adi--) fprintf(stderr, " "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); + } +} +#endif + ssize_t x2ap_generate_initiating_message( uint8_t **buffer, uint32_t *length, - e_ProcedureCode procedureCode, - Criticality_t criticality, + e_X2ap_ProcedureCode procedureCode, + X2ap_Criticality_t criticality, asn_TYPE_descriptor_t *td, - void *sptr) { - + void *sptr) +{ X2AP_PDU_t pdu; ssize_t encoded; @@ -60,10 +77,15 @@ ssize_t x2ap_generate_initiating_message( pdu.choice.initiatingMessage.criticality = criticality; ANY_fromType_aper(&pdu.choice.initiatingMessage.value, td, sptr); - if (asn1_xer_print) - xer_fprint(stdout,&asn_DEF_X2AP_PDU,(void*)&pdu); + if (asn1_xer_print) { + xer_fprint(stdout, &asn_DEF_X2AP_PDU, (void *)&pdu); + } - if ((encoded = aper_encode_to_new_buffer(&asn_DEF_X2AP_PDU, 0, &pdu, (void**)buffer)) < 0) { + /* We can safely free list of IE from sptr */ + ASN_STRUCT_FREE_CONTENTS_ONLY(*td, sptr); + + if ((encoded = aper_encode_to_new_buffer(&asn_DEF_X2AP_PDU, 0, &pdu, + (void **)buffer)) < 0) { return -1; } @@ -74,11 +96,11 @@ ssize_t x2ap_generate_initiating_message( ssize_t x2ap_generate_successfull_outcome( uint8_t **buffer, uint32_t *length, - e_ProcedureCode procedureCode, - Criticality_t criticality, + e_X2ap_ProcedureCode procedureCode, + X2ap_Criticality_t criticality, asn_TYPE_descriptor_t *td, - void *sptr) { - + void *sptr) +{ X2AP_PDU_t pdu; ssize_t encoded; @@ -89,7 +111,15 @@ ssize_t x2ap_generate_successfull_outcome( pdu.choice.successfulOutcome.criticality = criticality; ANY_fromType_aper(&pdu.choice.successfulOutcome.value, td, sptr); - if ((encoded = aper_encode_to_new_buffer(&asn_DEF_X2AP_PDU, 0, &pdu, (void**)buffer)) < 0) { + if (asn1_xer_print) { + xer_fprint(stdout, &asn_DEF_X2AP_PDU, (void *)&pdu); + } + + /* We can safely free list of IE from sptr */ + ASN_STRUCT_FREE_CONTENTS_ONLY(*td, sptr); + + if ((encoded = aper_encode_to_new_buffer(&asn_DEF_X2AP_PDU, 0, &pdu, + (void **)buffer)) < 0) { return -1; } @@ -101,11 +131,11 @@ ssize_t x2ap_generate_successfull_outcome( ssize_t x2ap_generate_unsuccessfull_outcome( uint8_t **buffer, uint32_t *length, - e_ProcedureCode procedureCode, - Criticality_t criticality, + e_X2ap_ProcedureCode procedureCode, + X2ap_Criticality_t criticality, asn_TYPE_descriptor_t *td, - void *sptr) { - + void *sptr) +{ X2AP_PDU_t pdu; ssize_t encoded; @@ -116,7 +146,15 @@ ssize_t x2ap_generate_unsuccessfull_outcome( pdu.choice.successfulOutcome.criticality = criticality; ANY_fromType_aper(&pdu.choice.successfulOutcome.value, td, sptr); - if ((encoded = aper_encode_to_new_buffer(&asn_DEF_X2AP_PDU, 0, &pdu, (void**)buffer)) < 0) { + if (asn1_xer_print) { + xer_fprint(stdout, &asn_DEF_X2AP_PDU, (void *)&pdu); + } + + /* We can safely free list of IE from sptr */ + ASN_STRUCT_FREE_CONTENTS_ONLY(*td, sptr); + + if ((encoded = aper_encode_to_new_buffer(&asn_DEF_X2AP_PDU, 0, &pdu, + (void **)buffer)) < 0) { return -1; } @@ -125,27 +163,31 @@ ssize_t x2ap_generate_unsuccessfull_outcome( return encoded; } -IE_t *x2ap_new_ie( - ProtocolIE_ID_t id, - Criticality_t criticality, +X2ap_IE_t *x2ap_new_ie( + X2ap_ProtocolIE_ID_t id, + X2ap_Criticality_t criticality, asn_TYPE_descriptor_t *type, - void *sptr) { + void *sptr) +{ + X2ap_IE_t *buff; - IE_t *buff; - - if ((buff = malloc(sizeof(IE_t))) == NULL) { + if ((buff = malloc(sizeof(X2ap_IE_t))) == NULL) { // Possible error on malloc return NULL; } - memset((void*)buff, 0, sizeof(IE_t)); + memset((void *)buff, 0, sizeof(X2ap_IE_t)); buff->id = id; buff->criticality = criticality; - ANY_fromType_aper(&buff->value, type, sptr); + if (ANY_fromType_aper(&buff->value, type, sptr) < 0) { + fprintf(stderr, "Encoding of %s failed\n", type->name); + free(buff); + return NULL; + } if (asn1_xer_print) - if (xer_fprint(stdout, &asn_DEF_IE, buff) < 0) { + if (xer_fprint(stdout, &asn_DEF_X2ap_IE, buff) < 0) { free(buff); return NULL; } @@ -153,6 +195,7 @@ IE_t *x2ap_new_ie( return buff; } -void x2ap_handle_criticality(e_Criticality criticality) { - +void x2ap_handle_criticality(X2ap_Criticality_t criticality) +{ + } diff --git a/openair2/X2AP/x2ap_common.h b/openair2/X2AP/x2ap_common.h index b2fb45ca4f..143b3e7812 100755 --- a/openair2/X2AP/x2ap_common.h +++ b/openair2/X2AP/x2ap_common.h @@ -288,8 +288,8 @@ typedef int (*x2ap_message_decoded_callback)( ssize_t x2ap_generate_successfull_outcome( uint8_t **buffer, uint32_t *length, - e_ProcedureCode procedureCode, - Criticality_t criticality, + e_X2ap_ProcedureCode procedureCode, + X2ap_Criticality_t criticality, asn_TYPE_descriptor_t *td, void *sptr); @@ -305,8 +305,8 @@ ssize_t x2ap_generate_successfull_outcome( ssize_t x2ap_generate_initiating_message( uint8_t **buffer, uint32_t *length, - e_ProcedureCode procedureCode, - Criticality_t criticality, + e_X2ap_ProcedureCode procedureCode, + X2ap_Criticality_t criticality, asn_TYPE_descriptor_t *td, void *sptr); @@ -322,8 +322,8 @@ ssize_t x2ap_generate_initiating_message( ssize_t x2ap_generate_unsuccessfull_outcome( uint8_t **buffer, uint32_t *length, - e_ProcedureCode procedureCode, - Criticality_t criticality, + e_X2ap_ProcedureCode procedureCode, + X2ap_Criticality_t criticality, asn_TYPE_descriptor_t *td, void *sptr); @@ -334,15 +334,16 @@ ssize_t x2ap_generate_unsuccessfull_outcome( \param sptr Structure to be encoded in the value field @returns a pointer to the newly created IE structure or NULL in case of failure **/ -IE_t *x2ap_new_ie(ProtocolIE_ID_t id, - Criticality_t criticality, - asn_TYPE_descriptor_t *type, - void *sptr); +X2ap_IE_t *x2ap_new_ie( + X2ap_ProtocolIE_ID_t id, + X2ap_Criticality_t criticality, + asn_TYPE_descriptor_t *type, + void *sptr); /** \brief Handle criticality \param criticality Criticality of the IE @returns void **/ -void x2ap_handle_criticality(e_Criticality criticality); +void x2ap_handle_criticality(X2ap_Criticality_t criticality); #endif /* X2AP_COMMON_H_ */