Fix the bug for S1-reset or eNB-restart(#627)
This commit is contained in:
parent
3cbec5f2e6
commit
93312e8f3d
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue