forked from acouzens/open5gs
tracking area update request's active flag
This commit is contained in:
parent
aacaa83eea
commit
c0d4f25717
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue