diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 3552344fb72954f3e381019b8040e435beee668a..ca1e8a3d374b20af0172967b27bded00ad2d598d 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -200,38 +200,40 @@ int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB) int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) { uint8_t i; - int j; - PHY_VARS_eNB *phy_vars_eNB = PHY_vars_eNB_g[Mod_idP]; - - for (i=0; i<NUMBER_OF_UE_MAX; i++) { - if ((phy_vars_eNB->dlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) { - MSC_LOG_EVENT(MSC_PHY_ENB, "0 Failed remove ue %"PRIx16" (ENOMEM)", rnti); - LOG_E(PHY,"Can't remove UE, not enough memory allocated\n"); - return(-1); - } else { - if (phy_vars_eNB->eNB_UE_stats[i].crnti==rntiP) { - MSC_LOG_EVENT(MSC_PHY_ENB, "0 Removed ue %"PRIx16" ", rntiP); + int j,CC_id; + PHY_VARS_eNB *phy_vars_eNB; + + for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) { + phy_vars_eNB = PHY_vars_eNB_g[Mod_idP][CC_id]; + for (i=0; i<NUMBER_OF_UE_MAX; i++) { + if ((phy_vars_eNB->dlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) { + MSC_LOG_EVENT(MSC_PHY_ENB, "0 Failed remove ue %"PRIx16" (ENOMEM)", rnti); + LOG_E(PHY,"Can't remove UE, not enough memory allocated\n"); + return(-1); + } else { + if (phy_vars_eNB->eNB_UE_stats[i].crnti==rntiP) { + MSC_LOG_EVENT(MSC_PHY_ENB, "0 Removed ue %"PRIx16" ", rntiP); #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"eNB %d removing UE %d with rnti %x\n",phy_vars_eNB->Mod_id,i,rnti); + LOG_I(PHY,"eNB %d removing UE %d with rnti %x\n",phy_vars_eNB->Mod_id,i,rnti); #endif - //msg("[PHY] UE_id %d\n",i); - clean_eNb_dlsch(phy_vars_eNB->dlsch_eNB[i][0]); - clean_eNb_ulsch(phy_vars_eNB->ulsch_eNB[i]); - //phy_vars_eNB->eNB_UE_stats[i].crnti = 0; - memset(&phy_vars_eNB->eNB_UE_stats[i],0,sizeof(LTE_eNB_UE_stats)); - // mac_exit_wrapper("Removing UE"); - - /* clear the harq pid freelist */ - phy_vars_eNB->dlsch_eNB[i][0]->head_freelist = 0; - phy_vars_eNB->dlsch_eNB[i][0]->tail_freelist = 0; - for (j = 0; j < 8; j++) - put_harq_pid_in_freelist(phy_vars_eNB->dlsch_eNB[i][0], j); - - return(i); + //msg("[PHY] UE_id %d\n",i); + clean_eNb_dlsch(phy_vars_eNB->dlsch_eNB[i][0]); + clean_eNb_ulsch(phy_vars_eNB->ulsch_eNB[i]); + //phy_vars_eNB->eNB_UE_stats[i].crnti = 0; + memset(&phy_vars_eNB->eNB_UE_stats[i],0,sizeof(LTE_eNB_UE_stats)); + // mac_exit_wrapper("Removing UE"); + + /* clear the harq pid freelist */ + phy_vars_eNB->dlsch_eNB[i][0]->head_freelist = 0; + phy_vars_eNB->dlsch_eNB[i][0]->tail_freelist = 0; + for (j = 0; j < 8; j++) + put_harq_pid_in_freelist(phy_vars_eNB->dlsch_eNB[i][0], j); + + return(i); + } } } } - MSC_LOG_EVENT(MSC_PHY_ENB, "0 Failed remove ue %"PRIx16" (not found)", rntiP); return(-1); } @@ -3523,7 +3525,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ frame, phy_vars_eNB->eNB_UE_stats[i].crnti); #endif - mac_phy_remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB); + mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti); phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; //phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0; @@ -3670,7 +3672,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ phy_vars_eNB->CC_id, frame, phy_vars_eNB->eNB_UE_stats[i].crnti); - mac_phy_remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB); + mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti); phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index 4ba290bf5958e3db6873a3ab1ba287e959e456c7..7162501f89d8b3a8ee23e0b5cf160a868b1ea266 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -360,6 +360,8 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP) prev=i; } + mac_phy_remove_ue(mod_idP,rntiP); + if (ret == 0) { return (0); } diff --git a/openair2/RRC/LITE/L2_interface.c b/openair2/RRC/LITE/L2_interface.c index 8c16eb854245b025130b29d37b9588cbc148d00a..ad8a9c9c2eccc77ed06ec147dc6008e6246ac5c6 100644 --- a/openair2/RRC/LITE/L2_interface.c +++ b/openair2/RRC/LITE/L2_interface.c @@ -731,10 +731,10 @@ void mac_eNB_rrc_ul_failure(const module_id_t Mod_instP, ue_context_p->ue_context.ul_failure_timer=1; } else { - LOG_E(RRC,"Frame %d, Subframe %d: UE %x unknown \n",rntiP); + LOG_W(RRC,"Frame %d, Subframe %d: UE %x unknown \n",frameP,subframeP,rntiP); + rrc_mac_remove_ue(Mod_instP,rntiP); } - return; } void mac_eNB_rrc_ul_in_sync(const module_id_t Mod_instP, diff --git a/openair2/RRC/LITE/proto.h b/openair2/RRC/LITE/proto.h index 920d4d85f3504cab6c49676d11b49b6238c0e570..d14b129479bf9d0214c0ce5564a765932050008e 100644 --- a/openair2/RRC/LITE/proto.h +++ b/openair2/RRC/LITE/proto.h @@ -439,10 +439,8 @@ rrc_eNB_free_mem_UE_context( void rrc_eNB_free_UE( - const module_id_t enb_mod_idP, - const rnti_t rntiP, - const frame_t frameP, - const sub_frame_t subframeP + const module_id_t enb_mod_idP, + const struct rrc_eNB_ue_context_s* const ue_context_pP ); long binary_search_int(int elements[], long numElem, int value); diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c index 75a50428f51d6ccc879efea1a3270e639517b946..595e87a5348a099cc58d241222fa4b46d1ebca62 100644 --- a/openair2/RRC/LITE/rrc_common.c +++ b/openair2/RRC/LITE/rrc_common.c @@ -48,6 +48,7 @@ #include "asn1_msg.h" #include "pdcp.h" #include "UTIL/LOG/vcd_signal_dumper.h" +#include "rrc_eNB_UE_context.h" #ifdef LOCALIZATION #include <sys/time.h> @@ -414,7 +415,7 @@ rrc_rx_tx( uint8_t UE_id; int32_t current_timestamp_ms, ref_timestamp_ms; struct timeval ts; - struct rrc_eNB_ue_context_s* ue_context_p = NULL; + struct rrc_eNB_ue_context_s *ue_context_p = NULL,*ue_to_be_removed = NULL; #ifdef LOCALIZATION double estimated_distance; @@ -523,15 +524,16 @@ rrc_rx_tx( RB_FOREACH(ue_context_p, rrc_ue_tree_s, &(eNB_rrc_inst[ctxt_pP->module_id].rrc_ue_head)) { if (ue_context_p->ue_context.ul_failure_timer>0) { ue_context_p->ue_context.ul_failure_timer++; - if (ue_context_p->ue_context.ul_failure_timer == 1000) { - // remove UE after 1 second after MAC has indicated UL failure + if (ue_context_p->ue_context.ul_failure_timer >= 20000) { + // remove UE after 20 seconds after MAC has indicated UL failure LOG_I(RRC,"Removing UE %x instance\n",ue_context_p->ue_context.rnti); - + ue_to_be_removed = ue_context_p; + break; } } - - } + if (ue_to_be_removed) + rrc_eNB_free_UE(ctxt_pP->module_id,ue_to_be_removed); #ifdef LOCALIZATION /* for the localization, only primary CC_id might be relevant*/ diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 836217e8d952f2c4584c4823022eecc7ac18d1cd..6683e70045cc1baf3e6247550822ac3112fff4fe 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -792,32 +792,30 @@ rrc_eNB_free_mem_UE_context( //----------------------------------------------------------------------------- // should be called when UE is lost by eNB void -rrc_eNB_free_UE( - const module_id_t enb_mod_idP, - const rnti_t rntiP, - const frame_t frameP, - const sub_frame_t subframeP -) +rrc_eNB_free_UE(const module_id_t enb_mod_idP,const struct rrc_eNB_ue_context_s* const ue_context_pP) //----------------------------------------------------------------------------- { - struct rrc_eNB_ue_context_s* ue_context_p = NULL; + protocol_ctxt_t ctxt; #if !defined(ENABLE_USE_MME) module_id_t ue_module_id; #endif - AssertFatal(enb_mod_idP < NB_eNB_INST, "eNB inst invalid (%d/%d) for UE %x!", enb_mod_idP, NB_eNB_INST, rntiP); - ue_context_p = rrc_eNB_get_ue_context( + rnti_t rnti = ue_context_pP->ue_context.rnti; + + + AssertFatal(enb_mod_idP < NB_eNB_INST, "eNB inst invalid (%d/%d) for UE %x!", enb_mod_idP, NB_eNB_INST, rnti); + /* ue_context_p = rrc_eNB_get_ue_context( &eNB_rrc_inst[enb_mod_idP], rntiP ); - - if (NULL != ue_context_p) { - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, enb_mod_idP, ENB_FLAG_YES, rntiP, frameP, subframeP,enb_mod_idP); - LOG_W(RRC, "[eNB %d] Removing UE RNTI %x\n", enb_mod_idP, rntiP); + */ + if (NULL != ue_context_pP) { + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, enb_mod_idP, ENB_FLAG_YES, rnti, 0, 0,enb_mod_idP); + LOG_W(RRC, "[eNB %d] Removing UE RNTI %x\n", enb_mod_idP, rnti); #if defined(ENABLE_USE_MME) - rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_REQ(enb_mod_idP, ue_context_p, S1AP_CAUSE_RADIO_NETWORK, 21); // send cause 21: connection with ue lost + rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_REQ(enb_mod_idP, ue_context_pP, S1AP_CAUSE_RADIO_NETWORK, 21); // send cause 21: connection with ue lost /* From 3GPP 36300v10 p129 : 19.2.2.2.2 S1 UE Context Release Request (eNB triggered) * If the E-UTRAN internal reason is a radio link failure detected in the eNB, the eNB shall wait a sufficient time before * triggering the S1 UE Context Release Request procedure @@ -826,23 +824,22 @@ rrc_eNB_free_UE( */ #else #if defined(OAI_EMU) - AssertFatal(ue_context_p->local_uid < NUMBER_OF_UE_MAX, "local_uid invalid (%d<%d) for UE %x!", ue_context_p->local_uid, NUMBER_OF_UE_MAX, rntiP); - ue_module_id = oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[enb_mod_idP][ue_context_p->local_uid]; - AssertFatal(ue_module_id < NUMBER_OF_UE_MAX, "ue_module_id invalid (%d<%d) for UE %x!", ue_module_id, NUMBER_OF_UE_MAX, rntiP); - oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[enb_mod_idP][ue_context_p->local_uid] = -1; + AssertFatal(ue_context_pP->local_uid < NUMBER_OF_UE_MAX, "local_uid invalid (%d<%d) for UE %x!", ue_context_pP->local_uid, NUMBER_OF_UE_MAX, rnti); + ue_module_id = oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[enb_mod_idP][ue_context_pP->local_uid]; + AssertFatal(ue_module_id < NUMBER_OF_UE_MAX, "ue_module_id invalid (%d<%d) for UE %x!", ue_module_id, NUMBER_OF_UE_MAX, rnti); + oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[enb_mod_idP][ue_context_pP->local_uid] = -1; oai_emulation.info.eNB_ue_module_id_to_rnti[enb_mod_idP][ue_module_id] = NOT_A_RNTI; #endif #endif - ue_context_p->ue_context.Status = RRC_IDLE; - rrc_mac_remove_ue(enb_mod_idP,rntiP); + rrc_mac_remove_ue(enb_mod_idP,rnti); rrc_rlc_remove_ue(&ctxt); pdcp_remove_UE(&ctxt); rrc_eNB_remove_ue_context( &ctxt, &eNB_rrc_inst[enb_mod_idP], - ue_context_p); + ue_context_pP); } } @@ -3554,6 +3551,7 @@ rrc_eNB_decode_ccch( int i, rval; struct rrc_eNB_ue_context_s* ue_context_p = NULL; uint64_t random_value = 0; + int stmsi_received = 0; //memset(ul_ccch_msg,0,sizeof(UL_CCCH_Message_t)); @@ -3724,17 +3722,16 @@ rrc_eNB_decode_ccch( random_value = (((uint64_t)mme_code) << 32) | m_tmsi; if ((ue_context_p = rrc_eNB_ue_context_stmsi_exist(ctxt_pP, mme_code, m_tmsi))) { #warning "TODO: stmsi_exist: remove UE from MAC/PHY (how?)" - LOG_I(RRC,PROTOCOL_RRC_CTXT_UE_FMT" S-TMSI exists, ue_context_p %p\n",ue_context_p); + LOG_I(RRC," S-TMSI exists, ue_context_p %p\n",ue_context_p); + stmsi_received=1; // AssertFatal(0 == 1, "TODO: remove UE from MAC/PHY (how?)"); - ue_context_p = NULL; + // ue_context_p = NULL; } else { ue_context_p = rrc_eNB_get_next_free_ue_context(ctxt_pP, NOT_A_RANDOM_UE_IDENTITY); + ue_context_p->ue_context.Initialue_identity_s_TMSI.presence = TRUE; + ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code = mme_code; + ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi = m_tmsi; } - if (ue_context_p==NULL) - AssertFatal(0 == 1, "ue_context_p is null"); - ue_context_p->ue_context.Initialue_identity_s_TMSI.presence = TRUE; - ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code = mme_code; - ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi = m_tmsi; MSC_LOG_RX_MESSAGE( MSC_RRC_ENB, @@ -3780,7 +3777,8 @@ rrc_eNB_decode_ccch( PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ue_context_p->ue_context.random_ue_identity); #endif - eNB_rrc_inst[ctxt_pP->module_id].Nb_ue++; + if (stmsi_received == 0) + eNB_rrc_inst[ctxt_pP->module_id].Nb_ue++; } else { // no context available