refine S1ap_Cause related source code

This commit is contained in:
Sukchan Lee 2018-01-21 20:31:28 +09:00
parent 32d62805df
commit e785d4ca4e
9 changed files with 97 additions and 160 deletions

View File

@ -275,7 +275,6 @@ void emm_state_identity(fsm_t *s, event_t *e)
{
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
S1ap_Cause_t cause;
enb_ue_t *enb_ue = NULL;
d_warn("Have PDN Connection "
@ -286,10 +285,9 @@ void emm_state_identity(fsm_t *s, event_t *e)
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, break, "No ENB UE context");
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_send_ue_context_release_commmand(
enb_ue, &cause,
rv = s1ap_send_ue_context_release_command(
enb_ue, S1ap_Cause_PR_nas,
S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_NO_ACTION, 0);
d_assert(rv == CORE_OK, break,
"s1ap send failed");
@ -605,7 +603,6 @@ void emm_state_initial_context_setup(fsm_t *s, event_t *e)
case NAS_TRACKING_AREA_UPDATE_COMPLETE:
{
status_t rv;
S1ap_Cause_t cause;
enb_ue_t *enb_ue = mme_ue->enb_ue;
d_trace(3, "[NAS] Tracking area update complete : "
@ -613,11 +610,9 @@ void emm_state_initial_context_setup(fsm_t *s, event_t *e)
mme_ue->imsi_bcd);
d_assert(enb_ue, return, "Null param");
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_send_ue_context_release_commmand(
enb_ue, &cause, S1AP_UE_CTX_REL_NO_ACTION, 0);
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_NO_ACTION, 0);
d_assert(rv == CORE_OK, return, "s1ap send error");
FSM_TRAN(s, &emm_state_attached);
break;
@ -701,7 +696,6 @@ void emm_state_attached(fsm_t *s, event_t *e)
{
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
S1ap_Cause_t cause;
enb_ue_t *enb_ue = NULL;
d_warn("Have PDN Connection in emm_state_attached");
@ -711,11 +705,9 @@ void emm_state_attached(fsm_t *s, event_t *e)
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, break, "No ENB UE context");
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_send_ue_context_release_commmand(
enb_ue, &cause,
S1AP_UE_CTX_REL_NO_ACTION, 0);
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_NO_ACTION, 0);
d_assert(rv == CORE_OK, break, "s1ap send failed");
}
else

View File

