forked from acouzens/open5gs
Follow-up on #1991
This commit is contained in:
parent
3fd7ecc9a2
commit
01a7b3c9b8
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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 */ {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue