forked from acouzens/open5gs
Try to fix the UE infinite attach (#568)
If both Delete-Session-Request/Response and UEContextReleaseCommand/UEContextReleaseComplete are failed at the same time, UE cannot attach to the EPC infinitely. So, I've add the protection code if timer expires when MME does not receive Delete-Session-Response.
This commit is contained in:
parent
56c0987ad2
commit
fc5c9b2af0
|
@ -1040,7 +1040,7 @@ ran_ue_t *ran_ue_cycle(ran_ue_t *ran_ue)
|
|||
return ogs_pool_cycle(&ran_ue_pool, ran_ue);
|
||||
}
|
||||
|
||||
static int amf_ue_new_guti(amf_ue_t *amf_ue)
|
||||
void amf_ue_new_guti(amf_ue_t *amf_ue)
|
||||
{
|
||||
if (amf_ue->m_tmsi) {
|
||||
/* AMF has a VALID GUTI
|
||||
|
@ -1062,7 +1062,7 @@ static int amf_ue_new_guti(amf_ue_t *amf_ue)
|
|||
ogs_hash_set(self.guti_ue_hash,
|
||||
&amf_ue->guti, sizeof(ogs_nas_5gs_guti_t), amf_ue);
|
||||
|
||||
return OGS_OK;
|
||||
amf_ue->guti_present = true;
|
||||
}
|
||||
|
||||
amf_ue_t *amf_ue_add(ran_ue_t *ran_ue)
|
||||
|
@ -1092,9 +1092,6 @@ amf_ue_t *amf_ue_add(ran_ue_t *ran_ue)
|
|||
amf_ue->nas.access_type = OGS_ACCESS_TYPE_3GPP;
|
||||
amf_ue->abba_len = 2;
|
||||
|
||||
/* Create New GUTI */
|
||||
amf_ue_new_guti(amf_ue);
|
||||
|
||||
/* Add All Timers */
|
||||
amf_ue->t3513.timer = ogs_timer_add(
|
||||
ogs_app()->timer_mgr, amf_timer_t3513_expire, amf_ue);
|
||||
|
@ -1378,8 +1375,6 @@ void amf_ue_set_suci(amf_ue_t *amf_ue,
|
|||
}
|
||||
amf_ue->suci = suci;
|
||||
ogs_hash_set(self.suci_hash, amf_ue->suci, strlen(amf_ue->suci), amf_ue);
|
||||
|
||||
amf_ue->guti_present = 1;
|
||||
}
|
||||
|
||||
void amf_ue_set_supi(amf_ue_t *amf_ue, char *supi)
|
||||
|
|
|
@ -263,7 +263,7 @@ struct amf_ue_s {
|
|||
|
||||
amf_m_tmsi_t *m_tmsi;
|
||||
ogs_nas_5gs_guti_t guti;
|
||||
int guti_present;
|
||||
bool guti_present;
|
||||
|
||||
/* UE Info */
|
||||
ogs_guami_t *guami;
|
||||
|
@ -601,6 +601,8 @@ ran_ue_t *ran_ue_find(uint32_t index);
|
|||
ran_ue_t *ran_ue_find_by_amf_ue_ngap_id(uint64_t amf_ue_ngap_id);
|
||||
ran_ue_t *ran_ue_cycle(ran_ue_t *ran_ue);
|
||||
|
||||
void amf_ue_new_guti(amf_ue_t *amf_ue);
|
||||
|
||||
amf_ue_t *amf_ue_add(ran_ue_t *ran_ue);
|
||||
void amf_ue_remove(amf_ue_t *amf_ue);
|
||||
void amf_ue_remove_all(void);
|
||||
|
|
|
@ -71,9 +71,9 @@ ogs_pkbuf_t *gmm_build_registration_accept(amf_ue_t *amf_ue)
|
|||
|
||||
/* Set GUTI */
|
||||
ogs_debug("[%s] %s 5G-S_GUTI[AMF_ID:0x%x,M_TMSI:0x%x]", amf_ue->supi,
|
||||
amf_ue->guti_present ? "[V]" : "[N]",
|
||||
amf_ue->guti_present == true ? "[V]" : "[N]",
|
||||
ogs_amf_id_hexdump(&amf_ue->guti.amf_id), amf_ue->guti.m_tmsi);
|
||||
if (amf_ue->guti_present) {
|
||||
if (amf_ue->guti_present == true) {
|
||||
registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_5G_GUTI_PRESENT;
|
||||
|
||||
ogs_nas_5gs_nas_guti_to_mobilty_identity_guti(
|
||||
|
@ -82,7 +82,6 @@ ogs_pkbuf_t *gmm_build_registration_accept(amf_ue_t *amf_ue)
|
|||
mobile_identity->length = sizeof(mobile_identity_guti);
|
||||
mobile_identity->buffer = &mobile_identity_guti;
|
||||
}
|
||||
amf_ue->guti_present = 0;
|
||||
|
||||
/* Set TAI List */
|
||||
registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_TAI_LIST_PRESENT;
|
||||
|
|
|
@ -237,65 +237,6 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
|
|||
OGS_FSM_TRAN(s, &gmm_state_authentication);
|
||||
break;
|
||||
|
||||
#if 0
|
||||
case OGS_NAS_5GS_TRACKING_AREA_UPDATE_REQUEST:
|
||||
ogs_error("[%s] Tracking area update request",
|
||||
amf_ue->supi);
|
||||
rv = gmm_handle_tau_request(
|
||||
amf_ue, &nas_message->gmm.tracking_area_update_request);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("gmm_handle_tau_request() failed");
|
||||
OGS_FSM_TRAN(s, gmm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!AMF_UE_HAVE_SUCI(amf_ue)) {
|
||||
ogs_warn("TAU request : Unknown UE");
|
||||
nas_5gs_send_tau_reject(amf_ue,
|
||||
GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
OGS_FSM_TRAN(s, &gmm_state_exception);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AMF_EPS_TYPE_TAU_REQUEST:
|
||||
procedureCode = e->ngap_code;
|
||||
|
||||
if (!SESSION_CONTEXT_IS_AVAILABLE(amf_ue)) {
|
||||
ogs_warn("No PDN Connection : UE[%s]", amf_ue->imsi_bcd);
|
||||
nas_5gs_send_tau_reject(amf_ue,
|
||||
GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
OGS_FSM_TRAN(s, gmm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!SECURITY_CONTEXT_IS_VALID(amf_ue)) {
|
||||
amf_s6a_send_air(amf_ue, NULL);
|
||||
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_authentication);
|
||||
break;
|
||||
}
|
||||
|
||||
if (procedureCode == NGAP_ProcedureCode_id_initialUEMessage) {
|
||||
ogs_debug(" Iniital UE Message");
|
||||
if (amf_ue->nas_5gs.update.active_flag) {
|
||||
nas_5gs_send_tau_accept(amf_ue,
|
||||
NGAP_ProcedureCode_id_InitialContextSetup);
|
||||
} else {
|
||||
nas_5gs_send_tau_accept(amf_ue,
|
||||
NGAP_ProcedureCode_id_downlinkNASTransport);
|
||||
amf_send_release_access_bearer_or_ue_context_release(ran_ue);
|
||||
}
|
||||
} else if (procedureCode == NGAP_ProcedureCode_id_uplinkNASTransport) {
|
||||
ogs_debug(" Uplink NAS Transport");
|
||||
nas_5gs_send_tau_accept(amf_ue,
|
||||
NGAP_ProcedureCode_id_downlinkNASTransport);
|
||||
} else {
|
||||
ogs_fatal("Invalid Procedure Code[%d]", (int)procedureCode);
|
||||
}
|
||||
break;
|
||||
case OGS_NAS_5GS_TRACKING_AREA_UPDATE_COMPLETE:
|
||||
ogs_error("[%s] Tracking area update complete", amf_ue->supi);
|
||||
break;
|
||||
#endif
|
||||
case OGS_NAS_5GS_5GMM_STATUS:
|
||||
ogs_warn("[%s] 5GMM STATUS : Cause[%d]", amf_ue->suci,
|
||||
nas_message->gmm.gmm_status.gmm_cause);
|
||||
|
@ -327,6 +268,11 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
|
|||
amf_ue, &nas_message->gmm.ul_nas_transport);
|
||||
break;
|
||||
|
||||
case OGS_NAS_5GS_REGISTRATION_COMPLETE:
|
||||
ogs_error("[%s] Registration complete in INVALID-STATE",
|
||||
amf_ue->supi);
|
||||
break;
|
||||
|
||||
default:
|
||||
ogs_error("Unknown message [%d]", nas_message->gmm.h.message_type);
|
||||
}
|
||||
|
@ -706,6 +652,9 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
|
|||
ogs_kdf_nh_gnb(amf_ue->kamf, amf_ue->kgnb, amf_ue->nh);
|
||||
amf_ue->nhcc = 1;
|
||||
|
||||
/* Create New GUTI */
|
||||
amf_ue_new_guti(amf_ue);
|
||||
|
||||
amf_ue_sbi_discover_and_send(OpenAPI_nf_type_UDM, amf_ue, NULL,
|
||||
amf_nudm_uecm_build_registration);
|
||||
|
||||
|
@ -741,22 +690,14 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
|
|||
|
||||
OGS_FSM_TRAN(s, &gmm_state_authentication);
|
||||
break;
|
||||
|
||||
case OGS_NAS_5GS_SERVICE_REQUEST:
|
||||
ogs_info("[%s] Service request", amf_ue->supi);
|
||||
nas_5gs_send_service_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED);
|
||||
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
OGS_FSM_TRAN(s, &gmm_state_exception);
|
||||
break;
|
||||
|
||||
#if 0
|
||||
case OGS_NAS_5GS_TRACKING_AREA_UPDATE_REQUEST:
|
||||
ogs_debug("Tracking area update request");
|
||||
nas_5gs_send_tau_reject(amf_ue,
|
||||
GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED);
|
||||
OGS_FSM_TRAN(s, &gmm_state_exception);
|
||||
break;
|
||||
#endif
|
||||
|
||||
case OGS_NAS_5GS_5GMM_STATUS:
|
||||
ogs_warn("[%s] 5GMM STATUS : Cause[%d]",
|
||||
amf_ue->supi, nas_message->gmm.gmm_status.gmm_cause);
|
||||
|
@ -921,6 +862,11 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
|
|||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* The usage of guti_present is changed
|
||||
* This following code should be removed.
|
||||
*/
|
||||
#if 0
|
||||
/*
|
||||
* Issues #553
|
||||
*
|
||||
|
@ -940,6 +886,7 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
|
|||
*/
|
||||
if (amf_ue->guti_present == 0)
|
||||
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_registered);
|
||||
#endif
|
||||
|
||||
/* If nas_5gs_send_service_accept() used, we need change it. */
|
||||
ogs_assert(amf_ue->nas.message_type ==
|
||||
|
@ -968,6 +915,9 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
|
|||
case OGS_NAS_5GS_REGISTRATION_COMPLETE:
|
||||
ogs_info("[%s] Registration complete", amf_ue->supi);
|
||||
|
||||
/* Clear GUTI present */
|
||||
amf_ue->guti_present = false;
|
||||
|
||||
/*
|
||||
* TS24.501
|
||||
* 5.4.4.2 Generic UE configuration update procedure initiated
|
||||
|
@ -1018,6 +968,13 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
|
|||
OGS_FSM_TRAN(s, &gmm_state_authentication);
|
||||
break;
|
||||
|
||||
case OGS_NAS_5GS_SERVICE_REQUEST:
|
||||
ogs_info("[%s] Service request", amf_ue->supi);
|
||||
nas_5gs_send_service_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
OGS_FSM_TRAN(s, &gmm_state_exception);
|
||||
break;
|
||||
|
||||
case OGS_NAS_5GS_5GMM_STATUS:
|
||||
ogs_warn("[%s] 5GMM STATUS : Cause[%d]",
|
||||
amf_ue->supi, nas_message->gmm.gmm_status.gmm_cause);
|
||||
|
|
|
@ -78,10 +78,10 @@ ogs_pkbuf_t *emm_build_attach_accept(
|
|||
attach_accept->esm_message_container.length = esmbuf->len;
|
||||
|
||||
ogs_debug(" %s GUTI[G:%d,C:%d,M_TMSI:0x%x] IMSI:[%s]",
|
||||
mme_ue->guti_present ? "[V]" : "[N]",
|
||||
mme_ue->guti_present == true ? "[V]" : "[N]",
|
||||
mme_ue->guti.mme_gid, mme_ue->guti.mme_code,
|
||||
mme_ue->guti.m_tmsi, mme_ue->imsi_bcd);
|
||||
if (mme_ue->guti_present) {
|
||||
if (mme_ue->guti_present == true) {
|
||||
attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_GUTI_PRESENT;
|
||||
nas_guti->length = sizeof(ogs_nas_eps_mobile_identity_guti_t);
|
||||
nas_guti->guti.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN;
|
||||
|
@ -91,7 +91,6 @@ ogs_pkbuf_t *emm_build_attach_accept(
|
|||
nas_guti->guti.mme_code = mme_ue->guti.mme_code;
|
||||
nas_guti->guti.m_tmsi = mme_ue->guti.m_tmsi;
|
||||
}
|
||||
mme_ue->guti_present = 0;
|
||||
|
||||
#if 0 /* Need not to include T3402 */
|
||||
/* Set T3402 */
|
||||
|
@ -378,6 +377,7 @@ ogs_pkbuf_t *emm_build_tau_accept(mme_ue_t *mme_ue)
|
|||
ogs_nas_eps_message_t message;
|
||||
ogs_nas_eps_tracking_area_update_accept_t *tau_accept =
|
||||
&message.emm.tracking_area_update_accept;
|
||||
ogs_nas_eps_mobile_identity_t *nas_guti = &tau_accept->guti;
|
||||
int served_tai_index = 0;
|
||||
|
||||
mme_sess_t *sess = NULL;
|
||||
|
@ -409,6 +409,22 @@ ogs_pkbuf_t *emm_build_tau_accept(mme_ue_t *mme_ue)
|
|||
tau_accept->t3412_value.unit = OGS_NAS_GRPS_TIMER_UNIT_MULTIPLES_OF_DECI_HH;
|
||||
tau_accept->t3412_value.value = 9;
|
||||
|
||||
ogs_debug(" %s GUTI[G:%d,C:%d,M_TMSI:0x%x] IMSI:[%s]",
|
||||
mme_ue->guti_present == true ? "[V]" : "[N]",
|
||||
mme_ue->guti.mme_gid, mme_ue->guti.mme_code,
|
||||
mme_ue->guti.m_tmsi, mme_ue->imsi_bcd);
|
||||
if (mme_ue->guti_present == true) {
|
||||
tau_accept->presencemask |=
|
||||
OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_GUTI_PRESENT;
|
||||
nas_guti->length = sizeof(ogs_nas_eps_mobile_identity_guti_t);
|
||||
nas_guti->guti.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN;
|
||||
nas_guti->guti.type = OGS_NAS_EPS_MOBILE_IDENTITY_GUTI;
|
||||
nas_guti->guti.nas_plmn_id = mme_ue->guti.nas_plmn_id;
|
||||
nas_guti->guti.mme_gid = mme_ue->guti.mme_gid;
|
||||
nas_guti->guti.mme_code = mme_ue->guti.mme_code;
|
||||
nas_guti->guti.m_tmsi = mme_ue->guti.m_tmsi;
|
||||
}
|
||||
|
||||
/* Set TAI */
|
||||
tau_accept->presencemask |=
|
||||
OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_TAI_LIST_PRESENT;
|
||||
|
|
|
@ -553,8 +553,7 @@ int emm_handle_tau_request(mme_ue_t *mme_ue,
|
|||
? mme_ue->imsi_bcd : "Unknown");
|
||||
break;
|
||||
default:
|
||||
ogs_warn("Not implemented[%d]",
|
||||
eps_mobile_identity->imsi.type);
|
||||
ogs_error("Not implemented[%d]", eps_mobile_identity->imsi.type);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
|
|
@ -195,7 +195,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
break;
|
||||
|
||||
case OGS_NAS_EPS_ATTACH_REQUEST:
|
||||
ogs_info("Attach request");
|
||||
ogs_warn("[%s] Attach request", mme_ue->imsi_bcd);
|
||||
rv = emm_handle_attach_request(
|
||||
mme_ue, &message->emm.attach_request, e->pkbuf);
|
||||
if (rv != OGS_OK) {
|
||||
|
@ -266,13 +266,13 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
|
||||
if (!ACTIVE_EPS_BEARERS_IS_AVAIABLE(mme_ue)) {
|
||||
ogs_warn("No active EPS bearers : IMSI[%s]", mme_ue->imsi_bcd);
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
nas_eps_send_tau_reject(mme_ue,
|
||||
EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED);
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
|
||||
if (!h.integrity_protected || !SECURITY_CONTEXT_IS_VALID(mme_ue)) {
|
||||
mme_s6a_send_air(mme_ue, NULL);
|
||||
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
|
||||
break;
|
||||
|
@ -304,6 +304,9 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
case OGS_NAS_EPS_TRACKING_AREA_UPDATE_COMPLETE:
|
||||
ogs_info("Tracking area update complete");
|
||||
ogs_info(" IMSI[%s]", mme_ue->imsi_bcd);
|
||||
|
||||
/* Clear GUTI present */
|
||||
mme_ue->guti_present = false;
|
||||
break;
|
||||
|
||||
case OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST:
|
||||
|
@ -462,9 +465,8 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
break;
|
||||
|
||||
case OGS_NAS_EPS_ATTACH_COMPLETE:
|
||||
ogs_warn("[%s] should not send Attach-Complete"
|
||||
" if GUTI is not present in Attach-Accept",
|
||||
mme_ue->imsi_bcd);
|
||||
ogs_error("[%s] Attach complete in INVALID-STATE",
|
||||
mme_ue->imsi_bcd);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -624,7 +626,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
|
|||
break;
|
||||
}
|
||||
case OGS_NAS_EPS_ATTACH_REQUEST:
|
||||
ogs_warn("Attach request[%s]", mme_ue->imsi_bcd);
|
||||
ogs_warn("[%s] Attach request", mme_ue->imsi_bcd);
|
||||
rv = emm_handle_attach_request(
|
||||
mme_ue, &message->emm.attach_request, e->pkbuf);
|
||||
if (rv != OGS_OK) {
|
||||
|
@ -759,12 +761,12 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
|
|||
ogs_kdf_nh_enb(mme_ue->kasme, mme_ue->kenb, mme_ue->nh);
|
||||
mme_ue->nhcc = 1;
|
||||
|
||||
/* Create New GUTI */
|
||||
mme_ue_new_guti(mme_ue);
|
||||
|
||||
mme_s6a_send_ulr(mme_ue);
|
||||
if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) {
|
||||
if (mme_ue->guti_present)
|
||||
OGS_FSM_TRAN(s, &emm_state_initial_context_setup);
|
||||
else
|
||||
OGS_FSM_TRAN(s, &emm_state_registered);
|
||||
OGS_FSM_TRAN(s, &emm_state_initial_context_setup);
|
||||
} else if (mme_ue->nas_eps.type ==
|
||||
MME_EPS_TYPE_SERVICE_REQUEST ||
|
||||
mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) {
|
||||
|
@ -781,7 +783,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
|
|||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
case OGS_NAS_EPS_ATTACH_REQUEST:
|
||||
ogs_warn("Attach request[%s]", mme_ue->imsi_bcd);
|
||||
ogs_warn("[%s] Attach request", mme_ue->imsi_bcd);
|
||||
rv = emm_handle_attach_request(
|
||||
mme_ue, &message->emm.attach_request, e->pkbuf);
|
||||
if (rv != OGS_OK) {
|
||||
|
@ -877,6 +879,15 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
|
|||
message = e->nas_message;
|
||||
ogs_assert(message);
|
||||
|
||||
if (message->emm.h.security_header_type
|
||||
== OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) {
|
||||
ogs_debug("Service request");
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (message->emm.h.message_type) {
|
||||
case OGS_NAS_EPS_ATTACH_COMPLETE:
|
||||
ogs_info("Attach complete");
|
||||
|
@ -909,13 +920,17 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
|
|||
OGS_FSM_TRAN(s, emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Clear GUTI present */
|
||||
mme_ue->guti_present = false;
|
||||
|
||||
if (MME_P_TMSI_IS_AVAILABLE(mme_ue))
|
||||
sgsap_send_tmsi_reallocation_complete(mme_ue);
|
||||
|
||||
OGS_FSM_TRAN(s, &emm_state_registered);
|
||||
break;
|
||||
case OGS_NAS_EPS_ATTACH_REQUEST:
|
||||
ogs_warn("Attach request[%s]", mme_ue->imsi_bcd);
|
||||
ogs_warn("[%s] Attach request", mme_ue->imsi_bcd);
|
||||
rv = emm_handle_attach_request(
|
||||
mme_ue, &message->emm.attach_request, e->pkbuf);
|
||||
if (rv != OGS_OK) {
|
||||
|
@ -1005,7 +1020,7 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e)
|
|||
|
||||
switch (message->emm.h.message_type) {
|
||||
case OGS_NAS_EPS_ATTACH_REQUEST:
|
||||
ogs_info("Attach request[%s]", mme_ue->imsi_bcd);
|
||||
ogs_warn("[%s] Attach request", mme_ue->imsi_bcd);
|
||||
rv = emm_handle_attach_request(
|
||||
mme_ue, &message->emm.attach_request, e->pkbuf);
|
||||
if (rv != OGS_OK) {
|
||||
|
|
|
@ -2103,7 +2103,7 @@ enb_ue_t *enb_ue_cycle(enb_ue_t *enb_ue)
|
|||
return ogs_pool_cycle(&enb_ue_pool, enb_ue);
|
||||
}
|
||||
|
||||
static int mme_ue_new_guti(mme_ue_t *mme_ue)
|
||||
void mme_ue_new_guti(mme_ue_t *mme_ue)
|
||||
{
|
||||
served_gummei_t *served_gummei = NULL;
|
||||
|
||||
|
@ -2137,7 +2137,7 @@ static int mme_ue_new_guti(mme_ue_t *mme_ue)
|
|||
ogs_hash_set(self.guti_ue_hash,
|
||||
&mme_ue->guti, sizeof(ogs_nas_eps_guti_t), mme_ue);
|
||||
|
||||
return OGS_OK;
|
||||
mme_ue->guti_present = true;
|
||||
}
|
||||
|
||||
static bool compare_ue_info(mme_sgw_t *node, enb_ue_t *enb_ue)
|
||||
|
@ -2199,9 +2199,6 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue)
|
|||
ogs_assert(mme_ue->mme_s11_teid > 0 &&
|
||||
mme_ue->mme_s11_teid <= ogs_app()->max.ue);
|
||||
|
||||
/* Create New GUTI */
|
||||
mme_ue_new_guti(mme_ue);
|
||||
|
||||
/*
|
||||
* When used for the first time, if last node is set,
|
||||
* the search is performed from the first SGW in a round-robin manner.
|
||||
|
@ -2532,8 +2529,6 @@ int mme_ue_set_imsi(mme_ue_t *mme_ue, char *imsi_bcd)
|
|||
|
||||
ogs_hash_set(self.imsi_ue_hash, mme_ue->imsi, mme_ue->imsi_len, mme_ue);
|
||||
|
||||
mme_ue->guti_present = 1;
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -323,7 +323,7 @@ struct mme_ue_s {
|
|||
mme_m_tmsi_t *m_tmsi;
|
||||
mme_p_tmsi_t p_tmsi;
|
||||
ogs_nas_eps_guti_t guti;
|
||||
int guti_present;
|
||||
bool guti_present;
|
||||
|
||||
uint32_t mme_s11_teid; /* MME-S11-TEID is derived from INDEX */
|
||||
uint32_t sgw_s11_teid; /* SGW-S11-TEID is received from SGW */
|
||||
|
@ -693,6 +693,8 @@ enb_ue_t *enb_ue_find(uint32_t index);
|
|||
enb_ue_t *enb_ue_find_by_mme_ue_s1ap_id(uint32_t mme_ue_s1ap_id);
|
||||
enb_ue_t *enb_ue_cycle(enb_ue_t *enb_ue);
|
||||
|
||||
void mme_ue_new_guti(mme_ue_t *mme_ue);
|
||||
|
||||
mme_ue_t *mme_ue_add(enb_ue_t *enb_ue);
|
||||
void mme_ue_remove(mme_ue_t *mme_ue);
|
||||
void mme_ue_remove_all(void);
|
||||
|
|
|
@ -118,6 +118,17 @@ static void timeout(ogs_gtp_xact_t *xact, void *data)
|
|||
|
||||
switch (type) {
|
||||
case OGS_GTP_DELETE_SESSION_REQUEST_TYPE:
|
||||
/*
|
||||
* If SESSION_CONTEXT_WILL_DELETED(MME_UE) is not cleared,
|
||||
* The MME cannot send Delete-Session-Request to the SGW-C.
|
||||
* As such, it could be the infinite loop occurred in EMM state machine.
|
||||
*
|
||||
* To prevent this situation,
|
||||
* force clearing SESSION_CONTEXT_WILL_DELETED variable
|
||||
* when MME does not receive Delete-Session-Response message from SGW-C.
|
||||
*/
|
||||
CLEAR_SESSION_CONTEXT(mme_ue);
|
||||
|
||||
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
|
||||
if (enb_ue) {
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -240,6 +240,7 @@ static void test1_func(abts_case *tc, void *data)
|
|||
|
||||
/* Send TAU Request */
|
||||
memset(&test_ue->tau_request_param, 0, sizeof(test_ue->tau_request_param));
|
||||
test_ue->tau_request_param.integrity_protected = 1;
|
||||
test_ue->tau_request_param.ciphered = 1;
|
||||
test_ue->tau_request_param.ue_network_capability = 1;
|
||||
test_ue->tau_request_param.last_visited_registered_tai = 1;
|
||||
|
@ -287,6 +288,7 @@ static void test1_func(abts_case *tc, void *data)
|
|||
|
||||
/* Send TAU Request */
|
||||
memset(&test_ue->tau_request_param, 0, sizeof(test_ue->tau_request_param));
|
||||
test_ue->tau_request_param.integrity_protected = 1;
|
||||
test_ue->tau_request_param.ciphered = 1;
|
||||
test_ue->tau_request_param.ue_network_capability = 1;
|
||||
test_ue->tau_request_param.last_visited_registered_tai = 1;
|
||||
|
@ -529,6 +531,7 @@ static void test2_func(abts_case *tc, void *data)
|
|||
|
||||
/* Send TAU Request */
|
||||
memset(&test_ue->tau_request_param, 0, sizeof(test_ue->tau_request_param));
|
||||
test_ue->tau_request_param.integrity_protected = 1;
|
||||
test_ue->tau_request_param.ciphered = 1;
|
||||
test_ue->tau_request_param.ue_network_capability = 1;
|
||||
test_ue->tau_request_param.last_visited_registered_tai = 1;
|
||||
|
|
|
@ -189,8 +189,8 @@ typedef struct test_tau_request_param_s {
|
|||
struct {
|
||||
ED8(uint8_t additional_update_type:1;,
|
||||
uint8_t device_properties:1;,
|
||||
uint8_t integrity_protected:1;,
|
||||
uint8_t ciphered:1;,
|
||||
uint8_t spare4:1;,
|
||||
uint8_t spare5:1;,
|
||||
uint8_t spare6:1;,
|
||||
uint8_t spare7:1;,
|
||||
|
|
|
@ -422,6 +422,23 @@ ogs_pkbuf_t *testemm_build_attach_complete(
|
|||
return test_nas_eps_security_encode(test_ue, &message);
|
||||
}
|
||||
|
||||
ogs_pkbuf_t *testemm_build_tau_complete(test_ue_t *test_ue)
|
||||
{
|
||||
ogs_nas_eps_message_t message;
|
||||
|
||||
ogs_assert(test_ue);
|
||||
|
||||
memset(&message, 0, sizeof(message));
|
||||
message.h.security_header_type =
|
||||
OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
|
||||
message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM;
|
||||
|
||||
message.emm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM;
|
||||
message.emm.h.message_type = OGS_NAS_EPS_TRACKING_AREA_UPDATE_COMPLETE;
|
||||
|
||||
return test_nas_eps_security_encode(test_ue, &message);
|
||||
}
|
||||
|
||||
ogs_pkbuf_t *testemm_build_detach_request(test_ue_t *test_ue, bool switch_off)
|
||||
{
|
||||
ogs_nas_eps_message_t message;
|
||||
|
@ -556,12 +573,14 @@ ogs_pkbuf_t *testemm_build_tau_request(
|
|||
ogs_assert(test_ue);
|
||||
|
||||
memset(&message, 0, sizeof(message));
|
||||
if (test_ue->tau_request_param.ciphered) {
|
||||
message.h.security_header_type =
|
||||
OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
|
||||
} else {
|
||||
message.h.security_header_type =
|
||||
OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED;
|
||||
if (test_ue->tau_request_param.integrity_protected) {
|
||||
if (test_ue->tau_request_param.ciphered) {
|
||||
message.h.security_header_type =
|
||||
OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
|
||||
} else {
|
||||
message.h.security_header_type =
|
||||
OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED;
|
||||
}
|
||||
}
|
||||
message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM;
|
||||
|
||||
|
@ -736,7 +755,10 @@ ogs_pkbuf_t *testemm_build_tau_request(
|
|||
OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_DEVICE_PROPERTIES_PRESENT;
|
||||
}
|
||||
|
||||
return test_nas_eps_security_encode(test_ue, &message);
|
||||
if (test_ue->tau_request_param.integrity_protected)
|
||||
return test_nas_eps_security_encode(test_ue, &message);
|
||||
else
|
||||
return ogs_nas_eps_plain_encode(&message);
|
||||
}
|
||||
|
||||
ogs_pkbuf_t *testemm_build_emm_status(
|
||||
|
|
|
@ -33,6 +33,7 @@ ogs_pkbuf_t *testemm_build_authentication_failure(
|
|||
ogs_pkbuf_t *testemm_build_security_mode_complete(test_ue_t *test_ue);
|
||||
ogs_pkbuf_t *testemm_build_attach_complete(
|
||||
test_ue_t *test_ue, ogs_pkbuf_t *esmbuf);
|
||||
ogs_pkbuf_t *testemm_build_tau_complete(test_ue_t *test_ue);
|
||||
|
||||
ogs_pkbuf_t *testemm_build_detach_request(test_ue_t *test_ue, bool switch_off);
|
||||
|
||||
|
|
|
@ -108,3 +108,23 @@ void testemm_handle_attach_accept(test_ue_t *test_ue,
|
|||
|
||||
testemm_send_to_esm(test_ue, &attach_accept->esm_message_container);
|
||||
}
|
||||
|
||||
void testemm_handle_tau_accept(test_ue_t *test_ue,
|
||||
ogs_nas_eps_tracking_area_update_accept_t *tau_accept)
|
||||
{
|
||||
ogs_nas_eps_mobile_identity_t *guti = NULL;
|
||||
|
||||
ogs_assert(test_ue);
|
||||
ogs_assert(tau_accept);
|
||||
|
||||
guti = &tau_accept->guti;
|
||||
|
||||
if (tau_accept->presencemask &
|
||||
OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_GUTI_PRESENT) {
|
||||
memcpy(&test_ue->nas_eps_guti.nas_plmn_id,
|
||||
&guti->guti.nas_plmn_id, OGS_PLMN_ID_LEN);
|
||||
test_ue->nas_eps_guti.mme_gid = guti->guti.mme_gid;
|
||||
test_ue->nas_eps_guti.mme_code = guti->guti.mme_code;
|
||||
test_ue->nas_eps_guti.m_tmsi = guti->guti.m_tmsi;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,6 +32,8 @@ void testemm_handle_security_mode_command(test_ue_t *test_ue,
|
|||
ogs_nas_eps_security_mode_command_t *security_mode_command);
|
||||
void testemm_handle_attach_accept(test_ue_t *test_ue,
|
||||
ogs_nas_eps_attach_accept_t *attach_accept);
|
||||
void testemm_handle_tau_accept(test_ue_t *test_ue,
|
||||
ogs_nas_eps_tracking_area_update_accept_t *tau_accept);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -156,6 +156,8 @@ void testemm_recv(test_ue_t *test_ue, ogs_pkbuf_t *pkbuf)
|
|||
case OGS_NAS_EPS_SERVICE_REJECT:
|
||||
break;
|
||||
case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT:
|
||||
testemm_handle_tau_accept(test_ue,
|
||||
&message.emm.tracking_area_update_accept);
|
||||
break;
|
||||
case OGS_NAS_EPS_EMM_INFORMATION:
|
||||
break;
|
||||
|
|
|
@ -363,6 +363,8 @@ static void test1_func(abts_case *tc, void *data)
|
|||
|
||||
/* Send TAU Request */
|
||||
memset(&test_ue->tau_request_param, 0, sizeof(test_ue->tau_request_param));
|
||||
test_ue->tau_request_param.integrity_protected = 1;
|
||||
test_ue->tau_request_param.ciphered = 1;
|
||||
test_ue->tau_request_param.ue_network_capability = 1;
|
||||
test_ue->tau_request_param.last_visited_registered_tai = 1;
|
||||
test_ue->tau_request_param.drx_parameter = 1;
|
||||
|
|
|
@ -373,9 +373,18 @@ static void test2_func(abts_case *tc, void *data)
|
|||
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||
|
||||
/* GUTI Not Present
|
||||
* SKIP Send Registration complete */
|
||||
/* SKIP Receive Configuration update command */
|
||||
/* Send Registration complete */
|
||||
gmmbuf = testgmm_build_registration_complete(test_ue);
|
||||
ABTS_PTR_NOTNULL(tc, gmmbuf);
|
||||
sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf);
|
||||
ABTS_PTR_NOTNULL(tc, sendbuf);
|
||||
rv = testgnb_ngap_send(ngap, sendbuf);
|
||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||
|
||||
/* Receive Configuration update command */
|
||||
recvbuf = testgnb_ngap_read(ngap);
|
||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||
testngap_recv(test_ue, recvbuf);
|
||||
|
||||
/* Send PDU session establishment request */
|
||||
sess = test_sess_add_by_dnn_and_psi(test_ue, "internet", 5);
|
||||
|
|
Loading…
Reference in New Issue