add PDN connectivity reject

This commit is contained in:
Sukchan Lee 2017-09-08 18:50:27 +09:00
parent 4b5d6ba01b
commit 97da327a61
7 changed files with 92 additions and 22 deletions

View File

@ -9,21 +9,41 @@
#include "esm_build.h"
status_t esm_build_pdn_connectivity_reject(
pkbuf_t **pkbuf, c_uint8_t pti, nas_esm_cause_t esm_cause)
pkbuf_t **pkbuf, mme_sess_t *sess, nas_esm_cause_t esm_cause)
{
mme_ue_t *mme_ue = NULL;
nas_message_t message;
nas_pdn_connectivity_reject_t *pdn_connectivity_reject =
&message.esm.pdn_connectivity_reject;
d_assert(sess, return CORE_ERROR, "Null param");
mme_ue = sess->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
memset(&message, 0, sizeof(message));
if (FSM_CHECK(&mme_ue->sm, emm_state_attached))
{
message.h.security_header_type =
NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
message.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
}
message.esm.h.eps_bearer_identity = 0;
message.esm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_ESM;
message.esm.h.procedure_transaction_identity = pti;
message.esm.h.procedure_transaction_identity = sess->pti;
message.esm.h.message_type = NAS_PDN_CONNECTIVITY_REJECT;
pdn_connectivity_reject->esm_cause = esm_cause;
d_assert(nas_plain_encode(pkbuf, &message) == CORE_OK && *pkbuf,,);
if (FSM_CHECK(&mme_ue->sm, emm_state_attached))
{
d_assert(nas_security_encode(pkbuf, mme_ue, &message) == CORE_OK &&
*pkbuf, return CORE_ERROR,);
}
else
{
d_assert(nas_plain_encode(pkbuf, &message) == CORE_OK && *pkbuf,
return CORE_ERROR,);
}
return CORE_OK;
}
@ -50,7 +70,7 @@ status_t esm_build_information_request(pkbuf_t **pkbuf, mme_bearer_t *bearer)
message.esm.h.message_type = NAS_ESM_INFORMATION_REQUEST;
d_assert(nas_security_encode(pkbuf, mme_ue, &message) == CORE_OK &&
*pkbuf,,);
*pkbuf, return CORE_ERROR,);
return CORE_OK;
}
@ -131,11 +151,12 @@ status_t esm_build_activate_default_bearer_context_request(
if (FSM_CHECK(&mme_ue->sm, emm_state_attached))
{
d_assert(nas_security_encode(pkbuf, mme_ue, &message) == CORE_OK &&
*pkbuf,,);
*pkbuf, return CORE_ERROR,);
}
else
{
d_assert(nas_plain_encode(pkbuf, &message) == CORE_OK && *pkbuf,,);
d_assert(nas_plain_encode(pkbuf, &message) == CORE_OK && *pkbuf,
return CORE_ERROR,);
}
return CORE_OK;
@ -188,7 +209,7 @@ status_t esm_build_activate_dedicated_bearer_context_request(
TLV_CLEAR_DATA(&bearer->tft);
d_assert(nas_security_encode(pkbuf, mme_ue, &message) == CORE_OK &&
*pkbuf,,);
*pkbuf, return CORE_ERROR,);
return CORE_OK;
}
@ -223,7 +244,7 @@ status_t esm_build_deactivate_bearer_context_request(
deactivate_eps_bearer_context_request->esm_cause = esm_cause;
d_assert(nas_security_encode(pkbuf, mme_ue, &message) == CORE_OK &&
*pkbuf,,);
*pkbuf, return CORE_ERROR,);
return CORE_OK;
}

View File

@ -8,7 +8,7 @@ extern "C" {
#endif /* __cplusplus */
CORE_DECLARE(status_t) esm_build_pdn_connectivity_reject(pkbuf_t **pkbuf,
c_uint8_t pti, nas_esm_cause_t esm_cause);
mme_sess_t *sess, nas_esm_cause_t esm_cause);
CORE_DECLARE(status_t) esm_build_information_request(pkbuf_t **pkbuf,
mme_bearer_t *bearer);
CORE_DECLARE(status_t) esm_build_activate_default_bearer_context_request(

View File

@ -33,8 +33,20 @@ void esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
{
sess->pdn = mme_pdn_find_by_apn(mme_ue,
pdn_connectivity_request->access_point_name.apn);
d_assert(sess->pdn, return, "No PDN Context[APN:%s])",
pdn_connectivity_request->access_point_name.apn);
if (!sess->pdn)
{
if (FSM_CHECK(&mme_ue->sm, emm_state_attached))
{
nas_send_pdn_connectivity_reject(
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN);
FSM_TRAN(&bearer->sm, esm_state_session_exception);
return;
}
else
{
d_assert(0, return, "Invalid EMM State");
}
}
}
if (pdn_connectivity_request->presencemask &

View File

@ -112,8 +112,7 @@ status_t nas_send_attach_reject(mme_ue_t *mme_ue,
sess = mme_sess_first(mme_ue);
if (sess)
{
rv = esm_build_pdn_connectivity_reject(
&esmbuf, sess->pti, esm_cause);
rv = esm_build_pdn_connectivity_reject(&esmbuf, sess, esm_cause);
d_assert(rv == CORE_OK && esmbuf, return CORE_ERROR,
"esm build error");
d_trace(3, "[NAS] PDN Connectivity reject : EMM <-- ESM\n",
@ -135,6 +134,27 @@ status_t nas_send_attach_reject(mme_ue_t *mme_ue,
return CORE_OK;
}
status_t nas_send_pdn_connectivity_reject(
mme_sess_t *sess, nas_esm_cause_t esm_cause)
{
status_t rv;
mme_ue_t *mme_ue;
pkbuf_t *esmbuf = NULL;
d_assert(sess, return CORE_ERROR, "Null param");
mme_ue = sess->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
rv = esm_build_pdn_connectivity_reject(&esmbuf, sess, esm_cause);
d_assert(rv == CORE_OK && esmbuf, return CORE_ERROR, "esm build error");
rv = nas_send_to_downlink_nas_transport(mme_ue, esmbuf);
d_assert(rv == CORE_OK, return CORE_ERROR,
"nas_send_to_downlink_nas_transport");
return CORE_OK;
}
status_t nas_send_activate_dedicated_bearer_context_request(
enb_ue_t *enb_ue, mme_bearer_t *bearer)
{
@ -204,7 +224,8 @@ status_t nas_send_tau_accept(mme_ue_t *mme_ue)
d_assert(rv == CORE_OK, return CORE_ERROR, "emm build error");
/* Send Dl NAS to UE */
d_assert(nas_send_to_downlink_nas_transport(mme_ue, emmbuf) == CORE_OK,,);
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf) == CORE_OK;
d_assert(rv == CORE_OK,, "nas_send_to_downlink_nas_transport");
/* FIXME : delay required before sending UE context release to make sure
* that UE receive DL NAS ? */

View File

@ -11,17 +11,19 @@ extern "C" {
CORE_DECLARE(status_t) nas_send_to_enb(enb_ue_t *enb_ue, pkbuf_t *pkbuf);
CORE_DECLARE(status_t) nas_send_emm_to_esm(
mme_ue_t *mme_ue, nas_esm_message_container_t *esm_message_container);
mme_ue_t *mme_ue, nas_esm_message_container_t *esm_message_container);
CORE_DECLARE(status_t) nas_send_to_downlink_nas_transport(
mme_ue_t *mme_ue, pkbuf_t *pkbuf);
CORE_DECLARE(status_t) nas_send_attach_accept(mme_ue_t *mme_ue);
CORE_DECLARE(status_t) nas_send_attach_reject(mme_ue_t *mme_ue,
e_S1ap_CauseNas s1ap_cause_nas, nas_emm_cause_t emm_cause,
nas_esm_cause_t esm_cause);
CORE_DECLARE(status_t) nas_send_pdn_connectivity_reject(
mme_sess_t *sess, nas_esm_cause_t esm_cause);
CORE_DECLARE(status_t) nas_send_activate_dedicated_bearer_context_request(
enb_ue_t *enb_ue, mme_bearer_t *bearer);
enb_ue_t *enb_ue, mme_bearer_t *bearer);
CORE_DECLARE(status_t) nas_send_deactivate_bearer_context_request(
enb_ue_t *enb_ue, mme_bearer_t *bearer);
enb_ue_t *enb_ue, mme_bearer_t *bearer);
CORE_DECLARE(status_t) nas_send_tau_accept(mme_ue_t *mme_ue);
CORE_DECLARE(status_t) nas_send_tau_reject(mme_ue_t *mme_ue,
nas_esm_cause_t emm_cause);

View File

@ -978,7 +978,11 @@ status_t tests1ap_build_pdn_connectivity_request(
"281208696e746572 6e6574036e673204 6d6e6574271a8080 2110010000108106"
"0000000083060000 0000000d00000a00 006440080055f501 0019d01000434006"
"0055f5011022",
"",
"000d40680000"
"0500000005c08000 0107000800030001 00001a003b3a2710 3fdafa0a0209d011"
"281208706e746572 6e6574036e673204 6d6e6574271a8080 2110010000108106"
"0000000083060000 0000000d00000a00 006440080055f501 0019d01000434006"
"0055f5011022",
"",
"",
@ -992,14 +996,14 @@ status_t tests1ap_build_pdn_connectivity_request(
};
c_uint16_t len[TESTS1AP_MAX_MESSAGE] = {
108,
0,
108,
0,
0,
0,
0,
59,
0,
0,
0,
};

View File

@ -214,8 +214,6 @@ static void volte_test1(abts_case *tc, void *data)
ABTS_INT_NEQUAL(tc, 0, rc);
pkbuf_free(recvbuf);
core_sleep(time_from_msec(300));
/* Send PDN Connectivity Request */
rv = tests1ap_build_pdn_connectivity_request(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
@ -295,6 +293,18 @@ static void volte_test1(abts_case *tc, void *data)
core_sleep(time_from_msec(300));
/* Send INVALID PDN Connectivity Request */
rv = tests1ap_build_pdn_connectivity_request(&sendbuf, msgindex+1);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
rv = tests1ap_enb_send(sock, sendbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
/* Receive PDN Connectivity Reject */
recvbuf = pkbuf_alloc(0, MAX_SDU_LEN);
rc = tests1ap_enb_read(sock, recvbuf);
ABTS_INT_NEQUAL(tc, 0, rc);
pkbuf_free(recvbuf);
/********** Remove Subscriber in Database */
doc = BCON_NEW("imsi", BCON_UTF8("001010123456819"));
ABTS_PTR_NOTNULL(tc, doc);