forked from acouzens/open5gs
MME can support S1-handover without creating indirect tunnel
This commit is contained in:
parent
c31dfb507d
commit
6c3390bf30
|
@ -2235,6 +2235,54 @@ status_t mme_ue_set_imsi(mme_ue_t *mme_ue, c_int8_t *imsi_bcd)
|
|||
return CORE_OK;
|
||||
}
|
||||
|
||||
int mme_ue_have_indirect_tunnel(mme_ue_t *mme_ue)
|
||||
{
|
||||
mme_sess_t *sess = NULL;
|
||||
|
||||
sess = mme_sess_first(mme_ue);
|
||||
while(sess)
|
||||
{
|
||||
mme_bearer_t *bearer = mme_bearer_first(sess);
|
||||
while(bearer)
|
||||
{
|
||||
if (MME_HAVE_ENB_DL_INDIRECT_TUNNEL(bearer) ||
|
||||
MME_HAVE_ENB_UL_INDIRECT_TUNNEL(bearer) ||
|
||||
MME_HAVE_SGW_DL_INDIRECT_TUNNEL(bearer) ||
|
||||
MME_HAVE_SGW_UL_INDIRECT_TUNNEL(bearer))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
bearer = mme_bearer_next(bearer);
|
||||
}
|
||||
sess = mme_sess_next(sess);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
status_t mme_ue_clear_indirect_tunnel(mme_ue_t *mme_ue)
|
||||
{
|
||||
mme_sess_t *sess = NULL;
|
||||
|
||||
d_assert(mme_ue, return CORE_ERROR,);
|
||||
|
||||
sess = mme_sess_first(mme_ue);
|
||||
while(sess)
|
||||
{
|
||||
mme_bearer_t *bearer = mme_bearer_first(sess);
|
||||
while(bearer)
|
||||
{
|
||||
CLEAR_INDIRECT_TUNNEL(bearer);
|
||||
|
||||
bearer = mme_bearer_next(bearer);
|
||||
}
|
||||
sess = mme_sess_next(sess);
|
||||
}
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t mme_ue_associate_enb_ue(mme_ue_t *mme_ue, enb_ue_t *enb_ue)
|
||||
{
|
||||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
|
|
|
@ -548,6 +548,9 @@ CORE_DECLARE(mme_ue_t*) mme_ue_find_by_message(nas_message_t *message);
|
|||
CORE_DECLARE(status_t) mme_ue_set_imsi(
|
||||
mme_ue_t *mme_ue, c_int8_t *imsi_bcd);
|
||||
|
||||
CORE_DECLARE(int) mme_ue_have_indirect_tunnel(mme_ue_t *mme_ue);
|
||||
CORE_DECLARE(status_t) mme_ue_clear_indirect_tunnel(mme_ue_t *mme_ue);
|
||||
|
||||
/*
|
||||
* o RECV Initial UE-Message : S-TMSI
|
||||
* o RECV Attach Request : IMSI, GUTI
|
||||
|
|
|
@ -643,9 +643,6 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
|
|||
{
|
||||
status_t rv;
|
||||
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
|
||||
d_assert(xact, return, "Null param");
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
d_assert(rsp, return, "Null param");
|
||||
|
@ -660,18 +657,8 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
|
|||
mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid);
|
||||
|
||||
rv = gtp_xact_commit(xact);
|
||||
d_assert(rv == CORE_OK, return, "xact_commit error");
|
||||
d_assert(rv == CORE_OK,, "xact_commit error");
|
||||
|
||||
sess = mme_sess_first(mme_ue);
|
||||
while(sess)
|
||||
{
|
||||
bearer = mme_bearer_first(sess);
|
||||
while(bearer)
|
||||
{
|
||||
CLEAR_INDIRECT_TUNNEL(bearer);
|
||||
|
||||
bearer = mme_bearer_next(bearer);
|
||||
}
|
||||
sess = mme_sess_next(sess);
|
||||
}
|
||||
rv = mme_ue_clear_indirect_tunnel(mme_ue);
|
||||
d_assert(rv == CORE_OK,, "mme_ue_clear_indirect_tunnel() failed");
|
||||
}
|
||||
|
|
|
@ -716,7 +716,7 @@ void s1ap_handle_ue_context_release_complete(
|
|||
d_assert(rv == CORE_OK,, "enb_ue_removeI() failed");
|
||||
|
||||
d_assert(mme_ue,,);
|
||||
if (SESSION_CONTEXT_IS_AVAILABLE(mme_ue))
|
||||
if (mme_ue_have_indirect_tunnel(mme_ue))
|
||||
{
|
||||
rv = mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(mme_ue);
|
||||
d_assert(rv == CORE_OK,, "mme_gtp_send_delete_indirect_data_"
|
||||
|
@ -724,22 +724,12 @@ void s1ap_handle_ue_context_release_complete(
|
|||
}
|
||||
else
|
||||
{
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
|
||||
d_warn("GTP-C(S11) has already been deleted");
|
||||
sess = mme_sess_first(mme_ue);
|
||||
while(sess)
|
||||
{
|
||||
bearer = mme_bearer_first(sess);
|
||||
while(bearer)
|
||||
{
|
||||
CLEAR_INDIRECT_TUNNEL(bearer);
|
||||
|
||||
bearer = mme_bearer_next(bearer);
|
||||
}
|
||||
sess = mme_sess_next(sess);
|
||||
}
|
||||
d_warn("Check your eNodeB");
|
||||
d_warn(" There is no INDIRECT TUNNEL");
|
||||
d_warn(" Packet could be dropped during S1-Handover");
|
||||
rv = mme_ue_clear_indirect_tunnel(mme_ue);
|
||||
d_assert(rv == CORE_OK,,
|
||||
"mme_ue_clear_indirect_tunnel() failed");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -1080,7 +1070,7 @@ void s1ap_handle_handover_request_ack(mme_enb_t *enb, s1ap_message_t *message)
|
|||
S1AP_STORE_DATA(
|
||||
&mme_ue->container, &ies->target_ToSource_TransparentContainer);
|
||||
|
||||
if (i > 0)
|
||||
if (mme_ue_have_indirect_tunnel(mme_ue) == 1)
|
||||
{
|
||||
rv = mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
||||
mme_ue);
|
||||
|
|
|
@ -613,6 +613,8 @@ static void handover_test2(abts_case *tc, void *data)
|
|||
|
||||
core_sleep(time_from_msec(300));
|
||||
|
||||
/* Send ENB configuration transfer */
|
||||
#if 0
|
||||
rv = tests1ap_build_enb_configuration_transfer(&sendbuf, 0);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
rv = tests1ap_enb_send(sock1, sendbuf);
|
||||
|
@ -620,6 +622,8 @@ static void handover_test2(abts_case *tc, void *data)
|
|||
|
||||
core_sleep(time_from_msec(300));
|
||||
|
||||
goto out;
|
||||
#else
|
||||
/* Send Handover Required */
|
||||
rv = tests1ap_build_handover_required(&sendbuf, 0);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
|
@ -818,6 +822,7 @@ static void handover_test2(abts_case *tc, void *data)
|
|||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
|
||||
core_sleep(time_from_msec(300));
|
||||
#endif
|
||||
|
||||
out:
|
||||
/********** Remove Subscriber in Database */
|
||||
|
|
Loading…
Reference in New Issue