diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index f1aae60ac..1257b5b49 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -1400,6 +1400,15 @@ void ngap_handle_ue_context_release_action(ran_ue_t *ran_ue) ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); if (amf_ue) { ogs_info(" SUCI[%s]", amf_ue->suci ? amf_ue->suci : "Unknown"); + + /* + * An assert occurs when a NAS message retransmission occurs. + * + * Because there is no `ran_ue` context. + * + * Therefore, before removing `ran_ue`, all Timers must be stopped + * to prevent retransmission of NAS messages. + */ CLEAR_AMF_UE_ALL_TIMERS(amf_ue); } diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index cfe870d6c..5f7691183 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -422,11 +422,20 @@ struct mme_ue_s { #define CLEAR_MME_UE_ALL_TIMERS(__mME) \ do { \ + mme_sess_t *sess = NULL; \ + mme_bearer_t *bearer = NULL; \ + \ CLEAR_MME_UE_TIMER((__mME)->t3413); \ CLEAR_MME_UE_TIMER((__mME)->t3422); \ CLEAR_MME_UE_TIMER((__mME)->t3450); \ CLEAR_MME_UE_TIMER((__mME)->t3460); \ CLEAR_MME_UE_TIMER((__mME)->t3470); \ + \ + ogs_list_for_each(&mme_ue->sess_list, sess) { \ + ogs_list_for_each(&sess->bearer_list, bearer) { \ + CLEAR_BEARER_ALL_TIMERS(bearer); \ + } \ + } \ } while(0); #define CLEAR_MME_UE_TIMER(__mME_UE_TIMER) \ do { \ diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index 72e9e23d6..eefa1346d 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -1385,6 +1385,15 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); if (mme_ue) { ogs_info(" IMSI[%s]", mme_ue->imsi_bcd); + + /* + * An assert occurs when a NAS message retransmission occurs. + * + * Because there is no `enb_ue` context. + * + * Therefore, before removing enb_ue, all Timers must be stopped + * to prevent retransmission of NAS messages. + */ CLEAR_MME_UE_ALL_TIMERS(mme_ue); }