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:
Sukchan Lee 2021-03-09 14:28:07 +09:00
parent 56c0987ad2
commit fc5c9b2af0
20 changed files with 1313 additions and 118 deletions

View File

@ -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)

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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;
}

View File

@ -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) {

View File

@ -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;
}

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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;,

View File

@ -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(

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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
}

View File

@ -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;

View File

@ -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;

View File

@ -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);