[#203] MME also maintains one session context like SGW/PGW

This commit is contained in:
Sukchan Lee 2019-11-05 23:15:57 +09:00
parent 6f44ff5f4d
commit 4b8e2a5c97
2 changed files with 38 additions and 22 deletions

View File

@ -2455,11 +2455,19 @@ mme_ue_t *mme_ue_find_by_message(ogs_nas_message_t *message)
int mme_ue_set_imsi(mme_ue_t *mme_ue, char *imsi_bcd)
{
mme_ue_t *old_mme_ue = NULL;
ogs_assert(mme_ue && imsi_bcd);
ogs_cpystrn(mme_ue->imsi_bcd, imsi_bcd, OGS_MAX_IMSI_BCD_LEN+1);
ogs_bcd_to_buffer(mme_ue->imsi_bcd, mme_ue->imsi, &mme_ue->imsi_len);
old_mme_ue = mme_ue_find_by_imsi(mme_ue->imsi, mme_ue->imsi_len);
if (old_mme_ue) {
if (old_mme_ue->enb_ue)
enb_ue_deassociate(old_mme_ue->enb_ue);
mme_ue_remove(old_mme_ue);
}
ogs_hash_set(self.imsi_ue_hash, mme_ue->imsi, mme_ue->imsi_len, mme_ue);
mme_ue->guti_present = 1;

View File

@ -570,38 +570,46 @@ void s1ap_handle_initial_context_setup_failure(
if (enb_ue == NULL) {
ogs_warn("Initial context setup failure : "
"cannot find eNB-UE-S1AP-ID[%d]", (int)*ENB_UE_S1AP_ID);
goto cleanup;
return;
}
mme_ue = enb_ue->mme_ue;
ogs_debug(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
ogs_debug(" Cause[Group:%d Cause:%d]",
Cause->present, (int)Cause->choice.radioNetwork);
ogs_assert(mme_ue);
if (mme_ue && OGS_FSM_CHECK(&mme_ue->sm, emm_state_registered)) {
ogs_debug(" EMM-Registered");
mme_ue = enb_ue->mme_ue;
/*
* 19.2.2.3 in Spec 36.300
*
* In case of failure, eNB and MME behaviours are not mandated.
*
* Both implicit release (local release at each node) and
* explicit release (MME-initiated UE Context Release procedure)
* may in principle be adopted. The eNB should ensure
* that no hanging resources remain at the eNB.
*/
} else {
ogs_debug(" NOT EMM-Registered");
ogs_assert(mme_ue);
rv = mme_send_delete_session_or_ue_context_release(mme_ue, enb_ue);
if (!mme_ue) {
ogs_debug(" S1 Context Not Associated");
CLEAR_ENB_UE_TIMER(enb_ue->t_ue_context_release);
rv = s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_NO_ACTION, 0);
ogs_assert(rv == OGS_OK);
}
} else {
if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_registered)) {
ogs_debug(" EMM-Registered");
cleanup:
CLEAR_SERVICE_INDICATOR(mme_ue);
/*
* 19.2.2.3 in Spec 36.300
*
* In case of failure, eNB and MME behaviours are not mandated.
*
* Both implicit release (local release at each node) and
* explicit release (MME-initiated UE Context Release procedure)
* may in principle be adopted. The eNB should ensure
* that no hanging resources remain at the eNB.
*/
} else {
ogs_debug(" NOT EMM-Registered");
ogs_assert(mme_ue);
rv = mme_send_delete_session_or_ue_context_release(mme_ue, enb_ue);
ogs_assert(rv == OGS_OK);
}
CLEAR_SERVICE_INDICATOR(mme_ue);
}
}
void s1ap_handle_ue_context_modification_response(