encode memory leak fix done

This commit is contained in:
Sukchan Lee 2017-02-07 11:35:22 +09:00
parent 56d4a15813
commit db62522a52
2 changed files with 217 additions and 199 deletions

View File

@ -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);

View File

@ -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;
}