[MME] Exception handle - APN duplicated (#1431)

This commit is contained in:
Sukchan Lee 2022-03-24 21:52:42 +09:00
parent 2cb06b3085
commit 41553de7a4
5 changed files with 21 additions and 48 deletions

View File

@ -2890,7 +2890,7 @@ mme_bearer_t *mme_bearer_find_by_ue_ebi(mme_ue_t *mme_ue, uint8_t ebi)
}
mme_bearer_t *mme_bearer_find_or_add_by_message(
mme_ue_t *mme_ue, ogs_nas_eps_message_t *message)
mme_ue_t *mme_ue, ogs_nas_eps_message_t *message, bool esm_piggybacked)
{
uint8_t pti = OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED;
uint8_t ebi = OGS_NAS_EPS_BEARER_IDENTITY_UNASSIGNED;
@ -2998,11 +2998,22 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
ogs_nas_eps_pdn_connectivity_request_t *pdn_connectivity_request =
&message->esm.pdn_connectivity_request;
if (pdn_connectivity_request->presencemask &
OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_ACCESS_POINT_NAME_PRESENT)
OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_ACCESS_POINT_NAME_PRESENT) {
sess = mme_sess_find_by_apn(mme_ue,
pdn_connectivity_request->access_point_name.apn);
else
if (sess && esm_piggybacked == false) {
ogs_assert(OGS_OK ==
nas_eps_send_pdn_connectivity_reject(
sess,
ESM_CAUSE_MULTIPLE_PDN_CONNECTIONS_FOR_A_GIVEN_APN_NOT_ALLOWED,
esm_piggybacked));
ogs_warn("APN duplicated [%s]",
pdn_connectivity_request->access_point_name.apn);
return NULL;
}
} else {
sess = mme_sess_first(mme_ue);
}
if (!sess)
sess = mme_sess_add(mme_ue, pti);

View File

@ -796,7 +796,7 @@ void mme_bearer_remove_all(mme_sess_t *sess);
mme_bearer_t *mme_bearer_find_by_sess_ebi(mme_sess_t *sess, uint8_t ebi);
mme_bearer_t *mme_bearer_find_by_ue_ebi(mme_ue_t *mme_ue, uint8_t ebi);
mme_bearer_t *mme_bearer_find_or_add_by_message(
mme_ue_t *mme_ue, ogs_nas_eps_message_t *message);
mme_ue_t *mme_ue, ogs_nas_eps_message_t *message, bool esm_piggybacked);
mme_bearer_t *mme_default_bearer_in_sess(mme_sess_t *sess);
mme_bearer_t *mme_linked_bearer(mme_bearer_t *bearer);
mme_bearer_t *mme_bearer_first(mme_sess_t *sess);

View File

@ -374,9 +374,9 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
break;
}
bearer = mme_bearer_find_or_add_by_message(mme_ue, &nas_message);
bearer = mme_bearer_find_or_add_by_message(
mme_ue, &nas_message, e->esm_piggybacked);
if (!bearer) {
ogs_error("mme_bearer_find_or_add_by_message() failed");
ogs_pkbuf_free(pkbuf);
break;
}

View File

@ -233,20 +233,9 @@ static void issues_1431_func(abts_case *tc, void *data)
ABTS_PTR_NOTNULL(tc, recvbuf);
tests1ap_recv(test_ue, recvbuf);
ABTS_INT_EQUAL(tc,
S1AP_ProcedureCode_id_E_RABSetup,
S1AP_ProcedureCode_id_downlinkNASTransport,
test_ue->s1ap_procedure_code);
/* Send E-RABSetupResponse */
bearer = test_bearer_find_by_ue_ebi(test_ue, 5);
ogs_assert(bearer);
sendbuf = test_s1ap_build_e_rab_failed_setup_response(
bearer,
S1AP_Cause_PR_radioNetwork,
S1AP_CauseRadioNetwork_multiple_E_RAB_ID_instances);
ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testenb_s1ap_send(s1ap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Just Delay */
ogs_msleep(100);

View File

@ -1163,7 +1163,7 @@ static void test3_func(abts_case *tc, void *data)
S1AP_ProcedureCode_id_E_RABRelease,
test_ue->s1ap_procedure_code);
/* Send PDN Connectivity Request */
/* Send PDN connectivity Request */
sess = test_sess_add_by_apn(test_ue, "ims", OGS_GTP_RAT_TYPE_EUTRAN);
ogs_assert(sess);
sess->pti = 39;
@ -1179,41 +1179,14 @@ static void test3_func(abts_case *tc, void *data)
rv = testenb_s1ap_send(s1ap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive E-RABSetupRequest +
* Activate default EPS bearer context request */
/* Receive PDN connectivity reject */
recvbuf = testenb_s1ap_read(s1ap);
ABTS_PTR_NOTNULL(tc, recvbuf);
tests1ap_recv(test_ue, recvbuf);
ABTS_INT_EQUAL(tc,
S1AP_ProcedureCode_id_E_RABSetup,
S1AP_ProcedureCode_id_downlinkNASTransport,
test_ue->s1ap_procedure_code);
/* Send E-RABSetupResponse */
bearer = test_bearer_find_by_ue_ebi(test_ue, 6);
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);
/* Send GTP-U ICMP Packet */
rv = test_gtpu_send_ping(gtpu, bearer, TEST_PING_IPV4);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Receive GTP-U ICMP Packet */
recvbuf = test_gtpu_read(gtpu);
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
/* Send Detach Request */
emmbuf = testemm_build_detach_request(test_ue, 1, true, false);
ABTS_PTR_NOTNULL(tc, emmbuf);