Fix the bug #619

When missing Activate default EPS bearer context accept
between UE and eNB, MME's exception handler has a bug.

So I've fixed it!
This commit is contained in:
Sukchan Lee 2020-10-23 13:48:39 -04:00
parent 15e42bc4a9
commit aa81bb2c89
4 changed files with 103 additions and 13 deletions

View File

@ -89,6 +89,18 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
break;
}
break;
case OGS_NAS_EPS_PDN_DISCONNECT_REQUEST:
ogs_fatal("PDN disconnect request");
ogs_fatal(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
if (MME_HAVE_SGW_S1U_PATH(sess)) {
mme_gtp_send_delete_session_request(sess,
OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST);
} else {
nas_eps_send_deactivate_bearer_context_request(bearer);
}
OGS_FSM_TRAN(s, esm_state_pdn_will_disconnect);
break;
case OGS_NAS_EPS_ESM_INFORMATION_RESPONSE:
ogs_debug("ESM information response");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
@ -130,8 +142,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
OGS_FSM_TRAN(s, esm_state_active);
break;
default:
ogs_error("Unknown message(type:%d)",
message->esm.h.message_type);
ogs_error("Unknown message(type:%d)", message->esm.h.message_type);
break;
}
break;

View File

@ -2775,7 +2775,7 @@ bool mme_sess_in_attach(mme_sess_t *sess)
mme_ue = sess->mme_ue;
ogs_assert(mme_ue);
return ogs_list_first(&mme_ue->sess_list) == sess;
return (ogs_list_count(&mme_ue->sess_list) <= 1);
}
unsigned int mme_sess_count(mme_ue_t *mme_ue)

View File

