add PDN connectivity reject
This commit is contained in:
parent
4b5d6ba01b
commit
97da327a61
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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 &
|
||||
|
|
|
@ -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 ? */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue