Fix the bug for S1-reset or eNB-restart(#627)

This commit is contained in:
Sukchan Lee 2020-10-28 22:59:27 -04:00
parent 3cbec5f2e6
commit 93312e8f3d
18 changed files with 78 additions and 190 deletions

View File

@ -979,9 +979,6 @@ ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint32_t ran_ue_ngap_id)
ran_ue->gnb = gnb;
ran_ue->t_ng_holding = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_ng_holding_timer_expire, ran_ue);
ogs_list_add(&gnb->ran_ue_list, ran_ue);
stats_add_ran_ue();
@ -994,12 +991,10 @@ void ran_ue_remove(ran_ue_t *ran_ue)
ogs_assert(ran_ue);
ogs_assert(ran_ue->gnb);
/* De-associate S1 with NAS/EMM */
ran_ue_deassociate(ran_ue);
ogs_list_remove(&ran_ue->gnb->ran_ue_list, ran_ue);
ogs_timer_delete(ran_ue->t_ng_holding);
if (ran_ue->t_ng_holding)
ogs_timer_delete(ran_ue->t_ng_holding);
ogs_pool_free(&ran_ue_pool, ran_ue);
@ -1073,6 +1068,11 @@ ran_ue_t *ran_ue_next_in_gnb(ran_ue_t *ran_ue)
return ogs_list_next(ran_ue);
}
ran_ue_t *ran_ue_cycle(ran_ue_t *ran_ue)
{
return ogs_pool_cycle(&ran_ue_pool, ran_ue);
}
static int amf_ue_new_guti(amf_ue_t *amf_ue)
{
if (amf_ue->m_tmsi) {

View File

@ -342,9 +342,10 @@ struct amf_ue_s {
ogs_bitrate_t subscribed_ue_ambr; /* UE-AMBR */
#define CM_CONNECTED(__aMF) \
((__aMF) && ((__aMF)->ran_ue != NULL))
((__aMF) && ((__aMF)->ran_ue != NULL) && ran_ue_cycle((__aMF)->ran_ue))
#define CM_IDLE(__aMF) \
((__aMF) && ((__aMF)->ran_ue == NULL))
((__aMF) && \
(((__aMF)->ran_ue == NULL) || (ran_ue_cycle((__aMF)->ran_ue) == NULL)))
/* NG UE context */
ran_ue_t *ran_ue;
@ -484,6 +485,7 @@ ran_ue_t *ran_ue_find(uint32_t index);
ran_ue_t *ran_ue_find_by_amf_ue_ngap_id(uint64_t amf_ue_ngap_id);
ran_ue_t *ran_ue_first_in_gnb(amf_gnb_t *gnb);
ran_ue_t *ran_ue_next_in_gnb(ran_ue_t *ran_ue);
ran_ue_t *ran_ue_cycle(ran_ue_t *ran_ue);
amf_ue_t *amf_ue_add(ran_ue_t *ran_ue);
void amf_ue_remove(amf_ue_t *amf_ue);

View File

@ -45,7 +45,7 @@ int gmm_handle_registration_request(amf_ue_t *amf_ue,
ogs_nas_5gs_guti_t nas_guti;
ogs_assert(amf_ue);
ran_ue = amf_ue->ran_ue;
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue);
ogs_assert(registration_request);
@ -332,7 +332,7 @@ int gmm_handle_service_request(amf_ue_t *amf_ue,
ogs_nas_key_set_identifier_t *ngksi = NULL;
ogs_assert(amf_ue);
ran_ue = amf_ue->ran_ue;
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue);
ngksi = &service_request->ngksi;
@ -597,7 +597,7 @@ int gmm_handle_identity_response(amf_ue_t *amf_ue,
ogs_assert(identity_response);
ogs_assert(amf_ue);
ran_ue = amf_ue->ran_ue;
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue);
mobile_identity = &identity_response->mobile_identity;
@ -621,136 +621,6 @@ int gmm_handle_identity_response(amf_ue_t *amf_ue,
return OGS_OK;
}
#if 0
int gmm_handle_tau_request(amf_ue_t *amf_ue,
ogs_nas_5gs_tracking_area_update_request_t *tau_request)
{
int served_tai_index = 0;
ogs_nas_5gs_mobile_identity_guti_t *5gs_mobile_identity_guti = NULL;
ogs_nas_5gs_guti_t nas_guti;
ogs_nas_5gs_update_type_t *5gs_update_type =
&tau_request->5gs_update_type;
ogs_nas_5gs_mobile_identity_t *5gs_mobile_identity =
&tau_request->old_guti;
ran_ue_t *ran_ue = NULL;
ogs_assert(amf_ue);
ran_ue = amf_ue->ran_ue;
ogs_assert(ran_ue);
/* Set 5GS Update Type */
memcpy(&amf_ue->nas.update, 5gs_update_type,
sizeof(ogs_nas_5gs_update_type_t));
amf_ue->nas.message_type = AMF_5GS_TYPE_TAU_REQUEST;
amf_ue->nas.ksi = 5gs_update_type->nas_key_set_identifier;
ogs_debug(" OGS_NAS_5GS TYPE[%d] KSI[%d] UPDATE[0x%x]",
amf_ue->nas.message_type, amf_ue->nas.ksi,
amf_ue->nas.data);
/*
* REGISTRATION_REQUEST
* SERVICE_REQUEST
* Clear Timer and Message
*/
CLEAR_AMF_UE_ALL_TIMERS(amf_ue);
CLEAR_SERVICE_INDICATOR(amf_ue);
if (BEARER_CONTEXT_IS_ACTIVE(amf_ue))
ogs_debug(" Bearer-Active");
else
ogs_debug(" Bearer-Inactive");
if (amf_ue->nas.update.active_flag)
ogs_debug(" Active flag");
else
ogs_debug(" No Active flag");
ogs_debug(" OLD TAI[PLMN_ID:%06x,TAC:%d]",
ogs_plmn_id_hexdump(&amf_ue->tai.plmn_id), amf_ue->tai.tac);
ogs_debug(" OLD NR_CGI[PLMN_ID:%06x,CELL_ID:%d]",
ogs_plmn_id_hexdump(&amf_ue->e_cgi.plmn_id), amf_ue->e_cgi.cell_id);
ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]",
ogs_plmn_id_hexdump(&ran_ue->saved.tai.plmn_id),
ran_ue->saved.tai.tac);
ogs_debug(" NR_CGI[PLMN_ID:%06x,CELL_ID:%d]",
ogs_plmn_id_hexdump(&ran_ue->saved.e_cgi.plmn_id),
ran_ue->saved.e_cgi.cell_id);
/* Copy TAI and ECGI from ran_ue */
memcpy(&amf_ue->tai, &ran_ue->saved.tai, sizeof(ogs_5gs_tai_t));
memcpy(&amf_ue->e_cgi, &ran_ue->saved.e_cgi, sizeof(ogs_e_cgi_t));
/* Check TAI */
served_tai_index = amf_find_served_tai(&amf_ue->tai);
if (served_tai_index < 0) {
/* Send TAU reject */
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]",
ogs_plmn_id_hexdump(&amf_ue->tai.plmn_id), amf_ue->tai.tac);
nas_5gs_send_tau_reject(amf_ue, EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED);
return OGS_ERROR;
}
ogs_debug(" SERVED_TAI_INDEX[%d]", served_tai_index);
/* Store UE specific information */
if (tau_request->presencemask &
OGS_NAS_5GS_TRACKING_AREA_UPDATE_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT) {
ogs_nas_5gs_tai_t *last_visited_registered_tai =
&tau_request->last_visited_registered_tai;
ogs_nas_to_plmn_id(&amf_ue->last_visited_plmn_id,
&last_visited_registered_tai->nas_plmn_id);
ogs_debug(" Visited_PLMN_ID:%06x",
ogs_plmn_id_hexdump(&amf_ue->last_visited_plmn_id));
}
if (tau_request->presencemask &
OGS_NAS_5GS_TRACKING_AREA_UPDATE_REQUEST_UE_NETWORK_CAPABILITY_PRESENT) {
memcpy(&amf_ue->ue_network_capability,
&tau_request->ue_network_capability,
sizeof(tau_request->ue_network_capability));
}
if (tau_request->presencemask &
OGS_NAS_5GS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_CAPABILITY_PRESENT) {
memcpy(&amf_ue->ms_network_capability,
&tau_request->ms_network_capability,
sizeof(tau_request->ms_network_capability));
}
/* TODO:
* 1) Consider if AMF is changed or not.
* 2) Consider if SGW is changed or not.
*/
switch (5gs_mobile_identity->imsi.type) {
case OGS_NAS_5GS_MOBILE_IDENTITY_GUTI:
5gs_mobile_identity_guti = &5gs_mobile_identity->guti;
nas_guti.nas_plmn_id = 5gs_mobile_identity_guti->nas_plmn_id;
nas_guti.amf_gid = 5gs_mobile_identity_guti->amf_gid;
nas_guti.amf_code = 5gs_mobile_identity_guti->amf_code;
nas_guti.m_tmsi = 5gs_mobile_identity_guti->m_tmsi;
ogs_debug(" GUTI[G:%d,C:%d,M_TMSI:0x%x] IMSI:[%s]",
nas_guti.amf_gid,
nas_guti.amf_code,
nas_guti.m_tmsi,
AMF_UE_HAVE_IMSI(amf_ue)
? amf_ue->imsi_bcd : "Unknown");
break;
default:
ogs_warn("Not implemented[%d]",
5gs_mobile_identity->imsi.type);
return OGS_OK;
}
return OGS_OK;
}
#endif
int gmm_handle_security_mode_complete(amf_ue_t *amf_ue,
ogs_nas_5gs_security_mode_complete_t *security_mode_complete)
{

View File

@ -115,7 +115,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
nas_message = e->nas.message;
ogs_assert(nas_message);
ran_ue = amf_ue->ran_ue;
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue);
h.type = e->nas.type;
@ -1050,7 +1050,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
nas_message = e->nas.message;
ogs_assert(nas_message);
ran_ue = amf_ue->ran_ue;
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue);
h.type = e->nas.type;