@ -112,7 +112,6 @@ void mme_s11_handle_modify_bearer_response(
gtp_xact_t *xact, mme_ue_t *mme_ue, gtp_modify_bearer_response_t *rsp)
{
status_t rv;
S1ap_Cause_t cause;
enb_ue_t *source_ue = NULL, *target_ue = NULL;
d_assert(xact, return, "Null param");
@ -136,11 +135,9 @@ void mme_s11_handle_modify_bearer_response(
source_ue = target_ue->source_ue;
d_assert(source_ue, return, "Null param");
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_send_ue_context_release_commmand(
source_ue, &cause, S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL, 300);
rv = s1ap_send_ue_context_release_command(source_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL, 300);
d_assert(rv == CORE_OK, return, "s1ap send error");
);
}
@ -202,16 +199,14 @@ void mme_s11_handle_delete_session_response(
else if (FSM_CHECK(&bearer->sm, esm_state_active))
{
GTP_COUNTER_CHECK(mme_ue, GTP_COUNTER_DELETE_SESSION,
S1ap_Cause_t cause;
enb_ue_t *enb_ue = NULL;
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return, );
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_send_ue_context_release_commmand(
enb_ue, &cause, S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT, 0);
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT, 0);
d_assert(rv == CORE_OK, return, "s1ap send error");
);
}
@ -224,16 +219,14 @@ void mme_s11_handle_delete_session_response(
FSM_CHECK(&mme_ue->sm, emm_state_exception))
{
GTP_COUNTER_CHECK(mme_ue, GTP_COUNTER_DELETE_SESSION,
S1ap_Cause_t cause;
enb_ue_t *enb_ue = NULL;
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return, );
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_send_ue_context_release_commmand(
enb_ue, &cause, S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT, 0);
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT, 0);
d_assert(rv == CORE_OK, return, "s1ap send error");
);
}
@ -505,7 +498,6 @@ void mme_s11_handle_release_access_bearers_response(
{
status_t rv;
enb_ue_t *enb_ue = NULL;
S1ap_Cause_t cause;
d_assert(xact, return, "Null param");
d_assert(mme_ue, return, "Null param");
@ -526,10 +518,9 @@ void mme_s11_handle_release_access_bearers_response(
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_send_ue_context_release_commmand(
enb_ue, &cause, S1AP_UE_CTX_REL_NO_ACTION, 0);
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_NO_ACTION, 0);
d_assert(rv == CORE_OK,, "s1ap send error");
}

View File

@ -279,11 +279,8 @@ void mme_state_operational(fsm_t *s, event_t *e)
}
else
{
S1ap_Cause_t cause;
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_send_ue_context_release_commmand(enb_ue, &cause,
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT, 0);
d_assert(rv == CORE_OK, pkbuf_free(pkbuf); break,
"s1ap send failed");
@ -373,7 +370,6 @@ void mme_state_operational(fsm_t *s, event_t *e)
if (s6a_message->result_code != ER_DIAMETER_SUCCESS)
{
S1ap_Cause_t cause;
enb_ue_t *enb_ue = NULL;
rv = nas_send_attach_reject(mme_ue,
@ -385,9 +381,8 @@ void mme_state_operational(fsm_t *s, event_t *e)
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, break, "No ENB UE context");
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_authentication_failure;
rv = s1ap_send_ue_context_release_commmand(enb_ue, &cause,
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_authentication_failure,
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT, 0);
d_assert(rv == CORE_OK,, "s1ap send error");

View File

@ -168,7 +168,6 @@ status_t nas_send_detach_accept(mme_ue_t *mme_ue)
status_t rv;
enb_ue_t *enb_ue = NULL;
pkbuf_t *emmbuf = NULL;
S1ap_Cause_t cause;
c_uint8_t ue_ctx_rel_action = S1AP_UE_CTX_REL_NO_ACTION;
d_assert(mme_ue, return CORE_ERROR, "Null param");
@ -190,11 +189,8 @@ status_t nas_send_detach_accept(mme_ue_t *mme_ue)
ue_ctx_rel_action = S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT;
}
/* FIXME : delay is needed */
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_detach;
rv = s1ap_send_ue_context_release_commmand(
enb_ue, &cause, ue_ctx_rel_action, 0);
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_detach, ue_ctx_rel_action, 0);
d_assert(rv == CORE_OK, return CORE_ERROR, "s1ap send error");
return CORE_OK;
@ -334,7 +330,6 @@ status_t nas_send_deactivate_bearer_context_request(mme_bearer_t *bearer)
{
status_t rv;
pkbuf_t *esmbuf = NULL, *s1apbuf = NULL;
S1ap_Cause_t cause;
mme_ue_t *mme_ue = NULL;
d_assert(bearer, return CORE_ERROR, "Null param");
@ -347,9 +342,8 @@ status_t nas_send_deactivate_bearer_context_request(mme_bearer_t *bearer)
d_trace(3, "[NAS] Deactivate bearer context request : EMM <-- ESM\n");
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_build_e_rab_release_command(&s1apbuf, bearer, esmbuf, &cause);
rv = s1ap_build_e_rab_release_command(&s1apbuf, bearer, esmbuf,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release);
d_assert(rv == CORE_OK && s1apbuf,
pkbuf_free(esmbuf); return CORE_ERROR, "s1ap build error");
@ -369,7 +363,6 @@ status_t nas_send_tau_accept(mme_ue_t *mme_ue)
if (FSM_CHECK(&mme_ue->sm, emm_state_attached))
{
S1ap_Cause_t cause;
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return CORE_ERROR, "Null param");
@ -382,12 +375,9 @@ status_t nas_send_tau_accept(mme_ue_t *mme_ue)
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 ? */
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_send_ue_context_release_commmand(
enb_ue, &cause, S1AP_UE_CTX_REL_NO_ACTION, 0);
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_NO_ACTION, 0);
d_assert(rv == CORE_OK, return CORE_ERROR, "s1ap send error");
}
else

