[#256] Remove timer of NAS message related to S1AP
This commit is contained in:
parent
835b3c9851
commit
a622feac84
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue