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:
Sukchan Lee 2018-01-11 22:12:48 +09:00
parent 1498f6c015
commit 47dc5eec38
14 changed files with 86 additions and 75 deletions

View File

@ -78,7 +78,8 @@ status_t emm_handle_attach_request(
nas_send_attach_reject(mme_ue,
S1ap_CauseNas_unspecified,
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;
}

View File

@ -515,7 +515,7 @@ void emm_state_default_esm(fsm_t *s, event_t *e)
cause.choice.nas = S1ap_CauseNas_normal_release;
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");
FSM_TRAN(s, &emm_state_attached);
break;

View File

@ -159,10 +159,18 @@ struct _enb_ue_t {
*
* Save TAI and ECGI. And then, this will copy 'mme_ue_t' context later */
struct {
tai_t tai;
e_cgi_t e_cgi;
tai_t tai;
e_cgi_t e_cgi;
} 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 */
mme_enb_t *enb;
mme_ue_t *mme_ue;

View File

@ -139,7 +139,8 @@ void mme_s11_handle_modify_bearer_response(
cause.present = S1ap_Cause_PR_nas;
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");
);
}
@ -319,7 +320,8 @@ void mme_s11_handle_release_access_bearers_response(
cause.present = S1ap_Cause_PR_nas;
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");
}

View File

@ -336,7 +336,8 @@ void mme_state_operational(fsm_t *s, event_t *e)
rv = nas_send_attach_reject(mme_ue,
S1ap_CauseNas_authentication_failure,
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,,
"nas_send_attach_reject failed");

View File

@ -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,
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;
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.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");
return rv;
@ -201,7 +203,8 @@ status_t nas_send_detach_accept(mme_ue_t *mme_ue)
/* 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, 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");
return CORE_OK;
@ -358,7 +361,8 @@ status_t nas_send_tau_accept(mme_ue_t *mme_ue)
* 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, 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");
}
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 ? */
cause.present = S1ap_Cause_PR_nas;
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");
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 ? */
cause.present = S1ap_Cause_PR_nas;
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");
return CORE_OK;

View File

@ -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_reject(mme_ue_t *mme_ue,
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(
mme_ue_t *mme_ue, e_utran_vector_t *e_utran_vector);

View File

@ -519,8 +519,9 @@ status_t s1ap_build_ue_context_release_commmand(
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",
ies->cause.present, ies->cause.choice.radioNetwork,
enb_ue->mme_ue_s1ap_id,
CORE_ADDR(enb_ue->enb->addr, buf), enb_ue->enb->enb_id);

View File

@ -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);
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",
ies->cause.present, ies->cause.choice.radioNetwork,
enb_ue->mme_ue_s1ap_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.choice.nas = S1ap_CauseNas_normal_release;
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");
}
}
@ -458,27 +459,16 @@ void s1ap_handle_ue_context_release_request(
case S1ap_Cause_PR_transport:
{
S1ap_Cause_t cause;
const char *cause_string = NULL;
if (ies->cause.choice.transport ==
S1ap_CauseTransport_transport_resource_unavailable)
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,
d_warn("[S1AP] UE Context Release Request[Transport Cause: %d]",
ies->cause.choice.transport,
enb_ue->enb_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
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");
break;
@ -505,11 +495,9 @@ void s1ap_handle_ue_context_release_complete(
status_t rv;
char buf[CORE_ADDRSTRLEN];
c_uint8_t ue_ctx_rel_action = 0;
enb_ue_t *enb_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;
ies = &message->s1ap_UEContextReleaseComplete_IEs;
@ -523,40 +511,36 @@ void s1ap_handle_ue_context_release_complete(
enb_ue->mme_ue_s1ap_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);
mme_ue = enb_ue->mme_ue;
if (mme_ue)
{
sess = mme_sess_first(mme_ue);
while(sess)
switch (ue_ctx_rel_action)
{
bearer = mme_bearer_first(sess);
while(bearer)
case S1AP_UE_CTX_REL_NO_ACTION:
{
if (MME_HAVE_SGW_DL_INDIRECT_TUNNEL(bearer) ||
MME_HAVE_SGW_UL_INDIRECT_TUNNEL(bearer))
{
need_to_delete_indirect_tunnel = 1;
}
bearer = mme_bearer_next(bearer);
break;
}
sess = mme_sess_next(sess);
}
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))
case S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT:
{
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.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_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.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_trace(3, "[S1AP] Handover Cancel : "

View File

@ -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(
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;
mme_enb_t *enb = 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");
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");

View File

@ -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(
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_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_failure(mme_enb_t *enb,

View File

@ -393,6 +393,8 @@ static void attach_test1(abts_case *tc, void *data)
rv = tests1ap_enb_send(sock, sendbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
core_sleep(time_from_msec(300));
/* eNB disonncect from MME */
rv = tests1ap_enb_close(sock);
ABTS_INT_EQUAL(tc, CORE_OK, rv);

View File

@ -169,7 +169,7 @@ status_t tests1ap_build_initial_ue_msg(pkbuf_t **pkbuf, int i)
"004300060000f110 3039006440080055 f5010019d0100086 400130",
"000c40809c00"
"0005000800030001 00001a007372178c 3e3cff070741020b f600f11000020100"
"0005000800030003 00001a007372178c 3e3cff070741020b f600f11000020100"
"00000905e060c040 0100210204d011d1 271a808021100100 0010810600000000"
"830600000000000d 00000a005255f501 10225c0a003103e5 c03e1355f501aaaa"
"11035758a6200b60 1404ef65233b8878 d290400804026004 00021f025d0107e0"
@ -254,7 +254,7 @@ status_t tests1ap_build_identity_response(pkbuf_t **pkbuf, int i)
"",
"",
"000d"
"403f000005000000 05c00100009f0008 0003000100001a00 121117d7e3248b57"
"403f000005000000 05c00100009f0008 0003000300001a00 121117d7e3248b57"
"0756080910101032 5486510064400800 00f11054f6401000 4340060000f1105b"
"a0",
@ -480,7 +480,7 @@ status_t tests1ap_build_esm_information_response(pkbuf_t **pkbuf, int i)
"9a2626c09a2626c0 9a2626c223150200 0015103d3dda5c72 4cc497354ae64653"
"45a8088021100100 0010810600000000 830600000000000d 00000a0000644008"
"0000f1101079baf0 004340060000f110 5ba0",
"000d40808d000005 00000005c0010000 9d00080002000100 1a00616027c963b5"
"000d40808d000005 00000005c0010000 9e00080002000200 1a00616027c963b5"
"1b010221da280908 696e7465726e6574 274a80c223150100 001510c09a2626c0"
"9a2626c09a2626c0 9a2626c223150200 0015103d3dda5c72 4cc497354ae64653"
"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)
{
char *payload[TESTS1AP_MAX_MESSAGE] = {
"000c404900000600 080003000100001a 001615172ba435db 040745090bf600f1"
"000c404900000600 080003000200001a 001615172ba435db 040745090bf600f1"
"10000201020003e6 004300060000f110 2b67006440080000 f1109d67aa500086"
"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)
{
char *payload[TESTS1AP_MAX_MESSAGE] = {
"2017001300000200 004005c00100009d 00084003400527",
"2017001300000200 004005c00100009e 00084003400002",
"",
"2017"
"0012000002000040 05c00100009f0008 40020001",
"0012000002000040 05c00100009f0008 40020003",
"",
"",

View File

@ -169,7 +169,7 @@ status_t tests1ap_build_initial_ue_msg(pkbuf_t **pkbuf, int i)
"004300060000f110 3039006440080055 f5010019d0100086 400130",
"000c40809c00"
"0005000800030001 00001a007372178c 3e3cff070741020b f600f11000020100"
"0005000800030003 00001a007372178c 3e3cff070741020b f600f11000020100"
"00000905e060c040 0100210204d011d1 271a808021100100 0010810600000000"
"830600000000000d 00000a005255f501 10225c0a003103e5 c03e1355f501aaaa"
"11035758a6200b60 1404ef65233b8878 d290400804026004 00021f025d0107e0"
@ -254,7 +254,7 @@ status_t tests1ap_build_identity_response(pkbuf_t **pkbuf, int i)
"",
"",
"000d"
"403f000005000000 05c00100009f0008 0003000100001a00 121117d7e3248b57"
"403f000005000000 05c00100009f0008 0003000300001a00 121117d7e3248b57"
"0756080910101032 5486510064400800 00f11054f6401000 4340060000f1105b"
"a0",
@ -480,7 +480,7 @@ status_t tests1ap_build_esm_information_response(pkbuf_t **pkbuf, int i)
"9a2626c09a2626c0 9a2626c223150200 0015103d3dda5c72 4cc497354ae64653"
"45a8088021100100 0010810600000000 830600000000000d 00000a0000644008"
"0000f1101079baf0 004340060000f110 5ba0",
"000d40808d000005 00000005c0010000 9d00080002000100 1a00616027c963b5"
"000d40808d000005 00000005c0010000 9e00080002000200 1a00616027c963b5"
"1b010221da280908 696e7465726e6574 274a80c223150100 001510c09a2626c0"
"9a2626c09a2626c0 9a2626c223150200 0015103d3dda5c72 4cc497354ae64653"
"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)
{
char *payload[TESTS1AP_MAX_MESSAGE] = {
"000c404900000600 080003000100001a 001615172ba435db 040745090bf600f1"
"000c404900000600 080003000200001a 001615172ba435db 040745090bf600f1"
"10000201020003e6 004300060000f110 2b67006440080000 f1109d67aa500086"
"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)
{
char *payload[TESTS1AP_MAX_MESSAGE] = {
"2017001300000200 004005c00100009d 00084003400527",
"2017001300000200 004005c00100009e 00084003400002",
"",
"2017"
"0012000002000040 05c00100009f0008 40020001",
"0012000002000040 05c00100009f0008 40020003",
"",
"",