View File

@ -10,8 +10,6 @@
#include "s1ap_build.h"
#include "s1ap_conv.h"
static void s1ap_build_cause(S1ap_Cause_t *dst, S1ap_Cause_t *src);
status_t s1ap_build_setup_rsp(pkbuf_t **pkbuf)
{
int erval;
@ -81,7 +79,8 @@ status_t s1ap_build_setup_rsp(pkbuf_t **pkbuf)
}
status_t s1ap_build_setup_failure(pkbuf_t **pkbuf, S1ap_Cause_t cause)
status_t s1ap_build_setup_failure(
pkbuf_t **pkbuf, S1ap_Cause_PR group, long cause)
{
int erval;
@ -91,7 +90,8 @@ status_t s1ap_build_setup_failure(pkbuf_t **pkbuf, S1ap_Cause_t cause)
memset(&message, 0, sizeof(s1ap_message_t));
ies = &message.s1ap_S1SetupFailureIEs;
ies->cause = cause;
ies->cause.present = group;
ies->cause.choice.radioNetwork = cause;
message.procedureCode = S1ap_ProcedureCode_id_S1Setup;
message.direction = S1AP_PDU_PR_unsuccessfulOutcome;
@ -495,7 +495,8 @@ status_t s1ap_build_e_rab_modify_request(
}
status_t s1ap_build_e_rab_release_command(pkbuf_t **s1apbuf,
mme_bearer_t *bearer, pkbuf_t *esmbuf, S1ap_Cause_t *cause)
mme_bearer_t *bearer, pkbuf_t *esmbuf,
S1ap_Cause_PR group, long cause)
{
char buf[CORE_ADDRSTRLEN];
@ -534,7 +535,8 @@ status_t s1ap_build_e_rab_release_command(pkbuf_t **s1apbuf,
e_rab = (S1ap_E_RABItem_t *)core_calloc(1, sizeof(S1ap_E_RABItem_t));
e_rab->e_RAB_ID = bearer->ebi;
s1ap_build_cause(&e_rab->cause, cause);
e_rab->cause.present = group;
e_rab->cause.choice.radioNetwork = cause;
ies->presenceMask |= S1AP_E_RABRELEASECOMMANDIES_NAS_PDU_PRESENT;
nasPdu = &ies->nas_pdu;
@ -562,8 +564,8 @@ status_t s1ap_build_e_rab_release_command(pkbuf_t **s1apbuf,
return CORE_OK;
}
status_t s1ap_build_ue_context_release_commmand(
pkbuf_t **s1apbuf, enb_ue_t *enb_ue, S1ap_Cause_t *cause)
status_t s1ap_build_ue_context_release_command(
pkbuf_t **s1apbuf, enb_ue_t *enb_ue, S1ap_Cause_PR group, long cause)
{
char buf[CORE_ADDRSTRLEN];
@ -573,7 +575,6 @@ status_t s1ap_build_ue_context_release_commmand(
&message.s1ap_UEContextReleaseCommand_IEs;
d_assert(enb_ue, return CORE_ERROR, "Null param");
d_assert(cause, return CORE_ERROR, "Null param");
memset(&message, 0, sizeof(s1ap_message_t));
@ -598,7 +599,8 @@ status_t s1ap_build_ue_context_release_commmand(
ies->uE_S1AP_IDs.choice.mME_UE_S1AP_ID = enb_ue->mme_ue_s1ap_id;
}
s1ap_build_cause(&ies->cause, cause);
ies->cause.present = group;
ies->cause.choice.radioNetwork = cause;
message.procedureCode = S1ap_ProcedureCode_id_UEContextRelease;
message.direction = S1AP_PDU_PR_initiatingMessage;
@ -725,7 +727,8 @@ status_t s1ap_build_path_switch_ack(pkbuf_t **s1apbuf, mme_ue_t *mme_ue)
}
status_t s1ap_build_path_switch_failure(pkbuf_t **s1apbuf,
c_uint32_t enb_ue_s1ap_id, c_uint32_t mme_ue_s1ap_id, S1ap_Cause_t *cause)
c_uint32_t enb_ue_s1ap_id, c_uint32_t mme_ue_s1ap_id,
S1ap_Cause_PR group, long cause)
{
int encoded;
s1ap_message_t message;
@ -736,8 +739,8 @@ status_t s1ap_build_path_switch_failure(pkbuf_t **s1apbuf,
ies->mme_ue_s1ap_id = mme_ue_s1ap_id;
ies->eNB_UE_S1AP_ID = enb_ue_s1ap_id;
s1ap_build_cause(&ies->cause, cause);
ies->cause.present = group;
ies->cause.choice.radioNetwork = cause;
message.procedureCode = S1ap_ProcedureCode_id_PathSwitchRequest;
message.direction = S1AP_PDU_PR_unsuccessfulOutcome;
@ -867,11 +870,16 @@ status_t s1ap_build_handover_preparation_failure(
S1ap_HandoverPreparationFailureIEs_t *ies =
&message.s1ap_HandoverPreparationFailureIEs;
d_assert(s1apbuf, return CORE_ERROR,);
d_assert(source_ue, return CORE_ERROR,);
d_assert(cause, return CORE_ERROR,);
memset(&message, 0, sizeof(s1ap_message_t));
ies->mme_ue_s1ap_id = source_ue->mme_ue_s1ap_id;
ies->eNB_UE_S1AP_ID = source_ue->enb_ue_s1ap_id;
s1ap_build_cause(&ies->cause, cause);
ies->cause.present = cause->present;
ies->cause.choice.radioNetwork = cause->choice.radioNetwork;
message.procedureCode = S1ap_ProcedureCode_id_HandoverPreparation;
message.direction = S1AP_PDU_PR_unsuccessfulOutcome;
@ -916,7 +924,8 @@ status_t s1ap_build_handover_request(
ies->mme_ue_s1ap_id = target_ue->mme_ue_s1ap_id;
ies->handoverType = required->handoverType;
s1ap_build_cause(&ies->cause, &required->cause);
ies->cause.present = required->cause.present;
ies->cause.choice.radioNetwork = required->cause.choice.radioNetwork;
asn_uint642INTEGER(
&ies->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL,
@ -1112,33 +1121,3 @@ status_t s1ap_build_mme_status_transfer(pkbuf_t **s1apbuf,
return CORE_OK;
}
static void s1ap_build_cause(S1ap_Cause_t *dst, S1ap_Cause_t *src)
{
d_assert(src, return, "Null param");
d_assert(dst, return, "Null param");
dst->present = src->present;
switch(dst->present)
{
case S1ap_Cause_PR_radioNetwork:
dst->choice.radioNetwork = src->choice.radioNetwork;
break;
case S1ap_Cause_PR_transport:
dst->choice.transport = src->choice.transport;
break;
case S1ap_Cause_PR_nas:
dst->choice.nas = src->choice.nas;
break;
case S1ap_Cause_PR_protocol:
dst->choice.protocol = src->choice.protocol;
break;
case S1ap_Cause_PR_misc:
dst->choice.misc = src->choice.misc;
break;
default:
d_error("Invalid src type : %d", dst->present);
break;
}
}

View File

@ -10,7 +10,7 @@ extern "C" {
CORE_DECLARE(status_t) s1ap_build_setup_rsp(pkbuf_t **pkbuf);
CORE_DECLARE(status_t) s1ap_build_setup_failure(
pkbuf_t **pkbuf, S1ap_Cause_t cause);
pkbuf_t **pkbuf, S1ap_Cause_PR group, long cause);
CORE_DECLARE(status_t) s1ap_build_downlink_nas_transport(
pkbuf_t **s1apbuf, enb_ue_t *enb_ue, pkbuf_t *emmbuf);
CORE_DECLARE(status_t) s1ap_build_initial_context_setup_request(
@ -20,15 +20,16 @@ CORE_DECLARE(status_t) s1ap_build_e_rab_setup_request(
CORE_DECLARE(status_t) s1ap_build_e_rab_modify_request(
pkbuf_t **s1apbuf, mme_bearer_t *bearer, pkbuf_t *esmbuf);
CORE_DECLARE(status_t) s1ap_build_e_rab_release_command(pkbuf_t **s1apbuf,
mme_bearer_t *bearer, pkbuf_t *esmbuf, S1ap_Cause_t *cause);
CORE_DECLARE(status_t) s1ap_build_ue_context_release_commmand(
pkbuf_t **s1apbuf, enb_ue_t *enb_ue, S1ap_Cause_t *cause);
mme_bearer_t *bearer, pkbuf_t *esmbuf, S1ap_Cause_PR group, long cause);
CORE_DECLARE(status_t) s1ap_build_ue_context_release_command(
pkbuf_t **s1apbuf, enb_ue_t *enb_ue, S1ap_Cause_PR group, long cause);
CORE_DECLARE(status_t) s1ap_build_paging(pkbuf_t **s1apbuf, mme_ue_t *mme_ue);
CORE_DECLARE(status_t) s1ap_build_path_switch_ack(
pkbuf_t **s1apbuf, mme_ue_t *mme_ue);
CORE_DECLARE(status_t) s1ap_build_path_switch_failure(pkbuf_t **s1apbuf,
c_uint32_t enb_ue_s1ap_id, c_uint32_t mme_ue_s1ap_id, S1ap_Cause_t *cause);
c_uint32_t enb_ue_s1ap_id, c_uint32_t mme_ue_s1ap_id,
S1ap_Cause_PR group, long cause);
CORE_DECLARE(status_t) s1ap_build_handover_command(
pkbuf_t **s1apbuf, enb_ue_t *source_ue);

View File

@ -313,7 +313,6 @@ void s1ap_handle_initial_context_setup_failure(
{
status_t rv;
char buf[CORE_ADDRSTRLEN];
S1ap_Cause_t cause;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
@ -341,10 +340,9 @@ void s1ap_handle_initial_context_setup_failure(
}
else
{
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_send_ue_context_release_commmand(
enb_ue, &cause, S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT, 0);
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT, 0);
d_assert(rv == CORE_OK, return, "s1ap send error");
}
}
@ -425,7 +423,6 @@ void s1ap_handle_ue_context_release_request(
enb_ue_t *enb_ue = NULL;
S1ap_UEContextReleaseRequest_IEs_t *ies = NULL;
S1ap_Cause_t cause;
ies = &message->s1ap_UEContextReleaseRequest_IEs;
d_assert(ies, return, "Null param");
@ -457,10 +454,9 @@ void s1ap_handle_ue_context_release_request(
}
else
{
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_send_ue_context_release_commmand(
enb_ue, &cause, S1AP_UE_CTX_REL_NO_ACTION, 0);
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_NO_ACTION, 0);
d_assert(rv == CORE_OK, return, "s1ap send error");
}
}
@ -480,9 +476,8 @@ void s1ap_handle_ue_context_release_request(
}
else
{
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_send_ue_context_release_commmand(enb_ue, &cause,
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT, 0);
d_assert(rv == CORE_OK, return, "s1ap send error");
}
@ -508,9 +503,8 @@ void s1ap_handle_ue_context_release_request(
}
else
{
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_send_ue_context_release_commmand(enb_ue, &cause,
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT, 0);
d_assert(rv == CORE_OK, return, "s1ap send error");
}
@ -637,8 +631,6 @@ void s1ap_handle_path_switch_request(
enb_ue_t *enb_ue = NULL;
mme_ue_t *mme_ue = NULL;
S1ap_Cause_t cause;
S1ap_PathSwitchRequestIEs_t *ies = NULL;
S1ap_EUTRAN_CGI_t *eutran_cgi;
S1ap_PLMNidentity_t *pLMNidentity = NULL;
@ -683,11 +675,10 @@ void s1ap_handle_path_switch_request(
ies->sourceMME_UE_S1AP_ID,
CORE_ADDR(enb->addr, buf), enb->enb_id);
cause.present = S1ap_Cause_PR_radioNetwork;
cause.choice.radioNetwork =
S1ap_CauseRadioNetwork_unknown_mme_ue_s1ap_id;
s1ap_send_path_switch_failure(enb, ies->eNB_UE_S1AP_ID,
ies->sourceMME_UE_S1AP_ID, &cause);
ies->sourceMME_UE_S1AP_ID,
S1ap_Cause_PR_radioNetwork,
S1ap_CauseRadioNetwork_unknown_mme_ue_s1ap_id);
return;
}
@ -701,10 +692,9 @@ void s1ap_handle_path_switch_request(
}
else
{
cause.present = S1ap_Cause_PR_nas;
cause.choice.radioNetwork = S1ap_CauseNas_authentication_failure;
s1ap_send_path_switch_failure(enb, ies->eNB_UE_S1AP_ID,
ies->sourceMME_UE_S1AP_ID, &cause);
ies->sourceMME_UE_S1AP_ID,
S1ap_Cause_PR_nas, S1ap_CauseNas_authentication_failure);
return;
}
@ -919,7 +909,6 @@ void s1ap_handle_handover_failure(mme_enb_t *enb, s1ap_message_t *message)
char buf[CORE_ADDRSTRLEN];
S1ap_HandoverFailureIEs_t *ies = NULL;
S1ap_Cause_t cause;
enb_ue_t *target_ue = NULL;
enb_ue_t *source_ue = NULL;
@ -939,11 +928,10 @@ void s1ap_handle_handover_failure(mme_enb_t *enb, s1ap_message_t *message)
rv = s1ap_send_handover_preparation_failure(source_ue, &ies->cause);
d_assert(rv == CORE_OK, return, "s1ap send error");
cause.present = S1ap_Cause_PR_radioNetwork;
cause.choice.nas = S1ap_CauseRadioNetwork_ho_failure_in_target_EPC_eNB_or_target_system;
rv = s1ap_send_ue_context_release_commmand(target_ue, &cause,
S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL, 0);
rv = s1ap_send_ue_context_release_command(
target_ue, S1ap_Cause_PR_radioNetwork,
S1ap_CauseRadioNetwork_ho_failure_in_target_EPC_eNB_or_target_system,
S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL, 0);
d_assert(rv == CORE_OK, return, "s1ap send error");
d_trace(3, "[S1AP] Handover Failure : "
@ -961,7 +949,6 @@ void s1ap_handle_handover_cancel(mme_enb_t *enb, s1ap_message_t *message)
enb_ue_t *target_ue = NULL;
S1ap_HandoverCancelIEs_t *ies = NULL;
S1ap_Cause_t cause;
d_assert(enb, return,);
@ -983,10 +970,9 @@ void s1ap_handle_handover_cancel(mme_enb_t *enb, s1ap_message_t *message)
rv = s1ap_send_handover_cancel_ack(source_ue);
d_assert(rv == CORE_OK,, "s1ap send error");
cause.present = S1ap_Cause_PR_radioNetwork;
cause.choice.nas = S1ap_CauseRadioNetwork_handover_cancelled;
rv = s1ap_send_ue_context_release_commmand(target_ue, &cause,
rv = s1ap_send_ue_context_release_command(
target_ue, S1ap_Cause_PR_radioNetwork,
S1ap_CauseRadioNetwork_handover_cancelled,
S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL, 300);
d_assert(rv == CORE_OK, return, "s1ap send error");

View File

@ -234,8 +234,9 @@ status_t s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue)
return CORE_OK;
}
status_t s1ap_send_ue_context_release_commmand(
enb_ue_t *enb_ue, S1ap_Cause_t *cause, c_uint8_t action, c_uint32_t delay)
status_t s1ap_send_ue_context_release_command(
enb_ue_t *enb_ue, S1ap_Cause_PR group, long cause,
c_uint8_t action, c_uint32_t delay)
{
status_t rv;
mme_enb_t *enb = NULL;
@ -246,11 +247,10 @@ status_t s1ap_send_ue_context_release_commmand(
d_assert(enb_ue, return CORE_ERROR, "Null param");
enb_ue->ue_ctx_rel_action = action;
d_assert(cause, return CORE_ERROR, "Null param");
enb = enb_ue->enb;
d_assert(enb, return CORE_ERROR, "Null param");
rv = s1ap_build_ue_context_release_commmand(&s1apbuf, enb_ue, cause);
rv = s1ap_build_ue_context_release_command(&s1apbuf, enb_ue, group, cause);
d_assert(rv == CORE_OK && s1apbuf, return CORE_ERROR, "s1ap build error");
rv = s1ap_delayed_send_to_enb(enb, s1apbuf, delay);
@ -276,16 +276,16 @@ status_t s1ap_send_path_switch_ack(mme_ue_t *mme_ue)
}
status_t s1ap_send_path_switch_failure(mme_enb_t *enb,
c_uint32_t enb_ue_s1ap_id, c_uint32_t mme_ue_s1ap_id, S1ap_Cause_t *cause)
c_uint32_t enb_ue_s1ap_id, c_uint32_t mme_ue_s1ap_id,
S1ap_Cause_PR group, long cause)
{
status_t rv;
pkbuf_t *s1apbuf = NULL;
d_assert(cause, return CORE_ERROR, "Null param");
d_assert(enb, return CORE_ERROR, "Null param");
rv = s1ap_build_path_switch_failure(&s1apbuf,
enb_ue_s1ap_id, mme_ue_s1ap_id, cause);
enb_ue_s1ap_id, mme_ue_s1ap_id, group, cause);
d_assert(rv == CORE_OK && s1apbuf, return CORE_ERROR, "s1ap build error");
rv = s1ap_send_to_enb(enb, s1apbuf);
@ -323,6 +323,7 @@ status_t s1ap_send_handover_preparation_failure(
mme_enb_t *enb = NULL;
d_assert(source_ue, return CORE_ERROR,);
d_assert(cause, return CORE_ERROR,);
enb = source_ue->enb;
d_assert(enb, return CORE_ERROR,);

View File

@ -34,12 +34,14 @@ CORE_DECLARE(status_t) s1ap_send_to_esm(mme_ue_t *mme_ue, pkbuf_t *esmbuf);
CORE_DECLARE(status_t) s1ap_send_initial_context_setup_request(
mme_ue_t *mme_ue);
CORE_DECLARE(status_t) s1ap_send_ue_context_release_commmand(
enb_ue_t *enb_ue, S1ap_Cause_t *cause, c_uint8_t action, c_uint32_t delay);
CORE_DECLARE(status_t) s1ap_send_ue_context_release_command(
enb_ue_t *enb_ue, S1ap_Cause_PR group, long cause,
c_uint8_t action, c_uint32_t delay);
CORE_DECLARE(status_t) s1ap_send_path_switch_ack(mme_ue_t *mme_ue);
CORE_DECLARE(status_t) s1ap_send_path_switch_failure(mme_enb_t *enb,
c_uint32_t enb_ue_s1ap_id, c_uint32_t mme_ue_s1ap_id, S1ap_Cause_t *cause);
c_uint32_t enb_ue_s1ap_id, c_uint32_t mme_ue_s1ap_id,
S1ap_Cause_PR group, long cause);
CORE_DECLARE(status_t) s1ap_send_handover_command(enb_ue_t *source_ue);
CORE_DECLARE(status_t) s1ap_send_handover_preparation_failure(