View File

@ -27,7 +27,7 @@ int nas_5gs_send_to_gnb(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf)
ran_ue_t *ran_ue = NULL;
ogs_assert(amf_ue);
ran_ue = amf_ue->ran_ue;
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue);
return ngap_send_to_ran_ue(ran_ue, pkbuf);
@ -41,7 +41,7 @@ int nas_5gs_send_to_downlink_nas_transport(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf)
ogs_assert(pkbuf);
ogs_assert(amf_ue);
ran_ue = amf_ue->ran_ue;
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
if (!ran_ue) {
ogs_warn("NG context has already been removed");
ogs_pkbuf_free(pkbuf);
@ -164,7 +164,7 @@ void nas_5gs_send_de_registration_accept(amf_ue_t *amf_ue)
ogs_pkbuf_t *gmmbuf = NULL;
ogs_assert(amf_ue);
ran_ue = amf_ue->ran_ue;
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue);
if (amf_ue->nas.de_registration.switch_off == 0) {

View File

@ -314,7 +314,7 @@ ogs_pkbuf_t *ngap_build_initial_context_setup_request(
NGAP_NAS_PDU_t *NAS_PDU = NULL;
ogs_assert(amf_ue);
ran_ue = amf_ue->ran_ue;
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue);
ogs_debug("Initial context setup request");
@ -611,7 +611,7 @@ ogs_pkbuf_t *ngap_build_ue_context_modification_request(amf_ue_t *amf_ue)
ran_ue_t *ran_ue = NULL;
ogs_assert(amf_ue);
ran_ue = amf_ue->ran_ue;
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue);
ogs_debug("UE context modification request");
@ -829,7 +829,7 @@ ogs_pkbuf_t *ngap_build_pdu_session_resource_setup_request(
amf_ue = sess->amf_ue;
ogs_assert(amf_ue);
ran_ue = amf_ue->ran_ue;
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue);
memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t));
@ -936,7 +936,7 @@ ogs_pkbuf_t *ngap_build_pdu_session_resource_release_command(
amf_ue = sess->amf_ue;
ogs_assert(amf_ue);
ran_ue = amf_ue->ran_ue;
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue);
memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t));
@ -1204,7 +1204,7 @@ ogs_pkbuf_t *ngap_build_path_switch_ack(amf_ue_t *amf_ue)
ran_ue_t *ran_ue = NULL;
ogs_assert(amf_ue);
ran_ue = amf_ue->ran_ue;
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue);
ogs_debug("Path switch acknowledge");
@ -2059,10 +2059,10 @@ ogs_pkbuf_t *ngap_build_path_switch_ack(amf_ue_t *amf_ue)
NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL;
NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL;
NGAP_SecurityContext_t *SecurityContext = NULL;
NGAP_PDUSessionResourceSwitchedList_t *PDUSessionResourceSwitchedList = NULL;
NGAP_PDUSessionResourceSwitchedList_t *PDUSessionResourceSwitchedList;
ogs_assert(amf_ue);
ran_ue = amf_ue->ran_ue;
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue);
memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t));

