[#256] Remove timer of NAS message related to S1AP

This commit is contained in:
Sukchan Lee 2019-11-18 09:04:10 +09:00
parent 835b3c9851
commit a622feac84
15 changed files with 13 additions and 135 deletions

View File

@ -844,8 +844,6 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
ogs_debug("[EMM] Attach complete");
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
CLEAR_MME_UE_TIMER(mme_ue->t3450);
rv = emm_handle_attach_complete(
mme_ue, &message->emm.attach_complete);
if (rv != OGS_OK) {
@ -900,20 +898,6 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
break;
case MME_EVT_EMM_TIMER:
switch (e->timer_id) {
case MME_TIMER_T3450:
if (mme_ue->t3450.retry_count >=
mme_timer_cfg(MME_TIMER_T3450)->max_count) {
ogs_warn("[EMM] Retransmission of IMSI[%s] failed. "
"Stop retransmission",
mme_ue->imsi_bcd);
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
/* NOTE: Do I need to send Attach-Reject */
} else {
mme_ue->t3450.retry_count++;
nas_send_attach_accept(mme_ue);
}
break;
default:
ogs_error("Unknown timer[%s:%d]",
mme_timer_get_name(e->timer_id), e->timer_id);

View File

@ -144,7 +144,6 @@ int esm_handle_information_response(mme_sess_t *sess,
if (csmap) {
sgsap_send_location_update_request(mme_ue);
} else {
CLEAR_MME_UE_TIMER(mme_ue->t3450);
nas_send_attach_accept(mme_ue);
}
} else {

View File

@ -2028,9 +2028,6 @@ enb_ue_t *enb_ue_add(mme_enb_t *enb)
enb_ue->enb = enb;
enb_ue->t_ue_context_release.timer = ogs_timer_add(
self.timer_mgr, mme_timer_ue_context_release, enb_ue);
ogs_hash_set(self.mme_ue_s1ap_id_hash, &enb_ue->mme_ue_s1ap_id,
sizeof(enb_ue->mme_ue_s1ap_id), enb_ue);
ogs_list_add(&enb->enb_ue_list, enb_ue);
@ -2052,9 +2049,6 @@ void enb_ue_remove(enb_ue_t *enb_ue)
ogs_assert(enb_ue);
ogs_assert(enb_ue->enb);
CLEAR_ENB_UE_ALL_TIMERS(enb_ue);
ogs_timer_delete(enb_ue->t_ue_context_release.timer);
/* De-associate S1 with NAS/EMM */
enb_ue_deassociate(enb_ue);

View File

@ -270,25 +270,6 @@ struct enb_ue_s {
#define S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL 4
uint8_t ue_ctx_rel_action;
#define CLEAR_ENB_UE_ALL_TIMERS(__eNB) \
do { \
CLEAR_ENB_UE_TIMER((__eNB)->t_ue_context_release); \
} while(0);
#define CLEAR_ENB_UE_TIMER(__eNB_UE_TIMER) \
do { \
ogs_timer_stop((__eNB_UE_TIMER).timer); \
if ((__eNB_UE_TIMER).pkbuf) { \
ogs_pkbuf_free((__eNB_UE_TIMER).pkbuf); \
(__eNB_UE_TIMER).pkbuf = NULL; \
} \
(__eNB_UE_TIMER).retry_count = 0; \
} while(0);
struct {
ogs_pkbuf_t *pkbuf;
ogs_timer_t *timer;
uint32_t retry_count;;
} t_ue_context_release;
/* Related Context */
mme_enb_t *enb;
mme_ue_t *mme_ue;

View File

@ -92,7 +92,6 @@ static void timeout(ogs_gtp_xact_t *xact, void *data)
enb_ue = mme_ue->enb_ue;
if (enb_ue) {
CLEAR_ENB_UE_TIMER(enb_ue->t_ue_context_release);
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);

View File

@ -42,7 +42,6 @@ void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue)
} else {
enb_ue_t *enb_ue = mme_ue->enb_ue;
if (enb_ue) {
CLEAR_ENB_UE_TIMER(enb_ue->t_ue_context_release);
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
@ -61,7 +60,6 @@ void mme_send_delete_session_or_enb_ue_context_release(enb_ue_t *enb_ue)
if (mme_ue && SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
mme_gtp_send_delete_all_sessions(mme_ue);
} else {
CLEAR_ENB_UE_TIMER(enb_ue->t_ue_context_release);
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0);
@ -84,7 +82,6 @@ void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue)
}
} else {
ogs_debug("No UE Context");
CLEAR_ENB_UE_TIMER(enb_ue->t_ue_context_release);
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0);

View File

@ -148,7 +148,6 @@ void mme_s11_handle_create_session_response(
if (csmap) {
sgsap_send_location_update_request(mme_ue);
} else {
CLEAR_MME_UE_TIMER(mme_ue->t3450);
nas_send_attach_accept(mme_ue);
}
@ -208,7 +207,6 @@ void mme_s11_handle_modify_bearer_response(
source_ue = target_ue->source_ue;
ogs_assert(source_ue);
CLEAR_ENB_UE_TIMER(source_ue->t_ue_context_release);
s1ap_send_ue_context_release_command(source_ue,
S1AP_Cause_PR_radioNetwork,
S1AP_CauseRadioNetwork_successful_handover,
@ -290,7 +288,6 @@ void mme_s11_handle_delete_session_response(
enb_ue = mme_ue->enb_ue;
if (enb_ue) {
CLEAR_ENB_UE_TIMER(enb_ue->t_ue_context_release);
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
@ -307,7 +304,6 @@ void mme_s11_handle_delete_session_response(
enb_ue = mme_ue->enb_ue;
if (enb_ue) {
CLEAR_ENB_UE_TIMER(enb_ue->t_ue_context_release);
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
@ -629,7 +625,6 @@ void mme_s11_handle_release_access_bearers_response(
enb_ue = mme_ue->enb_ue;
if (enb_ue) {
CLEAR_ENB_UE_TIMER(enb_ue->t_ue_context_release);
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0);

View File

@ -361,7 +361,6 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
enb_ue = mme_ue->enb_ue;
ogs_assert(enb_ue);
CLEAR_ENB_UE_TIMER(enb_ue->t_ue_context_release);
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);

View File

@ -22,9 +22,6 @@
#include "mme-context.h"
static mme_timer_cfg_t g_mme_timer_cfg[MAX_NUM_OF_MME_TIMER] = {
[MME_TIMER_UE_CONTEXT_RELEASE] =
{ .max_count = 2, .duration = ogs_time_from_sec(1) },
/* Paging procedure for EPS services initiated */
[MME_TIMER_T3413] =
{ .max_count = 2, .duration = ogs_time_from_sec(2) },
@ -73,8 +70,6 @@ const char *mme_timer_get_name(mme_timer_e id)
switch (id) {
case MME_TIMER_S1_DELAYED_SEND:
return "MME_TIMER_S1_DELAYED_SEND";
case MME_TIMER_UE_CONTEXT_RELEASE:
return "MME_TIMER_UE_CONTEXT_RELEASE";
case MME_TIMER_T3413:
return "MME_TIMER_T3413";
case MME_TIMER_T3422:
@ -113,30 +108,6 @@ void mme_timer_s1_delayed_send(void *data)
}
static void s1_timer_event_send(
mme_timer_e timer_id, enb_ue_t *enb_ue)
{
int rv;
mme_event_t *e = NULL;
ogs_assert(enb_ue);
e = mme_event_new(MME_EVT_S1AP_TIMER);
e->timer_id = timer_id;
e->enb_ue = enb_ue;
e->enb = enb_ue->enb;
rv = ogs_queue_push(mme_self()->queue, e);
if (rv != OGS_OK) {
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
mme_event_free(e);
}
}
void mme_timer_ue_context_release(void *data)
{
s1_timer_event_send(MME_TIMER_UE_CONTEXT_RELEASE, data);
}
static void emm_timer_event_send(
mme_timer_e timer_id, mme_ue_t *mme_ue)
{

View File

@ -32,8 +32,6 @@ typedef enum {
MME_TIMER_S1_DELAYED_SEND,
MME_TIMER_UE_CONTEXT_RELEASE,
MME_TIMER_T3413,
MME_TIMER_T3422,
MME_TIMER_T3450,
@ -57,7 +55,6 @@ mme_timer_cfg_t *mme_timer_cfg(mme_timer_e id);
const char *mme_timer_get_name(mme_timer_e id);
void mme_timer_s1_delayed_send(void *data);
void mme_timer_ue_context_release(void *data);
void mme_timer_t3413_expire(void *data);
void mme_timer_t3422_expire(void *data);

View File

@ -99,23 +99,14 @@ int nas_send_attach_accept(mme_ue_t *mme_ue)
ogs_assert(bearer);
ogs_assert(mme_bearer_next(bearer) == NULL);
if (mme_ue->t3450.pkbuf) {
s1apbuf = mme_ue->t3450.pkbuf;
rv = esm_build_activate_default_bearer_context_request(&esmbuf, sess);
ogs_assert(rv == OGS_OK && esmbuf);
} else {
rv = esm_build_activate_default_bearer_context_request(&esmbuf, sess);
ogs_assert(rv == OGS_OK && esmbuf);
rv = emm_build_attach_accept(&emmbuf, mme_ue, esmbuf);
ogs_assert(rv == OGS_OK && emmbuf);
rv = emm_build_attach_accept(&emmbuf, mme_ue, esmbuf);
ogs_assert(rv == OGS_OK && emmbuf);
rv = s1ap_build_initial_context_setup_request(&s1apbuf, mme_ue, emmbuf);
ogs_assert(rv == OGS_OK && s1apbuf);
}
mme_ue->t3450.pkbuf = ogs_pkbuf_copy(s1apbuf);
ogs_timer_start(mme_ue->t3450.timer,
mme_timer_cfg(MME_TIMER_T3450)->duration);
rv = s1ap_build_initial_context_setup_request(&s1apbuf, mme_ue, emmbuf);
ogs_assert(rv == OGS_OK && s1apbuf);
rv = nas_send_to_enb(mme_ue, s1apbuf);
ogs_assert(rv == OGS_OK);
@ -272,7 +263,6 @@ void nas_send_detach_accept(mme_ue_t *mme_ue)
ogs_assert(rv == OGS_OK);
}
CLEAR_ENB_UE_TIMER(enb_ue->t_ue_context_release);
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_detach,
S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0);

View File

@ -1595,7 +1595,6 @@ void s1ap_handle_handover_failure(mme_enb_t *enb, ogs_s1ap_message_t *message)
rv = s1ap_send_handover_preparation_failure(source_ue, Cause);
ogs_assert(rv == OGS_OK);
CLEAR_ENB_UE_TIMER(target_ue->t_ue_context_release);
s1ap_send_ue_context_release_command(
target_ue, S1AP_Cause_PR_radioNetwork,
S1AP_CauseRadioNetwork_ho_failure_in_target_EPC_eNB_or_target_system,
@ -1667,7 +1666,6 @@ void s1ap_handle_handover_cancel(mme_enb_t *enb, ogs_s1ap_message_t *message)
rv = s1ap_send_handover_cancel_ack(source_ue);
ogs_assert(rv == OGS_OK);
CLEAR_ENB_UE_TIMER(target_ue->t_ue_context_release);
s1ap_send_ue_context_release_command(
target_ue, S1AP_Cause_PR_radioNetwork,
S1AP_CauseRadioNetwork_handover_cancelled,

View File

@ -299,23 +299,15 @@ void s1ap_send_ue_context_release_command(
rv = s1ap_delayed_send_to_enb_ue(enb_ue, s1apbuf, delay);
ogs_assert(rv == OGS_OK);
} else {
if (enb_ue->t_ue_context_release.pkbuf) {
s1apbuf = enb_ue->t_ue_context_release.pkbuf;
} else {
ogs_assert(action != S1AP_UE_CTX_REL_INVALID_ACTION);
enb_ue->ue_ctx_rel_action = action;
ogs_assert(action != S1AP_UE_CTX_REL_INVALID_ACTION);
enb_ue->ue_ctx_rel_action = action;
ogs_debug(" Group[%d] Cause[%d] Action[%d] Delay[%d]",
group, (int)cause, action, delay);
ogs_debug(" Group[%d] Cause[%d] Action[%d] Delay[%d]",
group, (int)cause, action, delay);
rv = s1ap_build_ue_context_release_command(
&s1apbuf, enb_ue, group, cause);
ogs_assert(rv == OGS_OK && s1apbuf);
}
enb_ue->t_ue_context_release.pkbuf = ogs_pkbuf_copy(s1apbuf);
ogs_timer_start(enb_ue->t_ue_context_release.timer,
mme_timer_cfg(MME_TIMER_UE_CONTEXT_RELEASE)->duration);
rv = s1ap_build_ue_context_release_command(
&s1apbuf, enb_ue, group, cause);
ogs_assert(rv == OGS_OK && s1apbuf);
rv = s1ap_delayed_send_to_enb_ue(enb_ue, s1apbuf, 0);
ogs_assert(rv == OGS_OK);

View File

@ -194,23 +194,6 @@ void s1ap_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_assert(OGS_OK == s1ap_send_to_enb_ue(e->enb_ue, e->pkbuf));
ogs_timer_delete(e->timer);
break;
case MME_TIMER_UE_CONTEXT_RELEASE:
ogs_assert(e->enb_ue);
if (e->enb_ue->t_ue_context_release.retry_count >=
mme_timer_cfg(MME_TIMER_UE_CONTEXT_RELEASE)->max_count) {
ogs_warn("[S1AP] UE Context Release failed. Stop Releasing");
CLEAR_ENB_UE_TIMER(e->enb_ue->t_ue_context_release);
} else {
e->enb_ue->t_ue_context_release.retry_count++;
/*
* If timeout, the saved pkbuf is used.
* We don't have to set function parameter.
* So, we just set all parameters to 0
*/
s1ap_send_ue_context_release_command(e->enb_ue, 0, 0, 0, 0);
}
break;
default:
ogs_error("Unknown timer[%s:%d]",
mme_timer_get_name(e->timer_id), e->timer_id);

View File

@ -101,7 +101,6 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_debug(" P-TMSI[0x%08x]", mme_ue->p_tmsi);
}
CLEAR_MME_UE_TIMER(mme_ue->t3450);
nas_send_attach_accept(mme_ue);
return;