Commit f4448a80 authored by Aikaterini's avatar Aikaterini

Merge branch 'bugfix-48-L1L2signaling' of...

Merge branch 'bugfix-48-L1L2signaling' of https://gitlab.eurecom.fr/oai/openairinterface5g into bugfix-48-L1L2signaling

Conflicts:
	openair1/SCHED/phy_procedures_lte_eNb.c
	openair2/RRC/LITE/L2_interface.c
	openair2/RRC/LITE/rrc_common.c
	openair2/RRC/LITE/rrc_eNB.c
parents 33d9e8f2 d4cdda31
...@@ -200,38 +200,40 @@ int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB) ...@@ -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) { int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) {
uint8_t i; uint8_t i;
int j; int j,CC_id;
PHY_VARS_eNB *phy_vars_eNB = PHY_vars_eNB_g[Mod_idP]; PHY_VARS_eNB *phy_vars_eNB;
for (i=0; i<NUMBER_OF_UE_MAX; i++) { for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
if ((phy_vars_eNB->dlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) { phy_vars_eNB = PHY_vars_eNB_g[Mod_idP][CC_id];
MSC_LOG_EVENT(MSC_PHY_ENB, "0 Failed remove ue %"PRIx16" (ENOMEM)", rnti); for (i=0; i<NUMBER_OF_UE_MAX; i++) {
LOG_E(PHY,"Can't remove UE, not enough memory allocated\n"); if ((phy_vars_eNB->dlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) {
return(-1); MSC_LOG_EVENT(MSC_PHY_ENB, "0 Failed remove ue %"PRIx16" (ENOMEM)", rnti);
} else { LOG_E(PHY,"Can't remove UE, not enough memory allocated\n");
if (phy_vars_eNB->eNB_UE_stats[i].crnti==rntiP) { return(-1);
MSC_LOG_EVENT(MSC_PHY_ENB, "0 Removed ue %"PRIx16" ", rntiP); } 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 #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 #endif
//msg("[PHY] UE_id %d\n",i); //msg("[PHY] UE_id %d\n",i);
clean_eNb_dlsch(phy_vars_eNB->dlsch_eNB[i][0]); clean_eNb_dlsch(phy_vars_eNB->dlsch_eNB[i][0]);
clean_eNb_ulsch(phy_vars_eNB->ulsch_eNB[i]); clean_eNb_ulsch(phy_vars_eNB->ulsch_eNB[i]);
//phy_vars_eNB->eNB_UE_stats[i].crnti = 0; //phy_vars_eNB->eNB_UE_stats[i].crnti = 0;
memset(&phy_vars_eNB->eNB_UE_stats[i],0,sizeof(LTE_eNB_UE_stats)); memset(&phy_vars_eNB->eNB_UE_stats[i],0,sizeof(LTE_eNB_UE_stats));
// mac_exit_wrapper("Removing UE"); // mac_exit_wrapper("Removing UE");
/* clear the harq pid freelist */ /* clear the harq pid freelist */
phy_vars_eNB->dlsch_eNB[i][0]->head_freelist = 0; phy_vars_eNB->dlsch_eNB[i][0]->head_freelist = 0;
phy_vars_eNB->dlsch_eNB[i][0]->tail_freelist = 0; phy_vars_eNB->dlsch_eNB[i][0]->tail_freelist = 0;
for (j = 0; j < 8; j++) for (j = 0; j < 8; j++)
put_harq_pid_in_freelist(phy_vars_eNB->dlsch_eNB[i][0], j); put_harq_pid_in_freelist(phy_vars_eNB->dlsch_eNB[i][0], j);
return(i); return(i);
}
} }
} }
} }
MSC_LOG_EVENT(MSC_PHY_ENB, "0 Failed remove ue %"PRIx16" (not found)", rntiP); MSC_LOG_EVENT(MSC_PHY_ENB, "0 Failed remove ue %"PRIx16" (not found)", rntiP);
return(-1); return(-1);
} }
...@@ -3523,7 +3525,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ ...@@ -3523,7 +3525,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
frame, frame,
phy_vars_eNB->eNB_UE_stats[i].crnti); phy_vars_eNB->eNB_UE_stats[i].crnti);
#endif #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[(uint32_t)i]->Msg3_active = 0;
//phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_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_ ...@@ -3670,7 +3672,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
phy_vars_eNB->CC_id, phy_vars_eNB->CC_id,
frame, frame,
phy_vars_eNB->eNB_UE_stats[i].crnti); 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; phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0;
} }
......
...@@ -360,6 +360,8 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP) ...@@ -360,6 +360,8 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP)
prev=i; prev=i;
} }
mac_phy_remove_ue(mod_idP,rntiP);
if (ret == 0) { if (ret == 0) {
return (0); return (0);
} }
......
...@@ -731,10 +731,10 @@ void mac_eNB_rrc_ul_failure(const module_id_t Mod_instP, ...@@ -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; ue_context_p->ue_context.ul_failure_timer=1;
} }
else { 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, void mac_eNB_rrc_ul_in_sync(const module_id_t Mod_instP,
......
...@@ -439,10 +439,8 @@ rrc_eNB_free_mem_UE_context( ...@@ -439,10 +439,8 @@ rrc_eNB_free_mem_UE_context(
void void
rrc_eNB_free_UE( rrc_eNB_free_UE(
const module_id_t enb_mod_idP, const module_id_t enb_mod_idP,
const rnti_t rntiP, const struct rrc_eNB_ue_context_s* const ue_context_pP
const frame_t frameP,
const sub_frame_t subframeP
); );
long binary_search_int(int elements[], long numElem, int value); long binary_search_int(int elements[], long numElem, int value);
......
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include "asn1_msg.h" #include "asn1_msg.h"
#include "pdcp.h" #include "pdcp.h"
#include "UTIL/LOG/vcd_signal_dumper.h" #include "UTIL/LOG/vcd_signal_dumper.h"
#include "rrc_eNB_UE_context.h"
#ifdef LOCALIZATION #ifdef LOCALIZATION
#include <sys/time.h> #include <sys/time.h>
...@@ -414,7 +415,7 @@ rrc_rx_tx( ...@@ -414,7 +415,7 @@ rrc_rx_tx(
uint8_t UE_id; uint8_t UE_id;
int32_t current_timestamp_ms, ref_timestamp_ms; int32_t current_timestamp_ms, ref_timestamp_ms;
struct timeval ts; 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 #ifdef LOCALIZATION
double estimated_distance; double estimated_distance;
...@@ -523,15 +524,16 @@ rrc_rx_tx( ...@@ -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)) { 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) { if (ue_context_p->ue_context.ul_failure_timer>0) {
ue_context_p->ue_context.ul_failure_timer++; ue_context_p->ue_context.ul_failure_timer++;
if (ue_context_p->ue_context.ul_failure_timer == 1000) { if (ue_context_p->ue_context.ul_failure_timer >= 20000) {
// remove UE after 1 second after MAC has indicated UL failure // 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); 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 #ifdef LOCALIZATION
/* for the localization, only primary CC_id might be relevant*/ /* for the localization, only primary CC_id might be relevant*/
......
...@@ -792,32 +792,30 @@ rrc_eNB_free_mem_UE_context( ...@@ -792,32 +792,30 @@ rrc_eNB_free_mem_UE_context(
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// should be called when UE is lost by eNB // should be called when UE is lost by eNB
void void
rrc_eNB_free_UE( rrc_eNB_free_UE(const module_id_t enb_mod_idP,const struct rrc_eNB_ue_context_s* const ue_context_pP)
const module_id_t enb_mod_idP,
const rnti_t rntiP,
const frame_t frameP,
const sub_frame_t subframeP
)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
{ {
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
protocol_ctxt_t ctxt; protocol_ctxt_t ctxt;
#if !defined(ENABLE_USE_MME) #if !defined(ENABLE_USE_MME)
module_id_t ue_module_id; module_id_t ue_module_id;
#endif #endif
AssertFatal(enb_mod_idP < NB_eNB_INST, "eNB inst invalid (%d/%d) for UE %x!", enb_mod_idP, NB_eNB_INST, rntiP); rnti_t rnti = ue_context_pP->ue_context.rnti;
ue_context_p = rrc_eNB_get_ue_context(
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], &eNB_rrc_inst[enb_mod_idP],
rntiP rntiP
); );
*/
if (NULL != ue_context_p) { if (NULL != ue_context_pP) {
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, enb_mod_idP, ENB_FLAG_YES, rntiP, frameP, subframeP,enb_mod_idP); 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, rntiP); LOG_W(RRC, "[eNB %d] Removing UE RNTI %x\n", enb_mod_idP, rnti);
#if defined(ENABLE_USE_MME) #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) /* 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 * 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 * triggering the S1 UE Context Release Request procedure
...@@ -826,23 +824,22 @@ rrc_eNB_free_UE( ...@@ -826,23 +824,22 @@ rrc_eNB_free_UE(
*/ */
#else #else
#if defined(OAI_EMU) #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); 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_p->local_uid]; 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, rntiP); 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_p->local_uid] = -1; 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; oai_emulation.info.eNB_ue_module_id_to_rnti[enb_mod_idP][ue_module_id] = NOT_A_RNTI;
#endif #endif
#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); rrc_rlc_remove_ue(&ctxt);
pdcp_remove_UE(&ctxt); pdcp_remove_UE(&ctxt);
rrc_eNB_remove_ue_context( rrc_eNB_remove_ue_context(
&ctxt, &ctxt,
&eNB_rrc_inst[enb_mod_idP], &eNB_rrc_inst[enb_mod_idP],
ue_context_p); ue_context_pP);
} }
} }
...@@ -3554,6 +3551,7 @@ rrc_eNB_decode_ccch( ...@@ -3554,6 +3551,7 @@ rrc_eNB_decode_ccch(
int i, rval; int i, rval;
struct rrc_eNB_ue_context_s* ue_context_p = NULL; struct rrc_eNB_ue_context_s* ue_context_p = NULL;
uint64_t random_value = 0; uint64_t random_value = 0;
int stmsi_received = 0;
//memset(ul_ccch_msg,0,sizeof(UL_CCCH_Message_t)); //memset(ul_ccch_msg,0,sizeof(UL_CCCH_Message_t));
...@@ -3724,17 +3722,16 @@ rrc_eNB_decode_ccch( ...@@ -3724,17 +3722,16 @@ rrc_eNB_decode_ccch(
random_value = (((uint64_t)mme_code) << 32) | m_tmsi; 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))) { 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?)" #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?)"); // AssertFatal(0 == 1, "TODO: remove UE from MAC/PHY (how?)");
ue_context_p = NULL; // ue_context_p = NULL;
} else { } else {
ue_context_p = rrc_eNB_get_next_free_ue_context(ctxt_pP, NOT_A_RANDOM_UE_IDENTITY); 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_LOG_RX_MESSAGE(
MSC_RRC_ENB, MSC_RRC_ENB,
...@@ -3780,7 +3777,8 @@ rrc_eNB_decode_ccch( ...@@ -3780,7 +3777,8 @@ rrc_eNB_decode_ccch(
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
ue_context_p->ue_context.random_ue_identity); ue_context_p->ue_context.random_ue_identity);
#endif #endif
eNB_rrc_inst[ctxt_pP->module_id].Nb_ue++; if (stmsi_received == 0)
eNB_rrc_inst[ctxt_pP->module_id].Nb_ue++;
} else { } else {
// no context available // no context available
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment