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
This commit is contained in:
@@ -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];
|
||||
int j,CC_id;
|
||||
PHY_VARS_eNB *phy_vars_eNB;
|
||||
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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*/
|
||||
|
||||
+27
-29
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user