Change the sequence

BEFORE : Modify bearer -> Delete Indirect Tunnel -> UE Context Release
AFTER : Modify bearer -> Timer Expire -> UE Context Release -> Delete
Indirect Tunnel
This commit is contained in:
Sukchan Lee 2017-09-18 21:30:04 +09:00
parent 8862741a8d
commit bd9c8d467b
5 changed files with 67 additions and 57 deletions

View File

@ -1047,11 +1047,13 @@ unsigned int enb_ue_count()
status_t enb_ue_remove(enb_ue_t *enb_ue)
{
status_t rv;
d_assert(self.mme_ue_s1ap_id_hash, return CORE_ERROR, "Null param");
d_assert(enb_ue, return CORE_ERROR, "Null param");
d_assert(enb_ue->enb, return CORE_ERROR, "Null param");
mme_ue_deassociate_source_ue(enb_ue);
rv = source_ue_deassociate_target_ue(enb_ue);
d_assert(rv == CORE_OK, return CORE_ERROR, "Null param");
list_remove(&enb_ue->enb->enb_ue_list, enb_ue);
hash_set(self.mme_ue_s1ap_id_hash, &enb_ue->mme_ue_s1ap_id,
@ -1478,8 +1480,6 @@ status_t mme_ue_set_imsi(mme_ue_t *mme_ue, c_int8_t *imsi_bcd)
}
/*
* mme_ue is associated with enb_ue like the following conditions
*
* S1AP Initial UE-Message : S-TMSI
* NAS ATTACH_REQUEST : IMSI, GUTI
* NAS TAU_REQUEST : GUTI
@ -1497,18 +1497,33 @@ status_t mme_ue_associate_enb_ue(mme_ue_t *mme_ue, enb_ue_t *enb_ue)
}
/*
* mme_ue is associated with target_ue like the following conditions
* mme_ue_remove()
*
* Note : should not call in enb_ue_remove()
*/
status_t mme_ue_deassociate_enb_ue(mme_ue_t *mme_ue, enb_ue_t *enb_ue)
{
d_assert(mme_ue, return CORE_ERROR, "Null param");
d_assert(enb_ue, return CORE_ERROR, "Null param");
mme_ue->enb_ue = NULL;
enb_ue->mme_ue = NULL;
return CORE_OK;
}
/*
* S1AP Handover Required
*/
status_t mme_ue_associate_target_ue(mme_ue_t *mme_ue, enb_ue_t *target_ue)
status_t source_ue_associate_target_ue(
enb_ue_t *source_ue, enb_ue_t *target_ue)
{
enb_ue_t *source_ue = NULL;
mme_ue_t *mme_ue = NULL;
d_assert(target_ue, return CORE_ERROR, "Null param");
d_assert(mme_ue, return CORE_ERROR, "Null param");
source_ue = mme_ue->enb_ue;
d_assert(source_ue, return CORE_ERROR, "Null param");
d_assert(target_ue, return CORE_ERROR, "Null param");
mme_ue = source_ue->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
target_ue->mme_ue = mme_ue;
target_ue->source_ue = source_ue;
@ -1518,44 +1533,34 @@ status_t mme_ue_associate_target_ue(mme_ue_t *mme_ue, enb_ue_t *target_ue)
}
/*
* mme_ue is deassociated with target_ue like the following conditions
*
* Handover Cancel -> Delete Indirect Tunnel -> Deassociate -> UL Relase
* Handover Cancel -> Deassociate -> UL Relase
* S1AP Handover Failure
* enb_ue_remove()
*/
status_t mme_ue_deassociate_target_ue(enb_ue_t *target_ue)
status_t source_ue_deassociate_target_ue(enb_ue_t *enb_ue)
{
enb_ue_t *source_ue = NULL;
d_assert(target_ue, return CORE_ERROR,);
target_ue->mme_ue = NULL;
target_ue->source_ue = NULL;
source_ue = target_ue->source_ue;
if (source_ue)
source_ue->target_ue = NULL;
return CORE_OK;
}
/*
* mme_ue is deassociated with source_ue like the following conditions
*
* S1AP UE Context Release Complete : enb_ue_remove()
*/
status_t mme_ue_deassociate_source_ue(enb_ue_t *source_ue)
{
enb_ue_t *target_ue = NULL;
d_assert(source_ue, return CORE_ERROR,);
d_assert(enb_ue, return CORE_ERROR,);
target_ue = source_ue->target_ue;
if (target_ue)
if (enb_ue->target_ue)
{
source_ue = enb_ue;
target_ue = enb_ue->target_ue;
d_assert(source_ue->target_ue, return CORE_ERROR,);
d_assert(target_ue->source_ue, return CORE_ERROR,);
source_ue->target_ue = NULL;
target_ue->source_ue = NULL;
else if (source_ue->mme_ue)
source_ue->mme_ue->enb_ue = NULL;
}
else if (enb_ue->source_ue)
{
target_ue = enb_ue;
source_ue = enb_ue->source_ue;
d_assert(source_ue->target_ue, return CORE_ERROR,);
d_assert(target_ue->source_ue, return CORE_ERROR,);
source_ue->target_ue = NULL;
target_ue->source_ue = NULL;
}
return CORE_OK;
}

View File

@ -465,10 +465,11 @@ CORE_DECLARE(status_t) mme_ue_set_imsi(
mme_ue_t *mme_ue, c_int8_t *imsi_bcd);
CORE_DECLARE(status_t) mme_ue_associate_enb_ue(
mme_ue_t *mme_ue, enb_ue_t *enb_ue);
CORE_DECLARE(status_t) mme_ue_associate_target_ue(
mme_ue_t *mme_ue, enb_ue_t *target_ue);
CORE_DECLARE(status_t) mme_ue_deassociate_target_ue(enb_ue_t *target_ue);
CORE_DECLARE(status_t) mme_ue_deassociate_source_ue(enb_ue_t *source_ue);
CORE_DECLARE(status_t) mme_ue_deassociate_enb_ue(
mme_ue_t *mme_ue, enb_ue_t *enb_ue);
CORE_DECLARE(status_t) source_ue_associate_target_ue(
enb_ue_t *source_ue, enb_ue_t *target_ue);
CORE_DECLARE(status_t) source_ue_deassociate_target_ue(enb_ue_t *enb_ue);
CORE_DECLARE(hash_index_t *) mme_ue_first();
CORE_DECLARE(hash_index_t *) mme_ue_next(hash_index_t *hi);

View File

@ -759,10 +759,10 @@ void s1ap_handle_handover_request_ack(mme_enb_t *enb, s1ap_message_t *message)
target_ue->enb_ue_s1ap_id = ies->eNB_UE_S1AP_ID;
mme_ue = target_ue->mme_ue;
d_assert(mme_ue, return,);
source_ue = target_ue->source_ue;
d_assert(source_ue, return,);
mme_ue = source_ue->mme_ue;
d_assert(mme_ue, return,);
for (i = 0; i < ies->e_RABAdmittedList.s1ap_E_RABAdmittedItem.count; i++)
{
@ -855,8 +855,6 @@ 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");
mme_ue_deassociate_target_ue(target_ue);
cause.present = S1ap_Cause_PR_radioNetwork;
cause.choice.nas = S1ap_CauseRadioNetwork_ho_failure_in_target_EPC_eNB_or_target_system;
@ -902,12 +900,10 @@ 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");
mme_ue_deassociate_target_ue(target_ue);
cause.present = S1ap_Cause_PR_radioNetwork;
cause.choice.nas = S1ap_CauseRadioNetwork_handover_cancelled;
rv = s1ap_send_ue_context_release_commmand(target_ue, &cause, 0);
rv = s1ap_send_ue_context_release_commmand(target_ue, &cause, 300);
d_assert(rv == CORE_OK, return, "s1ap send error");
d_trace(3, "[S1AP] Handover Cancel : "
@ -953,6 +949,7 @@ void s1ap_handle_handover_notification(mme_enb_t *enb, s1ap_message_t *message)
status_t rv;
char buf[INET_ADDRSTRLEN];
enb_ue_t *source_ue = NULL;
enb_ue_t *target_ue = NULL;
mme_ue_t *mme_ue = NULL;
mme_sess_t *sess = NULL;
@ -994,7 +991,9 @@ void s1ap_handle_handover_notification(mme_enb_t *enb, s1ap_message_t *message)
"Conflict MME-UE-S1AP-ID : %d != %d\n",
target_ue->mme_ue_s1ap_id, ies->mme_ue_s1ap_id);
mme_ue = target_ue->mme_ue;
source_ue = target_ue->source_ue;
d_assert(source_ue, return,);
mme_ue = source_ue->mme_ue;
d_assert(mme_ue, return,);
mme_ue_associate_enb_ue(mme_ue, target_ue);

View File

@ -570,7 +570,8 @@ status_t s1ap_send_handover_request(
target_ue = enb_ue_add(target_enb);
d_assert(target_ue, return CORE_ERROR,);
mme_ue_associate_target_ue(mme_ue, target_ue);
rv = source_ue_associate_target_ue(source_ue, target_ue);
d_assert(rv == CORE_OK, return CORE_ERROR,);
rv = s1ap_build_handover_request(&s1apbuf, mme_ue, target_ue, ies);
d_assert(rv == CORE_OK && s1apbuf,

View File

@ -694,14 +694,19 @@ static void handover_test2(abts_case *tc, void *data)
ABTS_INT_NEQUAL(tc, 0, rc);
pkbuf_free(recvbuf);
#if 0
/* Send Handover Cancel */
rv = tests1ap_build_handover_cancel(&sendbuf, 0);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
rv = tests1ap_enb_send(sock1, sendbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
/* Receive UE Context Release Command */
/* Recv Handover Cancel Ack */
recvbuf = pkbuf_alloc(0, MAX_SDU_LEN);
rc = tests1ap_enb_read(sock1, recvbuf);
ABTS_INT_NEQUAL(tc, 0, rc);
pkbuf_free(recvbuf);
/* Recv UE Context Relase Command */
recvbuf = pkbuf_alloc(0, MAX_SDU_LEN);
rc = tests1ap_enb_read(sock2, recvbuf);
ABTS_INT_NEQUAL(tc, 0, rc);
@ -714,7 +719,6 @@ static void handover_test2(abts_case *tc, void *data)
ABTS_INT_EQUAL(tc, CORE_OK, rv);
core_sleep(time_from_msec(300));
#endif
/********** Remove Subscriber in Database */
doc = BCON_NEW("imsi", BCON_UTF8("001010123456815"));