change UE context release command/complete interface.
- Before : Based on EMM state, we decided call mme_ue_remove() or not - After : Explictly, user should set about calling the mme_ue_remove().
This commit is contained in:
parent
1498f6c015
commit
47dc5eec38
|
@ -78,7 +78,8 @@ status_t emm_handle_attach_request(
|
||||||
nas_send_attach_reject(mme_ue,
|
nas_send_attach_reject(mme_ue,
|
||||||
S1ap_CauseNas_unspecified,
|
S1ap_CauseNas_unspecified,
|
||||||
EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED,
|
EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED,
|
||||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||||
|
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT);
|
||||||
return CORE_ERROR;
|
return CORE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -515,7 +515,7 @@ void emm_state_default_esm(fsm_t *s, event_t *e)
|
||||||
cause.choice.nas = S1ap_CauseNas_normal_release;
|
cause.choice.nas = S1ap_CauseNas_normal_release;
|
||||||
|
|
||||||
rv = s1ap_send_ue_context_release_commmand(
|
rv = s1ap_send_ue_context_release_commmand(
|
||||||
enb_ue, &cause, 0);
|
enb_ue, &cause, S1AP_UE_CTX_REL_NO_ACTION, 0);
|
||||||
d_assert(rv == CORE_OK, return, "s1ap send error");
|
d_assert(rv == CORE_OK, return, "s1ap send error");
|
||||||
FSM_TRAN(s, &emm_state_attached);
|
FSM_TRAN(s, &emm_state_attached);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -159,10 +159,18 @@ struct _enb_ue_t {
|
||||||
*
|
*
|
||||||
* Save TAI and ECGI. And then, this will copy 'mme_ue_t' context later */
|
* Save TAI and ECGI. And then, this will copy 'mme_ue_t' context later */
|
||||||
struct {
|
struct {
|
||||||
tai_t tai;
|
tai_t tai;
|
||||||
e_cgi_t e_cgi;
|
e_cgi_t e_cgi;
|
||||||
} nas;
|
} nas;
|
||||||
|
|
||||||
|
/* Store by UE Context Release Command
|
||||||
|
* Retrieve by UE Context Release Complete */
|
||||||
|
#define S1AP_UE_CTX_REL_INVALID_ACTION 0
|
||||||
|
#define S1AP_UE_CTX_REL_NO_ACTION 1
|
||||||
|
#define S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT 2
|
||||||
|
#define S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL 3
|
||||||
|
c_uint8_t ue_ctx_rel_action;
|
||||||
|
|
||||||
/* Related Context */
|
/* Related Context */
|
||||||
mme_enb_t *enb;
|
mme_enb_t *enb;
|
||||||
mme_ue_t *mme_ue;
|
mme_ue_t *mme_ue;
|
||||||
|
|
|
@ -139,7 +139,8 @@ void mme_s11_handle_modify_bearer_response(
|
||||||
cause.present = S1ap_Cause_PR_nas;
|
cause.present = S1ap_Cause_PR_nas;
|
||||||
cause.choice.nas = S1ap_CauseNas_normal_release;
|
cause.choice.nas = S1ap_CauseNas_normal_release;
|
||||||
|
|
||||||
rv = s1ap_send_ue_context_release_commmand(source_ue, &cause, 300);
|
rv = s1ap_send_ue_context_release_commmand(
|
||||||
|
source_ue, &cause, S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL, 300);
|
||||||
d_assert(rv == CORE_OK, return, "s1ap send error");
|
d_assert(rv == CORE_OK, return, "s1ap send error");
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -319,7 +320,8 @@ void mme_s11_handle_release_access_bearers_response(
|
||||||
|
|
||||||
cause.present = S1ap_Cause_PR_nas;
|
cause.present = S1ap_Cause_PR_nas;
|
||||||
cause.choice.nas = S1ap_CauseNas_normal_release;
|
cause.choice.nas = S1ap_CauseNas_normal_release;
|
||||||
rv = s1ap_send_ue_context_release_commmand(enb_ue, &cause, 0);
|
rv = s1ap_send_ue_context_release_commmand(
|
||||||
|
enb_ue, &cause, S1AP_UE_CTX_REL_NO_ACTION, 0);
|
||||||
d_assert(rv == CORE_OK,, "s1ap send error");
|
d_assert(rv == CORE_OK,, "s1ap send error");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -336,7 +336,8 @@ void mme_state_operational(fsm_t *s, event_t *e)
|
||||||
rv = nas_send_attach_reject(mme_ue,
|
rv = nas_send_attach_reject(mme_ue,
|
||||||
S1ap_CauseNas_authentication_failure,
|
S1ap_CauseNas_authentication_failure,
|
||||||
EMM_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED,
|
EMM_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED,
|
||||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||||
|
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT);
|
||||||
d_assert(rv == CORE_OK,,
|
d_assert(rv == CORE_OK,,
|
||||||
"nas_send_attach_reject failed");
|
"nas_send_attach_reject failed");
|
||||||
|
|
||||||
|
|
|
@ -101,7 +101,8 @@ status_t nas_send_attach_accept(mme_ue_t *mme_ue)
|
||||||
|
|
||||||
status_t nas_send_attach_reject(mme_ue_t *mme_ue,
|
status_t nas_send_attach_reject(mme_ue_t *mme_ue,
|
||||||
e_S1ap_CauseNas s1ap_cause_nas,
|
e_S1ap_CauseNas s1ap_cause_nas,
|
||||||
nas_emm_cause_t emm_cause, nas_esm_cause_t esm_cause)
|
nas_emm_cause_t emm_cause, nas_esm_cause_t esm_cause,
|
||||||
|
c_uint8_t ue_ctx_rel_action)
|
||||||
{
|
{
|
||||||
status_t rv;
|
status_t rv;
|
||||||
mme_enb_t *enb = NULL;
|
mme_enb_t *enb = NULL;
|
||||||
|
@ -134,7 +135,8 @@ status_t nas_send_attach_reject(mme_ue_t *mme_ue,
|
||||||
|
|
||||||
cause.present = S1ap_Cause_PR_nas;
|
cause.present = S1ap_Cause_PR_nas;
|
||||||
cause.choice.nas = s1ap_cause_nas;;
|
cause.choice.nas = s1ap_cause_nas;;
|
||||||
rv = s1ap_send_ue_context_release_commmand(enb_ue, &cause, 0);
|
rv = s1ap_send_ue_context_release_commmand(
|
||||||
|
enb_ue, &cause, ue_ctx_rel_action, 0);
|
||||||
d_assert(rv == CORE_OK,, "s1ap send error");
|
d_assert(rv == CORE_OK,, "s1ap send error");
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
|
@ -201,7 +203,8 @@ status_t nas_send_detach_accept(mme_ue_t *mme_ue)
|
||||||
/* FIXME : delay is needed */
|
/* FIXME : delay is needed */
|
||||||
cause.present = S1ap_Cause_PR_nas;
|
cause.present = S1ap_Cause_PR_nas;
|
||||||
cause.choice.nas = S1ap_CauseNas_detach;
|
cause.choice.nas = S1ap_CauseNas_detach;
|
||||||
rv = s1ap_send_ue_context_release_commmand(enb_ue, &cause, 0);
|
rv = s1ap_send_ue_context_release_commmand(
|
||||||
|
enb_ue, &cause, S1AP_UE_CTX_REL_NO_ACTION, 0);
|
||||||
d_assert(rv == CORE_OK, return CORE_ERROR, "s1ap send error");
|
d_assert(rv == CORE_OK, return CORE_ERROR, "s1ap send error");
|
||||||
|
|
||||||
return CORE_OK;
|
return CORE_OK;
|
||||||
|
@ -358,7 +361,8 @@ status_t nas_send_tau_accept(mme_ue_t *mme_ue)
|
||||||
* that UE receive DL NAS ? */
|
* that UE receive DL NAS ? */
|
||||||
cause.present = S1ap_Cause_PR_nas;
|
cause.present = S1ap_Cause_PR_nas;
|
||||||
cause.choice.nas = S1ap_CauseNas_normal_release;
|
cause.choice.nas = S1ap_CauseNas_normal_release;
|
||||||
rv = s1ap_send_ue_context_release_commmand(enb_ue, &cause, 0);
|
rv = s1ap_send_ue_context_release_commmand(
|
||||||
|
enb_ue, &cause, S1AP_UE_CTX_REL_NO_ACTION, 0);
|
||||||
d_assert(rv == CORE_OK, return CORE_ERROR, "s1ap send error");
|
d_assert(rv == CORE_OK, return CORE_ERROR, "s1ap send error");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -405,7 +409,8 @@ status_t nas_send_tau_reject(mme_ue_t *mme_ue, nas_emm_cause_t emm_cause)
|
||||||
* that UE receive DL NAS ? */
|
* that UE receive DL NAS ? */
|
||||||
cause.present = S1ap_Cause_PR_nas;
|
cause.present = S1ap_Cause_PR_nas;
|
||||||
cause.choice.nas = S1ap_CauseNas_normal_release;
|
cause.choice.nas = S1ap_CauseNas_normal_release;
|
||||||
rv = s1ap_send_ue_context_release_commmand(enb_ue, &cause, 0);
|
rv = s1ap_send_ue_context_release_commmand(
|
||||||
|
enb_ue, &cause, S1AP_UE_CTX_REL_NO_ACTION, 0);
|
||||||
d_assert(rv == CORE_OK, return CORE_ERROR, "s1ap send error");
|
d_assert(rv == CORE_OK, return CORE_ERROR, "s1ap send error");
|
||||||
|
|
||||||
return CORE_OK;
|
return CORE_OK;
|
||||||
|
@ -438,7 +443,8 @@ status_t nas_send_service_reject(mme_ue_t *mme_ue, nas_emm_cause_t emm_cause)
|
||||||
* that UE receive DL NAS ? */
|
* that UE receive DL NAS ? */
|
||||||
cause.present = S1ap_Cause_PR_nas;
|
cause.present = S1ap_Cause_PR_nas;
|
||||||
cause.choice.nas = S1ap_CauseNas_normal_release;
|
cause.choice.nas = S1ap_CauseNas_normal_release;
|
||||||
rv = s1ap_send_ue_context_release_commmand(enb_ue, &cause, 0);
|
rv = s1ap_send_ue_context_release_commmand(
|
||||||
|
enb_ue, &cause, S1AP_UE_CTX_REL_NO_ACTION, 0);
|
||||||
d_assert(rv == CORE_OK, return CORE_ERROR, "s1ap send error");
|
d_assert(rv == CORE_OK, return CORE_ERROR, "s1ap send error");
|
||||||
|
|
||||||
return CORE_OK;
|
return CORE_OK;
|
||||||
|
|
|
@ -18,7 +18,7 @@ CORE_DECLARE(status_t) nas_send_to_downlink_nas_transport(
|
||||||
CORE_DECLARE(status_t) nas_send_attach_accept(mme_ue_t *mme_ue);
|
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,
|
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,
|
e_S1ap_CauseNas s1ap_cause_nas, nas_emm_cause_t emm_cause,
|
||||||
nas_esm_cause_t esm_cause);
|
nas_esm_cause_t esm_cause, c_uint8_t ue_ctx_rel_action);
|
||||||
|
|
||||||
CORE_DECLARE(status_t) nas_send_authentication_request(
|
CORE_DECLARE(status_t) nas_send_authentication_request(
|
||||||
mme_ue_t *mme_ue, e_utran_vector_t *e_utran_vector);
|
mme_ue_t *mme_ue, e_utran_vector_t *e_utran_vector);
|
||||||
|
|
|
@ -519,8 +519,9 @@ status_t s1ap_build_ue_context_release_commmand(
|
||||||
|
|
||||||
d_assert(s1apbuf && encoded >= 0, return CORE_ERROR,);
|
d_assert(s1apbuf && encoded >= 0, return CORE_ERROR,);
|
||||||
|
|
||||||
d_trace(3, "[S1AP] UE Context Release Command : "
|
d_trace(3, "[S1AP] UE Context Release Command[%d:%d] : "
|
||||||
"UE[mME-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
|
"UE[mME-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
|
||||||
|
ies->cause.present, ies->cause.choice.radioNetwork,
|
||||||
enb_ue->mme_ue_s1ap_id,
|
enb_ue->mme_ue_s1ap_id,
|
||||||
CORE_ADDR(enb_ue->enb->addr, buf), enb_ue->enb->enb_id);
|
CORE_ADDR(enb_ue->enb->addr, buf), enb_ue->enb->enb_id);
|
||||||
|
|
||||||
|
|
|
@ -417,8 +417,9 @@ void s1ap_handle_ue_context_release_request(
|
||||||
enb_ue = enb_ue_find_by_mme_ue_s1ap_id(ies->mme_ue_s1ap_id);
|
enb_ue = enb_ue_find_by_mme_ue_s1ap_id(ies->mme_ue_s1ap_id);
|
||||||
d_assert(enb_ue, return, "No UE Context[%d]", ies->mme_ue_s1ap_id);
|
d_assert(enb_ue, return, "No UE Context[%d]", ies->mme_ue_s1ap_id);
|
||||||
|
|
||||||
d_trace(3, "[S1AP] UE Context Release Request : "
|
d_trace(3, "[S1AP] UE Context Release Request[%d:%d] : "
|
||||||
"UE[mME-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
|
"UE[mME-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
|
||||||
|
ies->cause.present, ies->cause.choice.radioNetwork,
|
||||||
enb_ue->mme_ue_s1ap_id,
|
enb_ue->mme_ue_s1ap_id,
|
||||||
CORE_ADDR(enb->addr, buf), enb->enb_id);
|
CORE_ADDR(enb->addr, buf), enb->enb_id);
|
||||||
|
|
||||||
|
@ -444,7 +445,7 @@ void s1ap_handle_ue_context_release_request(
|
||||||
cause.present = S1ap_Cause_PR_nas;
|
cause.present = S1ap_Cause_PR_nas;
|
||||||
cause.choice.nas = S1ap_CauseNas_normal_release;
|
cause.choice.nas = S1ap_CauseNas_normal_release;
|
||||||
rv = s1ap_send_ue_context_release_commmand(
|
rv = s1ap_send_ue_context_release_commmand(
|
||||||
enb_ue, &cause, 0);
|
enb_ue, &cause, S1AP_UE_CTX_REL_NO_ACTION, 0);
|
||||||
d_assert(rv == CORE_OK, return, "s1ap send error");
|
d_assert(rv == CORE_OK, return, "s1ap send error");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -458,27 +459,16 @@ void s1ap_handle_ue_context_release_request(
|
||||||
case S1ap_Cause_PR_transport:
|
case S1ap_Cause_PR_transport:
|
||||||
{
|
{
|
||||||
S1ap_Cause_t cause;
|
S1ap_Cause_t cause;
|
||||||
const char *cause_string = NULL;
|
|
||||||
|
|
||||||
if (ies->cause.choice.transport ==
|
d_warn("[S1AP] UE Context Release Request[Transport Cause: %d]",
|
||||||
S1ap_CauseTransport_transport_resource_unavailable)
|
ies->cause.choice.transport,
|
||||||
cause_string = "Transport Resource Unavailable";
|
|
||||||
else if (ies->cause.choice.transport ==
|
|
||||||
S1ap_CauseTransport_unspecified)
|
|
||||||
cause_string = "Unspecified";
|
|
||||||
else
|
|
||||||
cause_string = "Unknown";
|
|
||||||
|
|
||||||
|
|
||||||
d_warn("[S1AP] UE Context Release Request(Transport Cause: %s[%d])",
|
|
||||||
cause_string, ies->cause.choice.transport,
|
|
||||||
enb_ue->enb_ue_s1ap_id,
|
enb_ue->enb_ue_s1ap_id,
|
||||||
CORE_ADDR(enb->addr, buf), enb->enb_id);
|
CORE_ADDR(enb->addr, buf), enb->enb_id);
|
||||||
|
|
||||||
cause.present = S1ap_Cause_PR_nas;
|
cause.present = S1ap_Cause_PR_nas;
|
||||||
cause.choice.nas = S1ap_CauseNas_normal_release;
|
cause.choice.nas = S1ap_CauseNas_normal_release;
|
||||||
rv = s1ap_send_ue_context_release_commmand(
|
rv = s1ap_send_ue_context_release_commmand(
|
||||||
enb_ue, &cause, 0);
|
enb_ue, &cause, S1AP_UE_CTX_REL_NO_ACTION, 0);
|
||||||
d_assert(rv == CORE_OK, return, "s1ap send error");
|
d_assert(rv == CORE_OK, return, "s1ap send error");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -505,11 +495,9 @@ void s1ap_handle_ue_context_release_complete(
|
||||||
status_t rv;
|
status_t rv;
|
||||||
char buf[CORE_ADDRSTRLEN];
|
char buf[CORE_ADDRSTRLEN];
|
||||||
|
|
||||||
|
c_uint8_t ue_ctx_rel_action = 0;
|
||||||
enb_ue_t *enb_ue = NULL;
|
enb_ue_t *enb_ue = NULL;
|
||||||
mme_ue_t *mme_ue = NULL;
|
mme_ue_t *mme_ue = NULL;
|
||||||
mme_sess_t *sess = NULL;
|
|
||||||
mme_bearer_t *bearer = NULL;
|
|
||||||
int need_to_delete_indirect_tunnel = 0;
|
|
||||||
S1ap_UEContextReleaseComplete_IEs_t *ies = NULL;
|
S1ap_UEContextReleaseComplete_IEs_t *ies = NULL;
|
||||||
|
|
||||||
ies = &message->s1ap_UEContextReleaseComplete_IEs;
|
ies = &message->s1ap_UEContextReleaseComplete_IEs;
|
||||||
|
@ -523,40 +511,36 @@ void s1ap_handle_ue_context_release_complete(
|
||||||
enb_ue->mme_ue_s1ap_id,
|
enb_ue->mme_ue_s1ap_id,
|
||||||
CORE_ADDR(enb->addr, buf), enb->enb_id);
|
CORE_ADDR(enb->addr, buf), enb->enb_id);
|
||||||
|
|
||||||
|
ue_ctx_rel_action = enb_ue->ue_ctx_rel_action;
|
||||||
|
enb_ue->ue_ctx_rel_action = S1AP_UE_CTX_REL_INVALID_ACTION;
|
||||||
|
mme_ue = enb_ue->mme_ue;
|
||||||
|
|
||||||
enb_ue_remove(enb_ue);
|
enb_ue_remove(enb_ue);
|
||||||
|
|
||||||
mme_ue = enb_ue->mme_ue;
|
|
||||||
if (mme_ue)
|
if (mme_ue)
|
||||||
{
|
{
|
||||||
sess = mme_sess_first(mme_ue);
|
switch (ue_ctx_rel_action)
|
||||||
while(sess)
|
|
||||||
{
|
{
|
||||||
bearer = mme_bearer_first(sess);
|
case S1AP_UE_CTX_REL_NO_ACTION:
|
||||||
while(bearer)
|
|
||||||
{
|
{
|
||||||
if (MME_HAVE_SGW_DL_INDIRECT_TUNNEL(bearer) ||
|
break;
|
||||||
MME_HAVE_SGW_UL_INDIRECT_TUNNEL(bearer))
|
|
||||||
{
|
|
||||||
need_to_delete_indirect_tunnel = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bearer = mme_bearer_next(bearer);
|
|
||||||
}
|
}
|
||||||
sess = mme_sess_next(sess);
|
case S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT:
|
||||||
}
|
|
||||||
|
|
||||||
if (need_to_delete_indirect_tunnel)
|
|
||||||
{
|
|
||||||
rv = mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
|
|
||||||
mme_ue);
|
|
||||||
d_assert(rv == CORE_OK, return, "gtp send error");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!FSM_CHECK(&mme_ue->sm, emm_state_detached) &&
|
|
||||||
!FSM_CHECK(&mme_ue->sm, emm_state_attached))
|
|
||||||
{
|
{
|
||||||
mme_ue_remove(mme_ue);
|
mme_ue_remove(mme_ue);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL:
|
||||||
|
{
|
||||||
|
rv = mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
|
||||||
|
mme_ue);
|
||||||
|
d_assert(rv == CORE_OK, return, "gtp send error");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
d_assert(0, return, "Invalid action(%d)", ue_ctx_rel_action);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -914,7 +898,8 @@ void s1ap_handle_handover_failure(mme_enb_t *enb, s1ap_message_t *message)
|
||||||
cause.present = S1ap_Cause_PR_radioNetwork;
|
cause.present = S1ap_Cause_PR_radioNetwork;
|
||||||
cause.choice.nas = S1ap_CauseRadioNetwork_ho_failure_in_target_EPC_eNB_or_target_system;
|
cause.choice.nas = S1ap_CauseRadioNetwork_ho_failure_in_target_EPC_eNB_or_target_system;
|
||||||
|
|
||||||
rv = s1ap_send_ue_context_release_commmand(target_ue, &cause, 0);
|
rv = s1ap_send_ue_context_release_commmand(target_ue, &cause,
|
||||||
|
S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL, 0);
|
||||||
d_assert(rv == CORE_OK, return, "s1ap send error");
|
d_assert(rv == CORE_OK, return, "s1ap send error");
|
||||||
|
|
||||||
d_trace(3, "[S1AP] Handover Failure : "
|
d_trace(3, "[S1AP] Handover Failure : "
|
||||||
|
@ -957,7 +942,8 @@ void s1ap_handle_handover_cancel(mme_enb_t *enb, s1ap_message_t *message)
|
||||||
cause.present = S1ap_Cause_PR_radioNetwork;
|
cause.present = S1ap_Cause_PR_radioNetwork;
|
||||||
cause.choice.nas = S1ap_CauseRadioNetwork_handover_cancelled;
|
cause.choice.nas = S1ap_CauseRadioNetwork_handover_cancelled;
|
||||||
|
|
||||||
rv = s1ap_send_ue_context_release_commmand(target_ue, &cause, 300);
|
rv = s1ap_send_ue_context_release_commmand(target_ue, &cause,
|
||||||
|
S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL, 300);
|
||||||
d_assert(rv == CORE_OK, return, "s1ap send error");
|
d_assert(rv == CORE_OK, return, "s1ap send error");
|
||||||
|
|
||||||
d_trace(3, "[S1AP] Handover Cancel : "
|
d_trace(3, "[S1AP] Handover Cancel : "
|
||||||
|
|
|
@ -235,13 +235,17 @@ status_t s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue)
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t s1ap_send_ue_context_release_commmand(
|
status_t s1ap_send_ue_context_release_commmand(
|
||||||
enb_ue_t *enb_ue, S1ap_Cause_t *cause, c_uint32_t delay)
|
enb_ue_t *enb_ue, S1ap_Cause_t *cause, c_uint8_t action, c_uint32_t delay)
|
||||||
{
|
{
|
||||||
status_t rv;
|
status_t rv;
|
||||||
mme_enb_t *enb = NULL;
|
mme_enb_t *enb = NULL;
|
||||||
pkbuf_t *s1apbuf = NULL;
|
pkbuf_t *s1apbuf = NULL;
|
||||||
|
|
||||||
|
d_assert(action != S1AP_UE_CTX_REL_INVALID_ACTION, return CORE_ERROR,
|
||||||
|
"Should give valid action for UE Context Release Command");
|
||||||
|
|
||||||
d_assert(enb_ue, return CORE_ERROR, "Null param");
|
d_assert(enb_ue, return CORE_ERROR, "Null param");
|
||||||
|
enb_ue->ue_ctx_rel_action = action;
|
||||||
d_assert(cause, return CORE_ERROR, "Null param");
|
d_assert(cause, return CORE_ERROR, "Null param");
|
||||||
enb = enb_ue->enb;
|
enb = enb_ue->enb;
|
||||||
d_assert(enb, return CORE_ERROR, "Null param");
|
d_assert(enb, return CORE_ERROR, "Null param");
|
||||||
|
|
|
@ -35,7 +35,7 @@ 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(
|
CORE_DECLARE(status_t) s1ap_send_initial_context_setup_request(
|
||||||
mme_ue_t *mme_ue);
|
mme_ue_t *mme_ue);
|
||||||
CORE_DECLARE(status_t) s1ap_send_ue_context_release_commmand(
|
CORE_DECLARE(status_t) s1ap_send_ue_context_release_commmand(
|
||||||
enb_ue_t *enb_ue, S1ap_Cause_t *cause, c_uint32_t delay);
|
enb_ue_t *enb_ue, S1ap_Cause_t *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_ack(mme_ue_t *mme_ue);
|
||||||
CORE_DECLARE(status_t) s1ap_send_path_switch_failure(mme_enb_t *enb,
|
CORE_DECLARE(status_t) s1ap_send_path_switch_failure(mme_enb_t *enb,
|
||||||
|
|
|
@ -393,6 +393,8 @@ static void attach_test1(abts_case *tc, void *data)
|
||||||
rv = tests1ap_enb_send(sock, sendbuf);
|
rv = tests1ap_enb_send(sock, sendbuf);
|
||||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||||
|
|
||||||
|
core_sleep(time_from_msec(300));
|
||||||
|
|
||||||
/* eNB disonncect from MME */
|
/* eNB disonncect from MME */
|
||||||
rv = tests1ap_enb_close(sock);
|
rv = tests1ap_enb_close(sock);
|
||||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||||
|
|
|
@ -169,7 +169,7 @@ status_t tests1ap_build_initial_ue_msg(pkbuf_t **pkbuf, int i)
|
||||||
"004300060000f110 3039006440080055 f5010019d0100086 400130",
|
"004300060000f110 3039006440080055 f5010019d0100086 400130",
|
||||||
|
|
||||||
"000c40809c00"
|
"000c40809c00"
|
||||||
"0005000800030001 00001a007372178c 3e3cff070741020b f600f11000020100"
|
"0005000800030003 00001a007372178c 3e3cff070741020b f600f11000020100"
|
||||||
"00000905e060c040 0100210204d011d1 271a808021100100 0010810600000000"
|
"00000905e060c040 0100210204d011d1 271a808021100100 0010810600000000"
|
||||||
"830600000000000d 00000a005255f501 10225c0a003103e5 c03e1355f501aaaa"
|
"830600000000000d 00000a005255f501 10225c0a003103e5 c03e1355f501aaaa"
|
||||||
"11035758a6200b60 1404ef65233b8878 d290400804026004 00021f025d0107e0"
|
"11035758a6200b60 1404ef65233b8878 d290400804026004 00021f025d0107e0"
|
||||||
|
@ -254,7 +254,7 @@ status_t tests1ap_build_identity_response(pkbuf_t **pkbuf, int i)
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"000d"
|
"000d"
|
||||||
"403f000005000000 05c00100009f0008 0003000100001a00 121117d7e3248b57"
|
"403f000005000000 05c00100009f0008 0003000300001a00 121117d7e3248b57"
|
||||||
"0756080910101032 5486510064400800 00f11054f6401000 4340060000f1105b"
|
"0756080910101032 5486510064400800 00f11054f6401000 4340060000f1105b"
|
||||||
"a0",
|
"a0",
|
||||||
|
|
||||||
|
@ -480,7 +480,7 @@ status_t tests1ap_build_esm_information_response(pkbuf_t **pkbuf, int i)
|
||||||
"9a2626c09a2626c0 9a2626c223150200 0015103d3dda5c72 4cc497354ae64653"
|
"9a2626c09a2626c0 9a2626c223150200 0015103d3dda5c72 4cc497354ae64653"
|
||||||
"45a8088021100100 0010810600000000 830600000000000d 00000a0000644008"
|
"45a8088021100100 0010810600000000 830600000000000d 00000a0000644008"
|
||||||
"0000f1101079baf0 004340060000f110 5ba0",
|
"0000f1101079baf0 004340060000f110 5ba0",
|
||||||
"000d40808d000005 00000005c0010000 9d00080002000100 1a00616027c963b5"
|
"000d40808d000005 00000005c0010000 9e00080002000200 1a00616027c963b5"
|
||||||
"1b010221da280908 696e7465726e6574 274a80c223150100 001510c09a2626c0"
|
"1b010221da280908 696e7465726e6574 274a80c223150100 001510c09a2626c0"
|
||||||
"9a2626c09a2626c0 9a2626c223150200 0015103d3dda5c72 4cc497354ae64653"
|
"9a2626c09a2626c0 9a2626c223150200 0015103d3dda5c72 4cc497354ae64653"
|
||||||
"45a8088021100100 0010810600000000 830600000000000d 00000a0000644008"
|
"45a8088021100100 0010810600000000 830600000000000d 00000a0000644008"
|
||||||
|
@ -768,7 +768,7 @@ status_t tests1ap_build_emm_status(pkbuf_t **pkbuf, int i)
|
||||||
status_t tests1ap_build_detach_request(pkbuf_t **pkbuf, int i)
|
status_t tests1ap_build_detach_request(pkbuf_t **pkbuf, int i)
|
||||||
{
|
{
|
||||||
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
||||||
"000c404900000600 080003000100001a 001615172ba435db 040745090bf600f1"
|
"000c404900000600 080003000200001a 001615172ba435db 040745090bf600f1"
|
||||||
"10000201020003e6 004300060000f110 2b67006440080000 f1109d67aa500086"
|
"10000201020003e6 004300060000f110 2b67006440080000 f1109d67aa500086"
|
||||||
"4001300060000600 40020003e6",
|
"4001300060000600 40020003e6",
|
||||||
|
|
||||||
|
@ -855,12 +855,12 @@ status_t tests1ap_build_ue_context_release_request(pkbuf_t **pkbuf, int i)
|
||||||
status_t tests1ap_build_ue_context_release_complete(pkbuf_t **pkbuf, int i)
|
status_t tests1ap_build_ue_context_release_complete(pkbuf_t **pkbuf, int i)
|
||||||
{
|
{
|
||||||
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
||||||
"2017001300000200 004005c00100009d 00084003400527",
|
"2017001300000200 004005c00100009e 00084003400002",
|
||||||
|
|
||||||
"",
|
"",
|
||||||
|
|
||||||
"2017"
|
"2017"
|
||||||
"0012000002000040 05c00100009f0008 40020001",
|
"0012000002000040 05c00100009f0008 40020003",
|
||||||
|
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
|
|
|
@ -169,7 +169,7 @@ status_t tests1ap_build_initial_ue_msg(pkbuf_t **pkbuf, int i)
|
||||||
"004300060000f110 3039006440080055 f5010019d0100086 400130",
|
"004300060000f110 3039006440080055 f5010019d0100086 400130",
|
||||||
|
|
||||||
"000c40809c00"
|
"000c40809c00"
|
||||||
"0005000800030001 00001a007372178c 3e3cff070741020b f600f11000020100"
|
"0005000800030003 00001a007372178c 3e3cff070741020b f600f11000020100"
|
||||||
"00000905e060c040 0100210204d011d1 271a808021100100 0010810600000000"
|
"00000905e060c040 0100210204d011d1 271a808021100100 0010810600000000"
|
||||||
"830600000000000d 00000a005255f501 10225c0a003103e5 c03e1355f501aaaa"
|
"830600000000000d 00000a005255f501 10225c0a003103e5 c03e1355f501aaaa"
|
||||||
"11035758a6200b60 1404ef65233b8878 d290400804026004 00021f025d0107e0"
|
"11035758a6200b60 1404ef65233b8878 d290400804026004 00021f025d0107e0"
|
||||||
|
@ -254,7 +254,7 @@ status_t tests1ap_build_identity_response(pkbuf_t **pkbuf, int i)
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"000d"
|
"000d"
|
||||||
"403f000005000000 05c00100009f0008 0003000100001a00 121117d7e3248b57"
|
"403f000005000000 05c00100009f0008 0003000300001a00 121117d7e3248b57"
|
||||||
"0756080910101032 5486510064400800 00f11054f6401000 4340060000f1105b"
|
"0756080910101032 5486510064400800 00f11054f6401000 4340060000f1105b"
|
||||||
"a0",
|
"a0",
|
||||||
|
|
||||||
|
@ -480,7 +480,7 @@ status_t tests1ap_build_esm_information_response(pkbuf_t **pkbuf, int i)
|
||||||
"9a2626c09a2626c0 9a2626c223150200 0015103d3dda5c72 4cc497354ae64653"
|
"9a2626c09a2626c0 9a2626c223150200 0015103d3dda5c72 4cc497354ae64653"
|
||||||
"45a8088021100100 0010810600000000 830600000000000d 00000a0000644008"
|
"45a8088021100100 0010810600000000 830600000000000d 00000a0000644008"
|
||||||
"0000f1101079baf0 004340060000f110 5ba0",
|
"0000f1101079baf0 004340060000f110 5ba0",
|
||||||
"000d40808d000005 00000005c0010000 9d00080002000100 1a00616027c963b5"
|
"000d40808d000005 00000005c0010000 9e00080002000200 1a00616027c963b5"
|
||||||
"1b010221da280908 696e7465726e6574 274a80c223150100 001510c09a2626c0"
|
"1b010221da280908 696e7465726e6574 274a80c223150100 001510c09a2626c0"
|
||||||
"9a2626c09a2626c0 9a2626c223150200 0015103d3dda5c72 4cc497354ae64653"
|
"9a2626c09a2626c0 9a2626c223150200 0015103d3dda5c72 4cc497354ae64653"
|
||||||
"45a8088021100100 0010810600000000 830600000000000d 00000a0000644008"
|
"45a8088021100100 0010810600000000 830600000000000d 00000a0000644008"
|
||||||
|
@ -768,7 +768,7 @@ status_t tests1ap_build_emm_status(pkbuf_t **pkbuf, int i)
|
||||||
status_t tests1ap_build_detach_request(pkbuf_t **pkbuf, int i)
|
status_t tests1ap_build_detach_request(pkbuf_t **pkbuf, int i)
|
||||||
{
|
{
|
||||||
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
||||||
"000c404900000600 080003000100001a 001615172ba435db 040745090bf600f1"
|
"000c404900000600 080003000200001a 001615172ba435db 040745090bf600f1"
|
||||||
"10000201020003e6 004300060000f110 2b67006440080000 f1109d67aa500086"
|
"10000201020003e6 004300060000f110 2b67006440080000 f1109d67aa500086"
|
||||||
"4001300060000600 40020003e6",
|
"4001300060000600 40020003e6",
|
||||||
|
|
||||||
|
@ -855,12 +855,12 @@ status_t tests1ap_build_ue_context_release_request(pkbuf_t **pkbuf, int i)
|
||||||
status_t tests1ap_build_ue_context_release_complete(pkbuf_t **pkbuf, int i)
|
status_t tests1ap_build_ue_context_release_complete(pkbuf_t **pkbuf, int i)
|
||||||
{
|
{
|
||||||
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
||||||
"2017001300000200 004005c00100009d 00084003400527",
|
"2017001300000200 004005c00100009e 00084003400002",
|
||||||
|
|
||||||
"",
|
"",
|
||||||
|
|
||||||
"2017"
|
"2017"
|
||||||
"0012000002000040 05c00100009f0008 40020001",
|
"0012000002000040 05c00100009f0008 40020003",
|
||||||
|
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
|
|
Loading…
Reference in New Issue