tracking area update request's active flag

This commit is contained in:
Sukchan Lee 2018-02-04 13:12:26 +09:00
parent aacaa83eea
commit c0d4f25717
4 changed files with 71 additions and 45 deletions

View File

@ -38,9 +38,13 @@ status_t emm_handle_attach_request(
d_assert(esm_message_container, return CORE_ERROR, "Null param");
d_assert(esm_message_container->length, return CORE_ERROR, "Null param");
d_trace(5, " KSI[%d]\n", eps_attach_type->nas_key_set_identifier);
if (eps_attach_type->nas_key_set_identifier == NAS_KSI_NO_KEY_IS_AVAILABLE)
CLEAR_SECURITY_CONTEXT(mme_ue);
/* Set EPS Attach Type */
memcpy(&mme_ue->nas_eps.attach, eps_attach_type,
sizeof(nas_eps_attach_type_t));
mme_ue->nas_eps.type = MME_EPS_TYPE_ATTACH_REQUEST;
mme_ue->nas_eps.ksi = eps_attach_type->nas_key_set_identifier;
d_trace(5, " NAS_EPS TYPE[%d] KSI[%d] ATTACH[0x%x]\n",
mme_ue->nas_eps.type, mme_ue->nas_eps.ksi, mme_ue->nas_eps.data);
/*
* ATTACH_REQUEST
* Clear EBI generator
@ -63,12 +67,6 @@ status_t emm_handle_attach_request(
mme_ue->nhcc = 1;
}
/* Set EPS Attach Type */
memcpy(&mme_ue->nas_eps.attach, eps_attach_type,
sizeof(nas_eps_attach_type_t));
mme_ue->nas_eps.type = MME_EPS_TYPE_ATTACH_REQUEST;
d_trace(9, " ATTACH_TYPE[%d]\n", eps_attach_type->attach_type);
d_trace(5, " OLD TAI[PLMN_ID:0x%x,TAC:%d]\n",
mme_ue->tai.plmn_id, mme_ue->tai.tac);
d_trace(5, " OLD E_CGI[PLMN_ID:0x%x,CELL_ID:%d]\n",
@ -262,9 +260,20 @@ status_t emm_handle_identity_response(
status_t emm_handle_detach_request(
mme_ue_t *mme_ue, nas_detach_request_from_ue_t *detach_request)
{
nas_detach_type_t *detach_type = NULL;
d_assert(detach_request, return CORE_ERROR, "Null param");
d_assert(mme_ue, return CORE_ERROR, "Null param");
detach_type = &detach_request->detach_type;
/* Set EPS Attach Type */
memcpy(&mme_ue->nas_eps.detach, detach_type, sizeof(nas_detach_type_t));
mme_ue->nas_eps.type = MME_EPS_TYPE_DETACH_REQUEST_FROM_UE;
mme_ue->nas_eps.ksi = detach_type->nas_key_set_identifier;
d_trace(5, " NAS_EPS TYPE[%d] KSI[%d] DETACH[0x%x]\n",
mme_ue->nas_eps.type, mme_ue->nas_eps.ksi, mme_ue->nas_eps.data);
switch (detach_request->detach_type.detach_type)
{
/* 0 0 1 : EPS detach */
@ -289,17 +298,23 @@ status_t emm_handle_detach_request(
if (detach_request->detach_type.switch_off)
d_trace(5, " Switch-Off\n");
/* Save detach type */
mme_ue->detach_type = detach_request->detach_type;
return CORE_OK;
}
status_t emm_handle_service_request(
mme_ue_t *mme_ue, nas_service_request_t *service_request)
{
nas_ksi_and_sequence_number_t *ksi_and_sequence_number =
&service_request->ksi_and_sequence_number;
d_assert(mme_ue, return CORE_ERROR, "Null param");
/* Set EPS Update Type */
mme_ue->nas_eps.type = MME_EPS_TYPE_SERVICE_REQUEST;
mme_ue->nas_eps.ksi = ksi_and_sequence_number->ksi;
d_trace(5, " NAS_EPS TYPE[%d] KSI[%d]\n",
mme_ue->nas_eps.type, mme_ue->nas_eps.ksi);
/*
* ATTACH_REQUEST
* Clear EBI generator
@ -321,9 +336,6 @@ status_t emm_handle_service_request(
mme_ue->nhcc = 1;
}
/* Set EPS Update Type */
mme_ue->nas_eps.type = MME_EPS_TYPE_SERVICE_REQUEST;
d_trace(5, " GUTI[G:%d,C:%d,M_TMSI:0x%x] IMSI[%s]\n",
mme_ue->guti.mme_gid,
mme_ue->guti.mme_code,
@ -348,6 +360,15 @@ status_t emm_handle_tau_request(
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return CORE_ERROR, "Null param");
/* Set EPS Update Type */
memcpy(&mme_ue->nas_eps.update, eps_update_type,
sizeof(nas_eps_update_type_t));
mme_ue->nas_eps.type = MME_EPS_TYPE_TAU_REQUEST;
mme_ue->nas_eps.ksi = eps_update_type->nas_key_set_identifier;
d_trace(5, " NAS_EPS TYPE[%d] KSI[%d] UPDATE[0x%x]\n",
mme_ue->nas_eps.type, mme_ue->nas_eps.ksi,
mme_ue->nas_eps.data);
/*
* ATTACH_REQUEST
* Clear EBI generator
@ -363,22 +384,15 @@ status_t emm_handle_tau_request(
*/
CLEAR_PAGING_INFO(mme_ue);
/* Set EPS Update Type */
memcpy(&mme_ue->nas_eps.update, eps_update_type,
sizeof(nas_eps_update_type_t));
mme_ue->nas_eps.type = MME_EPS_TYPE_TAU_REQUEST;
if (BEARER_CONTEXT_IS_ACTIVE(mme_ue))
d_trace(5, " Bearer-Active\n");
else
d_trace(5, " Bearer-Inactive\n");
if (mme_ue->nas_eps.update.active_flag)
d_trace(5, " Active flag[UPD:0x%x]\n",
mme_ue->nas_eps.update);
d_trace(5, " Active flag\n");
else
d_trace(5, " No Active flag[UPD:0x%x]\n",
mme_ue->nas_eps.update);
d_trace(5, " No Active flag\n");
d_trace(5, " OLD TAI[PLMN_ID:0x%x,TAC:%d]\n",
mme_ue->tai.plmn_id, mme_ue->tai.tac);

View File

@ -295,6 +295,13 @@ static void common_register_state(fsm_t *s, event_t *e)
S1ap_ProcedureCode_t procedureCode =
(S1ap_ProcedureCode_t)event_get_param2(e);
if (procedureCode == S1ap_ProcedureCode_id_initialUEMessage)
d_trace(5, " Iniital UE Message\n");
else if (procedureCode == S1ap_ProcedureCode_id_uplinkNASTransport)
d_trace(5, " Uplink NAS Transport\n");
else
d_assert(0,, "Invalid Procedure Code[%d]", procedureCode);
if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue))
{
d_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd);
@ -312,28 +319,17 @@ static void common_register_state(fsm_t *s, event_t *e)
break;
}
if (procedureCode == S1ap_ProcedureCode_id_initialUEMessage)
{
rv = nas_send_tau_accept(mme_ue);
d_assert(rv == CORE_OK,, "nas_send_tau_accept() failed");
d_trace(5, " Initial UE Message\n");
rv = mme_send_release_access_bearer_or_ue_context_release(
mme_ue, enb_ue);
d_assert(rv == CORE_OK,, "mme_send_release_access_bearer_or_"
"ue_context_release() failed");
}
else if (procedureCode == S1ap_ProcedureCode_id_uplinkNASTransport)
if (mme_ue->nas_eps.update.active_flag)
{
if (BEARER_CONTEXT_IS_ACTIVE(mme_ue))
{
rv = nas_send_tau_accept(mme_ue);
d_assert(rv == CORE_OK,, "nas_send_tau_accept() failed");
d_trace(5, " Uplink NAS Trasnport\n");
}
else
{
d_warn("No Bearer Context : UE[%s]", mme_ue->imsi_bcd);
d_warn("Active Flag, But No Bearer Context : UE[%s]",
mme_ue->imsi_bcd);
rv = nas_send_tau_reject(mme_ue,
EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED);
d_assert(rv == CORE_OK,, "nas_send_tau_reject() failed");
@ -341,8 +337,19 @@ static void common_register_state(fsm_t *s, event_t *e)
}
}
else
d_assert(0,, "Invalid S1AP Procedure Code[%ld]",
procedureCode);
{
rv = nas_send_tau_accept(mme_ue);
d_assert(rv == CORE_OK,, "nas_send_tau_accept() failed");
if (procedureCode == S1ap_ProcedureCode_id_initialUEMessage ||
!BEARER_CONTEXT_IS_ACTIVE(mme_ue))
{
rv = mme_send_release_access_bearer_or_ue_context_release(
mme_ue, enb_ue);
d_assert(rv == CORE_OK,, "mme_send_release_access_bearer"
"_or_ue_context_release() failed");
}
}
break;
}
default:

View File

@ -212,10 +212,15 @@ struct _mme_ue_t {
#define MME_EPS_TYPE_ATTACH_REQUEST 1
#define MME_EPS_TYPE_TAU_REQUEST 2
#define MME_EPS_TYPE_SERVICE_REQUEST 3
#define MME_EPS_TYPE_DETACH_REQUEST_FROM_UE 4
#define MME_EPS_TYPE_DETACH_REQUEST_TO_UE 5
c_uint8_t type;
c_uint8_t ksi;
union {
nas_eps_attach_type_t attach;
nas_eps_update_type_t update;
nas_detach_type_t detach;
c_uint8_t data;
};
} nas_eps;
@ -240,12 +245,15 @@ struct _mme_ue_t {
#define SECURITY_CONTEXT_IS_VALID(__mME) \
((__mME) && \
((__mME)->security_context_available == 1) && ((__mME)->mac_failed == 0))
((__mME)->security_context_available == 1) && \
((__mME)->mac_failed == 0) && \
((__mME)->nas_eps.ksi != NAS_KSI_NO_KEY_IS_AVAILABLE))
#define CLEAR_SECURITY_CONTEXT(__mME) \
do { \
d_assert((__mME), break, "Null param"); \
(__mME)->security_context_available = 0; \
(__mME)->mac_failed = 0; \
(__mME)->nas_eps.ksi = 0; \
} while(0)
int security_context_available;
int mac_failed;
@ -335,9 +343,6 @@ struct _mme_ue_t {
/* UE Radio Capability */
void *radio_capa;
/* Detach Request */
nas_detach_type_t detach_type;
/* S1AP Transparent Container */
OCTET_STRING_t container;

View File

@ -200,7 +200,7 @@ status_t nas_send_detach_accept(mme_ue_t *mme_ue)
d_assert(enb_ue, return CORE_ERROR, "Null param");
/* reply with detach accept */
if (mme_ue->detach_type.switch_off == 0)
if (mme_ue->nas_eps.detach.switch_off == 0)
{
rv = emm_build_detach_accept(&emmbuf, mme_ue);
d_assert(rv == CORE_OK && emmbuf, return CORE_ERROR,