diff --git a/lib/asn/src/Makefile.am b/lib/asn/src/Makefile.am index 5e7f4e879..511d77162 100644 --- a/lib/asn/src/Makefile.am +++ b/lib/asn/src/Makefile.am @@ -8,7 +8,7 @@ libasn_la_SOURCES = \ s1ap_ies_defs.h s1ap_codecs.h nodist_libasn_la_SOURCES = \ - s1ap_encoder.c s1ap_decoder.c \ + s1ap_encoder.c s1ap_decoder.c s1ap_free.c \ s1ap_ies_encoder.c s1ap_ies_decoder.c s1ap_ies_free.c s1ap_ies_xer_print.c libasn_la_DEPENDENCIES = \ diff --git a/lib/asn/src/s1ap_codecs.h b/lib/asn/src/s1ap_codecs.h index 9e72b69b3..b54e51afd 100644 --- a/lib/asn/src/s1ap_codecs.h +++ b/lib/asn/src/s1ap_codecs.h @@ -11,8 +11,8 @@ extern "C" { #define S1AP_SDU_SIZE 2048 CORE_DECLARE(int) s1ap_decode_pdu(s1ap_message *message, pkbuf_t *pkbuf); - CORE_DECLARE(int) s1ap_encode_pdu(pkbuf_t **pkbuf, s1ap_message *message); +CORE_DECLARE(int) s1ap_free_pdu(s1ap_message *message); #ifdef __cplusplus } diff --git a/lib/asn/src/s1ap_decoder.c b/lib/asn/src/s1ap_decoder.c index e93cc9e3f..5cfac2321 100644 --- a/lib/asn/src/s1ap_decoder.c +++ b/lib/asn/src/s1ap_decoder.c @@ -74,6 +74,7 @@ static int s1ap_decode_initiating(s1ap_message *message, d_assert(initiating_p, return -1, "Null param"); + message->procedureCode = initiating_p->procedureCode; switch (initiating_p->procedureCode) { case S1ap_ProcedureCode_id_uplinkNASTransport: @@ -143,6 +144,7 @@ static int s1ap_decode_successfull_outcome(s1ap_message *message, d_assert(successfullOutcome_p, return -1, "Null param"); + message->procedureCode = successfullOutcome_p->procedureCode; switch (successfullOutcome_p->procedureCode) { case S1ap_ProcedureCode_id_InitialContextSetup: @@ -179,6 +181,7 @@ static int s1ap_decode_unsuccessfull_outcome(s1ap_message *message, d_assert(unSuccessfulOutcome_p, return -1, "Null param"); + message->procedureCode = unSuccessfulOutcome_p->procedureCode; switch (unSuccessfulOutcome_p->procedureCode) { case S1ap_ProcedureCode_id_InitialContextSetup: diff --git a/lib/asn/src/s1ap_encoder.c b/lib/asn/src/s1ap_encoder.c index e59e83a0b..bdd50da65 100644 --- a/lib/asn/src/s1ap_encoder.c +++ b/lib/asn/src/s1ap_encoder.c @@ -20,7 +20,7 @@ static inline int s1ap_encode_s1setup_failure( s1ap_message *message_p, pkbuf_t *pkbuf); static inline int s1ap_encode_downlink_nas_transport( s1ap_message *message_p, pkbuf_t *pkbuf); -static inline int s1ap_encode_ue_context_release_command ( +static inline int s1ap_encode_ue_context_release_command( s1ap_message *message_p, pkbuf_t *pkbuf); int s1ap_encode_pdu(pkbuf_t **pkb, s1ap_message *message_p) diff --git a/lib/asn/src/s1ap_free.c b/lib/asn/src/s1ap_free.c new file mode 100644 index 000000000..485c74ae5 --- /dev/null +++ b/lib/asn/src/s1ap_free.c @@ -0,0 +1,242 @@ +#define TRACE_MODULE _s1free + +#include "core_debug.h" +#include "s1ap_codecs.h" + +static inline int s1ap_free_initiating_message(s1ap_message *message_p); +static inline int s1ap_free_successfull_outcome(s1ap_message *message_p); +static inline int s1ap_free_unsuccessfull_outcome(s1ap_message *message_p); + +static inline void s1ap_free_s1setup_request(s1ap_message *message_p); +static inline void s1ap_free_s1setup_response(s1ap_message *message_p); +static inline void s1ap_free_s1setup_failure(s1ap_message *message_p); + +static inline void s1ap_free_initialuemessage_ies(s1ap_message *message_p); +static inline void s1ap_free_uecapabilityinfoindicationies( + s1ap_message *message_p); + +static inline void s1ap_free_initial_context_setup_request( + s1ap_message *message_p); +static inline void s1ap_free_initialcontextsetupresponseies( + s1ap_message *message_p); +static inline void s1ap_free_initialcontextsetupfailureies( + s1ap_message *message_p); + +static inline void s1ap_free_downlink_nas_transport(s1ap_message *message_p); +static inline void s1ap_free_uplinknastransport_ies(s1ap_message *message_p); +static inline void s1ap_free_nasnondeliveryindication_ies( + s1ap_message *message_p); + +static inline void s1ap_free_ue_context_release_command( + s1ap_message *message_p); +static inline void s1ap_free_uecontextreleasecomplete_ies( + s1ap_message *message_p); +static inline void s1ap_free_uecontextreleaserequest_ies( + s1ap_message *message_p); + + +int s1ap_free_pdu(s1ap_message *message_p) +{ + d_assert (message_p, return -1, "Null param"); + + switch (message_p->direction) + { + case S1AP_PDU_PR_initiatingMessage: + return s1ap_free_initiating_message(message_p); + + case S1AP_PDU_PR_successfulOutcome: + return s1ap_free_successfull_outcome(message_p); + + case S1AP_PDU_PR_unsuccessfulOutcome: + return s1ap_free_unsuccessfull_outcome(message_p); + + default: + d_warn("Unknown message outcome (%d) or not implemented", + (int)message_p->direction); + break; + } + + return -1; +} + +static inline int s1ap_free_initiating_message(s1ap_message *message_p) +{ + switch (message_p->procedureCode) + { + case S1ap_ProcedureCode_id_S1Setup: + s1ap_free_s1setup_request(message_p); + break; + + case S1ap_ProcedureCode_id_initialUEMessage: + s1ap_free_initialuemessage_ies(message_p); + break; + + case S1ap_ProcedureCode_id_UECapabilityInfoIndication: + s1ap_free_uecapabilityinfoindicationies(message_p); + break; + + case S1ap_ProcedureCode_id_InitialContextSetup: + s1ap_free_initial_context_setup_request(message_p); + break; + + case S1ap_ProcedureCode_id_downlinkNASTransport: + s1ap_free_downlink_nas_transport(message_p); + break; + + case S1ap_ProcedureCode_id_uplinkNASTransport: + s1ap_free_uplinknastransport_ies(message_p); + break; + + case S1ap_ProcedureCode_id_NASNonDeliveryIndication: + s1ap_free_nasnondeliveryindication_ies(message_p); + break; + + case S1ap_ProcedureCode_id_UEContextRelease: + s1ap_free_ue_context_release_command(message_p); + break; + + case S1ap_ProcedureCode_id_UEContextReleaseRequest: + s1ap_free_uecontextreleaserequest_ies(message_p); + break; + + default: + d_warn("Unknown procedure ID (%d) for initiating message_p\n", + (int)message_p->procedureCode); + return -1; + } + + return 0; +} + +static inline int s1ap_free_successfull_outcome(s1ap_message *message_p) +{ + switch (message_p->procedureCode) + { + case S1ap_ProcedureCode_id_S1Setup: + s1ap_free_s1setup_response(message_p); + break; + + case S1ap_ProcedureCode_id_InitialContextSetup: + s1ap_free_initialcontextsetupresponseies(message_p); + break; + + case S1ap_ProcedureCode_id_UEContextRelease: + s1ap_free_uecontextreleasecomplete_ies(message_p); + break; + + default: + d_warn("Unknown procedure ID (%d) for successfull " + "outcome message\n", (int)message_p->procedureCode); + return -1; + } + + return 0; +} + +static inline int s1ap_free_unsuccessfull_outcome(s1ap_message *message_p) +{ + switch (message_p->procedureCode) + { + case S1ap_ProcedureCode_id_S1Setup: + s1ap_free_s1setup_failure(message_p); + break; + + case S1ap_ProcedureCode_id_InitialContextSetup: + s1ap_free_initialcontextsetupfailureies(message_p); + break; + + default: + d_warn("Unknown procedure ID (%d) for unsuccessfull " + "outcome message\n", (int)message_p->procedureCode); + return -1; + } + + return 0; +} + +static inline void s1ap_free_s1setup_request(s1ap_message *message_p) +{ + s1ap_free_s1ap_s1setuprequesties(&message_p->msg.s1ap_S1SetupRequestIEs); +} + +static inline void s1ap_free_s1setup_response(s1ap_message *message_p) +{ + s1ap_free_s1ap_s1setupresponseies( + &message_p->msg.s1ap_S1SetupResponseIEs); +} + +static inline void s1ap_free_s1setup_failure(s1ap_message *message_p) +{ + s1ap_free_s1ap_s1setupfailureies(&message_p->msg.s1ap_S1SetupFailureIEs); +} + +static inline void s1ap_free_initialuemessage_ies(s1ap_message *message_p) +{ + s1ap_free_s1ap_initialuemessage_ies( + &message_p->msg.s1ap_InitialUEMessage_IEs); +} + +static inline void s1ap_free_initial_context_setup_request( + s1ap_message *message_p) +{ + s1ap_free_s1ap_initialcontextsetuprequesties( + &message_p->msg.s1ap_InitialContextSetupRequestIEs); +} +static inline void s1ap_free_initialcontextsetupresponseies( + s1ap_message *message_p) +{ + s1ap_free_s1ap_initialcontextsetupresponseies( + &message_p->msg.s1ap_InitialContextSetupResponseIEs); +} +static inline void s1ap_free_initialcontextsetupfailureies( + s1ap_message *message_p) +{ + s1ap_free_s1ap_initialcontextsetupfailureies( + &message_p->msg.s1ap_InitialContextSetupFailureIEs); +} + +static inline void s1ap_free_downlink_nas_transport(s1ap_message *message_p) +{ + s1ap_free_s1ap_downlinknastransport_ies( + &message_p->msg.s1ap_DownlinkNASTransport_IEs); +} + +static inline void s1ap_free_uplinknastransport_ies(s1ap_message *message_p) +{ + s1ap_free_s1ap_uplinknastransport_ies( + &message_p->msg.s1ap_UplinkNASTransport_IEs); +} + +static inline void s1ap_free_ue_context_release_command( + s1ap_message *message_p) +{ + s1ap_free_s1ap_uecontextreleasecommand_ies( + &message_p->msg.s1ap_UEContextReleaseCommand_IEs); +} + +static inline void s1ap_free_uecontextreleaserequest_ies( + s1ap_message *message_p) +{ + s1ap_free_s1ap_uecontextreleaserequest_ies( + &message_p->msg.s1ap_UEContextReleaseRequest_IEs); +} +static inline void s1ap_free_uecapabilityinfoindicationies( + s1ap_message *message_p) +{ + s1ap_free_s1ap_uecapabilityinfoindicationies( + &message_p->msg.s1ap_UECapabilityInfoIndicationIEs); +} +static inline void s1ap_free_nasnondeliveryindication_ies( + s1ap_message *message_p) +{ + s1ap_free_s1ap_nasnondeliveryindication_ies( + &message_p->msg.s1ap_NASNonDeliveryIndication_IEs); +} + +static inline void s1ap_free_uecontextreleasecomplete_ies( + s1ap_message *message_p) +{ + s1ap_free_s1ap_uecontextreleasecomplete_ies( + &message_p->msg.s1ap_UEContextReleaseComplete_IEs); +} + diff --git a/src/s1ap_message.c b/src/s1ap_message.c index d881bf2e0..e28158125 100644 --- a/src/s1ap_message.c +++ b/src/s1ap_message.c @@ -67,8 +67,7 @@ status_t s1ap_build_setup_rsp(pkbuf_t **pkbuf) message.direction = S1AP_PDU_PR_successfulOutcome; erval = s1ap_encode_pdu(pkbuf, &message); - - s1ap_free_s1ap_s1setupresponseies(ies); + s1ap_free_pdu(&message); if (erval < 0) { diff --git a/test/s1ap_test.c b/test/s1ap_test.c index 5e657e4e9..7b9a4eef0 100644 --- a/test/s1ap_test.c +++ b/test/s1ap_test.c @@ -26,9 +26,8 @@ static void s1ap_test1(abts_case *tc, void *data) result = s1ap_decode_pdu(&message, pkbuf); ABTS_INT_EQUAL(tc, 0, result); + s1ap_free_pdu(&message); - s1ap_free_s1ap_s1setuprequesties(&message.msg.s1ap_S1SetupRequestIEs); - pkbuf_free(pkbuf); } @@ -50,8 +49,7 @@ static void s1ap_test2(abts_case *tc, void *data) result = s1ap_decode_pdu(&message, pkbuf); ABTS_INT_EQUAL(tc, 0, result); - - s1ap_free_s1ap_initialuemessage_ies(&message.msg.s1ap_InitialUEMessage_IEs); + s1ap_free_pdu(&message); pkbuf_free(pkbuf); } @@ -74,8 +72,7 @@ static void s1ap_test3(abts_case *tc, void *data) result = s1ap_decode_pdu(&message, pkbuf); ABTS_INT_EQUAL(tc, 0, result); - - s1ap_free_s1ap_initialcontextsetupresponseies(&message.msg.s1ap_InitialContextSetupResponseIEs); + s1ap_free_pdu(&message); pkbuf_free(pkbuf); } @@ -137,10 +134,9 @@ static void s1ap_test5(abts_case *tc, void *data) message.criticality = S1ap_Criticality_reject; erval = s1ap_encode_pdu(&pkbuf, &message); - - s1ap_free_s1ap_s1setuprequesties(s1SetupRequestIEs); - ABTS_INT_EQUAL(tc, 280, erval); + + s1ap_free_pdu(&message); } abts_suite *test_s1ap(abts_suite *suite)