open5gs/src/mme/emm_build.c

110 lines
3.9 KiB
C
Raw Normal View History

2017-04-12 13:27:32 +00:00
#define TRACE_MODULE _emm_build
#include "core_debug.h"
#include "nas_message.h"
#include "nas_security.h"
#include "emm_build.h"
2017-04-13 03:21:47 +00:00
status_t emm_build_attach_accept(
pkbuf_t **emmbuf, mme_ue_t *mme_ue, pkbuf_t *esmbuf)
2017-04-12 13:27:32 +00:00
{
nas_message_t message;
2017-04-13 03:21:47 +00:00
nas_attach_accept_t *attach_accept = &message.emm.attach_accept;
2017-04-13 04:54:39 +00:00
nas_eps_attach_result_t *eps_attach_result =
&attach_accept->eps_attach_result;
nas_gprs_timer_t *t3412_value = &attach_accept->t3412_value;
nas_tracking_area_identity_list_t *tai_list = &attach_accept->tai_list;
nas_eps_mobile_identity_t *guti = &attach_accept->guti;
nas_gprs_timer_t *t3402_value = &attach_accept->t3402_value;
nas_gprs_timer_t *t3423_value = &attach_accept->t3423_value;
nas_eps_network_feature_support_t *eps_network_feature_support =
&attach_accept->eps_network_feature_support;
2017-04-12 13:27:32 +00:00
d_assert(mme_ue, return CORE_ERROR, "Null param");
d_assert(mme_ue->enb_ue, return CORE_ERROR, "Null param");
2017-08-11 03:05:01 +00:00
d_assert(esmbuf, return CORE_ERROR, "Null param");
2017-04-12 13:27:32 +00:00
memset(&message, 0, sizeof(message));
message.h.security_header_type =
NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
message.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
message.emm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
message.emm.h.message_type = NAS_ATTACH_ACCEPT;
2017-04-13 04:54:39 +00:00
eps_attach_result->result = NAS_ATTACH_RESULT_COMBINED_EPS_IMSI_ATTACH;
t3412_value->unit = NAS_GRPS_TIMER_UNIT_MULTIPLES_OF_DECI_HH;
t3412_value->value = 9;
tai_list->length = 6;
tai_list->type = 2;
tai_list->num = 0; /* +1 = 1 elements */
memcpy(&tai_list->type2.tai[0], &mme_ue->enb_ue->tai, sizeof(tai_t));
2017-04-13 04:54:39 +00:00
2017-04-13 03:21:47 +00:00
attach_accept->esm_message_container.data = esmbuf->payload;
attach_accept->esm_message_container.len = esmbuf->len;
2017-04-13 04:54:39 +00:00
attach_accept->presencemask |= NAS_ATTACH_ACCEPT_GUTI_PRESENT;
2017-07-23 03:25:01 +00:00
guti->length = sizeof(nas_eps_mobile_identity_guti_t);
2017-04-13 04:54:39 +00:00
guti->guti.odd_even = NAS_EPS_MOBILE_IDENTITY_EVEN;
guti->guti.type = NAS_EPS_MOBILE_IDENTITY_GUTI;
2017-07-23 03:25:01 +00:00
memcpy(&guti->guti.plmn_id, &mme_ue->guti.plmn_id, PLMN_ID_LEN);
guti->guti.mme_gid = mme_ue->guti.mme_gid;
guti->guti.mme_code = mme_ue->guti.mme_code;
guti->guti.m_tmsi = mme_ue->guti.m_tmsi;
2017-04-13 04:54:39 +00:00
attach_accept->presencemask |= NAS_ATTACH_ACCEPT_EMM_CAUSE_PRESENT;
attach_accept->emm_cause = EMM_CAUSE_CS_DOMAIN_NOT_AVAILABLE;
attach_accept->presencemask |= NAS_ATTACH_ACCEPT_T3402_VALUE_PRESENT;
t3402_value->unit = NAS_GRPS_TIMER_UNIT_MULTIPLES_OF_1_MM;
t3402_value->value = 12;
attach_accept->presencemask |= NAS_ATTACH_ACCEPT_T3423_VALUE_PRESENT;
t3423_value->unit = NAS_GRPS_TIMER_UNIT_MULTIPLES_OF_DECI_HH;
t3423_value->value = 9;
attach_accept->presencemask |=
NAS_ATTACH_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_PRESENT;
eps_network_feature_support->length = 1;
eps_network_feature_support->esr_ps = 1;
eps_network_feature_support->epc_lcs = 1;
eps_network_feature_support->ims_vops = 1;
d_assert(nas_security_encode(emmbuf, mme_ue, &message) == CORE_OK &&
*emmbuf,,);
2017-04-13 08:46:26 +00:00
pkbuf_free(esmbuf);
2017-04-12 13:27:32 +00:00
return CORE_OK;
}
2017-08-11 03:05:01 +00:00
status_t emm_build_attach_reject(
pkbuf_t **emmbuf, nas_emm_cause_t emm_cause, pkbuf_t *esmbuf)
{
nas_message_t message;
nas_attach_reject_t *attach_reject = &message.emm.attach_reject;
memset(&message, 0, sizeof(message));
message.emm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
message.emm.h.message_type = NAS_ATTACH_REJECT;
attach_reject->emm_cause = emm_cause;
if (esmbuf)
{
attach_reject->presencemask |=
NAS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_PRESENT;
attach_reject->esm_message_container.data = esmbuf->payload;
attach_reject->esm_message_container.len = esmbuf->len;
}
d_assert(nas_plain_encode(emmbuf, &message) == CORE_OK && *emmbuf,,);
if (esmbuf)
{
pkbuf_free(esmbuf);
}
return CORE_OK;
}