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:
parent
15e42bc4a9
commit
aa81bb2c89
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue