[#203] Now UE context is always single

This commit is contained in:
Sukchan Lee 2019-11-06 10:43:21 +09:00
parent 3743ef98a2
commit f2e34dd7ff
5 changed files with 45 additions and 43 deletions

View File

@ -2467,6 +2467,7 @@ int mme_ue_set_imsi(mme_ue_t *mme_ue, char *imsi_bcd)
/* Check if OLD mme_ue_t is different with NEW mme_ue_t */
if (ogs_pool_index(&mme_ue_pool, mme_ue) !=
ogs_pool_index(&mme_ue_pool, old_mme_ue)) {
ogs_warn("OLD UE Context Release [IMSI:%s]", mme_ue->imsi_bcd);
if (old_mme_ue->enb_ue)
enb_ue_deassociate(old_mme_ue->enb_ue);
mme_ue_remove(old_mme_ue);

View File

@ -581,32 +581,26 @@ void s1ap_handle_initial_context_setup_failure(
mme_ue = enb_ue->mme_ue;
if (!mme_ue) {
ogs_debug(" S1 Context Not Associated");
ogs_debug(" S1 Context Release");
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");
/*
* 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);
}
ogs_debug(" UE Context Release [IMSI:%s]", mme_ue->imsi_bcd);
/*
* 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.
*/
rv = mme_send_delete_session_or_ue_context_release(mme_ue, enb_ue);
ogs_assert(rv == OGS_OK);
CLEAR_SERVICE_INDICATOR(mme_ue);
}

View File

@ -943,12 +943,15 @@ pgw_sess_t *pgw_sess_add_by_message(ogs_gtp_message_t *message)
* collides with a dedicated bearer of an existing PDN connection context.
*/
sess = pgw_sess_find_by_imsi_apn(req->imsi.data, req->imsi.len, apn);
if (!sess) {
sess = pgw_sess_add(req->imsi.data, req->imsi.len, apn,
req->pdn_type.u8,
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
ogs_assert(sess);
if (sess) {
ogs_warn("OLD Session Release [IMSI:%s,APN:%s]",
sess->imsi_bcd, sess->pdn.apn);
pgw_sess_remove(sess);
}
sess = pgw_sess_add(req->imsi.data, req->imsi.len, apn,
req->pdn_type.u8,
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
ogs_assert(sess);
return sess;
}

View File

@ -461,10 +461,12 @@ sgw_ue_t *sgw_ue_add_by_message(ogs_gtp_message_t *message)
* the message is received with a TEID not set to zero in the header.
*/
sgw_ue = sgw_ue_find_by_imsi(req->imsi.data, req->imsi.len);
if (!sgw_ue) {
sgw_ue = sgw_ue_add(req->imsi.data, req->imsi.len);
ogs_assert(sgw_ue);
if (sgw_ue) {
ogs_warn("OLD UE Context Release [IMSI:%s]", sgw_ue->imsi_bcd);
sgw_ue_remove(sgw_ue);
}
sgw_ue = sgw_ue_add(req->imsi.data, req->imsi.len);
ogs_assert(sgw_ue);
return sgw_ue;
}

View File

@ -41,6 +41,8 @@ void sgw_s11_handle_create_session_request(ogs_gtp_xact_t *s11_xact,
sgw_bearer_t *bearer = NULL;
sgw_tunnel_t *s5u_tunnel = NULL;
char apn[OGS_MAX_APN_LEN];
ogs_assert(s11_xact);
ogs_assert(gtp_message);
@ -59,22 +61,23 @@ void sgw_s11_handle_create_session_request(ogs_gtp_xact_t *s11_xact,
ogs_assert(sgw_ue);
sess = sgw_sess_find_by_ebi(sgw_ue,
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
if (!sess) {
char apn[OGS_MAX_APN_LEN];
if (req->access_point_name.presence == 0)
{
ogs_error("No APN");
return;
}
ogs_fqdn_parse(apn,
req->access_point_name.data, req->access_point_name.len);
sess = sgw_sess_add(sgw_ue, apn,
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
ogs_assert(sess);
if (sess) {
ogs_warn("OLD Session Release [IMSI:%s,APN:%s]",
sgw_ue->imsi_bcd, sess->pdn.apn);
sgw_sess_remove(sess);
}
if (req->access_point_name.presence == 0) {
ogs_error("No APN");
return;
}
ogs_fqdn_parse(apn,
req->access_point_name.data, req->access_point_name.len);
sess = sgw_sess_add(sgw_ue, apn,
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
ogs_assert(sess);
if (req->sender_f_teid_for_control_plane.presence == 0) {
ogs_error("No Sender F-TEID");
return;
@ -88,7 +91,6 @@ void sgw_s11_handle_create_session_request(ogs_gtp_xact_t *s11_xact,
return;
}
ogs_assert(sess);
bearer = sgw_default_bearer_in_sess(sess);
ogs_assert(bearer);
s5u_tunnel = sgw_s5u_tunnel_in_bearer(bearer);