forked from acouzens/open5gs
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:
parent
d1d3ec6fcb
commit
7e8f145973
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue