From 7e8f145973f95f548e5a2404d68dcce63beee85a Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Sat, 3 Feb 2024 16:18:26 +0900 Subject: [PATCH] Rollback Pull Request (#1911) Problems with Purge-UE-Request/Answer can occur in the following situations 1. Attach Request 2. Authentication request 3. Authentication reject 4. UEContextReleaseCommand 5. UEContextReleaseComplete 6. Purge-UE-Request 7. Attach Request 8. Purge-UE-Answer 9. (UE Context Remove) To resolve this issue, we have changed to delete the UE-Context via mme_ue_remove() immediately upon receiving UEContextReleaseComplete() without calling mme_s6a_send_pur(). --- src/mme/mme-context.h | 2 - src/mme/mme-path.c | 8 +--- src/mme/mme-s11-handler.c | 8 +--- src/mme/mme-sm.c | 3 -- src/mme/s1ap-handler.c | 12 ++---- tests/attach/auth-test.c | 81 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 89 insertions(+), 25 deletions(-) diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 566c57382..11606364d 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -474,8 +474,6 @@ struct mme_ue_s { int security_context_available; int mac_failed; - bool location_updated_but_not_canceled_yet; - /* Security Context */ ogs_nas_ue_network_capability_t ue_network_capability; ogs_nas_ms_network_capability_t ms_network_capability; diff --git a/src/mme/mme-path.c b/src/mme/mme-path.c index 420ec8b67..5e84400ce 100644 --- a/src/mme/mme-path.c +++ b/src/mme/mme-path.c @@ -83,12 +83,8 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue) S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0)); } else { - if (mme_ue->location_updated_but_not_canceled_yet == true) { - mme_s6a_send_pur(mme_ue); - } else { - MME_UE_CHECK(OGS_LOG_WARN, mme_ue); - mme_ue_remove(mme_ue); - } + MME_UE_CHECK(OGS_LOG_WARN, mme_ue); + mme_ue_remove(mme_ue); } } break; diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 306056eda..7e50f2df5 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -704,12 +704,8 @@ void mme_s11_handle_delete_session_response( } else if (action == OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE) { if (mme_sess_count(mme_ue) == 1) /* Last Session */ { if (ECM_IDLE(mme_ue)) { - if (mme_ue->location_updated_but_not_canceled_yet == true) { - mme_s6a_send_pur(mme_ue); - } else { - MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); - mme_ue_remove(mme_ue); - } + MME_UE_CHECK(OGS_LOG_ERROR, mme_ue); + mme_ue_remove(mme_ue); } else { ogs_assert(mme_ue->enb_ue); r = s1ap_send_ue_context_release_command(mme_ue->enb_ue, diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index 637e92e3d..c954008bf 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -612,8 +612,6 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } - - mme_ue->location_updated_but_not_canceled_yet = true; break; case OGS_DIAM_S6A_CMD_CODE_PURGE_UE: ogs_debug("OGS_DIAM_S6A_CMD_CODE_PURGE_UE"); @@ -621,7 +619,6 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) break; case OGS_DIAM_S6A_CMD_CODE_CANCEL_LOCATION: ogs_debug("OGS_DIAM_S6A_CMD_CODE_CANCEL_LOCATION"); - mme_ue->location_updated_but_not_canceled_yet = false; mme_s6a_handle_clr(mme_ue, s6a_message); break; case OGS_DIAM_S6A_CMD_CODE_INSERT_SUBSCRIBER_DATA: diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index 367f241b5..c5cc7ef08 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -1846,11 +1846,11 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) return; } - mme_ue = enb_ue->mme_ue; - ogs_info("UE Context Release [Action:%d]", enb_ue->ue_ctx_rel_action); ogs_info(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); + + mme_ue = mme_ue_cycle(enb_ue->mme_ue); if (mme_ue) { ogs_info(" IMSI[%s]", mme_ue->imsi_bcd); @@ -1946,12 +1946,8 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) return; } - if (mme_ue->location_updated_but_not_canceled_yet == true) { - mme_s6a_send_pur(mme_ue); - } else { - MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); - mme_ue_remove(mme_ue); - } + MME_UE_CHECK(OGS_LOG_DEBUG, mme_ue); + mme_ue_remove(mme_ue); break; case S1AP_UE_CTX_REL_S1_HANDOVER_COMPLETE: ogs_debug(" Action: S1 handover complete"); diff --git a/tests/attach/auth-test.c b/tests/attach/auth-test.c index 04b4225e2..9ba162d5d 100644 --- a/tests/attach/auth-test.c +++ b/tests/attach/auth-test.c @@ -410,6 +410,87 @@ static void test1_func(abts_case *tc, void *data) rv = testenb_s1ap_send(s1ap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* + * --- Immediately Re-attach Test --- + * + * Problems with Purge-UE-Request/Answer can occur + * in the following situations + * + * 1. Attach Request + * 2. Authentication request + * 3. Authentication reject + * 4. UEContextReleaseCommand + * 5. UEContextReleaseComplete + * 6. Purge-UE-Request + * 7. Attach Request + * 8. Purge-UE-Answer + * 9. (UE Context Remove) + * + * To resolve this issue, we have changed to delete the UE-Context + * via mme_ue_remove() immediately upon receiving UEContextReleaseComplete() + * without calling mme_s6a_send_pur(). + * + * The test below was created to indicate that mme_s6a_send_pur() + * should be added in the future to take this into account. + */ + + /* Send Attach Request */ + memset(&sess->pdn_connectivity_param, + 0, sizeof(sess->pdn_connectivity_param)); + sess->pdn_connectivity_param.eit = 1; + sess->pdn_connectivity_param.pco = 1; + sess->pdn_connectivity_param.request_type = + OGS_NAS_EPS_REQUEST_TYPE_INITIAL; + esmbuf = testesm_build_pdn_connectivity_request(sess, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + + memset(&test_ue->attach_request_param, + 0, sizeof(test_ue->attach_request_param)); + test_ue->attach_request_param.drx_parameter = 1; + test_ue->attach_request_param.tmsi_status = 1; + test_ue->attach_request_param.mobile_station_classmark_2 = 1; + test_ue->attach_request_param.additional_update_type = 1; + test_ue->attach_request_param.ue_usage_setting = 1; + emmbuf = testemm_build_attach_request(test_ue, esmbuf, false, false); + ABTS_PTR_NOTNULL(tc, emmbuf); + + memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param)); + sendbuf = test_s1ap_build_initial_ue_message( + test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send Authentication failure - MAC failure */ + emmbuf = testemm_build_authentication_failure( + test_ue, OGS_NAS_EMM_CAUSE_MAC_FAILURE, 0); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Authentication reject */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Receive UE Context Release Command */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Complete */ + sendbuf = test_s1ap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + ogs_msleep(300); /********** Remove Subscriber in Database */