@ -126,7 +126,7 @@ void mme_s11_handle_create_session_response(
}
if (cause_value != OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_initial_context_setup)) {
if (SESSION_CONTEXT_IN_ATTACH(sess)) {
ogs_error("[%s] Attach reject", mme_ue->imsi_bcd);
nas_eps_send_attach_reject(mme_ue,
EMM_CAUSE_NETWORK_FAILURE, ESM_CAUSE_NETWORK_FAILURE);
@ -384,10 +384,7 @@ void mme_s11_handle_create_bearer_request(
if (mme_ue && cause_value == OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
sess = mme_sess_find_by_ebi(mme_ue, req->linked_eps_bearer_id.u8);
ogs_assert(sess);
bearer = mme_bearer_add(sess);
ogs_assert(bearer);
if (sess) bearer = mme_bearer_add(sess);
}
if (!bearer) {
@ -426,6 +423,7 @@ void mme_s11_handle_create_bearer_request(
mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid);
/* Set PTI */
ogs_assert(bearer);
sess = bearer->sess;
ogs_assert(sess);
sess->pti = OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED;
@ -502,7 +500,6 @@ void mme_s11_handle_update_bearer_request(
if (mme_ue && cause_value == OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
bearer = mme_bearer_find_by_ue_ebi(mme_ue,
req->bearer_contexts.eps_bearer_id.u8);
ogs_expect_or_return(bearer);
}
if (!bearer) {
@ -520,6 +517,7 @@ void mme_s11_handle_update_bearer_request(
mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid);
/* Set PTI */
ogs_assert(bearer);
sess = bearer->sess;
ogs_assert(sess);
sess->pti = OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED;
@ -600,13 +598,19 @@ void mme_s11_handle_delete_bearer_request(
if (mme_ue && req->linked_eps_bearer_id.presence == 1) {
bearer = mme_bearer_find_by_ue_ebi(
mme_ue, req->linked_eps_bearer_id.u8);
ogs_expect_or_return(bearer);
if (!bearer)
ogs_error("Cannot find Bearer [%d]", req->linked_eps_bearer_id.u8);
} else if (mme_ue && req->eps_bearer_ids.presence == 1) {
bearer = mme_bearer_find_by_ue_ebi(
mme_ue, req->eps_bearer_ids.u8);
ogs_expect_or_return(bearer);
if (!bearer)
ogs_error("Cannot find Bearer [%d]", req->eps_bearer_ids.u8);
} else {
ogs_error("No Linked EBI or EPS Bearer ID");
}
if (!bearer) {
ogs_error("No Context");
ogs_gtp_send_error_message(xact, mme_ue ? mme_ue->sgw_s11_teid : 0,
OGS_GTP_DELETE_BEARER_RESPONSE_TYPE,
OGS_GTP_CAUSE_CONTEXT_NOT_FOUND);
@ -619,6 +623,7 @@ void mme_s11_handle_delete_bearer_request(
mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid);
/* Set PTI */
ogs_assert(bearer);
sess = bearer->sess;
ogs_assert(sess);
sess->pti = OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED;

View File

@ -1868,7 +1868,7 @@ static void test4_func(abts_case *tc, void *data)
/* Send PDN Connectivity Request */
sess = test_sess_add_by_apn(test_ue, "ims");
ogs_assert(sess);
sess->pti = 9;
sess->pti = 7;
sess->pdn_connectivity_param.integrity_protected = 1;
sess->pdn_connectivity_param.ciphered = 1;
@ -1907,6 +1907,80 @@ static void test4_func(abts_case *tc, void *data)
/* DELAY is needed in default EPS bearer */
ogs_msleep(100);
/* Send PDN disconnectivity request */
sess = test_sess_find_by_apn(test_ue, "internet");
sess->pti = 8;
esmbuf = testesm_build_pdn_disconnect_request(sess);
ABTS_PTR_NOTNULL(tc, esmbuf);
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testenb_s1ap_send(s1ap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive E-RAB Release Command +
* Deactivate EPS bearer context request */
recvbuf = testenb_s1ap_read(s1ap);
ABTS_PTR_NOTNULL(tc, recvbuf);
tests1ap_recv(test_ue, recvbuf);
/* Send E-RAB Release Response */
bearer = test_bearer_find_by_ue_ebi(test_ue, 5);
ogs_assert(bearer);
sendbuf = test_s1ap_build_e_rab_release_response(bearer);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testenb_s1ap_send(s1ap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Send Deactivate EPS bearer context accept */
esmbuf = testesm_build_deactivate_eps_bearer_context_accept(bearer);
ABTS_PTR_NOTNULL(tc, esmbuf);
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testenb_s1ap_send(s1ap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Send PDN Connectivity Request */
sess = test_sess_add_by_apn(test_ue, "internet");
ogs_assert(sess);
sess->pti = 9;
sess->pdn_connectivity_param.integrity_protected = 1;
sess->pdn_connectivity_param.ciphered = 1;
sess->pdn_connectivity_param.apn = 1;
sess->pdn_connectivity_param.pco = 1;
esmbuf = testesm_build_pdn_connectivity_request(sess);
ABTS_PTR_NOTNULL(tc, esmbuf);
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testenb_s1ap_send(s1ap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive E-RAB Setup Request +
* Activate default EPS bearer context request */
recvbuf = testenb_s1ap_read(s1ap);
ABTS_PTR_NOTNULL(tc, recvbuf);
tests1ap_recv(test_ue, recvbuf);
/* Send E-RAB Setup Response */
bearer = test_bearer_find_by_ue_ebi(test_ue, 7);
ogs_assert(bearer);
sendbuf = test_s1ap_build_e_rab_setup_response(bearer);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testenb_s1ap_send(s1ap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Send Activate default EPS bearer context accept */
esmbuf = testesm_build_activate_default_eps_bearer_context_accept(
bearer, true);
ABTS_PTR_NOTNULL(tc, esmbuf);
sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testenb_s1ap_send(s1ap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* DELAY is needed in default EPS bearer */
ogs_msleep(100);
/* Send AA-Request */
sess = test_sess_find_by_apn(test_ue, "ims");
ogs_assert(sess);
@ -1920,7 +1994,7 @@ static void test4_func(abts_case *tc, void *data)
tests1ap_recv(test_ue, recvbuf);
/* Send E-RAB Setup Response */
bearer = test_bearer_find_by_ue_ebi(test_ue, 7);
bearer = test_bearer_find_by_ue_ebi(test_ue, 8);
ogs_assert(bearer);
sendbuf = test_s1ap_build_e_rab_setup_response(bearer);
ABTS_PTR_NOTNULL(tc, sendbuf);