View File

@ -319,6 +319,13 @@ void ngap_send_ran_ue_context_release_command(
rv = ngap_delayed_send_to_ran_ue(ran_ue, ngapbuf, delay);
ogs_expect(rv == OGS_OK);
if (ran_ue->t_ng_holding)
ogs_timer_delete(ran_ue->t_ng_holding);
ran_ue->t_ng_holding = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_ng_holding_timer_expire, ran_ue);
ogs_assert(ran_ue->t_ng_holding);
ogs_timer_start(ran_ue->t_ng_holding,
amf_timer_cfg(AMF_TIMER_NG_HOLDING)->duration);
}
@ -329,7 +336,7 @@ void ngap_send_amf_ue_context_release_command(
{
ogs_assert(amf_ue);
ran_ue_t *ran_ue = amf_ue->ran_ue;
ran_ue_t *ran_ue = ran_ue_cycle(amf_ue->ran_ue);
if (ran_ue) {
ngap_send_ran_ue_context_release_command(ran_ue,
group, cause, action, delay);
@ -473,7 +480,7 @@ void ngap_send_handover_request(
ogs_assert(target_gnb);
ogs_assert(amf_ue);
source_ue = amf_ue->ran_ue;
source_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(source_ue);
ogs_assert(source_ue->target_ue == NULL);
@ -542,7 +549,7 @@ void ngap_send_error_indication2(
ran_ue_t *ran_ue;
ogs_assert(amf_ue);
ran_ue = amf_ue->ran_ue;
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_expect_or_return(ran_ue);
gnb = ran_ue->gnb;
ogs_expect_or_return(gnb);

View File

@ -51,7 +51,7 @@ int emm_handle_attach_request(mme_ue_t *mme_ue,
char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1];
ogs_assert(mme_ue);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
ogs_assert(esm_message_container);
@ -308,7 +308,7 @@ int emm_handle_identity_response(
ogs_assert(identity_response);
ogs_assert(mme_ue);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
mobile_identity = &identity_response->mobile_identity;
@ -435,7 +435,7 @@ int emm_handle_tau_request(mme_ue_t *mme_ue,
enb_ue_t *enb_ue = NULL;
ogs_assert(mme_ue);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
ogs_assert(pkbuf);
@ -564,7 +564,7 @@ int emm_handle_extended_service_request(mme_ue_t *mme_ue,
enb_ue_t *enb_ue = NULL;
ogs_assert(mme_ue);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
/* Set Service Type */

View File

@ -113,7 +113,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
message = e->nas_message;
ogs_assert(message);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
h.type = e->nas_type;
@ -956,7 +956,7 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e)
message = e->nas_message;
ogs_assert(message);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
h.type = e->nas_type;

View File

@ -2023,9 +2023,6 @@ enb_ue_t *enb_ue_add(mme_enb_t *enb, uint32_t enb_ue_s1ap_id)
enb_ue->enb_ostream_id =
OGS_NEXT_ID(enb->ostream_id, 1, enb->max_num_of_ostreams-1);
enb_ue->t_s1_holding = ogs_timer_add(
ogs_app()->timer_mgr, mme_timer_s1_holding_timer_expire, enb_ue);
enb_ue->enb = enb;
ogs_list_add(&enb->enb_ue_list, enb_ue);
@ -2043,12 +2040,10 @@ void enb_ue_remove(enb_ue_t *enb_ue)
enb = enb_ue->enb;
ogs_assert(enb);
/* De-associate S1 with NAS/EMM */
enb_ue_deassociate(enb_ue);
ogs_list_remove(&enb->enb_ue_list, enb_ue);
ogs_timer_delete(enb_ue->t_s1_holding);
if (enb_ue->t_s1_holding)
ogs_timer_delete(enb_ue->t_s1_holding);
ogs_pool_free(&enb_ue_pool, enb_ue);
@ -2122,6 +2117,11 @@ enb_ue_t *enb_ue_next_in_enb(enb_ue_t *enb_ue)
return ogs_list_next(enb_ue);
}
enb_ue_t *enb_ue_cycle(enb_ue_t *enb_ue)
{
return ogs_pool_cycle(&enb_ue_pool, enb_ue);
}
static int mme_ue_new_guti(mme_ue_t *mme_ue)
{
served_gummei_t *served_gummei = NULL;

View File

@ -407,9 +407,10 @@ struct mme_ue_s {
OGS_POOL(ebi_pool, uint8_t);
#define ECM_CONNECTED(__mME) \
((__mME) && ((__mME)->enb_ue != NULL))
((__mME) && ((__mME)->enb_ue != NULL) && enb_ue_cycle((__mME)->enb_ue))
#define ECM_IDLE(__mME) \
((__mME) && ((__mME)->enb_ue == NULL))
((__mME) && \
(((__mME)->enb_ue == NULL) || (enb_ue_cycle((__mME)->enb_ue) == NULL)))
/* S1 UE context */
enb_ue_t *enb_ue;
@ -685,6 +686,7 @@ enb_ue_t *enb_ue_find(uint32_t index);
enb_ue_t *enb_ue_find_by_mme_ue_s1ap_id(uint32_t mme_ue_s1ap_id);
enb_ue_t *enb_ue_first_in_enb(mme_enb_t *enb);
enb_ue_t *enb_ue_next_in_enb(enb_ue_t *enb_ue);
enb_ue_t *enb_ue_cycle(enb_ue_t *enb_ue);
mme_ue_t *mme_ue_add(enb_ue_t *enb_ue);
void mme_ue_remove(mme_ue_t *mme_ue);

View File

@ -91,7 +91,7 @@ static void timeout(ogs_gtp_xact_t *xact, void *data)
mme_ue = sess->mme_ue;
ogs_assert(mme_ue);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (enb_ue) {
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,

View File

@ -42,7 +42,7 @@ void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue)
mme_gtp_send_delete_all_sessions(mme_ue,
OGS_GTP_DELETE_SEND_UE_CONTEXT_RELEASE_COMMAND);
} else {
enb_ue_t *enb_ue = mme_ue->enb_ue;
enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (enb_ue) {
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,

View File

@ -326,7 +326,7 @@ void mme_s11_handle_delete_session_response(
if (mme_sess_count(mme_ue) == 1) /* Last Session */ {
enb_ue_t *enb_ue = NULL;
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (enb_ue) {
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
@ -695,7 +695,7 @@ void mme_s11_handle_release_access_bearers_response(
rv = CLEAR_BEARER_CONTEXT(mme_ue);
ogs_expect(rv == OGS_OK);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (enb_ue) {
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
@ -799,7 +799,7 @@ void mme_s11_handle_downlink_data_notification(
* included in Downlink Data Notification is "Error Indication received
* from RNC/eNodeB/S4-SGSN"
*/
enb_ue_t *enb_ue = mme_ue->enb_ue;
enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
s1ap_send_ue_context_release_command(enb_ue,
@ -880,7 +880,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
}
}
source_ue = mme_ue->enb_ue;
source_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(source_ue);
s1ap_send_handover_command(source_ue);

View File

@ -462,7 +462,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
nas_eps_send_attach_reject(mme_ue,
emm_cause, ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
s1ap_send_ue_context_release_command(enb_ue,

View File

@ -31,7 +31,7 @@ int nas_eps_send_to_enb(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
enb_ue_t *enb_ue = NULL;
ogs_assert(mme_ue);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
return s1ap_send_to_enb_ue(enb_ue, pkbuf);
@ -72,7 +72,7 @@ int nas_eps_send_to_downlink_nas_transport(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
ogs_assert(pkbuf);
ogs_assert(mme_ue);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (!enb_ue) {
ogs_warn("S1 context has already been removed");
ogs_pkbuf_free(pkbuf);
@ -249,7 +249,7 @@ void nas_eps_send_detach_accept(mme_ue_t *mme_ue)
ogs_pkbuf_t *emmbuf = NULL;
ogs_assert(mme_ue);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
/* reply with detach accept */

View File

@ -283,7 +283,7 @@ ogs_pkbuf_t *s1ap_build_initial_context_setup_request(
ogs_subscription_data_t *subscription_data = NULL;
ogs_assert(mme_ue);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
subscription_data = &mme_ue->subscription_data;
ogs_assert(subscription_data);
@ -606,7 +606,7 @@ ogs_pkbuf_t *s1ap_build_ue_context_modification_request(mme_ue_t *mme_ue)
enb_ue_t *enb_ue = NULL;
ogs_assert(mme_ue);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
ogs_debug("[MME] UE context modification request");
@ -827,7 +827,7 @@ ogs_pkbuf_t *s1ap_build_e_rab_setup_request(
mme_ue = bearer->mme_ue;
ogs_assert(mme_ue);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
memset(&pdu, 0, sizeof (S1AP_S1AP_PDU_t));
@ -963,7 +963,7 @@ ogs_pkbuf_t *s1ap_build_e_rab_modify_request(
mme_ue = bearer->mme_ue;
ogs_assert(mme_ue);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
ogs_debug("[MME] E-RAB modify request");
@ -1096,7 +1096,7 @@ ogs_pkbuf_t *s1ap_build_e_rab_release_command(
mme_ue = bearer->mme_ue;
ogs_assert(mme_ue);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
subscription_data = &mme_ue->subscription_data;
ogs_assert(subscription_data);
@ -1384,7 +1384,7 @@ ogs_pkbuf_t *s1ap_build_path_switch_ack(mme_ue_t *mme_ue)
enb_ue_t *enb_ue = NULL;
ogs_assert(mme_ue);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(enb_ue);
ogs_debug("[MME] Path switch acknowledge");

View File

@ -319,6 +319,13 @@ void s1ap_send_ue_context_release_command(
rv = s1ap_delayed_send_to_enb_ue(enb_ue, s1apbuf, delay);
ogs_expect(rv == OGS_OK);
if (enb_ue->t_s1_holding)
ogs_timer_delete(enb_ue->t_s1_holding);
enb_ue->t_s1_holding = ogs_timer_add(
ogs_app()->timer_mgr, mme_timer_s1_holding_timer_expire, enb_ue);
ogs_assert(enb_ue->t_s1_holding);
ogs_timer_start(enb_ue->t_s1_holding,
mme_timer_cfg(MME_TIMER_S1_HOLDING)->duration);
}
@ -454,7 +461,7 @@ void s1ap_send_handover_request(
ogs_assert(target_enb);
ogs_assert(mme_ue);
source_ue = mme_ue->enb_ue;
source_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(source_ue);
ogs_assert(source_ue->target_ue == NULL);
@ -525,7 +532,7 @@ void s1ap_send_error_indication2(
S1AP_ENB_UE_S1AP_ID_t enb_ue_s1ap_id;
ogs_assert(mme_ue);
enb_ue = mme_ue->enb_ue;
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_expect_or_return(enb_ue);
enb = enb_ue->enb;
ogs_expect_or_return(enb);