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().
This commit is contained in:
Sukchan Lee 2024-02-03 16:18:26 +09:00
parent d1d3ec6fcb
commit 7e8f145973
6 changed files with 89 additions and 25 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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