diff --git a/lib/asn/src/s1ap_encoder.c b/lib/asn/src/s1ap_encoder.c index aff6b2d03..e59e83a0b 100644 --- a/lib/asn/src/s1ap_encoder.c +++ b/lib/asn/src/s1ap_encoder.c @@ -23,19 +23,6 @@ static inline int s1ap_encode_downlink_nas_transport( static inline int s1ap_encode_ue_context_release_command ( s1ap_message *message_p, pkbuf_t *pkbuf); -ssize_t s1ap_generate_initiating_message(pkbuf_t *pkbuf, - e_S1ap_ProcedureCode procedureCode, S1ap_Criticality_t criticality, - asn_TYPE_descriptor_t *td, void *sptr); -ssize_t s1ap_generate_successfull_outcome(pkbuf_t *pkbuf, - e_S1ap_ProcedureCode procedureCode, S1ap_Criticality_t criticality, - asn_TYPE_descriptor_t *td, void *sptr); -ssize_t s1ap_generate_unsuccessfull_outcome(pkbuf_t *pkbuf, - e_S1ap_ProcedureCode procedureCode, S1ap_Criticality_t criticality, - asn_TYPE_descriptor_t *td, void *sptr); - -ssize_t s1ap_encode_to_buffer(pkbuf_t *pkbuf, - S1AP_PDU_t *pdu, asn_TYPE_descriptor_t *td, void *sptr); - int s1ap_encode_pdu(pkbuf_t **pkb, s1ap_message *message_p) { int encoded = -1; @@ -137,26 +124,43 @@ static inline int s1ap_encode_unsuccessfull_outcome( } static inline int s1ap_encode_initial_context_setup_request( - s1ap_message *message_p, pkbuf_t *pkbuf) + s1ap_message *message_p, pkbuf_t *pkbuf) { + asn_enc_rval_t enc_ret = {0}; + + S1AP_PDU_t pdu; S1ap_InitialContextSetupRequest_t initialContextSetupRequest; - S1ap_InitialContextSetupRequest_t *initialContextSetupRequest_p = - &initialContextSetupRequest; + asn_TYPE_descriptor_t *td = &asn_DEF_S1ap_InitialContextSetupRequest; - memset(initialContextSetupRequest_p, 0, + memset(&initialContextSetupRequest, 0, sizeof(S1ap_InitialContextSetupRequest_t)); - if (s1ap_encode_s1ap_initialcontextsetuprequesties( - initialContextSetupRequest_p, + &initialContextSetupRequest, &message_p->msg.s1ap_InitialContextSetupRequestIEs) < 0) { + d_error("Encoding of %s failed", td->name); return -1; } - return s1ap_generate_initiating_message(pkbuf, - S1ap_ProcedureCode_id_InitialContextSetup, - S1ap_Criticality_reject, &asn_DEF_S1ap_InitialContextSetupRequest, - initialContextSetupRequest_p); + memset(&pdu, 0, sizeof (S1AP_PDU_t)); + pdu.present = S1AP_PDU_PR_initiatingMessage; + pdu.choice.initiatingMessage.procedureCode = message_p->procedureCode; + pdu.choice.initiatingMessage.criticality = S1ap_Criticality_reject; + ANY_fromType_aper(&pdu.choice.initiatingMessage.value, + td, &initialContextSetupRequest); + + enc_ret = aper_encode_to_buffer(&asn_DEF_S1AP_PDU, + &pdu, pkbuf->payload, S1AP_SDU_SIZE); + + ASN_STRUCT_FREE_CONTENTS_ONLY(*td, &initialContextSetupRequest); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_S1AP_PDU, &pdu); + + if (enc_ret.encoded < 0) + { + d_error("Encoding of %s failed", td->name); + } + + return enc_ret.encoded; } static inline int s1ap_encode_s1setup_request( @@ -166,182 +170,182 @@ static inline int s1ap_encode_s1setup_request( S1AP_PDU_t pdu; S1ap_S1SetupRequest_t s1SetupRequest; + asn_TYPE_descriptor_t *td = &asn_DEF_S1ap_S1SetupRequest; - memset((void *)&s1SetupRequest, 0, sizeof(s1SetupRequest)); + memset(&s1SetupRequest, 0, sizeof(s1SetupRequest)); if (s1ap_encode_s1ap_s1setuprequesties( &s1SetupRequest, &message_p->msg.s1ap_S1SetupRequestIEs) < 0) { + d_error("Encoding of %s failed", td->name); return -1; } memset(&pdu, 0, sizeof (S1AP_PDU_t)); pdu.present = S1AP_PDU_PR_initiatingMessage; - pdu.choice.initiatingMessage.procedureCode = S1ap_ProcedureCode_id_S1Setup; + pdu.choice.initiatingMessage.procedureCode = message_p->procedureCode; pdu.choice.initiatingMessage.criticality = S1ap_Criticality_reject; - ANY_fromType_aper(&pdu.choice.initiatingMessage.value, - &asn_DEF_S1ap_S1SetupRequest, &s1SetupRequest); + ANY_fromType_aper(&pdu.choice.initiatingMessage.value, td, &s1SetupRequest); enc_ret = aper_encode_to_buffer(&asn_DEF_S1AP_PDU, &pdu, pkbuf->payload, S1AP_SDU_SIZE); - ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_S1ap_S1SetupRequest, &s1SetupRequest); + ASN_STRUCT_FREE_CONTENTS_ONLY(*td, &s1SetupRequest); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_S1AP_PDU, &pdu); + + if (enc_ret.encoded < 0) + { + d_error("Encoding of %s failed", td->name); + } + + return enc_ret.encoded; +} + +static inline int s1ap_encode_s1setup_response( + s1ap_message *message_p, pkbuf_t *pkbuf) +{ + asn_enc_rval_t enc_ret = {0}; + + S1AP_PDU_t pdu; + S1ap_S1SetupResponse_t s1SetupResponse; + asn_TYPE_descriptor_t *td = &asn_DEF_S1ap_S1SetupResponse; + + memset(&s1SetupResponse, 0, sizeof (S1ap_S1SetupResponse_t)); + if (s1ap_encode_s1ap_s1setupresponseies( + &s1SetupResponse, &message_p->msg.s1ap_S1SetupResponseIEs) < 0) + { + d_error("Encoding of %s failed", td->name); + return -1; + } + + memset(&pdu, 0, sizeof (S1AP_PDU_t)); + pdu.present = S1AP_PDU_PR_successfulOutcome; + pdu.choice.successfulOutcome.procedureCode = message_p->procedureCode; + pdu.choice.successfulOutcome.criticality = S1ap_Criticality_reject; + ANY_fromType_aper(&pdu.choice.successfulOutcome.value, + td, &s1SetupResponse); + + enc_ret = aper_encode_to_buffer(&asn_DEF_S1AP_PDU, + &pdu, pkbuf->payload, S1AP_SDU_SIZE); + + ASN_STRUCT_FREE_CONTENTS_ONLY(*td, &s1SetupResponse); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_S1AP_PDU, &pdu); + + if (enc_ret.encoded < 0) + { + d_error("Encoding of %s failed", td->name); + } + + return enc_ret.encoded; +} + +static inline int s1ap_encode_s1setup_failure( + s1ap_message *message_p, pkbuf_t *pkbuf) +{ + asn_enc_rval_t enc_ret = {0}; + + S1AP_PDU_t pdu; + S1ap_S1SetupFailure_t s1SetupFailure; + asn_TYPE_descriptor_t *td = &asn_DEF_S1ap_S1SetupFailure; + + memset(&s1SetupFailure, 0, sizeof (S1ap_S1SetupFailure_t)); + if (s1ap_encode_s1ap_s1setupfailureies( + &s1SetupFailure, &message_p->msg.s1ap_S1SetupFailureIEs) < 0) + { + d_error("Encoding of %s failed", td->name); + return -1; + } + + memset(&pdu, 0, sizeof (S1AP_PDU_t)); + pdu.present = S1AP_PDU_PR_unsuccessfulOutcome; + pdu.choice.unsuccessfulOutcome.procedureCode = message_p->procedureCode; + pdu.choice.unsuccessfulOutcome.criticality = S1ap_Criticality_reject; + ANY_fromType_aper(&pdu.choice.unsuccessfulOutcome.value, + td, &s1SetupFailure); + + enc_ret = aper_encode_to_buffer(&asn_DEF_S1AP_PDU, + &pdu, pkbuf->payload, S1AP_SDU_SIZE); + + ASN_STRUCT_FREE_CONTENTS_ONLY(*td, &s1SetupFailure); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_S1AP_PDU, &pdu); + + if (enc_ret.encoded < 0) + { + d_error("Encoding of %s failed", td->name); + } + + return enc_ret.encoded; +} + +static inline int s1ap_encode_downlink_nas_transport( + s1ap_message *message_p, pkbuf_t *pkbuf) +{ + asn_enc_rval_t enc_ret = {0}; + + S1AP_PDU_t pdu; + S1ap_DownlinkNASTransport_t downlinkNasTransport; + asn_TYPE_descriptor_t *td = &asn_DEF_S1ap_DownlinkNASTransport; + + memset(&downlinkNasTransport, 0, sizeof(S1ap_DownlinkNASTransport_t)); + if (s1ap_encode_s1ap_downlinknastransport_ies(&downlinkNasTransport, + &message_p->msg.s1ap_DownlinkNASTransport_IEs) < 0) + { + d_error("Encoding of %s failed", td->name); + return -1; + } + + memset(&pdu, 0, sizeof (S1AP_PDU_t)); + pdu.present = S1AP_PDU_PR_initiatingMessage; + pdu.choice.initiatingMessage.procedureCode = message_p->procedureCode; + pdu.choice.initiatingMessage.criticality = S1ap_Criticality_ignore; + ANY_fromType_aper(&pdu.choice.initiatingMessage.value, + td, &downlinkNasTransport); + + enc_ret = aper_encode_to_buffer(&asn_DEF_S1AP_PDU, + &pdu, pkbuf->payload, S1AP_SDU_SIZE); + + ASN_STRUCT_FREE_CONTENTS_ONLY(*td, &downlinkNasTransport); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_S1AP_PDU, &pdu); + + if (enc_ret.encoded < 0) + { + d_error("Encoding of %s failed", td->name); + } + + return enc_ret.encoded; +} + +static inline int s1ap_encode_ue_context_release_command( + s1ap_message *message_p, pkbuf_t *pkbuf) +{ + asn_enc_rval_t enc_ret = {0}; + + S1AP_PDU_t pdu; + S1ap_UEContextReleaseCommand_t ueContextReleaseCommand; + asn_TYPE_descriptor_t *td = &asn_DEF_S1ap_UEContextReleaseCommand; + + memset(&ueContextReleaseCommand, 0, + sizeof(S1ap_UEContextReleaseCommand_t)); + if (s1ap_encode_s1ap_uecontextreleasecommand_ies( + &ueContextReleaseCommand, + &message_p->msg.s1ap_UEContextReleaseCommand_IEs) < 0) + { + d_error("Encoding of %s failed", td->name); + return -1; + } + + memset(&pdu, 0, sizeof (S1AP_PDU_t)); + pdu.present = S1AP_PDU_PR_initiatingMessage; + pdu.choice.initiatingMessage.procedureCode = message_p->procedureCode; + pdu.choice.initiatingMessage.criticality = S1ap_Criticality_reject; + ANY_fromType_aper(&pdu.choice.initiatingMessage.value, + td, &ueContextReleaseCommand); + + enc_ret = aper_encode_to_buffer(&asn_DEF_S1AP_PDU, + &pdu, pkbuf->payload, S1AP_SDU_SIZE); + + ASN_STRUCT_FREE_CONTENTS_ONLY(*td, &ueContextReleaseCommand); ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_S1AP_PDU, &pdu); - if (enc_ret.encoded < 0) - { - d_error("Encoding of %s failed", asn_DEF_S1ap_S1SetupRequest.name); - } - - return enc_ret.encoded; -} - -static inline int s1ap_encode_s1setup_response( - s1ap_message *message_p, pkbuf_t *pkbuf) -{ - S1ap_S1SetupResponse_t s1SetupResponse; - S1ap_S1SetupResponse_t *s1SetupResponse_p = &s1SetupResponse; - - memset(s1SetupResponse_p, 0, sizeof (S1ap_S1SetupResponse_t)); - - if (s1ap_encode_s1ap_s1setupresponseies( - s1SetupResponse_p, &message_p->msg.s1ap_S1SetupResponseIEs) < 0) - { - return -1; - } - - return s1ap_generate_successfull_outcome(pkbuf, - S1ap_ProcedureCode_id_S1Setup, message_p->criticality, - &asn_DEF_S1ap_S1SetupResponse, s1SetupResponse_p); -} - -static inline int s1ap_encode_s1setup_failure( - s1ap_message *message_p, pkbuf_t *pkbuf) -{ - S1ap_S1SetupFailure_t s1SetupFailure; - S1ap_S1SetupFailure_t *s1SetupFailure_p = &s1SetupFailure; - - memset(s1SetupFailure_p, 0, sizeof (S1ap_S1SetupFailure_t)); - - if (s1ap_encode_s1ap_s1setupfailureies( - s1SetupFailure_p, &message_p->msg.s1ap_S1SetupFailureIEs) < 0) - { - return -1; - } - - return s1ap_generate_unsuccessfull_outcome(pkbuf, - S1ap_ProcedureCode_id_S1Setup, message_p->criticality, - &asn_DEF_S1ap_S1SetupFailure, s1SetupFailure_p); -} - -static inline int s1ap_encode_downlink_nas_transport( - s1ap_message *message_p, pkbuf_t *pkbuf) -{ - S1ap_DownlinkNASTransport_t downlinkNasTransport; - S1ap_DownlinkNASTransport_t *downlinkNasTransport_p = &downlinkNasTransport; - - memset(downlinkNasTransport_p, 0, sizeof(S1ap_DownlinkNASTransport_t)); - - /* - * Convert IE structure into asn1 message_p - */ - if (s1ap_encode_s1ap_downlinknastransport_ies(downlinkNasTransport_p, - &message_p->msg.s1ap_DownlinkNASTransport_IEs) < 0) - { - return -1; - } - - /* - * Generate Initiating message_p for the list of IEs - */ - return s1ap_generate_initiating_message(pkbuf, - S1ap_ProcedureCode_id_downlinkNASTransport, message_p->criticality, - &asn_DEF_S1ap_DownlinkNASTransport, downlinkNasTransport_p); -} - -static inline int s1ap_encode_ue_context_release_command( - s1ap_message *message_p, pkbuf_t *pkbuf) -{ - S1ap_UEContextReleaseCommand_t ueContextReleaseCommand; - S1ap_UEContextReleaseCommand_t *ueContextReleaseCommand_p = - &ueContextReleaseCommand; - - memset(ueContextReleaseCommand_p, 0, - sizeof(S1ap_UEContextReleaseCommand_t)); - - /* - * Convert IE structure into asn1 message_p - */ - if (s1ap_encode_s1ap_uecontextreleasecommand_ies(ueContextReleaseCommand_p, - &message_p->msg.s1ap_UEContextReleaseCommand_IEs) < 0) - { - return -1; - } - - return s1ap_generate_initiating_message(pkbuf, - S1ap_ProcedureCode_id_UEContextRelease, message_p->criticality, - &asn_DEF_S1ap_UEContextReleaseCommand, ueContextReleaseCommand_p); -} - - -ssize_t s1ap_generate_initiating_message(pkbuf_t *pkbuf, - e_S1ap_ProcedureCode procedureCode, S1ap_Criticality_t criticality, - asn_TYPE_descriptor_t *td, void *sptr) -{ - S1AP_PDU_t pdu; - - d_assert(td, return -1, "Null param"); - d_assert(sptr, return -1, "Null param"); - - memset(&pdu, 0, sizeof (S1AP_PDU_t)); - pdu.present = S1AP_PDU_PR_initiatingMessage; - pdu.choice.initiatingMessage.procedureCode = procedureCode; - pdu.choice.initiatingMessage.criticality = criticality; - ANY_fromType_aper(&pdu.choice.initiatingMessage.value, td, sptr); - - return s1ap_encode_to_buffer(pkbuf, &pdu, td, sptr); -} - -ssize_t s1ap_generate_successfull_outcome(pkbuf_t *pkbuf, - e_S1ap_ProcedureCode procedureCode, S1ap_Criticality_t criticality, - asn_TYPE_descriptor_t * td, void *sptr) -{ - S1AP_PDU_t pdu; - - memset(&pdu, 0, sizeof (S1AP_PDU_t)); - pdu.present = S1AP_PDU_PR_successfulOutcome; - pdu.choice.successfulOutcome.procedureCode = procedureCode; - pdu.choice.successfulOutcome.criticality = criticality; - ANY_fromType_aper(&pdu.choice.successfulOutcome.value, td, sptr); - - return s1ap_encode_to_buffer(pkbuf, &pdu, td, sptr); -} - -ssize_t s1ap_generate_unsuccessfull_outcome(pkbuf_t *pkbuf, - e_S1ap_ProcedureCode procedureCode, S1ap_Criticality_t criticality, - asn_TYPE_descriptor_t *td, void *sptr) -{ - S1AP_PDU_t pdu; - - memset(&pdu, 0, sizeof (S1AP_PDU_t)); - pdu.present = S1AP_PDU_PR_unsuccessfulOutcome; - pdu.choice.successfulOutcome.procedureCode = procedureCode; - pdu.choice.successfulOutcome.criticality = criticality; - ANY_fromType_aper(&pdu.choice.successfulOutcome.value, td, sptr); - - return s1ap_encode_to_buffer(pkbuf, &pdu, td, sptr); -} - -ssize_t s1ap_encode_to_buffer(pkbuf_t *pkbuf, - S1AP_PDU_t *pdu, asn_TYPE_descriptor_t *td, void *sptr) -{ - asn_enc_rval_t enc_ret = {0}; - - enc_ret = aper_encode_to_buffer(&asn_DEF_S1AP_PDU, - pdu, pkbuf->payload, S1AP_SDU_SIZE); - - ASN_STRUCT_FREE_CONTENTS_ONLY(*td, sptr); - ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_S1AP_PDU, pdu); - if (enc_ret.encoded < 0) { d_error("Encoding of %s failed", td->name); diff --git a/src/s1ap_message.c b/src/s1ap_message.c index 11c8ce075..1af9fd46e 100644 --- a/src/s1ap_message.c +++ b/src/s1ap_message.c @@ -12,10 +12,10 @@ status_t s1ap_build_setup_rsp(pkbuf_t **pkbuf) s1ap_message message; S1ap_S1SetupResponseIEs_t *ies = NULL; int numServedGUMMEI = 0; - S1ap_ServedGUMMEIsItem_t servedGUMMEI; - S1ap_PLMNidentity_t plmnIdentity; - S1ap_MME_Group_ID_t mmeGroupId; - S1ap_MME_Code_t mmeCode; + S1ap_ServedGUMMEIsItem_t *servedGUMMEI; + S1ap_PLMNidentity_t *plmnIdentity; + S1ap_MME_Group_ID_t *mmeGroupId; + S1ap_MME_Code_t *mmeCode; uint16_t mcc = 0x1234; uint16_t mnc = 0x5678; @@ -26,42 +26,56 @@ status_t s1ap_build_setup_rsp(pkbuf_t **pkbuf) ies = &message.msg.s1ap_S1SetupResponseIEs; ies->relativeMMECapacity = mme_self()->relative_capacity; - memset((void*)&servedGUMMEI, 0, sizeof(S1ap_ServedGUMMEIsItem_t)); numServedGUMMEI = 1; + + servedGUMMEI = (S1ap_ServedGUMMEIsItem_t *) + calloc(numServedGUMMEI, sizeof(S1ap_ServedGUMMEIsItem_t)); for (i = 0; i < numServedGUMMEI; i++) { srvd_gummei_t *srvd_gummei = &mme_self()->srvd_gummei; for (j = 0; j < srvd_gummei->num_of_plmn_id; j++) { - memset((void *)&plmnIdentity, 0, sizeof(S1ap_PLMNidentity_t)); - MCC_MNC_TO_TBCD(mcc, mnc, mnc_digit_len, &plmnIdentity); - ASN_SEQUENCE_ADD(&servedGUMMEI.servedPLMNs, &plmnIdentity); + plmnIdentity = (S1ap_PLMNidentity_t *) + calloc(srvd_gummei->num_of_plmn_id, + sizeof(S1ap_PLMNidentity_t)); + MCC_MNC_TO_TBCD(mcc, mnc, mnc_digit_len, plmnIdentity); + ASN_SEQUENCE_ADD(&servedGUMMEI->servedPLMNs, plmnIdentity); } for (j = 0; j < srvd_gummei->num_of_grp_id; j++) { - memset((void*)&mmeGroupId, 0, sizeof(S1ap_MME_Group_ID_t)); - INT16_TO_OCTET_STRING(srvd_gummei->grp_id[j], &mmeGroupId); - ASN_SEQUENCE_ADD(&servedGUMMEI.servedGroupIDs, &mmeGroupId); + mmeGroupId = (S1ap_MME_Group_ID_t *) + calloc(srvd_gummei->num_of_grp_id, + sizeof(S1ap_MME_Group_ID_t)); + INT16_TO_OCTET_STRING(srvd_gummei->grp_id[j], mmeGroupId); + ASN_SEQUENCE_ADD(&servedGUMMEI->servedGroupIDs, mmeGroupId); } for (j = 0; j < srvd_gummei->num_of_code; j++) { - memset((void*)&mmeCode, 0, sizeof(S1ap_MME_Code_t)); - INT8_TO_OCTET_STRING(srvd_gummei->code[j], &mmeCode); - ASN_SEQUENCE_ADD(&servedGUMMEI.servedMMECs, &mmeCode); + mmeCode = (S1ap_MME_Code_t *) + calloc(srvd_gummei->num_of_grp_id, + sizeof(S1ap_MME_Code_t)); + INT8_TO_OCTET_STRING(srvd_gummei->code[j], mmeCode); + ASN_SEQUENCE_ADD(&servedGUMMEI->servedMMECs, mmeCode); } } - ASN_SEQUENCE_ADD(&ies->servedGUMMEIs, &servedGUMMEI); + ASN_SEQUENCE_ADD(&ies->servedGUMMEIs, servedGUMMEI); message.procedureCode = S1ap_ProcedureCode_id_S1Setup; message.direction = S1AP_PDU_PR_successfulOutcome; - message.criticality = S1ap_Criticality_reject; erval = s1ap_encode_pdu(pkbuf, &message); + + ASN_STRUCT_FREE_CONTENTS_ONLY( + asn_DEF_S1ap_ServedGUMMEIs, &ies->servedGUMMEIs); + if (erval < 0) + { + d_error("s1ap_encode_error : (%d)", erval); return CORE_ERROR; + } return CORE_OK; }