open5gs/src/mme/s1ap_build.c

108 lines
3.0 KiB
C
Raw Normal View History

2017-03-08 06:27:48 +00:00
#define TRACE_MODULE _s1ap_build
2017-02-06 10:12:10 +00:00
2017-02-06 11:54:31 +00:00
#include "core_debug.h"
2017-02-06 10:12:10 +00:00
#include "context.h"
2017-02-20 10:46:58 +00:00
#include "s1ap_build.h"
#include "s1ap_conv.h"
2017-02-06 10:12:10 +00:00
status_t s1ap_build_setup_rsp(pkbuf_t **pkbuf)
{
int erval;
int i, j;
2017-03-06 00:07:59 +00:00
s1ap_message_t message;
2017-02-06 10:12:10 +00:00
S1ap_S1SetupResponseIEs_t *ies = NULL;
2017-02-06 12:52:20 +00:00
int numServedGUMMEI = 0;
2017-02-07 02:35:22 +00:00
S1ap_ServedGUMMEIsItem_t *servedGUMMEI;
S1ap_PLMNidentity_t *plmnIdentity;
S1ap_MME_Group_ID_t *mmeGroupId;
S1ap_MME_Code_t *mmeCode;
2017-02-06 11:54:31 +00:00
2017-03-06 00:07:59 +00:00
memset(&message, 0, sizeof(s1ap_message_t));
2017-02-06 10:12:10 +00:00
2017-03-05 02:46:42 +00:00
ies = &message.s1ap_S1SetupResponseIEs;
2017-02-06 10:12:10 +00:00
2017-02-06 12:52:20 +00:00
numServedGUMMEI = 1;
2017-02-07 02:35:22 +00:00
servedGUMMEI = (S1ap_ServedGUMMEIsItem_t *)
core_calloc(numServedGUMMEI, sizeof(S1ap_ServedGUMMEIsItem_t));
2017-02-06 12:52:20 +00:00
for (i = 0; i < numServedGUMMEI; i++)
2017-02-06 10:12:10 +00:00
{
srvd_gummei_t *srvd_gummei = &mme_self()->srvd_gummei;
2017-02-06 11:54:31 +00:00
for (j = 0; j < srvd_gummei->num_of_plmn_id; j++)
2017-02-06 10:12:10 +00:00
{
2017-02-07 02:35:22 +00:00
plmnIdentity = (S1ap_PLMNidentity_t *)
core_calloc(srvd_gummei->num_of_plmn_id,
2017-02-07 02:35:22 +00:00
sizeof(S1ap_PLMNidentity_t));
2017-03-05 02:29:15 +00:00
s1ap_plmn_id_to_TBCD_STRING(
&srvd_gummei->plmn_id[j], plmnIdentity);
2017-02-07 02:35:22 +00:00
ASN_SEQUENCE_ADD(&servedGUMMEI->servedPLMNs, plmnIdentity);
2017-02-06 10:12:10 +00:00
}
2017-02-13 05:41:20 +00:00
for (j = 0; j < srvd_gummei->num_of_mme_gid; j++)
2017-02-06 10:12:10 +00:00
{
2017-02-07 02:35:22 +00:00
mmeGroupId = (S1ap_MME_Group_ID_t *)
2017-02-13 05:41:20 +00:00
core_calloc(srvd_gummei->num_of_mme_gid,
2017-02-07 02:35:22 +00:00
sizeof(S1ap_MME_Group_ID_t));
2017-03-05 02:29:15 +00:00
s1ap_uint16_to_OCTET_STRING(
2017-02-13 05:41:20 +00:00
srvd_gummei->mme_gid[j], mmeGroupId);
2017-02-07 02:35:22 +00:00
ASN_SEQUENCE_ADD(&servedGUMMEI->servedGroupIDs, mmeGroupId);
2017-02-06 10:12:10 +00:00
}
2017-02-13 05:41:20 +00:00
for (j = 0; j < srvd_gummei->num_of_mme_code; j++)
2017-02-06 10:12:10 +00:00
{
2017-02-07 02:35:22 +00:00
mmeCode = (S1ap_MME_Code_t *)
2017-02-13 05:41:20 +00:00
core_calloc(srvd_gummei->num_of_mme_code,
2017-02-07 02:35:22 +00:00
sizeof(S1ap_MME_Code_t));
2017-03-05 02:29:15 +00:00
s1ap_uint8_to_OCTET_STRING(
2017-02-13 05:41:20 +00:00
srvd_gummei->mme_code[j], mmeCode);
2017-02-07 02:35:22 +00:00
ASN_SEQUENCE_ADD(&servedGUMMEI->servedMMECs, mmeCode);
2017-02-06 10:12:10 +00:00
}
}
2017-02-07 02:35:22 +00:00
ASN_SEQUENCE_ADD(&ies->servedGUMMEIs, servedGUMMEI);
2017-02-14 00:09:01 +00:00
ies->relativeMMECapacity = mme_self()->relative_capacity;
2017-02-06 10:12:10 +00:00
message.procedureCode = S1ap_ProcedureCode_id_S1Setup;
message.direction = S1AP_PDU_PR_successfulOutcome;
erval = s1ap_encode_pdu(pkbuf, &message);
2017-02-09 14:15:08 +00:00
s1ap_free_pdu(&message);
2017-02-07 02:35:22 +00:00
2017-02-06 10:12:10 +00:00
if (erval < 0)
2017-02-07 02:35:22 +00:00
{
d_error("s1ap_encode_error : (%d)", erval);
2017-02-06 10:12:10 +00:00
return CORE_ERROR;
2017-02-07 02:35:22 +00:00
}
2017-02-06 10:12:10 +00:00
return CORE_OK;
}
2017-02-13 11:10:05 +00:00
status_t s1ap_build_setup_failure(pkbuf_t **pkbuf, S1ap_Cause_t cause)
{
int erval;
2017-03-06 00:07:59 +00:00
s1ap_message_t message;
2017-02-13 11:10:05 +00:00
S1ap_S1SetupFailureIEs_t *ies = NULL;
2017-03-06 00:07:59 +00:00
memset(&message, 0, sizeof(s1ap_message_t));
2017-02-13 11:10:05 +00:00
2017-03-05 02:46:42 +00:00
ies = &message.s1ap_S1SetupFailureIEs;
2017-02-13 11:10:05 +00:00
ies->cause = cause;
message.procedureCode = S1ap_ProcedureCode_id_S1Setup;
message.direction = S1AP_PDU_PR_unsuccessfulOutcome;
erval = s1ap_encode_pdu(pkbuf, &message);
s1ap_free_pdu(&message);
if (erval < 0)
{
d_error("s1ap_encode_error : (%d)", erval);
return CORE_ERROR;
}
return CORE_OK;
}