Follow-up on #1991

This commit is contained in:
Sukchan Lee 2023-01-14 09:20:52 +09:00
parent 3fd7ecc9a2
commit 01a7b3c9b8
9 changed files with 35 additions and 46 deletions

View File

@ -96,16 +96,15 @@ typedef struct ogs_gtp_xact_s {
#define OGS_GTP_MODIFY_QOS_UPDATE ((uint64_t)1<<1)
uint64_t update_flags;
#define OGS_GTP_DELETE_NO_ACTION 1
#define OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST 2
#define OGS_GTP_DELETE_SEND_DETACH_ACCEPT 3
#define OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST 4
#define OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE 5
#define OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_PURGE_AND_REMOVE 6
#define OGS_GTP_DELETE_SEND_RELEASE_WITH_S1_REMOVE_AND_UNLINK 7
#define OGS_GTP_DELETE_HANDLE_PDN_CONNECTIVITY_REQUEST 8
#define OGS_GTP_DELETE_UE_CONTEXT_REMOVE_PARTIAL 9
#define OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST 10
#define OGS_GTP_DELETE_NO_ACTION 1
#define OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST 2
#define OGS_GTP_DELETE_SEND_DETACH_ACCEPT 3
#define OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST 4
#define OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE 5
#define OGS_GTP_DELETE_SEND_RELEASE_WITH_S1_REMOVE_AND_UNLINK 6
#define OGS_GTP_DELETE_HANDLE_PDN_CONNECTIVITY_REQUEST 7
#define OGS_GTP_DELETE_UE_CONTEXT_REMOVE_PARTIAL 8
#define OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST 9
int delete_action;

View File

@ -145,7 +145,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE, 0));
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
OGS_FSM_TRAN(s, &esm_state_exception);
break;
}
@ -160,7 +160,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE, 0));
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
OGS_FSM_TRAN(s, &esm_state_exception);
break;
}

View File

@ -262,11 +262,10 @@ struct enb_ue_s {
#define S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE 1
#define S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK 2
#define S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE 3
#define S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE 4
#define S1AP_UE_CTX_REL_S1_HANDOVER_COMPLETE 5
#define S1AP_UE_CTX_REL_S1_HANDOVER_CANCEL 6
#define S1AP_UE_CTX_REL_S1_HANDOVER_FAILURE 7
#define S1AP_UE_CTX_REL_S1_PAGING 8
#define S1AP_UE_CTX_REL_S1_HANDOVER_COMPLETE 4
#define S1AP_UE_CTX_REL_S1_HANDOVER_CANCEL 5
#define S1AP_UE_CTX_REL_S1_HANDOVER_FAILURE 6
#define S1AP_UE_CTX_REL_S1_PAGING 7
uint8_t ue_ctx_rel_action;
bool part_of_s1_reset_requested;
@ -397,6 +396,8 @@ struct mme_ue_s {
int security_context_available;
int mac_failed;
bool update_location_answer_received;
/* Security Context */
ogs_nas_ue_network_capability_t ue_network_capability;
ogs_nas_ms_network_capability_t ms_network_capability;

View File

@ -134,7 +134,7 @@ static void timeout(ogs_gtp_xact_t *xact, void *data)
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE, 0));
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
} else {
ogs_warn("No S1 Context");
}

View File

@ -98,7 +98,7 @@ void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue)
if (SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
mme_gtp_send_delete_all_sessions(mme_ue,
OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_PURGE_AND_REMOVE);
OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE);
} else {
enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (enb_ue) {

View File

@ -623,8 +623,12 @@ 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)) {
mme_ue_hash_remove(mme_ue);
mme_ue_remove(mme_ue);
if (mme_ue->update_location_answer_received == true) {
mme_s6a_send_pur(mme_ue);
} else {
mme_ue_hash_remove(mme_ue);
mme_ue_remove(mme_ue);
}
} else {
ogs_assert(mme_ue->enb_ue);
ogs_assert(OGS_OK ==
@ -634,20 +638,6 @@ void mme_s11_handle_delete_session_response(
}
}
} else if (action ==
OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_PURGE_AND_REMOVE) {
if (mme_sess_count(mme_ue) == 1) /* Last Session */ {
if (ECM_IDLE(mme_ue)) {
mme_s6a_send_pur(mme_ue);
} else {
ogs_assert(mme_ue->enb_ue);
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE, 0));
}
}
} else if (action ==
OGS_GTP_DELETE_SEND_RELEASE_WITH_S1_REMOVE_AND_UNLINK) {
if (mme_sess_count(mme_ue) == 1) /* Last Session */ {

View File

@ -436,8 +436,10 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE, 0));
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
}
mme_ue->update_location_answer_received = true;
break;
case OGS_DIAM_S6A_CMD_CODE_PURGE_UE:
mme_s6a_handle_pua(mme_ue, s6a_message);

View File

@ -346,7 +346,7 @@ int nas_eps_send_pdn_connectivity_reject(
ogs_assert(OGS_OK ==
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE, 0));
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
}
} else {
esmbuf = esm_build_pdn_connectivity_reject(

View File

@ -1485,15 +1485,12 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue)
enb_ue_remove(enb_ue);
ogs_expect_or_return(mme_ue);
mme_ue_hash_remove(mme_ue);
mme_ue_remove(mme_ue);
break;
case S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE:
ogs_debug(" Action: UE context remove");
enb_ue_remove(enb_ue);
ogs_expect_or_return(mme_ue);
mme_s6a_send_pur(mme_ue);
if (mme_ue->update_location_answer_received == true) {
mme_s6a_send_pur(mme_ue);
} else {
mme_ue_hash_remove(mme_ue);
mme_ue_remove(mme_ue);
}
break;
case S1AP_UE_CTX_REL_S1_HANDOVER_COMPLETE:
ogs_debug(" Action: S1 handover complete");