mirror of
				https://github.com/nextepc/nextepc-oss.git
				synced 2025-10-30 19:43:29 +00:00 
			
		
		
		
	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:
		| @@ -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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user