Merge remote-tracking branch 'oai/develop' into oai-integration
Conflicts: openair1/SCHED/phy_procedures_lte_eNb.c openair2/LAYER2/MAC/eNB_scheduler.c
This commit is contained in:
+140
-130
@@ -90,8 +90,8 @@ void ue_mac_reset(module_id_t module_idP,uint8_t eNB_index)
|
||||
|
||||
int
|
||||
rrc_mac_config_req(
|
||||
module_id_t Mod_id,
|
||||
int CC_id,
|
||||
module_id_t Mod_idP,
|
||||
int CC_idP,
|
||||
eNB_flag_t eNB_flagP,
|
||||
rnti_t rntiP,
|
||||
uint8_t eNB_index,
|
||||
@@ -129,28 +129,31 @@ rrc_mac_config_req(
|
||||
int i;
|
||||
|
||||
int UE_id = -1;
|
||||
eNB_MAC_INST *eNB = &eNB_mac_inst[Mod_idP];
|
||||
UE_list_t *UE_list= &eNB->UE_list;
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_IN);
|
||||
|
||||
if (eNB_flagP==0) {
|
||||
LOG_I(MAC,"[CONFIG][UE %d] Configuring MAC/PHY from eNB %d\n",Mod_id,eNB_index);
|
||||
LOG_I(MAC,"[CONFIG][UE %d] Configuring MAC/PHY from eNB %d\n",Mod_idP,eNB_index);
|
||||
|
||||
if (tdd_Config != NULL) {
|
||||
UE_mac_inst[Mod_id].tdd_Config = tdd_Config;
|
||||
UE_mac_inst[Mod_idP].tdd_Config = tdd_Config;
|
||||
}
|
||||
} else {
|
||||
UE_id = find_UE_id(Mod_id, rntiP);
|
||||
UE_id = find_UE_id(Mod_idP, rntiP);
|
||||
if (physicalConfigDedicated == NULL) {
|
||||
LOG_I(MAC,"[CONFIG][eNB %d/%d] Configuring MAC/PHY\n", Mod_id, CC_id);
|
||||
LOG_I(MAC,"[CONFIG][eNB %d/%d] Configuring MAC/PHY\n", Mod_idP, CC_idP);
|
||||
} else {
|
||||
LOG_I(MAC,"[CONFIG][eNB %d/%d] Configuring MAC/PHY for UE %d (%x)\n", Mod_id, CC_id, UE_id, UE_RNTI(Mod_id, UE_id));
|
||||
LOG_I(MAC,"[CONFIG][eNB %d/%d] Configuring MAC/PHY for UE %d (%x)\n", Mod_idP, CC_idP, UE_id, UE_RNTI(Mod_idP, UE_id));
|
||||
}
|
||||
}
|
||||
|
||||
if (tdd_Config && SIwindowsize && SIperiod) {
|
||||
if (eNB_flagP == ENB_FLAG_YES) {
|
||||
mac_xface->phy_config_sib1_eNB(Mod_id, CC_id, tdd_Config, *SIwindowsize, *SIperiod);
|
||||
mac_xface->phy_config_sib1_eNB(Mod_idP, CC_idP, tdd_Config, *SIwindowsize, *SIperiod);
|
||||
} else {
|
||||
mac_xface->phy_config_sib1_ue(Mod_id,0,eNB_index,tdd_Config,*SIwindowsize,*SIperiod);
|
||||
mac_xface->phy_config_sib1_ue(Mod_idP,0,eNB_index,tdd_Config,*SIwindowsize,*SIperiod);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,106 +168,112 @@ rrc_mac_config_req(
|
||||
LOG_I(MAC,"[CONFIG]pusch_config_common.groupAssignmentPUSCH = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH);
|
||||
LOG_I(MAC,"[CONFIG]pusch_config_common.sequenceHoppingEnabled = %d\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled);
|
||||
LOG_I(MAC,"[CONFIG]pusch_config_common.cyclicShift = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift);
|
||||
mac_xface->phy_config_sib2_eNB(Mod_id, CC_id, radioResourceConfigCommon, ul_CarrierFreq, ul_Bandwidth, additionalSpectrumEmission, mbsfn_SubframeConfigList);
|
||||
mac_xface->phy_config_sib2_eNB(Mod_idP, CC_idP, radioResourceConfigCommon, ul_CarrierFreq, ul_Bandwidth, additionalSpectrumEmission, mbsfn_SubframeConfigList);
|
||||
} else {
|
||||
UE_mac_inst[Mod_id].radioResourceConfigCommon = radioResourceConfigCommon;
|
||||
mac_xface->phy_config_sib2_ue(Mod_id,0,eNB_index,radioResourceConfigCommon,ul_CarrierFreq,ul_Bandwidth,additionalSpectrumEmission,mbsfn_SubframeConfigList);
|
||||
UE_mac_inst[Mod_idP].radioResourceConfigCommon = radioResourceConfigCommon;
|
||||
mac_xface->phy_config_sib2_ue(Mod_idP,0,eNB_index,radioResourceConfigCommon,ul_CarrierFreq,ul_Bandwidth,additionalSpectrumEmission,mbsfn_SubframeConfigList);
|
||||
}
|
||||
}
|
||||
|
||||
// SRB2_lchan_config->choice.explicitValue.ul_SpecificParameters->logicalChannelGroup
|
||||
if (logicalChannelConfig!= NULL) {
|
||||
if (eNB_flagP==0) {
|
||||
LOG_I(MAC,"[CONFIG][UE %d] Applying RRC logicalChannelConfig from eNB%d\n",Mod_id,eNB_index);
|
||||
UE_mac_inst[Mod_id].logicalChannelConfig[logicalChannelIdentity]=logicalChannelConfig;
|
||||
UE_mac_inst[Mod_id].scheduling_info.Bj[logicalChannelIdentity]=0; // initilize the bucket for this lcid
|
||||
LOG_I(MAC,"[CONFIG][UE %d] Applying RRC logicalChannelConfig from eNB%d\n",Mod_idP,eNB_index);
|
||||
UE_mac_inst[Mod_idP].logicalChannelConfig[logicalChannelIdentity]=logicalChannelConfig;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.Bj[logicalChannelIdentity]=0; // initilize the bucket for this lcid
|
||||
|
||||
if (logicalChannelConfig->ul_SpecificParameters) {
|
||||
UE_mac_inst[Mod_id].scheduling_info.bucket_size[logicalChannelIdentity]=logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate *
|
||||
UE_mac_inst[Mod_idP].scheduling_info.bucket_size[logicalChannelIdentity]=logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate *
|
||||
logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration; // set the max bucket size
|
||||
UE_mac_inst[Mod_id].scheduling_info.LCGID[logicalChannelIdentity]=*logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup;
|
||||
LOG_D(MAC,"[CONFIG][UE %d] LCID %d is attached to the LCGID %d\n",Mod_id,logicalChannelIdentity,*logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup);
|
||||
UE_mac_inst[Mod_idP].scheduling_info.LCGID[logicalChannelIdentity]=*logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup;
|
||||
LOG_D(MAC,"[CONFIG][UE %d] LCID %d is attached to the LCGID %d\n",Mod_idP,logicalChannelIdentity,*logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup);
|
||||
} else {
|
||||
LOG_E(MAC,"[CONFIG][UE %d] LCID %d NULL ul_SpecificParameters\n",Mod_id,logicalChannelIdentity);
|
||||
LOG_E(MAC,"[CONFIG][UE %d] LCID %d NULL ul_SpecificParameters\n",Mod_idP,logicalChannelIdentity);
|
||||
mac_xface->macphy_exit("NULL ul_SpecificParameters");
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (logicalChannelConfig)
|
||||
UE_list->UE_template[CC_idP][UE_id].lcgidmap[logicalChannelIdentity] = *logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup;
|
||||
else
|
||||
UE_list->UE_template[CC_idP][UE_id].lcgidmap[logicalChannelIdentity] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (mac_MainConfig != NULL) {
|
||||
if (eNB_flagP==0) {
|
||||
LOG_I(MAC,"[CONFIG][UE%d] Applying RRC macMainConfig from eNB%d\n",Mod_id,eNB_index);
|
||||
UE_mac_inst[Mod_id].macConfig=mac_MainConfig;
|
||||
UE_mac_inst[Mod_id].measGapConfig=measGapConfig;
|
||||
LOG_I(MAC,"[CONFIG][UE%d] Applying RRC macMainConfig from eNB%d\n",Mod_idP,eNB_index);
|
||||
UE_mac_inst[Mod_idP].macConfig=mac_MainConfig;
|
||||
UE_mac_inst[Mod_idP].measGapConfig=measGapConfig;
|
||||
|
||||
if (mac_MainConfig->ul_SCH_Config) {
|
||||
|
||||
if (mac_MainConfig->ul_SCH_Config->periodicBSR_Timer) {
|
||||
UE_mac_inst[Mod_id].scheduling_info.periodicBSR_Timer = (uint16_t) *mac_MainConfig->ul_SCH_Config->periodicBSR_Timer;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_Timer = (uint16_t) *mac_MainConfig->ul_SCH_Config->periodicBSR_Timer;
|
||||
} else {
|
||||
UE_mac_inst[Mod_id].scheduling_info.periodicBSR_Timer = (uint16_t) MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_Timer = (uint16_t) MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity;
|
||||
}
|
||||
|
||||
if (mac_MainConfig->ul_SCH_Config->maxHARQ_Tx) {
|
||||
UE_mac_inst[Mod_id].scheduling_info.maxHARQ_Tx = (uint16_t) *mac_MainConfig->ul_SCH_Config->maxHARQ_Tx;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.maxHARQ_Tx = (uint16_t) *mac_MainConfig->ul_SCH_Config->maxHARQ_Tx;
|
||||
} else {
|
||||
UE_mac_inst[Mod_id].scheduling_info.maxHARQ_Tx = (uint16_t) MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.maxHARQ_Tx = (uint16_t) MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5;
|
||||
}
|
||||
|
||||
if (mac_MainConfig->ul_SCH_Config->retxBSR_Timer) {
|
||||
UE_mac_inst[Mod_id].scheduling_info.retxBSR_Timer = (uint16_t) mac_MainConfig->ul_SCH_Config->retxBSR_Timer;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer = (uint16_t) mac_MainConfig->ul_SCH_Config->retxBSR_Timer;
|
||||
} else {
|
||||
UE_mac_inst[Mod_id].scheduling_info.retxBSR_Timer = (uint16_t)MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf2560;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer = (uint16_t)MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf2560;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef Rel10
|
||||
|
||||
if (mac_MainConfig->ext1 && mac_MainConfig->ext1->sr_ProhibitTimer_r9) {
|
||||
UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer = (uint16_t) *mac_MainConfig->ext1->sr_ProhibitTimer_r9;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.sr_ProhibitTimer = (uint16_t) *mac_MainConfig->ext1->sr_ProhibitTimer_r9;
|
||||
} else {
|
||||
UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer = (uint16_t) 0;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.sr_ProhibitTimer = (uint16_t) 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
UE_mac_inst[Mod_id].scheduling_info.periodicBSR_SF = get_sf_periodicBSRTimer(UE_mac_inst[Mod_id].scheduling_info.periodicBSR_Timer);
|
||||
UE_mac_inst[Mod_id].scheduling_info.retxBSR_SF = get_sf_retxBSRTimer(UE_mac_inst[Mod_id].scheduling_info.retxBSR_Timer);
|
||||
UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_SF = get_sf_periodicBSRTimer(UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_Timer);
|
||||
UE_mac_inst[Mod_idP].scheduling_info.retxBSR_SF = get_sf_retxBSRTimer(UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer);
|
||||
|
||||
UE_mac_inst[Mod_id].scheduling_info.drx_config = mac_MainConfig->drx_Config;
|
||||
UE_mac_inst[Mod_id].scheduling_info.phr_config = mac_MainConfig->phr_Config;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.drx_config = mac_MainConfig->drx_Config;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.phr_config = mac_MainConfig->phr_Config;
|
||||
|
||||
if (mac_MainConfig->phr_Config) {
|
||||
UE_mac_inst[Mod_id].PHR_state = mac_MainConfig->phr_Config->present;
|
||||
UE_mac_inst[Mod_id].PHR_reconfigured = 1;
|
||||
UE_mac_inst[Mod_id].scheduling_info.periodicPHR_Timer = mac_MainConfig->phr_Config->choice.setup.periodicPHR_Timer;
|
||||
UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_Timer = mac_MainConfig->phr_Config->choice.setup.prohibitPHR_Timer;
|
||||
UE_mac_inst[Mod_id].scheduling_info.PathlossChange = mac_MainConfig->phr_Config->choice.setup.dl_PathlossChange;
|
||||
UE_mac_inst[Mod_idP].PHR_state = mac_MainConfig->phr_Config->present;
|
||||
UE_mac_inst[Mod_idP].PHR_reconfigured = 1;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_Timer = mac_MainConfig->phr_Config->choice.setup.periodicPHR_Timer;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_Timer = mac_MainConfig->phr_Config->choice.setup.prohibitPHR_Timer;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.PathlossChange = mac_MainConfig->phr_Config->choice.setup.dl_PathlossChange;
|
||||
} else {
|
||||
UE_mac_inst[Mod_id].PHR_reconfigured = 0;
|
||||
UE_mac_inst[Mod_id].PHR_state = MAC_MainConfig__phr_Config_PR_setup;
|
||||
UE_mac_inst[Mod_id].scheduling_info.periodicPHR_Timer = MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20;
|
||||
UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_Timer = MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20;
|
||||
UE_mac_inst[Mod_id].scheduling_info.PathlossChange = MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1;
|
||||
UE_mac_inst[Mod_idP].PHR_reconfigured = 0;
|
||||
UE_mac_inst[Mod_idP].PHR_state = MAC_MainConfig__phr_Config_PR_setup;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_Timer = MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_Timer = MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20;
|
||||
UE_mac_inst[Mod_idP].scheduling_info.PathlossChange = MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1;
|
||||
}
|
||||
|
||||
UE_mac_inst[Mod_id].scheduling_info.periodicPHR_SF = get_sf_perioidicPHR_Timer(UE_mac_inst[Mod_id].scheduling_info.periodicPHR_Timer);
|
||||
UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_SF = get_sf_prohibitPHR_Timer(UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_Timer);
|
||||
UE_mac_inst[Mod_id].scheduling_info.PathlossChange_db = get_db_dl_PathlossChange(UE_mac_inst[Mod_id].scheduling_info.PathlossChange);
|
||||
UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_SF = get_sf_perioidicPHR_Timer(UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_Timer);
|
||||
UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_SF = get_sf_prohibitPHR_Timer(UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_Timer);
|
||||
UE_mac_inst[Mod_idP].scheduling_info.PathlossChange_db = get_db_dl_PathlossChange(UE_mac_inst[Mod_idP].scheduling_info.PathlossChange);
|
||||
LOG_D(MAC,"[UE %d] config PHR (%d): periodic %d (SF) prohibit %d (SF) pathlosschange %d (db) \n",
|
||||
Mod_id,
|
||||
Mod_idP,
|
||||
(mac_MainConfig->phr_Config)?mac_MainConfig->phr_Config->present:-1,
|
||||
UE_mac_inst[Mod_id].scheduling_info.periodicPHR_SF,
|
||||
UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_SF,
|
||||
UE_mac_inst[Mod_id].scheduling_info.PathlossChange_db);
|
||||
UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_SF,
|
||||
UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_SF,
|
||||
UE_mac_inst[Mod_idP].scheduling_info.PathlossChange_db);
|
||||
}
|
||||
}
|
||||
|
||||
if (physicalConfigDedicated != NULL) {
|
||||
if (eNB_flagP==1) {
|
||||
mac_xface->phy_config_dedicated_eNB(Mod_id, CC_id, UE_RNTI(Mod_id, UE_id), physicalConfigDedicated);
|
||||
mac_xface->phy_config_dedicated_eNB(Mod_idP, CC_idP, UE_RNTI(Mod_idP, UE_id), physicalConfigDedicated);
|
||||
} else {
|
||||
mac_xface->phy_config_dedicated_ue(Mod_id,0,eNB_index,physicalConfigDedicated);
|
||||
UE_mac_inst[Mod_id].physicalConfigDedicated=physicalConfigDedicated; // for SR proc
|
||||
mac_xface->phy_config_dedicated_ue(Mod_idP,0,eNB_index,physicalConfigDedicated);
|
||||
UE_mac_inst[Mod_idP].physicalConfigDedicated=physicalConfigDedicated; // for SR proc
|
||||
}
|
||||
}
|
||||
|
||||
@@ -273,11 +282,12 @@ rrc_mac_config_req(
|
||||
if (sCellToAddMod_r10 != NULL) {
|
||||
|
||||
if (eNB_flagP==1) {
|
||||
mac_xface->phy_config_dedicated_scell_eNB(Mod_id,UE_RNTI(Mod_id,UE_id),sCellToAddMod_r10,1);
|
||||
mac_xface->phy_config_dedicated_scell_eNB(Mod_idP,UE_RNTI(Mod_idP,UE_id),sCellToAddMod_r10,1);
|
||||
} else {
|
||||
//#warning "phy_config_dedicated_scell_ue is empty"
|
||||
mac_xface->phy_config_dedicated_scell_ue(Mod_id,eNB_index,sCellToAddMod_r10,1);
|
||||
UE_mac_inst[Mod_id].physicalConfigDedicatedSCell_r10 = sCellToAddMod_r10->radioResourceConfigDedicatedSCell_r10->physicalConfigDedicatedSCell_r10; // using SCell index 0
|
||||
|
||||
//#warning "phy_config_dedicated_scell_ue is empty"
|
||||
mac_xface->phy_config_dedicated_scell_ue(Mod_idP,eNB_index,sCellToAddMod_r10,1);
|
||||
UE_mac_inst[Mod_idP].physicalConfigDedicatedSCell_r10 = sCellToAddMod_r10->radioResourceConfigDedicatedSCell_r10->physicalConfigDedicatedSCell_r10; // using SCell index 0
|
||||
}
|
||||
}
|
||||
|
||||
@@ -286,22 +296,22 @@ rrc_mac_config_req(
|
||||
if (eNB_flagP == 0) {
|
||||
if (measObj!= NULL) {
|
||||
if (measObj[0]!= NULL) {
|
||||
UE_mac_inst[Mod_id].n_adj_cells = measObj[0]->measObject.choice.measObjectEUTRA.cellsToAddModList->list.count;
|
||||
LOG_I(MAC,"Number of adjacent cells %d\n",UE_mac_inst[Mod_id].n_adj_cells);
|
||||
UE_mac_inst[Mod_idP].n_adj_cells = measObj[0]->measObject.choice.measObjectEUTRA.cellsToAddModList->list.count;
|
||||
LOG_I(MAC,"Number of adjacent cells %d\n",UE_mac_inst[Mod_idP].n_adj_cells);
|
||||
|
||||
for (i=0; i<UE_mac_inst[Mod_id].n_adj_cells; i++) {
|
||||
UE_mac_inst[Mod_id].adj_cell_id[i] = measObj[0]->measObject.choice.measObjectEUTRA.cellsToAddModList->list.array[i]->physCellId;
|
||||
LOG_I(MAC,"Cell %d : Nid_cell %d\n",i,UE_mac_inst[Mod_id].adj_cell_id[i]);
|
||||
for (i=0; i<UE_mac_inst[Mod_idP].n_adj_cells; i++) {
|
||||
UE_mac_inst[Mod_idP].adj_cell_id[i] = measObj[0]->measObject.choice.measObjectEUTRA.cellsToAddModList->list.array[i]->physCellId;
|
||||
LOG_I(MAC,"Cell %d : Nid_cell %d\n",i,UE_mac_inst[Mod_idP].adj_cell_id[i]);
|
||||
}
|
||||
|
||||
mac_xface->phy_config_meas_ue(Mod_id,0,eNB_index,UE_mac_inst[Mod_id].n_adj_cells,UE_mac_inst[Mod_id].adj_cell_id);
|
||||
mac_xface->phy_config_meas_ue(Mod_idP,0,eNB_index,UE_mac_inst[Mod_idP].n_adj_cells,UE_mac_inst[Mod_idP].adj_cell_id);
|
||||
}
|
||||
|
||||
/*
|
||||
if (quantityConfig != NULL) {
|
||||
if (quantityConfig[0] != NULL) {
|
||||
UE_mac_inst[Mod_id].quantityConfig = quantityConfig[0];
|
||||
LOG_I(MAC,"UE %d configured filterCoeff.",UE_mac_inst[Mod_id].crnti);
|
||||
UE_mac_inst[Mod_idP].quantityConfig = quantityConfig[0];
|
||||
LOG_I(MAC,"UE %d configured filterCoeff.",UE_mac_inst[Mod_idP].crnti);
|
||||
mac_xface->phy_config_meas_ue
|
||||
}
|
||||
}
|
||||
@@ -312,51 +322,51 @@ rrc_mac_config_req(
|
||||
if (eNB_flagP==0) {
|
||||
if(mobilityControlInfo != NULL) {
|
||||
|
||||
LOG_D(MAC,"[UE%d] MAC Reset procedure triggered by RRC eNB %d \n",Mod_id,eNB_index);
|
||||
ue_mac_reset(Mod_id,eNB_index);
|
||||
LOG_D(MAC,"[UE%d] MAC Reset procedure triggered by RRC eNB %d \n",Mod_idP,eNB_index);
|
||||
ue_mac_reset(Mod_idP,eNB_index);
|
||||
|
||||
if(mobilityControlInfo->radioResourceConfigCommon.rach_ConfigCommon) {
|
||||
memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->rach_ConfigCommon,
|
||||
memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->rach_ConfigCommon,
|
||||
(void *)mobilityControlInfo->radioResourceConfigCommon.rach_ConfigCommon,
|
||||
sizeof(RACH_ConfigCommon_t));
|
||||
}
|
||||
|
||||
memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->prach_Config.prach_ConfigInfo,
|
||||
memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->prach_Config.prach_ConfigInfo,
|
||||
(void *)mobilityControlInfo->radioResourceConfigCommon.prach_Config.prach_ConfigInfo,
|
||||
sizeof(PRACH_ConfigInfo_t));
|
||||
UE_mac_inst[Mod_id].radioResourceConfigCommon->prach_Config.rootSequenceIndex = mobilityControlInfo->radioResourceConfigCommon.prach_Config.rootSequenceIndex;
|
||||
UE_mac_inst[Mod_idP].radioResourceConfigCommon->prach_Config.rootSequenceIndex = mobilityControlInfo->radioResourceConfigCommon.prach_Config.rootSequenceIndex;
|
||||
|
||||
if(mobilityControlInfo->radioResourceConfigCommon.pdsch_ConfigCommon) {
|
||||
memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->pdsch_ConfigCommon,
|
||||
memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->pdsch_ConfigCommon,
|
||||
(void *)mobilityControlInfo->radioResourceConfigCommon.pdsch_ConfigCommon,
|
||||
sizeof(PDSCH_ConfigCommon_t));
|
||||
}
|
||||
|
||||
// not a pointer: mobilityControlInfo->radioResourceConfigCommon.pusch_ConfigCommon
|
||||
memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->pusch_ConfigCommon,
|
||||
memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->pusch_ConfigCommon,
|
||||
(void *)&mobilityControlInfo->radioResourceConfigCommon.pusch_ConfigCommon,
|
||||
sizeof(PUSCH_ConfigCommon_t));
|
||||
|
||||
if(mobilityControlInfo->radioResourceConfigCommon.phich_Config) {
|
||||
/* memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->phich_Config,
|
||||
/* memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->phich_Config,
|
||||
(void *)mobilityControlInfo->radioResourceConfigCommon.phich_Config,
|
||||
sizeof(PHICH_Config_t)); */
|
||||
}
|
||||
|
||||
if(mobilityControlInfo->radioResourceConfigCommon.pucch_ConfigCommon) {
|
||||
memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->pucch_ConfigCommon,
|
||||
memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->pucch_ConfigCommon,
|
||||
(void *)mobilityControlInfo->radioResourceConfigCommon.pucch_ConfigCommon,
|
||||
sizeof(PUCCH_ConfigCommon_t));
|
||||
}
|
||||
|
||||
if(mobilityControlInfo->radioResourceConfigCommon.soundingRS_UL_ConfigCommon) {
|
||||
memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->soundingRS_UL_ConfigCommon,
|
||||
memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->soundingRS_UL_ConfigCommon,
|
||||
(void *)mobilityControlInfo->radioResourceConfigCommon.soundingRS_UL_ConfigCommon,
|
||||
sizeof(SoundingRS_UL_ConfigCommon_t));
|
||||
}
|
||||
|
||||
if(mobilityControlInfo->radioResourceConfigCommon.uplinkPowerControlCommon) {
|
||||
memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->uplinkPowerControlCommon,
|
||||
memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->uplinkPowerControlCommon,
|
||||
(void *)mobilityControlInfo->radioResourceConfigCommon.uplinkPowerControlCommon,
|
||||
sizeof(UplinkPowerControlCommon_t));
|
||||
}
|
||||
@@ -367,54 +377,54 @@ rrc_mac_config_req(
|
||||
}
|
||||
|
||||
if(mobilityControlInfo->radioResourceConfigCommon.tdd_Config) {
|
||||
UE_mac_inst[Mod_id].tdd_Config = mobilityControlInfo->radioResourceConfigCommon.tdd_Config;
|
||||
UE_mac_inst[Mod_idP].tdd_Config = mobilityControlInfo->radioResourceConfigCommon.tdd_Config;
|
||||
}
|
||||
|
||||
if(mobilityControlInfo->radioResourceConfigCommon.ul_CyclicPrefixLength) {
|
||||
memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->ul_CyclicPrefixLength,
|
||||
memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->ul_CyclicPrefixLength,
|
||||
(void *)mobilityControlInfo->radioResourceConfigCommon.ul_CyclicPrefixLength,
|
||||
sizeof(UL_CyclicPrefixLength_t));
|
||||
}
|
||||
|
||||
// store the previous rnti in case of failure, and set thenew rnti
|
||||
UE_mac_inst[Mod_id].crnti_before_ho = UE_mac_inst[Mod_id].crnti;
|
||||
UE_mac_inst[Mod_id].crnti = ((mobilityControlInfo->newUE_Identity.buf[0])|(mobilityControlInfo->newUE_Identity.buf[1]<<8));
|
||||
LOG_I(MAC,"[UE %d] Received new identity %x from %d\n", Mod_id, UE_mac_inst[Mod_id].crnti, eNB_index);
|
||||
UE_mac_inst[Mod_id].rach_ConfigDedicated = malloc(sizeof(*mobilityControlInfo->rach_ConfigDedicated));
|
||||
UE_mac_inst[Mod_idP].crnti_before_ho = UE_mac_inst[Mod_idP].crnti;
|
||||
UE_mac_inst[Mod_idP].crnti = ((mobilityControlInfo->newUE_Identity.buf[0])|(mobilityControlInfo->newUE_Identity.buf[1]<<8));
|
||||
LOG_I(MAC,"[UE %d] Received new identity %x from %d\n", Mod_idP, UE_mac_inst[Mod_idP].crnti, eNB_index);
|
||||
UE_mac_inst[Mod_idP].rach_ConfigDedicated = malloc(sizeof(*mobilityControlInfo->rach_ConfigDedicated));
|
||||
|
||||
if (mobilityControlInfo->rach_ConfigDedicated) {
|
||||
memcpy((void*)UE_mac_inst[Mod_id].rach_ConfigDedicated,
|
||||
memcpy((void*)UE_mac_inst[Mod_idP].rach_ConfigDedicated,
|
||||
(void*)mobilityControlInfo->rach_ConfigDedicated,
|
||||
sizeof(*mobilityControlInfo->rach_ConfigDedicated));
|
||||
}
|
||||
|
||||
mac_xface->phy_config_afterHO_ue(Mod_id,0,eNB_index,mobilityControlInfo,0);
|
||||
mac_xface->phy_config_afterHO_ue(Mod_idP,0,eNB_index,mobilityControlInfo,0);
|
||||
}
|
||||
}
|
||||
|
||||
if (mbsfn_SubframeConfigList != NULL) {
|
||||
if (eNB_flagP == 1) {
|
||||
LOG_I(MAC,"[eNB %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n", Mod_id, mbsfn_SubframeConfigList->list.count);
|
||||
eNB_mac_inst[Mod_id].common_channels[0].num_sf_allocation_pattern= mbsfn_SubframeConfigList->list.count;
|
||||
LOG_I(MAC,"[eNB %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n", Mod_idP, mbsfn_SubframeConfigList->list.count);
|
||||
eNB_mac_inst[Mod_idP].common_channels[0].num_sf_allocation_pattern= mbsfn_SubframeConfigList->list.count;
|
||||
|
||||
for (i=0; i<mbsfn_SubframeConfigList->list.count; i++) {
|
||||
eNB_mac_inst[Mod_id].common_channels[0].mbsfn_SubframeConfig[i] = mbsfn_SubframeConfigList->list.array[i];
|
||||
LOG_I(MAC, "[eNB %d][CONFIG] MBSFN_SubframeConfig[%d] pattern is %x\n", Mod_id, i,
|
||||
eNB_mac_inst[Mod_id].common_channels[0].mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]);
|
||||
eNB_mac_inst[Mod_idP].common_channels[0].mbsfn_SubframeConfig[i] = mbsfn_SubframeConfigList->list.array[i];
|
||||
LOG_I(MAC, "[eNB %d][CONFIG] MBSFN_SubframeConfig[%d] pattern is %x\n", Mod_idP, i,
|
||||
eNB_mac_inst[Mod_idP].common_channels[0].mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]);
|
||||
}
|
||||
|
||||
#ifdef Rel10
|
||||
eNB_mac_inst[Mod_id].common_channels[0].MBMS_flag = MBMS_Flag;
|
||||
eNB_mac_inst[Mod_idP].common_channels[0].MBMS_flag = MBMS_Flag;
|
||||
#endif
|
||||
} else { // UE
|
||||
LOG_I(MAC,"[UE %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n", Mod_id, mbsfn_SubframeConfigList->list.count);
|
||||
UE_mac_inst[Mod_id].num_sf_allocation_pattern= mbsfn_SubframeConfigList->list.count;
|
||||
LOG_I(MAC,"[UE %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n", Mod_idP, mbsfn_SubframeConfigList->list.count);
|
||||
UE_mac_inst[Mod_idP].num_sf_allocation_pattern= mbsfn_SubframeConfigList->list.count;
|
||||
|
||||
for (i=0; i<mbsfn_SubframeConfigList->list.count; i++) {
|
||||
LOG_I(MAC, "[UE %d] Configuring MBSFN_SubframeConfig %d from received SIB2 \n", Mod_id, i);
|
||||
UE_mac_inst[Mod_id].mbsfn_SubframeConfig[i] = mbsfn_SubframeConfigList->list.array[i];
|
||||
// LOG_I("[UE %d] MBSFN_SubframeConfig[%d] pattern is %ld\n", Mod_id,
|
||||
// UE_mac_inst[Mod_id].mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]);
|
||||
LOG_I(MAC, "[UE %d] Configuring MBSFN_SubframeConfig %d from received SIB2 \n", Mod_idP, i);
|
||||
UE_mac_inst[Mod_idP].mbsfn_SubframeConfig[i] = mbsfn_SubframeConfigList->list.array[i];
|
||||
// LOG_I("[UE %d] MBSFN_SubframeConfig[%d] pattern is %ld\n", Mod_idP,
|
||||
// UE_mac_inst[Mod_idP].mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -424,24 +434,24 @@ rrc_mac_config_req(
|
||||
if (mbsfn_AreaInfoList != NULL) {
|
||||
if (eNB_flagP == 1) {
|
||||
// One eNB could be part of multiple mbsfn syc area, this could change over time so reset each time
|
||||
LOG_I(MAC,"[eNB %d][CONFIG] Received %d MBSFN Area Info\n", Mod_id, mbsfn_AreaInfoList->list.count);
|
||||
eNB_mac_inst[Mod_id].common_channels[0].num_active_mbsfn_area = mbsfn_AreaInfoList->list.count;
|
||||
LOG_I(MAC,"[eNB %d][CONFIG] Received %d MBSFN Area Info\n", Mod_idP, mbsfn_AreaInfoList->list.count);
|
||||
eNB_mac_inst[Mod_idP].common_channels[0].num_active_mbsfn_area = mbsfn_AreaInfoList->list.count;
|
||||
|
||||
for (i =0; i< mbsfn_AreaInfoList->list.count; i++) {
|
||||
eNB_mac_inst[Mod_id].common_channels[0].mbsfn_AreaInfo[i] = mbsfn_AreaInfoList->list.array[i];
|
||||
LOG_I(MAC,"[eNB %d][CONFIG] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n", Mod_id,i,
|
||||
eNB_mac_inst[Mod_id].common_channels[0].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9);
|
||||
mac_xface->phy_config_sib13_eNB(Mod_id,0,i,eNB_mac_inst[Mod_id].common_channels[0].mbsfn_AreaInfo[i]->mbsfn_AreaId_r9);
|
||||
eNB_mac_inst[Mod_idP].common_channels[0].mbsfn_AreaInfo[i] = mbsfn_AreaInfoList->list.array[i];
|
||||
LOG_I(MAC,"[eNB %d][CONFIG] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n", Mod_idP,i,
|
||||
eNB_mac_inst[Mod_idP].common_channels[0].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9);
|
||||
mac_xface->phy_config_sib13_eNB(Mod_idP,0,i,eNB_mac_inst[Mod_idP].common_channels[0].mbsfn_AreaInfo[i]->mbsfn_AreaId_r9);
|
||||
}
|
||||
} else { // UE
|
||||
LOG_I(MAC,"[UE %d][CONFIG] Received %d MBSFN Area Info\n", Mod_id, mbsfn_AreaInfoList->list.count);
|
||||
UE_mac_inst[Mod_id].num_active_mbsfn_area = mbsfn_AreaInfoList->list.count;
|
||||
LOG_I(MAC,"[UE %d][CONFIG] Received %d MBSFN Area Info\n", Mod_idP, mbsfn_AreaInfoList->list.count);
|
||||
UE_mac_inst[Mod_idP].num_active_mbsfn_area = mbsfn_AreaInfoList->list.count;
|
||||
|
||||
for (i =0; i< mbsfn_AreaInfoList->list.count; i++) {
|
||||
UE_mac_inst[Mod_id].mbsfn_AreaInfo[i] = mbsfn_AreaInfoList->list.array[i];
|
||||
LOG_I(MAC,"[UE %d] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n",Mod_id, i,
|
||||
UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9);
|
||||
mac_xface->phy_config_sib13_ue(Mod_id,0,eNB_index,i,UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mbsfn_AreaId_r9);
|
||||
UE_mac_inst[Mod_idP].mbsfn_AreaInfo[i] = mbsfn_AreaInfoList->list.array[i];
|
||||
LOG_I(MAC,"[UE %d] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n",Mod_idP, i,
|
||||
UE_mac_inst[Mod_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9);
|
||||
mac_xface->phy_config_sib13_ue(Mod_idP,0,eNB_index,i,UE_mac_inst[Mod_idP].mbsfn_AreaInfo[i]->mbsfn_AreaId_r9);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -456,29 +466,29 @@ rrc_mac_config_req(
|
||||
LOG_I(MAC, "[CONFIG] Number of PMCH in this MBSFN Area %d\n", pmch_InfoList->list.count);
|
||||
|
||||
for (i =0; i< pmch_InfoList->list.count; i++) {
|
||||
eNB_mac_inst[Mod_id].common_channels[0].pmch_Config[i] = &pmch_InfoList->list.array[i]->pmch_Config_r9;
|
||||
eNB_mac_inst[Mod_idP].common_channels[0].pmch_Config[i] = &pmch_InfoList->list.array[i]->pmch_Config_r9;
|
||||
|
||||
LOG_I(MAC, "[CONFIG] PMCH[%d]: This PMCH stop (sf_AllocEnd_r9) at subframe %ldth\n", i,
|
||||
eNB_mac_inst[Mod_id].common_channels[0].pmch_Config[i]->sf_AllocEnd_r9);
|
||||
eNB_mac_inst[Mod_idP].common_channels[0].pmch_Config[i]->sf_AllocEnd_r9);
|
||||
LOG_I(MAC, "[CONFIG] PMCH[%d]: mch_Scheduling_Period = %ld\n", i,
|
||||
eNB_mac_inst[Mod_id].common_channels[0].pmch_Config[i]->mch_SchedulingPeriod_r9);
|
||||
eNB_mac_inst[Mod_idP].common_channels[0].pmch_Config[i]->mch_SchedulingPeriod_r9);
|
||||
LOG_I(MAC, "[CONFIG] PMCH[%d]: dataMCS = %ld\n", i,
|
||||
eNB_mac_inst[Mod_id].common_channels[0].pmch_Config[i]->dataMCS_r9);
|
||||
eNB_mac_inst[Mod_idP].common_channels[0].pmch_Config[i]->dataMCS_r9);
|
||||
|
||||
// MBMS session info list in each MCH
|
||||
eNB_mac_inst[Mod_id].common_channels[0].mbms_SessionList[i] = &pmch_InfoList->list.array[i]->mbms_SessionInfoList_r9;
|
||||
LOG_I(MAC, "PMCH[%d] Number of session (MTCH) is: %d\n",i, eNB_mac_inst[Mod_id].common_channels[0].mbms_SessionList[i]->list.count);
|
||||
eNB_mac_inst[Mod_idP].common_channels[0].mbms_SessionList[i] = &pmch_InfoList->list.array[i]->mbms_SessionInfoList_r9;
|
||||
LOG_I(MAC, "PMCH[%d] Number of session (MTCH) is: %d\n",i, eNB_mac_inst[Mod_idP].common_channels[0].mbms_SessionList[i]->list.count);
|
||||
}
|
||||
} else { // UE
|
||||
LOG_I(MAC, "[UE %d] Configuring PMCH_config from MCCH MESSAGE \n",Mod_id);
|
||||
LOG_I(MAC, "[UE %d] Configuring PMCH_config from MCCH MESSAGE \n",Mod_idP);
|
||||
|
||||
for (i =0; i< pmch_InfoList->list.count; i++) {
|
||||
UE_mac_inst[Mod_id].pmch_Config[i] = &pmch_InfoList->list.array[i]->pmch_Config_r9;
|
||||
LOG_I(MAC, "[UE %d] PMCH[%d]: MCH_Scheduling_Period = %ld\n", Mod_id, i,
|
||||
UE_mac_inst[Mod_id].pmch_Config[i]->mch_SchedulingPeriod_r9);
|
||||
UE_mac_inst[Mod_idP].pmch_Config[i] = &pmch_InfoList->list.array[i]->pmch_Config_r9;
|
||||
LOG_I(MAC, "[UE %d] PMCH[%d]: MCH_Scheduling_Period = %ld\n", Mod_idP, i,
|
||||
UE_mac_inst[Mod_idP].pmch_Config[i]->mch_SchedulingPeriod_r9);
|
||||
}
|
||||
|
||||
UE_mac_inst[Mod_id].mcch_status = 1;
|
||||
UE_mac_inst[Mod_idP].mcch_status = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -487,28 +497,28 @@ rrc_mac_config_req(
|
||||
|
||||
if (eNB_flagP == 0) {
|
||||
if (cba_rnti) {
|
||||
UE_mac_inst[Mod_id].cba_rnti[num_active_cba_groups-1] = cba_rnti;
|
||||
UE_mac_inst[Mod_idP].cba_rnti[num_active_cba_groups-1] = cba_rnti;
|
||||
LOG_D(MAC,"[UE %d] configure CBA group %d RNTI %x for eNB %d (total active cba group %d)\n",
|
||||
Mod_id,Mod_id%num_active_cba_groups, cba_rnti,eNB_index,num_active_cba_groups);
|
||||
mac_xface->phy_config_cba_rnti(Mod_id,CC_id,eNB_flagP,eNB_index,cba_rnti,num_active_cba_groups-1, num_active_cba_groups);
|
||||
Mod_idP,Mod_idP%num_active_cba_groups, cba_rnti,eNB_index,num_active_cba_groups);
|
||||
mac_xface->phy_config_cba_rnti(Mod_idP,CC_idP,eNB_flagP,eNB_index,cba_rnti,num_active_cba_groups-1, num_active_cba_groups);
|
||||
}
|
||||
} else {
|
||||
if (cba_rnti) {
|
||||
LOG_D(MAC,"[eNB %d] configure CBA RNTI for UE %d (total active cba groups %d)\n",
|
||||
Mod_id, UE_id, num_active_cba_groups);
|
||||
eNB_mac_inst[Mod_id].common_channels[CC_id].num_active_cba_groups=num_active_cba_groups;
|
||||
Mod_idP, UE_id, num_active_cba_groups);
|
||||
eNB_mac_inst[Mod_idP].common_channels[CC_idP].num_active_cba_groups=num_active_cba_groups;
|
||||
|
||||
for (i=0; i < num_active_cba_groups; i ++) {
|
||||
if (eNB_mac_inst[Mod_id].common_channels[CC_id].cba_rnti[i] != cba_rnti + i) {
|
||||
eNB_mac_inst[Mod_id].common_channels[CC_id].cba_rnti[i] = cba_rnti + i;
|
||||
if (eNB_mac_inst[Mod_idP].common_channels[CC_idP].cba_rnti[i] != cba_rnti + i) {
|
||||
eNB_mac_inst[Mod_idP].common_channels[CC_idP].cba_rnti[i] = cba_rnti + i;
|
||||
}
|
||||
|
||||
//only configure UE ids up to num_active_cba_groups
|
||||
//we use them as candidates for the transmission of dci format0)
|
||||
if (UE_id%num_active_cba_groups == i) {
|
||||
mac_xface->phy_config_cba_rnti(Mod_id,CC_id,eNB_flagP,UE_id,cba_rnti + i,i,num_active_cba_groups );
|
||||
mac_xface->phy_config_cba_rnti(Mod_idP,CC_idP,eNB_flagP,UE_id,cba_rnti + i,i,num_active_cba_groups );
|
||||
LOG_D(MAC,"[eNB %d] configure CBA groups %d with RNTI %x for UE %d (total active cba groups %d)\n",
|
||||
Mod_id, i, eNB_mac_inst[Mod_id].common_channels[CC_id].cba_rnti[i],UE_id, num_active_cba_groups);
|
||||
Mod_idP, i, eNB_mac_inst[Mod_idP].common_channels[CC_idP].cba_rnti[i],UE_id, num_active_cba_groups);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -558,7 +568,7 @@ rrc_get_estimated_ue_distance(
|
||||
return eNB_UE_stats->distance.power_based;
|
||||
}
|
||||
|
||||
// LOG_D(LOCALIZE, "DEBUG ME, dist = %d\n", &eNB_mac_inst[ctxt_pP->module_id].UE_list.UE_template[CC_id][UE_id].distance.power_based);
|
||||
// LOG_D(LOCALIZE, "DEBUG ME, dist = %d\n", &eNB_mac_inst[ctxt_pP->module_id].UE_list.UE_template[CC_idP][UE_id].distance.power_based);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -251,7 +251,7 @@ typedef struct {
|
||||
typedef struct {
|
||||
uint8_t Num_ue_spec_dci ;
|
||||
uint8_t Num_common_dci ;
|
||||
uint32_t nCCE;
|
||||
// uint32_t nCCE;
|
||||
uint32_t num_pdcch_symbols;
|
||||
DCI_ALLOC_t dci_alloc[NUM_DCI_MAX] ;
|
||||
} DCI_PDU;
|
||||
@@ -667,9 +667,12 @@ typedef struct {
|
||||
|
||||
// Logical channel info for link with RLC
|
||||
|
||||
/// UE BSR info for each logical channel group id
|
||||
/// Last received UE BSR info for each logical channel group id
|
||||
uint8_t bsr_info[MAX_NUM_LCGID];
|
||||
|
||||
/// LCGID mapping
|
||||
long lcgidmap[11];
|
||||
|
||||
/// phr information
|
||||
int8_t phr_info;
|
||||
|
||||
@@ -750,7 +753,15 @@ typedef struct {
|
||||
uint16_t pre_nb_available_rbs[MAX_NUM_CCs];
|
||||
unsigned char rballoc_sub_UE[MAX_NUM_CCs][N_RBG_MAX];
|
||||
uint16_t ta_timer;
|
||||
int16_t ta_update;
|
||||
int16_t ta_update;
|
||||
int32_t context_active_timer;
|
||||
int32_t cqi_req_timer;
|
||||
int32_t ul_inactivity_timer;
|
||||
int32_t ul_failure_timer;
|
||||
int32_t ul_scheduled;
|
||||
int32_t ra_pdcch_order_sent;
|
||||
int32_t ul_out_of_sync;
|
||||
int32_t phr_received;
|
||||
} UE_sched_ctrl;
|
||||
/*! \brief eNB template for the Random access information */
|
||||
typedef struct {
|
||||
|
||||
@@ -99,7 +99,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
#endif
|
||||
#if defined(ENABLE_ITTI)
|
||||
MessageDef *msg_p;
|
||||
const char *msg_name;
|
||||
const char *msg_name;
|
||||
instance_t instance;
|
||||
int result;
|
||||
#endif
|
||||
@@ -107,6 +107,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
int CC_id,i,next_i;
|
||||
UE_list_t *UE_list=&eNB_mac_inst[module_idP].UE_list;
|
||||
rnti_t rnti;
|
||||
void *DLSCH_dci=NULL;
|
||||
int size_bits=0,size_bytes=0;
|
||||
|
||||
Protocol__ProgranMessage *msg;
|
||||
|
||||
@@ -117,8 +119,6 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
|
||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||
DCI_pdu[CC_id] = &eNB_mac_inst[module_idP].common_channels[CC_id].DCI_pdu;
|
||||
DCI_pdu[CC_id]->nCCE=0;
|
||||
DCI_pdu[CC_id]->num_pdcch_symbols=1;
|
||||
mbsfn_status[CC_id]=0;
|
||||
// clear vrb_map
|
||||
memset(eNB_mac_inst[module_idP].common_channels[CC_id].vrb_map,0,100);
|
||||
@@ -134,8 +134,16 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
mac_xface->get_eNB_UE_stats(module_idP, CC_id, rnti));
|
||||
next_i= UE_list->next[i];
|
||||
|
||||
PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_bsr[i][(frameP*10)+subframeP]=-63;
|
||||
if (i==UE_list->head)
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR,PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_bsr[i][(frameP*10)+subframeP]);
|
||||
// increment this, it is cleared when we receive an sdu
|
||||
eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[i].ul_inactivity_timer++;
|
||||
|
||||
eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[i].cqi_req_timer++;
|
||||
|
||||
if (mac_xface->get_eNB_UE_stats(module_idP, CC_id, rnti)==NULL) {
|
||||
mac_remove_ue(module_idP, i, frameP, subframeP);
|
||||
//mac_remove_ue(module_idP, i, frameP, subframeP);
|
||||
//Inform the controller about the UE deactivation. Should be moved to RRC agent in the future
|
||||
if (mac_agent_registered[module_idP]) {
|
||||
agent_mac_xface[module_idP]->enb_agent_notify_ue_state_change(module_idP,
|
||||
@@ -143,6 +151,114 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
PROTOCOL__PRP_UE_STATE_CHANGE_TYPE__PRUESC_DEACTIVATED);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// check uplink failure
|
||||
if ((UE_list->UE_sched_ctrl[i].ul_failure_timer>0)&&
|
||||
(UE_list->UE_sched_ctrl[i].ul_out_of_sync==0)) {
|
||||
LOG_D(MAC,"UE %d rnti %x: UL Failure timer %d \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);
|
||||
if (UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent==0) {
|
||||
UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent=1;
|
||||
|
||||
// add a format 1A dci for this UE to request an RA procedure (only one UE per subframe)
|
||||
LOG_D(MAC,"UE %d rnti %x: sending PDCCH order for RAPROC (failure timer %d) \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);
|
||||
DLSCH_dci = (void *)UE_list->UE_template[CC_id][i].DLSCH_DCI[0];
|
||||
*(uint32_t*)DLSCH_dci = 0;
|
||||
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
||||
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
((DCI1A_1_5MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
|
||||
((DCI1A_1_5MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 31;
|
||||
size_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
|
||||
size_bits = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
|
||||
break;
|
||||
case 25:
|
||||
((DCI1A_5MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
|
||||
((DCI1A_5MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 511;
|
||||
size_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t);
|
||||
size_bits = sizeof_DCI1A_5MHz_TDD_1_6_t;
|
||||
break;
|
||||
case 50:
|
||||
((DCI1A_10MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
|
||||
((DCI1A_10MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 2047;
|
||||
size_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t);
|
||||
size_bits = sizeof_DCI1A_10MHz_TDD_1_6_t;
|
||||
break;
|
||||
case 100:
|
||||
((DCI1A_20MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
|
||||
((DCI1A_20MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 8191;
|
||||
size_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t);
|
||||
size_bits = sizeof_DCI1A_20MHz_TDD_1_6_t;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else { // FDD
|
||||
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
((DCI1A_1_5MHz_FDD_t*)DLSCH_dci)->type = 1;
|
||||
((DCI1A_1_5MHz_FDD_t*)DLSCH_dci)->rballoc = 31;
|
||||
size_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
|
||||
size_bits = sizeof_DCI1A_1_5MHz_FDD_t;
|
||||
break;
|
||||
case 15:/*
|
||||
((DCI1A_2_5MHz_FDD_t*)DLSCH_dci)->type = 1;
|
||||
((DCI1A_2_5MHz_FDD_t*)DLSCH_dci)->rballoc = 31;
|
||||
size_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
|
||||
size_bits = sizeof_DCI1A_1_5MHz_FDD_t;*/
|
||||
break;
|
||||
case 25:
|
||||
((DCI1A_5MHz_FDD_t*)DLSCH_dci)->type = 1;
|
||||
((DCI1A_5MHz_FDD_t*)DLSCH_dci)->rballoc = 511;
|
||||
size_bytes = sizeof(DCI1A_5MHz_FDD_t);
|
||||
size_bits = sizeof_DCI1A_5MHz_FDD_t;
|
||||
break;
|
||||
case 50:
|
||||
((DCI1A_10MHz_FDD_t*)DLSCH_dci)->type = 1;
|
||||
((DCI1A_10MHz_FDD_t*)DLSCH_dci)->rballoc = 2047;
|
||||
size_bytes = sizeof(DCI1A_10MHz_FDD_t);
|
||||
size_bits = sizeof_DCI1A_10MHz_FDD_t;
|
||||
break;
|
||||
case 75:
|
||||
/* ((DCI1A_15MHz_FDD_t*)DLSCH_dci)->type = 1;
|
||||
((DCI1A_15MHz_FDD_t*)DLSCH_dci)->rballoc = 2047;
|
||||
size_bytes = sizeof(DCI1A_10MHz_FDD_t);
|
||||
size_bits = sizeof_DCI1A_10MHz_FDD_t;*/
|
||||
break;
|
||||
case 100:
|
||||
((DCI1A_20MHz_FDD_t*)DLSCH_dci)->type = 1;
|
||||
((DCI1A_20MHz_FDD_t*)DLSCH_dci)->rballoc = 8191;
|
||||
size_bytes = sizeof(DCI1A_20MHz_FDD_t);
|
||||
size_bits = sizeof_DCI1A_20MHz_FDD_t;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
add_ue_spec_dci(DCI_pdu[CC_id],
|
||||
DLSCH_dci,
|
||||
rnti,
|
||||
size_bytes,
|
||||
process_ue_cqi (module_idP,i),//aggregation,
|
||||
size_bits,
|
||||
format1A,
|
||||
0);
|
||||
}
|
||||
else { // ra_pdcch_sent==1
|
||||
LOG_D(MAC,"UE %d rnti %x: sent PDCCH order for RAPROC waiting (failure timer %d) \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);
|
||||
if ((UE_list->UE_sched_ctrl[i].ul_failure_timer % 40) == 0)
|
||||
UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent=0; // resend every 4 frames
|
||||
}
|
||||
|
||||
UE_list->UE_sched_ctrl[i].ul_failure_timer++;
|
||||
// check threshold
|
||||
if (UE_list->UE_sched_ctrl[i].ul_failure_timer > 200) {
|
||||
// inform RRC of failure and clear timer
|
||||
LOG_I(MAC,"UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);
|
||||
mac_eNB_rrc_ul_failure(module_idP,CC_id,frameP,subframeP,rnti);
|
||||
UE_list->UE_sched_ctrl[i].ul_failure_timer=0;
|
||||
UE_list->UE_sched_ctrl[i].ul_out_of_sync=1;
|
||||
}
|
||||
}
|
||||
} // ul_failure_timer>0
|
||||
|
||||
i = next_i;
|
||||
}
|
||||
|
||||
@@ -489,7 +605,6 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
} else {
|
||||
if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD
|
||||
|
||||
// schedule_RA(module_idP,frameP, subframeP, 0);
|
||||
schedule_ulsch(module_idP, frameP, cooperation_flag, 4, 8);
|
||||
#ifndef ENABLE_ENB_AGENT_DL_SCHEDULER
|
||||
schedule_ue_spec(module_idP, frameP, subframeP, mbsfn_status);
|
||||
@@ -656,7 +771,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
break;
|
||||
}
|
||||
} else { //FDD
|
||||
// schedule_ulsch(module_idP,frameP,cooperation_flag,6,0);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,6,0);
|
||||
#ifndef ENABLE_ENB_AGENT_DL_SCHEDULER
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
@@ -739,7 +854,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
break;
|
||||
}
|
||||
} else { //FDD
|
||||
//schedule_ulsch(module_idP,frameP,cooperation_flag,7,1);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,7,1);
|
||||
#ifndef ENABLE_ENB_AGENT_DL_SCHEDULER
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
@@ -804,7 +919,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
break;
|
||||
}
|
||||
} else { //FDD
|
||||
//schedule_ulsch(module_idP,frameP,cooperation_flag,8,2);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,8,2);
|
||||
#ifndef ENABLE_ENB_AGENT_DL_SCHEDULER
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
@@ -938,7 +1053,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
break;
|
||||
}
|
||||
} else { //FDD
|
||||
// schedule_ulsch(module_idP,frameP,cooperation_flag,9,3);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,9,3);
|
||||
#ifndef ENABLE_ENB_AGENT_DL_SCHEDULER
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
@@ -971,7 +1086,6 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++)
|
||||
allocate_CCEs(module_idP,CC_id,subframeP,0);
|
||||
|
||||
|
||||
#ifndef DISABLE_CONT_STATS
|
||||
//Send subframe trigger to the controller
|
||||
if (mac_agent_registered[module_idP]) {
|
||||
@@ -979,8 +1093,27 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
int dummy=0;
|
||||
for (i=0;
|
||||
i<DCI_pdu[CC_id]->Num_common_dci+DCI_pdu[CC_id]->Num_ue_spec_dci;
|
||||
i++)
|
||||
if (DCI_pdu[CC_id]->dci_alloc[i].rnti==2)
|
||||
dummy=1;
|
||||
|
||||
if (dummy==1)
|
||||
for (i=0;
|
||||
i<DCI_pdu[CC_id]->Num_common_dci+DCI_pdu[CC_id]->Num_ue_spec_dci;
|
||||
i++)
|
||||
LOG_I(MAC,"Frame %d, subframe %d: DCI %d/%d, format %d, rnti %x, NCCE %d(num_pdcch_symb %d)\n",
|
||||
frameP,subframeP,i,DCI_pdu[CC_id]->Num_common_dci+DCI_pdu[CC_id]->Num_ue_spec_dci,
|
||||
DCI_pdu[CC_id]->dci_alloc[i].format,
|
||||
DCI_pdu[CC_id]->dci_alloc[i].rnti,
|
||||
DCI_pdu[CC_id]->dci_alloc[i].firstCCE,
|
||||
DCI_pdu[CC_id]->num_pdcch_symbols);
|
||||
|
||||
LOG_D(MAC,"frameP %d, subframeP %d\n",frameP,subframeP);
|
||||
*/
|
||||
|
||||
stop_meas(&eNB_mac_inst[module_idP].eNB_scheduler);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_OUT);
|
||||
|
||||
@@ -251,6 +251,8 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un
|
||||
}
|
||||
|
||||
if (!CCE_allocation_infeasible(module_idP,CC_id,1,subframeP,2,RA_template->RA_rnti)) {
|
||||
LOG_D(MAC,"Frame %d: Subframe %d : Adding common DCI for RA_RNTI %x\n",
|
||||
frameP,subframeP,RA_template->RA_rnti);
|
||||
add_common_dci(DCI_pdu,
|
||||
(void*)&RA_template->RA_alloc_pdu1[0],
|
||||
RA_template->RA_rnti,
|
||||
@@ -737,7 +739,10 @@ void initiate_ra_proc(module_id_t module_idP, int CC_id,frame_t frameP, uint16_t
|
||||
uint8_t i;
|
||||
RA_TEMPLATE *RA_template = (RA_TEMPLATE *)&eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[0];
|
||||
|
||||
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d Initiating RA procedure for preamble index %d\n",module_idP,CC_id,frameP,preamble_index);
|
||||
LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d Initiating RA procedure for preamble index %d\n",module_idP,CC_id,frameP,preamble_index);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC,1);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC,0);
|
||||
|
||||
for (i=0; i<NB_RA_PROC_MAX; i++) {
|
||||
if (RA_template[i].RA_active==FALSE) {
|
||||
@@ -765,7 +770,7 @@ void cancel_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP, rnti_t rn
|
||||
RA_TEMPLATE *RA_template = (RA_TEMPLATE *)&eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[0];
|
||||
|
||||
MSC_LOG_EVENT(MSC_PHY_ENB, "RA Cancelling procedure ue %"PRIx16" ", rnti);
|
||||
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d Cancelling RA procedure for UE rnti %x\n",module_idP,CC_id,frameP,rnti);
|
||||
LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d Cancelling RA procedure for UE rnti %x\n",module_idP,CC_id,frameP,rnti);
|
||||
|
||||
for (i=0; i<NB_RA_PROC_MAX; i++) {
|
||||
if (rnti == RA_template[i].rnti) {
|
||||
|
||||
@@ -193,7 +193,7 @@ uint8_t find_active_UEs(module_id_t module_idP,int CC_id){
|
||||
// get aggregatiob form phy for a give UE
|
||||
unsigned char process_ue_cqi (module_id_t module_idP, int ue_idP)
|
||||
{
|
||||
unsigned char aggregation=2;
|
||||
unsigned char aggregation=1;
|
||||
// check the MCS and SNR and set the aggregation accordingly
|
||||
return aggregation;
|
||||
}
|
||||
@@ -287,44 +287,38 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP,int harq_pidP)
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
int mac_remove_ue(module_id_t mod_idP, int ue_idP, int frameP, sub_frame_t subframeP)
|
||||
int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP)
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
|
||||
int prev,i, ret=-1;
|
||||
|
||||
rnti_t rnti;
|
||||
UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list;
|
||||
int pCC_id = UE_PCCID(mod_idP,ue_idP);
|
||||
|
||||
rnti = UE_list->UE_template[pCC_id][ue_idP].rnti;
|
||||
LOG_I(MAC,"Removing UE %d from Primary CC_id %d (rnti %x)\n",ue_idP,pCC_id, rnti);
|
||||
UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list;
|
||||
int UE_id = find_UE_id(mod_idP,rntiP);
|
||||
int pCC_id = UE_PCCID(mod_idP,UE_id);
|
||||
|
||||
LOG_I(MAC,"Removing UE %d from Primary CC_id %d (rnti %x)\n",UE_id,pCC_id, rntiP);
|
||||
dump_ue_list(UE_list,0);
|
||||
|
||||
// clear all remaining pending transmissions
|
||||
UE_list->UE_template[pCC_id][ue_idP].bsr_info[LCGID0] = 0;
|
||||
UE_list->UE_template[pCC_id][ue_idP].bsr_info[LCGID1] = 0;
|
||||
UE_list->UE_template[pCC_id][ue_idP].bsr_info[LCGID2] = 0;
|
||||
UE_list->UE_template[pCC_id][ue_idP].bsr_info[LCGID3] = 0;
|
||||
UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID0] = 0;
|
||||
UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID1] = 0;
|
||||
UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID2] = 0;
|
||||
UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID3] = 0;
|
||||
|
||||
UE_list->UE_template[pCC_id][ue_idP].ul_SR = 0;
|
||||
UE_list->UE_template[pCC_id][ue_idP].rnti = NOT_A_RNTI;
|
||||
UE_list->UE_template[pCC_id][ue_idP].ul_active = FALSE;
|
||||
eNB_ulsch_info[mod_idP][pCC_id][ue_idP].rnti = NOT_A_RNTI;
|
||||
eNB_ulsch_info[mod_idP][pCC_id][ue_idP].status = S_UL_NONE;
|
||||
eNB_dlsch_info[mod_idP][pCC_id][ue_idP].rnti = NOT_A_RNTI;
|
||||
eNB_dlsch_info[mod_idP][pCC_id][ue_idP].status = S_DL_NONE;
|
||||
|
||||
rrc_eNB_free_UE(
|
||||
mod_idP,
|
||||
rnti,
|
||||
frameP,
|
||||
subframeP);
|
||||
UE_list->UE_template[pCC_id][UE_id].ul_SR = 0;
|
||||
UE_list->UE_template[pCC_id][UE_id].rnti = NOT_A_RNTI;
|
||||
UE_list->UE_template[pCC_id][UE_id].ul_active = FALSE;
|
||||
eNB_ulsch_info[mod_idP][pCC_id][UE_id].rnti = NOT_A_RNTI;
|
||||
eNB_ulsch_info[mod_idP][pCC_id][UE_id].status = S_UL_NONE;
|
||||
eNB_dlsch_info[mod_idP][pCC_id][UE_id].rnti = NOT_A_RNTI;
|
||||
eNB_dlsch_info[mod_idP][pCC_id][UE_id].status = S_DL_NONE;
|
||||
|
||||
prev = UE_list->head;
|
||||
|
||||
for (i=UE_list->head; i>=0; i=UE_list->next[i]) {
|
||||
if (i == ue_idP) {
|
||||
if (i == UE_id) {
|
||||
// link prev to next in Active list
|
||||
//if (prev==UE_list->head)
|
||||
if (i==UE_list->head) {
|
||||
@@ -349,7 +343,7 @@ int mac_remove_ue(module_id_t mod_idP, int ue_idP, int frameP, sub_frame_t subfr
|
||||
prev = UE_list->head_ul;
|
||||
|
||||
for (i=UE_list->head_ul; i>=0; i=UE_list->next_ul[i]) {
|
||||
if (i == ue_idP) {
|
||||
if (i == UE_id) {
|
||||
// link prev to next in Active list
|
||||
if (prev==UE_list->head_ul) {
|
||||
UE_list->head_ul = UE_list->next_ul[i];
|
||||
@@ -366,11 +360,13 @@ int mac_remove_ue(module_id_t mod_idP, int ue_idP, int frameP, sub_frame_t subfr
|
||||
prev=i;
|
||||
}
|
||||
|
||||
mac_phy_remove_ue(mod_idP,rntiP);
|
||||
|
||||
if (ret == 0) {
|
||||
return (0);
|
||||
}
|
||||
|
||||
LOG_E(MAC,"error in mac_remove_ue(), could not find previous to %d in UE_list, should never happen, Dumping UE list\n",ue_idP);
|
||||
LOG_E(MAC,"error in mac_remove_ue(), could not find previous to %d in UE_list, should never happen, Dumping UE list\n",UE_id);
|
||||
dump_ue_list(UE_list,0);
|
||||
mac_xface->macphy_exit("mac_remove_ue: Problem in UE_list");
|
||||
return(-1);
|
||||
@@ -530,22 +526,9 @@ void swap_UEs(UE_list_t *listP,int nodeiP, int nodejP, int ul_flag)
|
||||
dump_ue_list(listP,ul_flag);
|
||||
}
|
||||
|
||||
void SR_indication(module_id_t mod_idP, int cc_idP, frame_t frameP, rnti_t rntiP, sub_frame_t subframeP)
|
||||
{
|
||||
|
||||
int UE_id = find_UE_id(mod_idP, rntiP);
|
||||
UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list;
|
||||
|
||||
if (UE_id != -1) {
|
||||
LOG_D(MAC,"[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d on CC_id %d\n",mod_idP,rntiP,frameP,subframeP, UE_id,cc_idP);
|
||||
UE_list->UE_template[cc_idP][UE_id].ul_SR = 1;
|
||||
UE_list->UE_template[cc_idP][UE_id].ul_active = TRUE;
|
||||
} else {
|
||||
// AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP);
|
||||
// AssertError(0, 0, "Frame %d: find_UE_id(%u,rnti %d) not found\n", frameP, enb_mod_idP, rntiP);
|
||||
LOG_D(MAC,"[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d (unknown UEid) on CC_id %d\n",mod_idP,rntiP,frameP,subframeP, UE_id,cc_idP);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -707,16 +690,31 @@ void add_ue_spec_dci(DCI_PDU *DCI_pdu,void *pdu,rnti_t rnti,unsigned char dci_si
|
||||
uint8_t UE_is_to_be_scheduled(module_id_t module_idP,int CC_id,uint8_t UE_id)
|
||||
{
|
||||
|
||||
UE_TEMPLATE *UE_template = &eNB_mac_inst[module_idP].UE_list.UE_template[CC_id][UE_id];
|
||||
UE_TEMPLATE *UE_template = &eNB_mac_inst[module_idP].UE_list.UE_template[CC_id][UE_id];
|
||||
UE_sched_ctrl *UE_sched_ctl = &eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[UE_id];
|
||||
|
||||
// LOG_D(MAC,"[eNB %d][PUSCH] Frame %d subframeP %d Scheduling UE %d\n",module_idP,rnti,frameP,subframeP,
|
||||
// UE_id);
|
||||
|
||||
// do not schedule UE if UL is not working
|
||||
if (UE_sched_ctl->ul_failure_timer>0)
|
||||
return(0);
|
||||
if (UE_sched_ctl->ul_out_of_sync>0)
|
||||
return(0);
|
||||
|
||||
LOG_D(MAC,"[eNB %d][PUSCH] Checking UL requirements UE %d/%x\n",module_idP,UE_id,UE_RNTI(module_idP,UE_id));
|
||||
|
||||
if ((UE_template->bsr_info[LCGID0]>0) ||
|
||||
(UE_template->bsr_info[LCGID1]>0) ||
|
||||
(UE_template->bsr_info[LCGID2]>0) ||
|
||||
(UE_template->bsr_info[LCGID3]>0) ||
|
||||
(UE_template->ul_SR>0)) { // uplink scheduling request
|
||||
(UE_template->ul_SR>0) || // uplink scheduling request
|
||||
((UE_sched_ctl->ul_inactivity_timer>20)&&
|
||||
(UE_sched_ctl->ul_scheduled==0))|| // every 2 frames when RRC_CONNECTED
|
||||
((UE_sched_ctl->ul_inactivity_timer>10)&&
|
||||
(UE_sched_ctl->ul_scheduled==0)&&
|
||||
(mac_eNB_get_rrc_status(module_idP,UE_RNTI(module_idP,UE_id)) < RRC_CONNECTED))) // every Frame when not RRC_CONNECTED
|
||||
{
|
||||
|
||||
LOG_D(MAC,"[eNB %d][PUSCH] UE %d/%x should be scheduled\n",module_idP,UE_id,UE_RNTI(module_idP,UE_id));
|
||||
return(1);
|
||||
} else {
|
||||
return(0);
|
||||
@@ -995,19 +993,19 @@ int allocate_CCEs(int module_idP,
|
||||
|
||||
int *CCE_table = eNB_mac_inst[module_idP].CCE_table[CC_idP];
|
||||
DCI_PDU *DCI_pdu = &eNB_mac_inst[module_idP].common_channels[CC_idP].DCI_pdu;
|
||||
int nCCE_max = mac_xface->get_nCCE_max(module_idP,CC_idP,DCI_pdu->num_pdcch_symbols,subframeP);
|
||||
int nCCE_max = mac_xface->get_nCCE_max(module_idP,CC_idP,1,subframeP);
|
||||
int fCCE;
|
||||
int i,j;
|
||||
int allocation_is_feasible = 1;
|
||||
DCI_ALLOC_t *dci_alloc;
|
||||
|
||||
int nCCE=0;
|
||||
|
||||
LOG_D(MAC,"Allocate CCEs subframe %d, test %d : (common %d,uspec %d)\n",subframeP,test_onlyP,DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci);
|
||||
|
||||
init_CCE_table(module_idP,CC_idP);
|
||||
DCI_pdu->nCCE=0;
|
||||
DCI_pdu->num_pdcch_symbols=1;
|
||||
|
||||
while (allocation_is_feasible == 1) {
|
||||
init_CCE_table(module_idP,CC_idP);
|
||||
nCCE=0;
|
||||
|
||||
for (i=0;i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci;i++) {
|
||||
dci_alloc = &DCI_pdu->dci_alloc[i];
|
||||
@@ -1015,9 +1013,9 @@ int allocate_CCEs(int module_idP,
|
||||
i,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci,
|
||||
DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci,
|
||||
dci_alloc->rnti,1<<dci_alloc->L,
|
||||
DCI_pdu->nCCE,nCCE_max,DCI_pdu->num_pdcch_symbols);
|
||||
nCCE,nCCE_max,DCI_pdu->num_pdcch_symbols);
|
||||
|
||||
if (DCI_pdu->nCCE + (1<<dci_alloc->L) > nCCE_max) {
|
||||
if (nCCE + (1<<dci_alloc->L) > nCCE_max) {
|
||||
if (DCI_pdu->num_pdcch_symbols == 3)
|
||||
allocation_is_feasible = 0;
|
||||
else {
|
||||
@@ -1036,7 +1034,7 @@ int allocate_CCEs(int module_idP,
|
||||
|
||||
LOG_D(MAC,"Allocating at nCCE %d\n",fCCE);
|
||||
if (test_onlyP == 0) {
|
||||
DCI_pdu->nCCE += (1<<dci_alloc->L);
|
||||
nCCE += (1<<dci_alloc->L);
|
||||
dci_alloc->firstCCE=fCCE;
|
||||
LOG_D(MAC,"Allocate CCEs subframe %d, test %d\n",subframeP,test_onlyP);
|
||||
}
|
||||
@@ -1053,7 +1051,7 @@ int allocate_CCEs(int module_idP,
|
||||
DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci,
|
||||
DCI_pdu->dci_alloc[j].rnti,DCI_pdu->dci_alloc[j].format,
|
||||
1<<DCI_pdu->dci_alloc[j].L,
|
||||
DCI_pdu->nCCE,nCCE_max,DCI_pdu->num_pdcch_symbols);
|
||||
nCCE,nCCE_max,DCI_pdu->num_pdcch_symbols);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -1107,3 +1105,41 @@ boolean_t CCE_allocation_infeasible(int module_idP,
|
||||
return(res);
|
||||
}
|
||||
|
||||
void SR_indication(module_id_t mod_idP, int cc_idP, frame_t frameP, rnti_t rntiP, sub_frame_t subframeP)
|
||||
{
|
||||
|
||||
int UE_id = find_UE_id(mod_idP, rntiP);
|
||||
UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list;
|
||||
|
||||
if (UE_id != -1) {
|
||||
if (mac_eNB_get_rrc_status(mod_idP,UE_RNTI(mod_idP,UE_id)) < RRC_CONNECTED)
|
||||
LOG_I(MAC,"[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d on CC_id %d\n",mod_idP,rntiP,frameP,subframeP, UE_id,cc_idP);
|
||||
UE_list->UE_template[cc_idP][UE_id].ul_SR = 1;
|
||||
UE_list->UE_template[cc_idP][UE_id].ul_active = TRUE;
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION,1);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION,0);
|
||||
} else {
|
||||
// AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP);
|
||||
// AssertError(0, 0, "Frame %d: find_UE_id(%u,rnti %d) not found\n", frameP, enb_mod_idP, rntiP);
|
||||
LOG_D(MAC,"[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d (unknown UEid) on CC_id %d\n",mod_idP,rntiP,frameP,subframeP, UE_id,cc_idP);
|
||||
}
|
||||
}
|
||||
|
||||
void UL_failure_indication(module_id_t mod_idP, int cc_idP, frame_t frameP, rnti_t rntiP, sub_frame_t subframeP)
|
||||
{
|
||||
|
||||
int UE_id = find_UE_id(mod_idP, rntiP);
|
||||
UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list;
|
||||
|
||||
if (UE_id != -1) {
|
||||
LOG_I(MAC,"[eNB %d][UE %d/%x] Frame %d subframeP %d Signaling UL Failure for UE %d on CC_id %d (timer %d)\n",
|
||||
mod_idP,UE_id,rntiP,frameP,subframeP, UE_id,cc_idP,
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer);
|
||||
if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer == 0)
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer=1;
|
||||
} else {
|
||||
// AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP);
|
||||
// AssertError(0, 0, "Frame %d: find_UE_id(%u,rnti %d) not found\n", frameP, enb_mod_idP, rntiP);
|
||||
LOG_W(MAC,"[eNB %d][SR %x] Frame %d subframeP %d Signaling UL Failure for UE %d (unknown UEid) on CC_id %d\n",mod_idP,rntiP,frameP,subframeP, UE_id,cc_idP);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,6 +89,7 @@ void rx_sdu(
|
||||
eNB_MAC_INST *eNB = &eNB_mac_inst[enb_mod_idP];
|
||||
UE_list_t *UE_list= &eNB->UE_list;
|
||||
int crnti_rx=0;
|
||||
int old_buffer_info;
|
||||
|
||||
start_meas(&eNB->rx_ulsch_sdu);
|
||||
|
||||
@@ -105,9 +106,28 @@ void rx_sdu(
|
||||
}
|
||||
|
||||
LOG_D(MAC,"[eNB %d] CC_id %d Received ULSCH sdu from PHY (rnti %x, UE_id %d), parsing header\n",enb_mod_idP,CC_idP,rntiP,UE_id);
|
||||
|
||||
|
||||
if (sduP==NULL) { // we've got an error after N rounds
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_scheduled &= (~(1<<harq_pidP));
|
||||
return;
|
||||
}
|
||||
|
||||
if (UE_id!=-1) {
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer=0;
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer =0;
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_scheduled &= (~(1<<harq_pidP));
|
||||
|
||||
if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync > 0) {
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync=0;
|
||||
mac_eNB_rrc_ul_in_sync(enb_mod_idP,CC_idP,frameP,subframeP,UE_RNTI(enb_mod_idP,UE_id));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
payload_ptr = parse_ulsch_header(sduP,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,sdu_lenP);
|
||||
|
||||
|
||||
|
||||
|
||||
eNB->eNB_stats[CC_idP].ulsch_bytes_rx=sdu_lenP;
|
||||
eNB->eNB_stats[CC_idP].total_ulsch_bytes_rx+=sdu_lenP;
|
||||
eNB->eNB_stats[CC_idP].total_ulsch_pdus_rx+=1;
|
||||
@@ -122,13 +142,23 @@ void rx_sdu(
|
||||
enb_mod_idP, CC_idP, rx_ces[i], UE_list->UE_template[CC_idP][UE_id].phr_info);
|
||||
UE_list->UE_template[CC_idP][UE_id].phr_info_configured=1;
|
||||
}
|
||||
UE_list->UE_sched_ctrl[UE_id].phr_received = 1;
|
||||
|
||||
payload_ptr+=sizeof(POWER_HEADROOM_CMD);
|
||||
break;
|
||||
|
||||
case CRNTI:
|
||||
UE_id = find_UE_id(enb_mod_idP,(((uint16_t)payload_ptr[0])<<8) + payload_ptr[1]);
|
||||
LOG_I(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d (ce %d/%d): CRNTI %x (UE_id %d) in Msg3\n",enb_mod_idP, CC_idP, rx_ces[i], i,num_ce,(((uint16_t)payload_ptr[0])<<8) + payload_ptr[1],UE_id);
|
||||
LOG_I(MAC, "[eNB %d] Frame %d, Subframe %d CC_id %d MAC CE_LCID %d (ce %d/%d): CRNTI %x (UE_id %d) in Msg3\n",
|
||||
frameP,subframeP,enb_mod_idP, CC_idP, rx_ces[i], i,num_ce,(((uint16_t)payload_ptr[0])<<8) + payload_ptr[1],UE_id);
|
||||
if (UE_id!=-1) {
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer=0;
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer=0;
|
||||
if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync > 0) {
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync=0;
|
||||
mac_eNB_rrc_ul_in_sync(enb_mod_idP,CC_idP,frameP,subframeP,(((uint16_t)payload_ptr[0])<<8) + payload_ptr[1]);
|
||||
}
|
||||
}
|
||||
crnti_rx=1;
|
||||
payload_ptr+=2;
|
||||
|
||||
@@ -152,9 +182,22 @@ void rx_sdu(
|
||||
|
||||
UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid] = (payload_ptr[0] & 0x3f);
|
||||
|
||||
// update buffer info
|
||||
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid]=BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid]];
|
||||
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_total_buffer= UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid];
|
||||
|
||||
PHY_vars_eNB_g[enb_mod_idP][CC_idP]->pusch_stats_bsr[UE_id][(frameP*10)+subframeP] = (payload_ptr[0] & 0x3f);
|
||||
if (UE_id == UE_list->head)
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR,PHY_vars_eNB_g[enb_mod_idP][CC_idP]->pusch_stats_bsr[UE_id][(frameP*10)+subframeP]);
|
||||
if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[lcgid] == 0 ) {
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[lcgid]=frameP;
|
||||
}
|
||||
if (mac_eNB_get_rrc_status(enb_mod_idP,UE_RNTI(enb_mod_idP,UE_id)) < RRC_CONNECTED)
|
||||
LOG_I(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : ul_total_buffer = %d (lcg increment %d)\n",
|
||||
enb_mod_idP, CC_idP, rx_ces[i], UE_list->UE_template[CC_idP][UE_id].ul_total_buffer,
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid]);
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -171,6 +214,41 @@ void rx_sdu(
|
||||
UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2] =
|
||||
((payload_ptr[1] & 0x0F) << 2) | ((payload_ptr[2] & 0xC0) >> 6);
|
||||
UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3] = (payload_ptr[2] & 0x3F);
|
||||
|
||||
// update buffer info
|
||||
old_buffer_info = UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0];
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0]=BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0]];
|
||||
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_total_buffer+= UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0];
|
||||
if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= old_buffer_info)
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= old_buffer_info;
|
||||
else
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 0;
|
||||
|
||||
old_buffer_info = UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1];
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1]=BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1]];
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_total_buffer+= UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1];
|
||||
if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= old_buffer_info)
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= old_buffer_info;
|
||||
else
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 0;
|
||||
|
||||
old_buffer_info = UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2];
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2]=BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2]];
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_total_buffer+= UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2];
|
||||
if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= old_buffer_info)
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= old_buffer_info;
|
||||
else
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 0;
|
||||
|
||||
old_buffer_info = UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3];
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3]=BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3]];
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_total_buffer+= UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3];
|
||||
if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= old_buffer_info)
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= old_buffer_info;
|
||||
else
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 0;
|
||||
|
||||
LOG_D(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d: Received long BSR LCGID0 = %u LCGID1 = "
|
||||
"%u LCGID2 = %u LCGID3 = %u\n",
|
||||
enb_mod_idP, CC_idP,
|
||||
@@ -238,7 +316,8 @@ void rx_sdu(
|
||||
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, Received CCCH: %x.%x.%x.%x.%x.%x, Terminating RA procedure for UE rnti %x\n",
|
||||
enb_mod_idP,CC_idP,frameP,
|
||||
payload_ptr[0],payload_ptr[1],payload_ptr[2],payload_ptr[3],payload_ptr[4], payload_ptr[5], rntiP);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_TERMINATE_RA_PROC,1);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_TERMINATE_RA_PROC,0);
|
||||
for (ii=0; ii<NB_RA_PROC_MAX; ii++) {
|
||||
LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d Checking proc %d : rnti (%x, %x), active %d\n",
|
||||
enb_mod_idP, CC_idP, ii,
|
||||
@@ -296,10 +375,11 @@ void rx_sdu(
|
||||
case DCCH :
|
||||
case DCCH1 :
|
||||
// if(eNB_mac_inst[module_idP][CC_idP].Dcch_lchan[UE_id].Active==1){
|
||||
|
||||
|
||||
#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
|
||||
LOG_T(MAC,"offset: %d\n",(unsigned char)((unsigned char*)payload_ptr-sduP));
|
||||
|
||||
|
||||
for (j=0; j<32; j++) {
|
||||
LOG_T(MAC,"%x ",payload_ptr[j]);
|
||||
}
|
||||
@@ -308,23 +388,29 @@ void rx_sdu(
|
||||
#endif
|
||||
|
||||
if (UE_id != -1) {
|
||||
LOG_D(MAC,"[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DCCH, received %d bytes form UE %d on LCID %d \n",
|
||||
enb_mod_idP,CC_idP,frameP, rx_lengths[i], UE_id, rx_lcids[i]);
|
||||
// adjust buffer occupancy of the correponding logical channel group
|
||||
if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] >= rx_lengths[i])
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] -= rx_lengths[i];
|
||||
else
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] = 0;
|
||||
|
||||
mac_rlc_data_ind(
|
||||
enb_mod_idP,
|
||||
rntiP,
|
||||
enb_mod_idP,
|
||||
frameP,
|
||||
ENB_FLAG_YES,
|
||||
MBMS_FLAG_NO,
|
||||
rx_lcids[i],
|
||||
(char *)payload_ptr,
|
||||
rx_lengths[i],
|
||||
1,
|
||||
NULL);//(unsigned int*)crc_status);
|
||||
UE_list->eNB_UE_stats[CC_idP][UE_id].num_pdu_rx[rx_lcids[i]]+=1;
|
||||
UE_list->eNB_UE_stats[CC_idP][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i];
|
||||
LOG_D(MAC,"[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DCCH, received %d bytes form UE %d on LCID %d \n",
|
||||
enb_mod_idP,CC_idP,frameP, rx_lengths[i], UE_id, rx_lcids[i]);
|
||||
|
||||
mac_rlc_data_ind(
|
||||
enb_mod_idP,
|
||||
rntiP,
|
||||
enb_mod_idP,
|
||||
frameP,
|
||||
ENB_FLAG_YES,
|
||||
MBMS_FLAG_NO,
|
||||
rx_lcids[i],
|
||||
(char *)payload_ptr,
|
||||
rx_lengths[i],
|
||||
1,
|
||||
NULL);//(unsigned int*)crc_status);
|
||||
UE_list->eNB_UE_stats[CC_idP][UE_id].num_pdu_rx[rx_lcids[i]]+=1;
|
||||
UE_list->eNB_UE_stats[CC_idP][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i];
|
||||
} /* UE_id != -1 */
|
||||
|
||||
// }
|
||||
@@ -347,6 +433,17 @@ void rx_sdu(
|
||||
enb_mod_idP,CC_idP,frameP, rx_lengths[i], UE_id,rx_lcids[i]);
|
||||
|
||||
if (UE_id != -1) {
|
||||
// adjust buffer occupancy of the correponding logical channel group
|
||||
LOG_D(MAC,"[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DTCH, received %d bytes from UE %d for lcid %d, removing from LCGID %d, %d\n",
|
||||
enb_mod_idP,CC_idP,frameP, rx_lengths[i], UE_id,rx_lcids[i],
|
||||
UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]],
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]]);
|
||||
|
||||
if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] >= rx_lengths[i])
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] -= rx_lengths[i];
|
||||
else
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] = 0;
|
||||
|
||||
if ((rx_lengths[i] <SCH_PAYLOAD_SIZE_MAX) && (rx_lengths[i] > 0) ) { // MAX SIZE OF transport block
|
||||
mac_rlc_data_ind(
|
||||
enb_mod_idP,
|
||||
@@ -420,52 +517,6 @@ uint32_t bytes_to_bsr_index(int32_t nbytes)
|
||||
return(i-1);
|
||||
}
|
||||
|
||||
void adjust_bsr_info(int buffer_occupancy,
|
||||
uint16_t TBS,
|
||||
UE_TEMPLATE *UE_template)
|
||||
{
|
||||
|
||||
uint32_t tmp_bsr;
|
||||
|
||||
// could not serve all the uplink traffic
|
||||
if (buffer_occupancy > 0 ) {
|
||||
if (BSR_TABLE[UE_template->bsr_info[LCGID0]] <= TBS ) {
|
||||
tmp_bsr = BSR_TABLE[UE_template->bsr_info[LCGID0]]; // serving this amout of bytes
|
||||
UE_template->bsr_info[LCGID0] = 0;
|
||||
|
||||
if (BSR_TABLE[UE_template->bsr_info[LCGID1]] <= (TBS-tmp_bsr)) {
|
||||
tmp_bsr += BSR_TABLE[UE_template->bsr_info[LCGID1]];
|
||||
UE_template->bsr_info[LCGID1] = 0;
|
||||
|
||||
if (BSR_TABLE[UE_template->bsr_info[LCGID2]] <= (TBS-tmp_bsr)) {
|
||||
tmp_bsr += BSR_TABLE[UE_template->bsr_info[LCGID2]];
|
||||
UE_template->bsr_info[LCGID2] = 0;
|
||||
|
||||
if (BSR_TABLE[UE_template->bsr_info[LCGID3]] <= (TBS-tmp_bsr)) {
|
||||
tmp_bsr += BSR_TABLE[UE_template->bsr_info[LCGID3]];
|
||||
UE_template->bsr_info[LCGID3] = 0;
|
||||
} else {
|
||||
UE_template->bsr_info[LCGID3] = bytes_to_bsr_index((int32_t)BSR_TABLE[UE_template->bsr_info[LCGID3]] - ((int32_t) TBS - (int32_t)tmp_bsr));
|
||||
}
|
||||
} else {
|
||||
UE_template->bsr_info[LCGID2] = bytes_to_bsr_index((int32_t)BSR_TABLE[UE_template->bsr_info[LCGID2]] - ((int32_t)TBS - (int32_t)tmp_bsr));
|
||||
}
|
||||
} else {
|
||||
UE_template->bsr_info[LCGID1] = bytes_to_bsr_index((int32_t)BSR_TABLE[UE_template->bsr_info[LCGID1]] - ((int32_t)TBS - (int32_t)tmp_bsr));
|
||||
}
|
||||
} else {
|
||||
UE_template->bsr_info[LCGID0] = bytes_to_bsr_index((int32_t)BSR_TABLE[UE_template->bsr_info[LCGID0]] - (int32_t)TBS);
|
||||
}
|
||||
} else { // we have flushed all buffers so clear bsr
|
||||
UE_template->bsr_info[LCGID0] = 0;
|
||||
UE_template->bsr_info[LCGID1] = 0;
|
||||
UE_template->bsr_info[LCGID2] = 0;
|
||||
UE_template->bsr_info[LCGID3] = 0;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void add_ue_ulsch_info(module_id_t module_idP, int CC_id, int UE_id, sub_frame_t subframeP, UE_ULSCH_STATUS status)
|
||||
{
|
||||
|
||||
@@ -477,66 +528,6 @@ void add_ue_ulsch_info(module_id_t module_idP, int CC_id, int UE_id, sub_frame_t
|
||||
|
||||
}
|
||||
|
||||
// This seems not to be used anymore
|
||||
/*
|
||||
int schedule_next_ulue(module_id_t module_idP, int UE_id, sub_frame_t subframeP){
|
||||
|
||||
int next_ue;
|
||||
|
||||
// first phase: scheduling for ACK
|
||||
switch (subframeP) {
|
||||
// scheduling for subframeP 2: for scheduled user during subframeP 5 and 6
|
||||
case 8:
|
||||
if ((eNB_dlsch_info[module_idP][UE_id].status == S_DL_SCHEDULED) &&
|
||||
(eNB_dlsch_info[module_idP][UE_id].subframe == 5 || eNB_dlsch_info[module_idP][UE_id].subframe == 6)){
|
||||
// set the downlink status
|
||||
eNB_dlsch_info[module_idP][UE_id].status = S_DL_BUFFERED;
|
||||
return UE_id;
|
||||
}
|
||||
break;
|
||||
// scheduling for subframeP 3: for scheduled user during subframeP 7 and 8
|
||||
case 9:
|
||||
if ((eNB_dlsch_info[module_idP][UE_id].status == S_DL_SCHEDULED) &&
|
||||
(eNB_dlsch_info[module_idP][UE_id].subframe == 7 || eNB_dlsch_info[module_idP][UE_id].subframe == 8)){
|
||||
eNB_dlsch_info[module_idP][UE_id].status = S_DL_BUFFERED;
|
||||
return UE_id;
|
||||
}
|
||||
break;
|
||||
// scheduling UL subframeP 4: for scheduled user during subframeP 9 and 0
|
||||
case 0 :
|
||||
if ((eNB_dlsch_info[module_idP][UE_id].status == S_DL_SCHEDULED) &&
|
||||
(eNB_dlsch_info[module_idP][UE_id].subframe == 9 || eNB_dlsch_info[module_idP][UE_id].subframe == 0)){
|
||||
eNB_dlsch_info[module_idP][UE_id].status = S_DL_BUFFERED;
|
||||
return UE_id;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// second phase
|
||||
for (next_ue=0; next_ue <NUMBER_OF_UE_MAX; next_ue++ ){
|
||||
|
||||
if (eNB_ulsch_info[module_idP][next_ue].status == S_UL_WAITING )
|
||||
return next_ue;
|
||||
else if (eNB_ulsch_info[module_idP][next_ue].status == S_UL_SCHEDULED){
|
||||
eNB_ulsch_info[module_idP][next_ue].status = S_UL_BUFFERED;
|
||||
}
|
||||
}
|
||||
for (next_ue=0; next_ue <NUMBER_OF_UE_MAX; next_ue++ ){
|
||||
if (eNB_ulsch_info[module_idP][next_ue].status != S_UL_NONE )// do this just for active UEs
|
||||
eNB_ulsch_info[module_idP][next_ue].status = S_UL_WAITING;
|
||||
}
|
||||
next_ue = 0;
|
||||
return next_ue;
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
unsigned char *parse_ulsch_header(unsigned char *mac_header,
|
||||
unsigned char *num_ce,
|
||||
unsigned char *num_sdu,
|
||||
@@ -691,8 +682,8 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
uint8_t status = 0;
|
||||
uint8_t rb_table_index = -1;
|
||||
uint16_t TBS = 0;
|
||||
int32_t buffer_occupancy=0;
|
||||
uint32_t cqi_req,cshift,ndi,mcs,rballoc,tpc;
|
||||
// int32_t buffer_occupancy=0;
|
||||
uint32_t cqi_req,cshift,ndi,mcs=0,rballoc,tpc;
|
||||
int32_t normalized_rx_power, target_rx_power=-90;
|
||||
static int32_t tpc_accumulated=0;
|
||||
|
||||
@@ -700,9 +691,11 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
eNB_MAC_INST *eNB=&eNB_mac_inst[module_idP];
|
||||
UE_list_t *UE_list=&eNB->UE_list;
|
||||
UE_TEMPLATE *UE_template;
|
||||
int rvidx_tab[4] = {0,2,3,1};
|
||||
LTE_DL_FRAME_PARMS *frame_parms;
|
||||
UE_sched_ctrl *UE_sched_ctrl;
|
||||
|
||||
// int rvidx_tab[4] = {0,2,3,1};
|
||||
LTE_DL_FRAME_PARMS *frame_parms;
|
||||
int drop_ue=0;
|
||||
|
||||
// LOG_I(MAC,"entering ulsch preprocesor\n");
|
||||
|
||||
@@ -719,6 +712,8 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
|
||||
// don't schedule if Msg4 is not received yet
|
||||
if (UE_list->UE_template[UE_PCCID(module_idP,UE_id)][UE_id].configured==FALSE) {
|
||||
LOG_I(MAC,"[eNB %d] frame %d subfarme %d, UE %d: not configured, skipping UE scheduling \n",
|
||||
module_idP,frameP,subframeP,UE_id);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -737,46 +732,57 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti);
|
||||
|
||||
if (eNB_UE_stats==NULL) {
|
||||
LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d CC %d: no PHY context\n", module_idP,frameP,subframeP,UE_id,CC_id);
|
||||
LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: no PHY context\n", module_idP,frameP,subframeP,UE_id,rnti,CC_id);
|
||||
drop_ue=1;
|
||||
continue; // mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n");
|
||||
}
|
||||
|
||||
if (drop_ue==1)
|
||||
continue;
|
||||
|
||||
if (CCE_allocation_infeasible(module_idP,CC_id,0,subframeP,aggregation,rnti)) {
|
||||
LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: not enough nCCE\n", module_idP,frameP,subframeP,UE_id,rnti,CC_id);
|
||||
continue; // break;
|
||||
}
|
||||
|
||||
|
||||
// printf("UE %d/%x is feasible, mode %s\n",UE_id,rnti,mode_string[eNB_UE_stats->mode]);
|
||||
|
||||
if (eNB_UE_stats->mode == PUSCH) { // ue has a ulsch channel
|
||||
|
||||
DCI_pdu = &eNB->common_channels[CC_id].DCI_pdu;
|
||||
UE_template = &UE_list->UE_template[CC_id][UE_id];
|
||||
UE_template = &UE_list->UE_template[CC_id][UE_id];
|
||||
UE_sched_ctrl = &UE_list->UE_sched_ctrl[UE_id];
|
||||
|
||||
if (mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,frameP,subframeP,&harq_pid,&round,openair_harq_UL) == -1 ) {
|
||||
LOG_W(MAC,"[eNB %d] Scheduler Frame %d, subframeP %d: candidate harq_pid from PHY for UE %d CC %d RNTI %x\n",
|
||||
module_idP,frameP,subframeP, UE_id, CC_id, rnti);
|
||||
// NN --> RK: Don't schedule UE if we cannot get harq pid
|
||||
//should we continue or set harq_pid to 0?
|
||||
continue;
|
||||
} else
|
||||
LOG_T(MAC,"[eNB %d] Frame %d, subframeP %d, UE %d CC %d : got harq pid %d round %d (rnti %x,mode %s)\n",
|
||||
module_idP,frameP,subframeP,UE_id,CC_id, harq_pid, round,rnti,mode_string[eNB_UE_stats->mode]);
|
||||
|
||||
//#undef EXMIMO_IOT
|
||||
#ifndef EXMIMO_IOT
|
||||
|
||||
if (((UE_is_to_be_scheduled(module_idP,CC_id,UE_id)>0)) || (round>0) || ((frameP%10)==0))
|
||||
PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP*10)+subframeP] = UE_template->ul_total_buffer;
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BO,PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP*10)+subframeP]);
|
||||
if (((UE_is_to_be_scheduled(module_idP,CC_id,UE_id)>0)) || (round>0))// || ((frameP%10)==0))
|
||||
// if there is information on bsr of DCCH, DTCH or if there is UL_SR, or if there is a packet to retransmit, or we want to schedule a periodic feedback every 10 frames
|
||||
#else
|
||||
if (round==0)
|
||||
#endif
|
||||
{
|
||||
LOG_D(MAC,"[eNB %d][PUSCH] Frame %d subframe %d Scheduling UE %d/%x in round %d(SR %d,UL_inactivity timer %d,UL_failure timer %d)\n",
|
||||
module_idP,frameP,subframeP,UE_id,rnti,round,UE_template->ul_SR,
|
||||
UE_sched_ctrl->ul_inactivity_timer,
|
||||
UE_sched_ctrl->ul_failure_timer);
|
||||
// reset the scheduling request
|
||||
UE_template->ul_SR = 0;
|
||||
aggregation = process_ue_cqi(module_idP,UE_id); // =2 by default!!
|
||||
aggregation = process_ue_cqi(module_idP,UE_id);
|
||||
status = mac_eNB_get_rrc_status(module_idP,rnti);
|
||||
cqi_req = (status < RRC_CONNECTED)? 0:1;
|
||||
if (status < RRC_CONNECTED)
|
||||
cqi_req = 0;
|
||||
else if (UE_sched_ctrl->cqi_req_timer>30) {
|
||||
cqi_req = 1;
|
||||
UE_sched_ctrl->cqi_req_timer=0;
|
||||
}
|
||||
else
|
||||
cqi_req = 0;
|
||||
|
||||
//power control
|
||||
//compute the expected ULSCH RX power (for the stats)
|
||||
@@ -821,7 +827,9 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power=target_rx_power;
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1=UE_template->pre_assigned_mcs_ul;
|
||||
mcs = cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS
|
||||
|
||||
if ((cqi_req==1) && (mcs>19)) {
|
||||
mcs=19;
|
||||
}
|
||||
if (UE_template->pre_allocated_rb_table_index_ul >=0) {
|
||||
rb_table_index=UE_template->pre_allocated_rb_table_index_ul;
|
||||
} else {
|
||||
@@ -830,9 +838,10 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
}
|
||||
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2=mcs;
|
||||
buffer_occupancy = UE_template->ul_total_buffer;
|
||||
// buffer_occupancy = UE_template->ul_total_buffer;
|
||||
|
||||
while ((rb_table[rb_table_index]>(frame_parms->N_RB_UL-1-first_rb[CC_id])) &&
|
||||
while (((rb_table[rb_table_index]>(frame_parms->N_RB_UL-1-first_rb[CC_id])) ||
|
||||
(rb_table[rb_table_index]>45)) &&
|
||||
(rb_table_index>0)) {
|
||||
rb_table_index--;
|
||||
}
|
||||
@@ -840,25 +849,254 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
TBS = mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]);
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used_rx+=rb_table[rb_table_index];
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_TBS=TBS;
|
||||
buffer_occupancy -= TBS;
|
||||
// buffer_occupancy -= TBS;
|
||||
rballoc = mac_xface->computeRIV(frame_parms->N_RB_UL,
|
||||
first_rb[CC_id],
|
||||
rb_table[rb_table_index]);
|
||||
// bad indices : 20 (40 PRB), 21 (45 PRB), 22 (48 PRB)
|
||||
// increment for next UE allocation
|
||||
first_rb[CC_id]+=rb_table[rb_table_index];
|
||||
//store for possible retransmission
|
||||
UE_template->nb_rb_ul[harq_pid] = rb_table[rb_table_index];
|
||||
UE_sched_ctrl->ul_scheduled |= (1<<harq_pid);
|
||||
if (UE_id == UE_list->head)
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SCHEDULED,UE_sched_ctrl->ul_scheduled);
|
||||
|
||||
LOG_D(MAC,"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE %d (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)\n",
|
||||
if (mac_eNB_get_rrc_status(module_idP,rnti) < RRC_CONNECTED)
|
||||
LOG_I(MAC,"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE %d (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)\n",
|
||||
module_idP,harq_pid,rnti,CC_id,frameP,subframeP,UE_id,mcs,
|
||||
first_rb[CC_id],rb_table[rb_table_index],
|
||||
rb_table_index,TBS,harq_pid);
|
||||
|
||||
// adjust total UL buffer status by TBS, wait for UL sdus to do final update
|
||||
LOG_D(MAC,"[eNB %d] CC_id %d UE %d/%x : adjusting ul_total_buffer, old %d, TBS %d\n", module_idP,CC_id,UE_id,rnti,UE_template->ul_total_buffer,TBS);
|
||||
if (UE_template->ul_total_buffer > TBS)
|
||||
UE_template->ul_total_buffer -= TBS;
|
||||
else
|
||||
UE_template->ul_total_buffer = 0;
|
||||
LOG_D(MAC,"ul_total_buffer, new %d\n", UE_template->ul_total_buffer);
|
||||
// Cyclic shift for DM RS
|
||||
cshift = 0;// values from 0 to 7 can be used for mapping the cyclic shift (36.211 , Table 5.5.2.1.1-1)
|
||||
|
||||
if (frame_parms->frame_type == TDD) {
|
||||
switch (frame_parms->N_RB_UL) {
|
||||
case 6:
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->dai = UE_template->DAI_ul[sched_subframe];
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_1_5MHz_TDD_1_6_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_1_5MHz_TDD_1_6_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
|
||||
default:
|
||||
case 25:
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->dai = UE_template->DAI_ul[sched_subframe];
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_5MHz_TDD_1_6_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_5MHz_TDD_1_6_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
|
||||
case 50:
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->dai = UE_template->DAI_ul[sched_subframe];
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_10MHz_TDD_1_6_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_10MHz_TDD_1_6_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
|
||||
case 100:
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->dai = UE_template->DAI_ul[sched_subframe];
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_20MHz_TDD_1_6_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_20MHz_TDD_1_6_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
}
|
||||
} // TDD
|
||||
else { //FDD
|
||||
switch (frame_parms->N_RB_UL) {
|
||||
case 25:
|
||||
default:
|
||||
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_5MHz_FDD_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_5MHz_FDD_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_1_5MHz_FDD_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_1_5MHz_FDD_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
|
||||
case 50:
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_10MHz_FDD_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_10MHz_FDD_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
|
||||
case 100:
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_20MHz_FDD_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_20MHz_FDD_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
add_ue_ulsch_info(module_idP,
|
||||
CC_id,
|
||||
UE_id,
|
||||
subframeP,
|
||||
S_UL_SCHEDULED);
|
||||
|
||||
LOG_D(MAC,"[eNB %d] CC_id %d Frame %d, subframeP %d: Generated ULSCH DCI for next UE_id %d, format 0\n", module_idP,CC_id,frameP,subframeP,UE_id);
|
||||
#ifdef DEBUG
|
||||
dump_dci(frame_parms, &DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci-1]);
|
||||
#endif
|
||||
|
||||
}
|
||||
else {
|
||||
LOG_D(MAC,"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled (PHICH) UE %d (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d,round %d)\n",
|
||||
module_idP,harq_pid,rnti,CC_id,frameP,subframeP,UE_id,mcs,
|
||||
first_rb[CC_id],rb_table[rb_table_index],
|
||||
rb_table_index,TBS,harq_pid);
|
||||
// Adjust BSR entries for LCGIDs
|
||||
adjust_bsr_info(buffer_occupancy,
|
||||
TBS,
|
||||
UE_template);
|
||||
|
||||
} else if (round > 0) { //we schedule a retransmission
|
||||
rb_table_index,TBS,harq_pid,round);
|
||||
}/*
|
||||
else if (round > 0) { //we schedule a retransmission
|
||||
|
||||
ndi = UE_template->oldNDI_UL[harq_pid];
|
||||
|
||||
@@ -869,7 +1107,7 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
|
||||
}
|
||||
|
||||
LOG_D(MAC,"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE retransmission (mcs %d, first rb %d, nb_rb %d, harq_pid %d, round %d)\n",
|
||||
LOG_I(MAC,"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE retransmission (mcs %d, first rb %d, nb_rb %d, harq_pid %d, round %d)\n",
|
||||
module_idP,UE_id,rnti,CC_id,frameP,subframeP,mcs,
|
||||
first_rb[CC_id],UE_template->nb_rb_ul[harq_pid],
|
||||
harq_pid, round);
|
||||
@@ -885,227 +1123,7 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1=mcs;
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2=mcs;
|
||||
}
|
||||
|
||||
// Cyclic shift for DM RS
|
||||
if(cooperation_flag == 2) {
|
||||
if(UE_id == 1) { // For Distriibuted Alamouti, cyclic shift applied to 2nd UE
|
||||
cshift = 1;
|
||||
} else {
|
||||
cshift = 0;
|
||||
}
|
||||
} else {
|
||||
cshift = 0;// values from 0 to 7 can be used for mapping the cyclic shift (36.211 , Table 5.5.2.1.1-1)
|
||||
}
|
||||
|
||||
if (frame_parms->frame_type == TDD) {
|
||||
switch (frame_parms->N_RB_UL) {
|
||||
case 6:
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->dai = UE_template->DAI_ul[sched_subframe];
|
||||
((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_1_5MHz_TDD_1_6_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_1_5MHz_TDD_1_6_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
|
||||
default:
|
||||
case 25:
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->dai = UE_template->DAI_ul[sched_subframe];
|
||||
((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_5MHz_TDD_1_6_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_5MHz_TDD_1_6_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
|
||||
case 50:
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->dai = UE_template->DAI_ul[sched_subframe];
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_10MHz_TDD_1_6_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_10MHz_TDD_1_6_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
|
||||
case 100:
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->dai = UE_template->DAI_ul[sched_subframe];
|
||||
((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_20MHz_TDD_1_6_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_20MHz_TDD_1_6_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
}
|
||||
} // TDD
|
||||
else { //FDD
|
||||
switch (frame_parms->N_RB_UL) {
|
||||
case 25:
|
||||
default:
|
||||
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_5MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_5MHz_FDD_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_5MHz_FDD_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_1_5MHz_FDD_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_1_5MHz_FDD_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
|
||||
case 50:
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_10MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_10MHz_FDD_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_10MHz_FDD_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
|
||||
case 100:
|
||||
ULSCH_dci = UE_template->ULSCH_DCI[harq_pid];
|
||||
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->type = 0;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->hopping = 0;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->mcs = mcs;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->ndi = ndi;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->TPC = tpc;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->padding = 0;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->cshift = cshift;
|
||||
((DCI0_20MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req;
|
||||
|
||||
add_ue_spec_dci(DCI_pdu,
|
||||
ULSCH_dci,
|
||||
rnti,
|
||||
sizeof(DCI0_20MHz_FDD_t),
|
||||
aggregation,
|
||||
sizeof_DCI0_20MHz_FDD_t,
|
||||
format0,
|
||||
0);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
add_ue_ulsch_info(module_idP,
|
||||
CC_id,
|
||||
UE_id,
|
||||
subframeP,
|
||||
S_UL_SCHEDULED);
|
||||
|
||||
LOG_D(MAC,"[eNB %d] CC_id %d Frame %d, subframeP %d: Generated ULSCH DCI for next UE_id %d, format 0\n", module_idP,CC_id,frameP,subframeP,UE_id);
|
||||
#ifdef DEBUG
|
||||
dump_dci(frame_parms, &DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci-1]);
|
||||
#endif
|
||||
*/
|
||||
|
||||
} // UE_is_to_be_scheduled
|
||||
} // UE is in PUSCH
|
||||
@@ -1188,7 +1206,7 @@ void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_f
|
||||
|
||||
// simple UE identity based grouping
|
||||
if ((UE_id % total_groups) == cba_group) { // this could be simplifed to active_UEs[UE_id % total_groups]++;
|
||||
if ((mac_get_rrc_status(module_idP,1,UE_id) > RRC_CONNECTED) &&
|
||||
if ((mac_eNB_get_rrc_status(module_idP,rnti) > RRC_CONNECTED) &&
|
||||
(UE_is_to_be_scheduled(module_idP,CC_id,UE_id) == 0)) {
|
||||
active_UEs[cba_group]++;
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@ void dl_phy_sync_success(module_id_t module_idP,
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
mac_in_sync_ind(module_idP,frameP,eNB_index);
|
||||
rrc_in_sync_ind(module_idP,frameP,eNB_index);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -382,7 +382,7 @@ int mac_init_global_param(void)
|
||||
// mac_xface->macphy_data_ind=macphy_data_ind;
|
||||
mac_xface->mrbch_phy_sync_failure=mrbch_phy_sync_failure;
|
||||
mac_xface->dl_phy_sync_success=dl_phy_sync_success;
|
||||
mac_xface->out_of_sync_ind=mac_out_of_sync_ind;
|
||||
mac_xface->out_of_sync_ind=rrc_out_of_sync_ind;
|
||||
|
||||
// Mac_rlc_xface->macphy_exit= mac_xface->macphy_exit;
|
||||
// Mac_rlc_xface->frame = 0;
|
||||
@@ -462,6 +462,7 @@ int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer,ui
|
||||
mac_xface->initiate_ra_proc = initiate_ra_proc;
|
||||
mac_xface->cancel_ra_proc = cancel_ra_proc;
|
||||
mac_xface->SR_indication = SR_indication;
|
||||
mac_xface->UL_failure_indication = UL_failure_indication;
|
||||
mac_xface->rx_sdu = rx_sdu;
|
||||
mac_xface->get_dlsch_sdu = get_dlsch_sdu;
|
||||
mac_xface->get_eNB_UE_stats = get_eNB_UE_stats;
|
||||
@@ -475,6 +476,7 @@ int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer,ui
|
||||
mac_xface->Msg1_transmitted = Msg1_tx;
|
||||
mac_xface->ra_failed = ra_failed;
|
||||
mac_xface->ra_succeeded = ra_succeeded;
|
||||
mac_xface->mac_phy_remove_ue = mac_phy_remove_ue;
|
||||
|
||||
LOG_I(MAC,"[MAIN] init UE MAC functions \n");
|
||||
mac_xface->ue_decode_si = ue_decode_si;
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
#include "LAYER2/MAC/proto.h"
|
||||
#include "LAYER2/MAC/extern.h"
|
||||
#include "UTIL/LOG/log.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
#include "UTIL/OPT/opt.h"
|
||||
#include "OCG.h"
|
||||
#include "OCG_extern.h"
|
||||
@@ -319,6 +320,8 @@ void sort_UEs (module_id_t Mod_idP,
|
||||
rnti1 = UE_RNTI(Mod_idP,UE_id1);
|
||||
if(rnti1 == NOT_A_RNTI)
|
||||
continue;
|
||||
if (UE_list->UE_sched_ctrl[UE_id1].ul_out_of_sync == 1)
|
||||
continue;
|
||||
pCC_id1 = UE_PCCID(Mod_idP,UE_id1);
|
||||
cqi1 = maxcqi(Mod_idP,UE_id1); //
|
||||
round1 = maxround(Mod_idP,rnti1,frameP,subframeP,0);
|
||||
@@ -327,6 +330,8 @@ void sort_UEs (module_id_t Mod_idP,
|
||||
rnti2 = UE_RNTI(Mod_idP,UE_id2);
|
||||
if(rnti2 == NOT_A_RNTI)
|
||||
continue;
|
||||
if (UE_list->UE_sched_ctrl[UE_id2].ul_out_of_sync == 1)
|
||||
continue;
|
||||
cqi2 = maxcqi(Mod_idP,UE_id2);
|
||||
round2 = maxround(Mod_idP,rnti2,frameP,subframeP,0); //mac_xface->get_ue_active_harq_pid(Mod_id,rnti2,subframe,&harq_pid2,&round2,0);
|
||||
pCC_id2 = UE_PCCID(Mod_idP,UE_id2);
|
||||
@@ -453,7 +458,8 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id,
|
||||
|
||||
if(rnti == NOT_A_RNTI)
|
||||
continue;
|
||||
|
||||
if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1)
|
||||
continue;
|
||||
UE_id = i;
|
||||
|
||||
// if there is no available harq_process, skip the UE
|
||||
@@ -563,6 +569,8 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id,
|
||||
// LOG_D(MAC,"UE %d rnti 0x\n", UE_id, rnti );
|
||||
if(rnti == NOT_A_RNTI)
|
||||
continue;
|
||||
if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync == 1)
|
||||
continue;
|
||||
|
||||
transmission_mode = mac_xface->get_transmission_mode(Mod_id,CC_id,rnti);
|
||||
// mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0);
|
||||
@@ -607,6 +615,8 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id,
|
||||
round2 = ue_sched_ctl2->round[CC_id];
|
||||
if(rnti2 == NOT_A_RNTI)
|
||||
continue;
|
||||
if (UE_list->UE_sched_ctrl[UE_id2].ul_out_of_sync == 1)
|
||||
continue;
|
||||
|
||||
eNB_UE_stats2 = mac_xface->get_eNB_UE_stats(Mod_id,CC_id,rnti2);
|
||||
//mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti2,frameP,subframeP,&harq_pid2,&round2,0);
|
||||
@@ -798,6 +808,9 @@ void dlsch_scheduler_pre_processor_reset (int module_idP,
|
||||
ue_sched_ctl->ta_timer--;
|
||||
ue_sched_ctl->ta_update =0; // don't trigger a timing advance command
|
||||
}
|
||||
if (UE_id==0) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_TIMING_ADVANCE,ue_sched_ctl->ta_update);
|
||||
}
|
||||
nb_rbs_required[CC_id][UE_id]=0;
|
||||
ue_sched_ctl->pre_nb_available_rbs[CC_id] = 0;
|
||||
ue_sched_ctl->dl_pow_off[CC_id] = 2;
|
||||
@@ -928,9 +941,6 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP,
|
||||
UE_TEMPLATE *UE_template = 0;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = 0;
|
||||
|
||||
// LOG_I(MAC,"store ulsch buffers\n");
|
||||
// convert BSR to bytes for comparison with tbs
|
||||
store_ulsch_buffer(module_idP,frameP, subframeP);
|
||||
|
||||
//LOG_I(MAC,"assign max mcs min rb\n");
|
||||
// maximize MCS and then allocate required RB according to the buffer occupancy with the limit of max available UL RB
|
||||
@@ -965,6 +975,9 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP,
|
||||
if (rnti==NOT_A_RNTI)
|
||||
continue;
|
||||
|
||||
if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1)
|
||||
continue;
|
||||
|
||||
UE_id = i;
|
||||
|
||||
for (n=0; n<UE_list->numactiveULCCs[UE_id]; n++) {
|
||||
@@ -1013,6 +1026,8 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP,
|
||||
|
||||
if (rnti==NOT_A_RNTI)
|
||||
continue;
|
||||
if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1)
|
||||
continue;
|
||||
|
||||
UE_id = i;
|
||||
|
||||
@@ -1041,6 +1056,8 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP,
|
||||
|
||||
if (rnti==NOT_A_RNTI)
|
||||
continue;
|
||||
if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1)
|
||||
continue;
|
||||
|
||||
UE_id = i;
|
||||
|
||||
@@ -1082,49 +1099,6 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP,
|
||||
}
|
||||
|
||||
|
||||
void store_ulsch_buffer(module_id_t module_idP, int frameP, sub_frame_t subframeP)
|
||||
{
|
||||
|
||||
int UE_id, /* pCC_id, */ lcgid;
|
||||
UE_list_t *UE_list = &eNB_mac_inst[module_idP].UE_list;
|
||||
UE_TEMPLATE *UE_template;
|
||||
|
||||
for (UE_id=UE_list->head_ul; UE_id>=0; UE_id=UE_list->next_ul[UE_id]) {
|
||||
|
||||
|
||||
UE_template = &UE_list->UE_template[UE_PCCID(module_idP,UE_id)][UE_id];
|
||||
//LOG_I(MAC,"[UE %d next %d] SR is %d\n",UE_id, UE_list->next_ul[UE_id], UE_template->ul_SR);
|
||||
|
||||
UE_template->ul_total_buffer=0;
|
||||
|
||||
for (lcgid=0; lcgid<MAX_NUM_LCGID; lcgid++) {
|
||||
UE_template->ul_buffer_info[lcgid]=BSR_TABLE[UE_template->bsr_info[lcgid]];
|
||||
UE_template->ul_total_buffer+= UE_template->ul_buffer_info[lcgid]; // apply traffic aggregtaion if packets are small
|
||||
// UE_template->ul_buffer_creation_time_max=cmax(UE_template->ul_buffer_creation_time_max, frame_cycle*1024 + frameP-UE_template->ul_buffer_creation_time[lcgid]));
|
||||
}
|
||||
|
||||
if ( UE_template->ul_total_buffer >0)
|
||||
LOG_D(MAC,"[eNB %d] Frame %d subframe %d UE %d CC id %d: LCGID0 %d, LCGID1 %d, LCGID2 %d LCGID3 %d, BO %d\n",
|
||||
module_idP, frameP,subframeP, UE_id, UE_PCCID(module_idP,UE_id),
|
||||
UE_template->ul_buffer_info[LCGID0],
|
||||
UE_template->ul_buffer_info[LCGID1],
|
||||
UE_template->ul_buffer_info[LCGID2],
|
||||
UE_template->ul_buffer_info[LCGID3],
|
||||
UE_template->ul_total_buffer);
|
||||
else if (UE_is_to_be_scheduled(module_idP,UE_PCCID(module_idP,UE_id),UE_id) > 0 ) {
|
||||
if (UE_template->ul_total_buffer == 0 ) {
|
||||
UE_template->ul_total_buffer = BSR_TABLE[11];
|
||||
}
|
||||
|
||||
LOG_D(MAC,"[eNB %d] Frame %d subframe %d UE %d CC id %d: SR active, set BO to %d \n",
|
||||
module_idP, frameP,subframeP, UE_id, UE_PCCID(module_idP,UE_id),
|
||||
UE_template->ul_total_buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void assign_max_mcs_min_rb(module_id_t module_idP,int frameP, sub_frame_t subframeP, uint16_t *first_rb)
|
||||
{
|
||||
|
||||
@@ -1132,7 +1106,7 @@ void assign_max_mcs_min_rb(module_id_t module_idP,int frameP, sub_frame_t subfra
|
||||
uint16_t n,UE_id;
|
||||
uint8_t CC_id;
|
||||
rnti_t rnti = -1;
|
||||
int mcs=cmin(16,openair_daq_vars.target_ue_ul_mcs);
|
||||
int mcs;
|
||||
int rb_table_index=0,tbs,tx_power;
|
||||
eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP];
|
||||
UE_list_t *UE_list = &eNB->UE_list;
|
||||
@@ -1140,12 +1114,20 @@ void assign_max_mcs_min_rb(module_id_t module_idP,int frameP, sub_frame_t subfra
|
||||
UE_TEMPLATE *UE_template;
|
||||
LTE_DL_FRAME_PARMS *frame_parms;
|
||||
|
||||
|
||||
for (i=UE_list->head_ul; i>=0; i=UE_list->next_ul[i]) {
|
||||
|
||||
rnti = UE_RNTI(module_idP,i);
|
||||
|
||||
if (rnti==NOT_A_RNTI)
|
||||
continue;
|
||||
if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1)
|
||||
continue;
|
||||
|
||||
if (UE_list->UE_sched_ctrl[i].phr_received == 1)
|
||||
mcs = 20; // if we've received the power headroom information the UE, we can go to maximum mcs
|
||||
else
|
||||
mcs = 10; // otherwise, limit to QPSK PUSCH
|
||||
|
||||
UE_id = i;
|
||||
|
||||
@@ -1246,7 +1228,9 @@ void sort_ue_ul (module_id_t module_idP,int frameP, sub_frame_t subframeP)
|
||||
rnti1 = UE_RNTI(module_idP,UE_id1);
|
||||
|
||||
if(rnti1 == NOT_A_RNTI)
|
||||
continue;
|
||||
continue;
|
||||
if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1)
|
||||
continue;
|
||||
|
||||
pCCid1 = UE_PCCID(module_idP,UE_id1);
|
||||
round1 = maxround(module_idP,rnti1,frameP,subframeP,1);
|
||||
@@ -1256,6 +1240,8 @@ void sort_ue_ul (module_id_t module_idP,int frameP, sub_frame_t subframeP)
|
||||
|
||||
if(rnti2 == NOT_A_RNTI)
|
||||
continue;
|
||||
if (UE_list->UE_sched_ctrl[UE_id2].ul_out_of_sync == 1)
|
||||
continue;
|
||||
|
||||
pCCid2 = UE_PCCID(module_idP,UE_id2);
|
||||
round2 = maxround(module_idP,rnti2,frameP,subframeP,1);
|
||||
|
||||
@@ -271,6 +271,15 @@ void rx_sdu(const module_id_t module_idP, const int CC_id,const frame_t frameP,
|
||||
*/
|
||||
void SR_indication(module_id_t module_idP,int CC_id,frame_t frameP,rnti_t rnti, sub_frame_t subframe);
|
||||
|
||||
/* \brief Function to indicate a UL failure was detected by eNB PHY.
|
||||
@param Mod_id Instance ID of eNB
|
||||
@param CC_id Component carrier
|
||||
@param frameP Frame index
|
||||
@param rnti RNTI of UE transmitting the SR
|
||||
@param subframe Index of subframe where SR was received
|
||||
*/
|
||||
void UL_failure_indication(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti,sub_frame_t subframe);
|
||||
|
||||
uint8_t *get_dlsch_sdu(module_id_t module_idP,int CC_id,frame_t frameP,rnti_t rnti,uint8_t TBindex);
|
||||
|
||||
/* \brief Function to retrieve MCH transport block and MCS used for MCH in this MBSFN subframe. Returns null if no MCH is to be transmitted
|
||||
@@ -492,7 +501,7 @@ uint8_t *parse_ulsch_header(uint8_t *mac_header,
|
||||
int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, uint8_t HO_active);
|
||||
int mac_init(void);
|
||||
int add_new_ue(module_id_t Mod_id, int CC_id, rnti_t rnti,int harq_pid);
|
||||
int mac_remove_ue(module_id_t Mod_id, int UE_id,int frameP, sub_frame_t subframeP);
|
||||
int rrc_mac_remove_ue(module_id_t Mod_id, rnti_t rntiP);
|
||||
|
||||
|
||||
int maxround(module_id_t Mod_id,uint16_t rnti,int frame,sub_frame_t subframe,uint8_t ul_flag);
|
||||
|
||||
@@ -39,8 +39,6 @@
|
||||
#include "defs.h"
|
||||
#include "proto.h"
|
||||
#include "extern.h"
|
||||
#include "MAC_INTERFACE/defs.h"
|
||||
#include "MAC_INTERFACE/extern.h"
|
||||
#include "SIMULATION/TOOLS/defs.h"
|
||||
#include "UTIL/LOG/log.h"
|
||||
#include "OCG.h"
|
||||
@@ -117,7 +115,7 @@ unsigned short fill_rar(
|
||||
rar[2] |= ((mcs&0x8)>>3); // mcs 10
|
||||
rar[3] = (((mcs&0x7)<<5)) | ((TPC&7)<<2) | ((ULdelay&1)<<1) | (cqireq&1);
|
||||
|
||||
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d Generating RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for ra_idx %d, CRNTI %x,preamble %d/%d,TIMING OFFSET %d\n",
|
||||
LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d Generating RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for ra_idx %d, CRNTI %x,preamble %d/%d,TIMING OFFSET %d\n",
|
||||
module_idP, CC_id,
|
||||
frameP,
|
||||
*(uint8_t*)rarh,rar[0],rar[1],rar[2],rar[3],rar[4],rar[5],
|
||||
@@ -168,14 +166,14 @@ ue_process_rar(
|
||||
LOG_D(MAC,"[UE %d][RAPROC] rarh->RAPID %d\n",module_idP,rarh->RAPID);
|
||||
|
||||
// LOG_I(MAC,"[UE %d][RAPROC] rar->R %d\n",module_idP,rar->R);
|
||||
LOG_I(MAC,"[UE %d][RAPROC] rar->Timing_Advance_Command %d\n",module_idP,(((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4));
|
||||
LOG_D(MAC,"[UE %d][RAPROC] rar->Timing_Advance_Command %d\n",module_idP,(((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4));
|
||||
// LOG_I(MAC,"[UE %d][RAPROC] rar->hopping_flag %d\n",module_idP,rar->hopping_flag);
|
||||
// LOG_I(MAC,"[UE %d][RAPROC] rar->rb_alloc %d\n",module_idP,rar->rb_alloc);
|
||||
// LOG_I(MAC,"[UE %d][RAPROC] rar->mcs %d\n",module_idP,rar->mcs);
|
||||
// LOG_I(MAC,"[UE %d][RAPROC] rar->TPC %d\n",module_idP,rar->TPC);
|
||||
// LOG_I(MAC,"[UE %d][RAPROC] rar->UL_delay %d\n",module_idP,rar->UL_delay);
|
||||
// LOG_I(MAC,"[UE %d][RAPROC] rar->cqi_req %d\n",module_idP,rar->cqi_req);
|
||||
LOG_I(MAC,"[UE %d][RAPROC] rar->t_crnti %x\n",module_idP,(uint16_t)rar[5]+(rar[4]<<8));
|
||||
LOG_D(MAC,"[UE %d][RAPROC] rar->t_crnti %x\n",module_idP,(uint16_t)rar[5]+(rar[4]<<8));
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -55,6 +55,7 @@ const uint32_t BSR_TABLE[BSR_TABLE_SIZE]= {0,10,12,14,17,19,22,26,31,36,42,49,57
|
||||
|
||||
//uint32_t EBSR_Level[63]={0,10,13,16,19,23,29,35,43,53,65,80,98,120,147,181};
|
||||
|
||||
MAC_xface *mac_xface;
|
||||
|
||||
uint32_t RRC_CONNECTION_FLAG;
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
#include "pdcp_sequence_manager.h"
|
||||
#include "LAYER2/RLC/rlc.h"
|
||||
#include "LAYER2/MAC/extern.h"
|
||||
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
|
||||
#include "RRC/LITE/proto.h"
|
||||
#include "pdcp_primitives.h"
|
||||
#include "OCG.h"
|
||||
#include "OCG_extern.h"
|
||||
@@ -636,10 +636,10 @@ pdcp_data_ind(
|
||||
PROTOCOL_PDCP_CTXT_FMT" DATA-IND len %u",
|
||||
PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p),
|
||||
sdu_buffer_sizeP - pdcp_header_len - pdcp_tailer_len);
|
||||
pdcp_rrc_data_ind(ctxt_pP,
|
||||
rb_id,
|
||||
sdu_buffer_sizeP - pdcp_header_len - pdcp_tailer_len,
|
||||
(uint8_t*)&sdu_buffer_pP->data[pdcp_header_len]);
|
||||
rrc_data_ind(ctxt_pP,
|
||||
rb_id,
|
||||
sdu_buffer_sizeP - pdcp_header_len - pdcp_tailer_len,
|
||||
(uint8_t*)&sdu_buffer_pP->data[pdcp_header_len]);
|
||||
free_mem_block(sdu_buffer_pP);
|
||||
|
||||
// free_mem_block(new_sdu);
|
||||
|
||||
@@ -484,7 +484,7 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t* const ctxt_pP)
|
||||
ctxt.enb_flag = ENB_FLAG_NO;
|
||||
ctxt.module_id = pdcp_read_header_g.inst - oai_emulation.info.nb_enb_local + oai_emulation.info.first_ue_local;
|
||||
ctxt.rnti = pdcp_UE_UE_module_id_to_rnti[ctxt.module_id];
|
||||
rab_id = pdcp_read_header_g.rb_id;
|
||||
rab_id = pdcp_read_header_g.rb_id % maxDRB;
|
||||
}
|
||||
|
||||
CHECK_CTXT_ARGS(&ctxt);
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
#include "rlc_primitives.h"
|
||||
#include "mac_primitives.h"
|
||||
#include "list.h"
|
||||
#include "MAC_INTERFACE/extern.h"
|
||||
#include "UTIL/LOG/log.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
|
||||
|
||||
@@ -36,7 +36,6 @@
|
||||
#include "rlc_primitives.h"
|
||||
#include "mac_primitives.h"
|
||||
#include "list.h"
|
||||
#include "MAC_INTERFACE/extern.h"
|
||||
#include "UTIL/LOG/log.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
#include "list.h"
|
||||
#include "rlc_um.h"
|
||||
#include "rlc_primitives.h"
|
||||
#include "MAC_INTERFACE/extern.h"
|
||||
#include "UTIL/LOG/log.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
@@ -203,9 +203,11 @@ int dump_eNB_l2_stats(char *buffer, int length)
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].avg_overhead_bytes
|
||||
);
|
||||
|
||||
len += sprintf(&buffer[len],"[MAC] UE %d (ULSCH), Status %s, RNTI %x : rx power (normalized %d, target %d), MCS (pre %d, post %d), RB (rx %d, retx %d, total %d), Current TBS %d \n",
|
||||
|
||||
len += sprintf(&buffer[len],"[MAC] UE %d (ULSCH), Status %s, Failute timer %d, RNTI %x : rx power (normalized %d, target %d), MCS (pre %d, post %d), RB (rx %d, retx %d, total %d), Current TBS %d \n",
|
||||
UE_id,
|
||||
map_int_to_str(rrc_status_names, UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status),
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer,
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].crnti,
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].normalized_rx_power,
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power,
|
||||
|
||||
@@ -94,7 +94,8 @@ typedef struct {
|
||||
|
||||
/// Indicate Scheduling Request from UE
|
||||
void (*SR_indication)(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti,sub_frame_t subframe);
|
||||
|
||||
/// Indicate UL Failure to eNodeB MAC
|
||||
void (*UL_failure_indication)(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti,sub_frame_t subframe);
|
||||
/// Configure Common PHY parameters from SIB1
|
||||
void (*phy_config_sib1_eNB)(module_id_t Mod_id,int CC_id,
|
||||
TDD_Config_t *tdd_config,
|
||||
@@ -133,7 +134,7 @@ typedef struct {
|
||||
/// get delta mcs for fast UL AMC
|
||||
int16_t (*estimate_ue_tx_power)(uint32_t tbs, uint32_t nb_rb, uint8_t control_only, lte_prefix_type_t ncp, uint8_t use_srs);
|
||||
|
||||
|
||||
int (*mac_phy_remove_ue)(module_id_t Mod_idP,rnti_t rntiP);
|
||||
/// UE functions
|
||||
|
||||
/// reset the ue phy
|
||||
|
||||
@@ -155,10 +155,10 @@ rlcrrc_data_ind(
|
||||
)
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
rrc_lite_data_ind(ctxt_pP,
|
||||
srb_idP,
|
||||
sdu_lenP,
|
||||
buffer_pP);
|
||||
rrc_data_ind(ctxt_pP,
|
||||
srb_idP,
|
||||
sdu_lenP,
|
||||
buffer_pP);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
@@ -67,7 +67,7 @@ mui_t mui=0;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
int8_t
|
||||
mac_rrc_lite_data_req(
|
||||
mac_rrc_data_req(
|
||||
const module_id_t Mod_idP,
|
||||
const int CC_id,
|
||||
const frame_t frameP,
|
||||
@@ -98,7 +98,7 @@ mac_rrc_lite_data_req(
|
||||
// All even frames transmit SIB in SF 5
|
||||
if (eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB1 == 255) {
|
||||
LOG_E(RRC,"[eNB %d] MAC Request for SIB1 and SIB1 not initialized\n",Mod_idP);
|
||||
mac_xface->macphy_exit("mac_rrc_lite_data_req: MAC Request for SIB1 and SIB1 not initialized");
|
||||
mac_xface->macphy_exit("mac_rrc_data_req: MAC Request for SIB1 and SIB1 not initialized");
|
||||
}
|
||||
|
||||
if ((frameP%2) == 0) {
|
||||
@@ -337,7 +337,7 @@ mac_rrc_lite_data_req(
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
int8_t
|
||||
mac_rrc_lite_data_ind(
|
||||
mac_rrc_data_ind(
|
||||
const module_id_t module_idP,
|
||||
const int CC_id,
|
||||
const frame_t frameP,
|
||||
@@ -509,14 +509,14 @@ mac_rrc_lite_data_ind(
|
||||
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
// this function is Not USED anymore
|
||||
void mac_lite_sync_ind(module_id_t Mod_idP,uint8_t Status)
|
||||
void mac_sync_ind(module_id_t Mod_idP,uint8_t Status)
|
||||
{
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
uint8_t
|
||||
rrc_lite_data_req(
|
||||
rrc_data_req(
|
||||
const protocol_ctxt_t* const ctxt_pP,
|
||||
const rb_id_t rb_idP,
|
||||
const mui_t muiP,
|
||||
@@ -586,7 +586,7 @@ rrc_lite_data_req(
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
void
|
||||
rrc_lite_data_ind(
|
||||
rrc_data_ind(
|
||||
const protocol_ctxt_t* const ctxt_pP,
|
||||
const rb_id_t Srb_id,
|
||||
const sdu_size_t sdu_sizeP,
|
||||
@@ -650,7 +650,7 @@ rrc_lite_data_ind(
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
void rrc_lite_in_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index)
|
||||
void rrc_in_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index)
|
||||
{
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
#if defined(ENABLE_ITTI)
|
||||
@@ -674,7 +674,7 @@ void rrc_lite_in_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_inde
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
void rrc_lite_out_of_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index)
|
||||
void rrc_out_of_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index)
|
||||
{
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
LOG_I(RRC,"[UE %d] Frame %d: OUT OF SYNC FROM eNB %d (T310 active %d : T310 %d, N310 %d, N311 %d)\n ",
|
||||
@@ -701,7 +701,7 @@ void rrc_lite_out_of_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
int
|
||||
mac_eNB_get_rrc_lite_status(
|
||||
mac_eNB_get_rrc_status(
|
||||
const module_id_t Mod_idP,
|
||||
const rnti_t rntiP
|
||||
)
|
||||
@@ -719,10 +719,54 @@ mac_eNB_get_rrc_lite_status(
|
||||
}
|
||||
}
|
||||
|
||||
void mac_eNB_rrc_ul_failure(const module_id_t Mod_instP,
|
||||
const int CC_idP,
|
||||
const frame_t frameP,
|
||||
const sub_frame_t subframeP,
|
||||
const rnti_t rntiP) {
|
||||
|
||||
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
|
||||
ue_context_p = rrc_eNB_get_ue_context(
|
||||
&eNB_rrc_inst[Mod_instP],
|
||||
rntiP);
|
||||
|
||||
if (ue_context_p != NULL) {
|
||||
LOG_I(RRC,"Frame %d, Subframe %d: UE %x UL failure, activating timer\n",frameP,subframeP,rntiP);
|
||||
ue_context_p->ue_context.ul_failure_timer=1;
|
||||
}
|
||||
else {
|
||||
LOG_W(RRC,"Frame %d, Subframe %d: UE %x unknown \n",frameP,subframeP,rntiP);
|
||||
rrc_mac_remove_ue(Mod_instP,rntiP);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void mac_eNB_rrc_ul_in_sync(const module_id_t Mod_instP,
|
||||
const int CC_idP,
|
||||
const frame_t frameP,
|
||||
const sub_frame_t subframeP,
|
||||
const rnti_t rntiP) {
|
||||
|
||||
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
|
||||
ue_context_p = rrc_eNB_get_ue_context(
|
||||
&eNB_rrc_inst[Mod_instP],
|
||||
rntiP);
|
||||
|
||||
|
||||
|
||||
if (ue_context_p != NULL) {
|
||||
LOG_I(RRC,"Frame %d, Subframe %d: UE %x to UL in synch\n",rntiP);
|
||||
ue_context_p->ue_context.ul_failure_timer=0;
|
||||
}
|
||||
else {
|
||||
LOG_E(RRC,"Frame %d, Subframe %d: UE %x unknown \n",rntiP);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
int
|
||||
mac_UE_get_rrc_lite_status(
|
||||
mac_UE_get_rrc_status(
|
||||
const module_id_t Mod_idP,
|
||||
const uint8_t indexP
|
||||
)
|
||||
|
||||
@@ -357,6 +357,8 @@ typedef struct eNB_RRC_UE_s {
|
||||
transport_layer_addr_t enb_gtp_addrs[S1AP_MAX_E_RAB];
|
||||
rb_id_t enb_gtp_ebi[S1AP_MAX_E_RAB];
|
||||
#endif
|
||||
uint32_t ul_failure_timer;
|
||||
uint32_t ue_release_timer;
|
||||
} eNB_RRC_UE_t;
|
||||
|
||||
typedef uid_t ue_uid_t;
|
||||
|
||||
+27
-15
@@ -38,21 +38,23 @@
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include "RRC/LITE/defs.h"
|
||||
|
||||
//main.c
|
||||
int rrc_init_global_param(void);
|
||||
int L3_xface_init(void);
|
||||
void openair_rrc_top_init(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active,uint8_t HO_enabled);
|
||||
#if defined(ENABLE_ITTI)
|
||||
char
|
||||
openair_rrc_lite_eNB_configuration(
|
||||
openair_rrc_eNB_configuration(
|
||||
const module_id_t enb_mod_idP,
|
||||
RrcConfigurationReq* configuration
|
||||
);
|
||||
#endif
|
||||
char openair_rrc_lite_eNB_init(
|
||||
char openair_rrc_eNB_init(
|
||||
const module_id_t module_idP);
|
||||
|
||||
char openair_rrc_lite_ue_init(
|
||||
char openair_rrc_ue_init(
|
||||
const module_id_t module_idP,
|
||||
const uint8_t CH_IDX);
|
||||
void rrc_config_buffer(SRB_INFO *srb_info, uint8_t Lchan_type, uint8_t Role);
|
||||
@@ -281,7 +283,7 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover(
|
||||
|
||||
//L2_interface.c
|
||||
int8_t
|
||||
mac_rrc_lite_data_req(
|
||||
mac_rrc_data_req(
|
||||
const module_id_t Mod_idP,
|
||||
const int CC_id,
|
||||
const frame_t frameP,
|
||||
@@ -294,7 +296,7 @@ mac_rrc_lite_data_req(
|
||||
);
|
||||
|
||||
int8_t
|
||||
mac_rrc_lite_data_ind(
|
||||
mac_rrc_data_ind(
|
||||
const module_id_t module_idP,
|
||||
const int CC_id,
|
||||
const frame_t frameP,
|
||||
@@ -310,8 +312,20 @@ mac_rrc_lite_data_ind(
|
||||
|
||||
void mac_sync_ind( module_id_t Mod_instP, uint8_t status);
|
||||
|
||||
void mac_eNB_rrc_ul_failure(const module_id_t Mod_instP,
|
||||
const int CC_id,
|
||||
const frame_t frameP,
|
||||
const sub_frame_t subframeP,
|
||||
const rnti_t rnti);
|
||||
|
||||
void mac_eNB_rrc_ul_in_sync(const module_id_t Mod_instP,
|
||||
const int CC_id,
|
||||
const frame_t frameP,
|
||||
const sub_frame_t subframeP,
|
||||
const rnti_t rnti);
|
||||
|
||||
uint8_t
|
||||
rrc_lite_data_req(
|
||||
rrc_data_req(
|
||||
const protocol_ctxt_t* const ctxt_pP,
|
||||
const rb_id_t rb_idP,
|
||||
const mui_t muiP,
|
||||
@@ -322,16 +336,16 @@ rrc_lite_data_req(
|
||||
);
|
||||
|
||||
void
|
||||
rrc_lite_data_ind(
|
||||
rrc_data_ind(
|
||||
const protocol_ctxt_t* const ctxt_pP,
|
||||
const rb_id_t Srb_id,
|
||||
const sdu_size_t sdu_sizeP,
|
||||
const uint8_t* const buffer_pP
|
||||
);
|
||||
|
||||
void rrc_lite_in_sync_ind(module_id_t module_idP, frame_t frameP, uint16_t eNB_index);
|
||||
void rrc_in_sync_ind(module_id_t module_idP, frame_t frameP, uint16_t eNB_index);
|
||||
|
||||
void rrc_lite_out_of_sync_ind(module_id_t module_idP, frame_t frameP, unsigned short eNB_index);
|
||||
void rrc_out_of_sync_ind(module_id_t module_idP, frame_t frameP, unsigned short eNB_index);
|
||||
|
||||
int decode_MCCH_Message( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index, const uint8_t* const Sdu, const uint8_t Sdu_len, const uint8_t mbsfn_sync_area );
|
||||
|
||||
@@ -356,13 +370,13 @@ ue_measurement_report_triggering(
|
||||
);
|
||||
|
||||
int
|
||||
mac_eNB_get_rrc_lite_status(
|
||||
mac_eNB_get_rrc_status(
|
||||
const module_id_t Mod_idP,
|
||||
const rnti_t rntiP
|
||||
);
|
||||
|
||||
int
|
||||
mac_UE_get_rrc_lite_status(
|
||||
mac_UE_get_rrc_status(
|
||||
const module_id_t Mod_idP,
|
||||
const uint8_t indexP
|
||||
);
|
||||
@@ -427,10 +441,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);
|
||||
|
||||
+42
-42
@@ -283,7 +283,7 @@ static void init_MCCH_UE(module_id_t ue_mod_idP, uint8_t eNB_index)
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
static void openair_rrc_lite_ue_init_security( const protocol_ctxt_t* const ctxt_pP )
|
||||
static void openair_rrc_ue_init_security( const protocol_ctxt_t* const ctxt_pP )
|
||||
{
|
||||
#if defined(ENABLE_SECURITY)
|
||||
// uint8_t *kRRCenc;
|
||||
@@ -304,7 +304,7 @@ static void openair_rrc_lite_ue_init_security( const protocol_ctxt_t* const ctxt
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
char openair_rrc_lite_ue_init( const module_id_t ue_mod_idP, const unsigned char eNB_index )
|
||||
char openair_rrc_ue_init( const module_id_t ue_mod_idP, const unsigned char eNB_index )
|
||||
{
|
||||
protocol_ctxt_t ctxt;
|
||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_idP, ENB_FLAG_NO, NOT_A_RNTI, 0, 0,eNB_index);
|
||||
@@ -331,7 +331,7 @@ char openair_rrc_lite_ue_init( const module_id_t ue_mod_idP, const unsigned char
|
||||
UE_rrc_inst[ctxt.module_id].integrity_algorithm = SecurityAlgorithmConfig__integrityProtAlgorithm_reserved;
|
||||
#endif
|
||||
|
||||
openair_rrc_lite_ue_init_security(&ctxt);
|
||||
openair_rrc_ue_init_security(&ctxt);
|
||||
init_SI_UE(&ctxt,eNB_index);
|
||||
LOG_D(RRC,PROTOCOL_RRC_CTXT_FMT" INIT: phy_sync_2_ch_ind\n",
|
||||
PROTOCOL_RRC_CTXT_ARGS(&ctxt));
|
||||
@@ -452,14 +452,14 @@ static void rrc_ue_generate_RRCConnectionSetupComplete( const protocol_ctxt_t* c
|
||||
LOG_D(RLC,
|
||||
"[FRAME %05d][RRC_UE][MOD %02d][][--- PDCP_DATA_REQ/%d Bytes (RRCConnectionSetupComplete to eNB %d MUI %d) --->][PDCP][MOD %02d][RB %02d]\n",
|
||||
ctxt_pP->frame, ctxt_pP->module_id+NB_eNB_INST, size, eNB_index, rrc_mui, ctxt_pP->module_id+NB_eNB_INST, DCCH);
|
||||
pdcp_rrc_data_req (
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
rrc_data_req (
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -479,14 +479,14 @@ static void rrc_ue_generate_RRCConnectionReconfigurationComplete( const protocol
|
||||
rrc_mui,
|
||||
UE_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id),
|
||||
DCCH);
|
||||
pdcp_rrc_data_req (
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
rrc_data_req (
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
}
|
||||
|
||||
|
||||
@@ -1441,14 +1441,14 @@ rrc_ue_process_securityModeCommand(
|
||||
}
|
||||
|
||||
LOG_T(RRC, "\n");
|
||||
pdcp_rrc_data_req (
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
(enc_rval.encoded + 7) / 8,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
rrc_data_req (
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
(enc_rval.encoded + 7) / 8,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1546,14 +1546,14 @@ rrc_ue_process_ueCapabilityEnquiry(
|
||||
}
|
||||
|
||||
LOG_T(RRC, "\n");
|
||||
pdcp_rrc_data_req (
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
(enc_rval.encoded + 7) / 8,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
rrc_data_req (
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
(enc_rval.encoded + 7) / 8,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4175,15 +4175,15 @@ void *rrc_ue_task( void *args_p )
|
||||
|
||||
/* Transfer data to PDCP */
|
||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, ENB_FLAG_NO, UE_rrc_inst[ue_mod_id].Info[0].rnti, 0, 0,0);
|
||||
pdcp_rrc_data_req (&ctxt,
|
||||
DCCH,
|
||||
rrc_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
length, buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
rrc_data_req (&ctxt,
|
||||
DCCH,
|
||||
rrc_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
length, buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
# endif
|
||||
|
||||
# if ENABLE_RAL
|
||||
|
||||
@@ -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>
|
||||
@@ -132,7 +133,7 @@ rrc_init_global_param(
|
||||
return -1;
|
||||
}
|
||||
*/
|
||||
rrc_rlc_register_rrc (rlcrrc_data_ind, NULL); //register with rlc
|
||||
rrc_rlc_register_rrc (rrc_data_ind, NULL); //register with rlc
|
||||
|
||||
DCCH_LCHAN_DESC.transport_block_size = 4;
|
||||
DCCH_LCHAN_DESC.max_transport_blocks = 16;
|
||||
@@ -417,9 +418,10 @@ 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,*ue_to_be_removed = NULL;
|
||||
|
||||
#ifdef LOCALIZATION
|
||||
double estimated_distance;
|
||||
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
|
||||
protocol_ctxt_t ctxt;
|
||||
#endif
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_IN);
|
||||
@@ -520,7 +522,32 @@ rrc_rx_tx(
|
||||
} else { // eNB
|
||||
check_handovers(ctxt_pP);
|
||||
// counetr, and get the value and aggregate
|
||||
#ifdef LOCALIZATION
|
||||
|
||||
// check for UL failure
|
||||
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 >= 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_context_p->ue_context.ue_release_timer>0) {
|
||||
ue_context_p->ue_context.ue_release_timer++;
|
||||
if (ue_context_p->ue_context.ue_release_timer >= 100) {
|
||||
// remove UE after 10 frames after RRCConnectionRelease is triggered
|
||||
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 RRC_LOCALIZATION
|
||||
|
||||
/* for the localization, only primary CC_id might be relevant*/
|
||||
gettimeofday(&ts, NULL);
|
||||
|
||||
+101
-79
@@ -569,10 +569,20 @@ rrc_eNB_ue_context_stmsi_exist(
|
||||
{
|
||||
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
|
||||
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.Initialue_identity_s_TMSI.presence == TRUE)
|
||||
LOG_I(RRC,"checking for UE S-TMSI %x, mme %x (%p): rnti %x",
|
||||
m_tmsiP, mme_codeP, ue_context_p,
|
||||
ue_context_p->ue_context.rnti);
|
||||
if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == TRUE) {
|
||||
printf("S-TMSI %x, MME %x\n",
|
||||
ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi,
|
||||
ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code);
|
||||
if (ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi == m_tmsiP)
|
||||
if (ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code == mme_codeP)
|
||||
return ue_context_p;
|
||||
}
|
||||
else
|
||||
printf("\n");
|
||||
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@@ -785,37 +795,34 @@ rrc_eNB_free_mem_UE_context(
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// called by MAC layer only
|
||||
// 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;
|
||||
/* avoid gcc warnings */
|
||||
(void)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
|
||||
@@ -824,22 +831,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,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);
|
||||
(struct rrc_eNB_ue_context_s*) ue_context_pP);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -927,14 +934,14 @@ rrc_eNB_generate_SecurityModeCommand(
|
||||
rrc_eNB_mui,
|
||||
size);
|
||||
|
||||
pdcp_rrc_data_req(
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_eNB_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
rrc_data_req(
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_eNB_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
|
||||
}
|
||||
|
||||
@@ -978,14 +985,14 @@ rrc_eNB_generate_UECapabilityEnquiry(
|
||||
rrc_eNB_mui,
|
||||
size);
|
||||
|
||||
pdcp_rrc_data_req(
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_eNB_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
rrc_data_req(
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_eNB_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
|
||||
}
|
||||
|
||||
@@ -1090,6 +1097,8 @@ rrc_eNB_generate_RRCConnectionRelease(
|
||||
memset(buffer, 0, RRC_BUF_SIZE);
|
||||
|
||||
size = do_RRCConnectionRelease(ctxt_pP->module_id, buffer,rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id));
|
||||
// set release timer
|
||||
ue_context_pP->ue_context.ue_release_timer=1;
|
||||
|
||||
LOG_I(RRC,
|
||||
PROTOCOL_RRC_CTXT_UE_FMT" Logical Channel DL-DCCH, Generate RRCConnectionRelease (bytes %d)\n",
|
||||
@@ -1114,14 +1123,14 @@ rrc_eNB_generate_RRCConnectionRelease(
|
||||
rrc_eNB_mui,
|
||||
size);
|
||||
|
||||
pdcp_rrc_data_req(
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_eNB_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
rrc_data_req(
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_eNB_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -1741,14 +1750,14 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(
|
||||
rrc_eNB_mui,
|
||||
size);
|
||||
|
||||
pdcp_rrc_data_req(
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_eNB_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
rrc_data_req(
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_eNB_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
}
|
||||
|
||||
|
||||
@@ -1818,14 +1827,14 @@ rrc_eNB_generate_RRCConnectionReconfiguration_SCell(
|
||||
rrc_eNB_mui,
|
||||
size);
|
||||
|
||||
pdcp_rrc_data_req(
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_eNB_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
rrc_data_req(
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
rrc_eNB_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -3386,7 +3395,7 @@ rrc_eNB_generate_RRCConnectionSetup(
|
||||
#if defined(ENABLE_ITTI)
|
||||
char
|
||||
//-----------------------------------------------------------------------------
|
||||
openair_rrc_lite_eNB_init(
|
||||
openair_rrc_eNB_init(
|
||||
const module_id_t enb_mod_idP
|
||||
)
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -3399,13 +3408,13 @@ openair_rrc_lite_eNB_init(
|
||||
#if defined(ENABLE_ITTI)
|
||||
//-----------------------------------------------------------------------------
|
||||
char
|
||||
openair_rrc_lite_eNB_configuration(
|
||||
openair_rrc_eNB_configuration(
|
||||
const module_id_t enb_mod_idP,
|
||||
RrcConfigurationReq* configuration
|
||||
)
|
||||
#else
|
||||
char
|
||||
openair_rrc_lite_eNB_init(
|
||||
openair_rrc_eNB_init(
|
||||
const module_id_t enb_mod_idP
|
||||
)
|
||||
#endif
|
||||
@@ -3434,7 +3443,7 @@ openair_rrc_lite_eNB_init(
|
||||
// for (j = 0; j < NUMBER_OF_UE_MAX; j++) {
|
||||
// eNB_rrc_inst[ctxt.module_id].ciphering_algorithm[j] = SecurityAlgorithmConfig__cipheringAlgorithm_eea0;
|
||||
// eNB_rrc_inst[ctxt.module_id].integrity_algorithm[j] = SecurityAlgorithmConfig__integrityProtAlgorithm_eia2;
|
||||
// rrc_lite_eNB_init_security(enb_mod_idP, j);
|
||||
// rrc_eNB_init_security(enb_mod_idP, j);
|
||||
// }
|
||||
// }
|
||||
eNB_rrc_inst[ctxt.module_id].Nb_ue = 0;
|
||||
@@ -3561,6 +3570,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));
|
||||
|
||||
@@ -3730,15 +3740,19 @@ rrc_eNB_decode_ccch(
|
||||
m_tmsi_t m_tmsi = BIT_STRING_to_uint32(&s_TMSI.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))) {
|
||||
//#warning "TODO: stmsi_exist: remove UE from MAC/PHY (how?)"
|
||||
|
||||
//#warning "TODO: stmsi_exist: remove UE from MAC/PHY (how?)"
|
||||
LOG_I(RRC," S-TMSI exists, ue_context_p %p\n",ue_context_p);
|
||||
stmsi_received=1;
|
||||
ue_context_p->ue_context.rnti = ctxt_pP->rnti;
|
||||
// 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;
|
||||
}
|
||||
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,
|
||||
@@ -3773,18 +3787,26 @@ rrc_eNB_decode_ccch(
|
||||
|
||||
#if defined(ENABLE_ITTI)
|
||||
ue_context_p->ue_context.establishment_cause = rrcConnectionRequest->establishmentCause;
|
||||
LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Accept new connection from UE random UE identity (0x%" PRIx64 ") MME code %u TMSI %u cause %u\n",
|
||||
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
|
||||
ue_context_p->ue_context.random_ue_identity,
|
||||
ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code,
|
||||
ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi,
|
||||
ue_context_p->ue_context.establishment_cause);
|
||||
if (stmsi_received==0)
|
||||
LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Accept new connection from UE random UE identity (0x%" PRIx64 ") MME code %u TMSI %u cause %u\n",
|
||||
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
|
||||
ue_context_p->ue_context.random_ue_identity,
|
||||
ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code,
|
||||
ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi,
|
||||
ue_context_p->ue_context.establishment_cause);
|
||||
else
|
||||
LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Accept new connection from UE MME code %u TMSI %u cause %u\n",
|
||||
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
|
||||
ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code,
|
||||
ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi,
|
||||
ue_context_p->ue_context.establishment_cause);
|
||||
#else
|
||||
LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Accept new connection for UE random UE identity (0x%" PRIx64 ")\n",
|
||||
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
|
||||
@@ -4460,7 +4482,7 @@ rrc_enb_task(
|
||||
/* Messages from eNB app */
|
||||
case RRC_CONFIGURATION_REQ:
|
||||
LOG_I(RRC, "[eNB %d] Received %s\n", instance, msg_name_p);
|
||||
openair_rrc_lite_eNB_configuration(ENB_INSTANCE_TO_MODULE_ID(instance), &RRC_CONFIGURATION_REQ(msg_p));
|
||||
openair_rrc_eNB_configuration(ENB_INSTANCE_TO_MODULE_ID(instance), &RRC_CONFIGURATION_REQ(msg_p));
|
||||
break;
|
||||
|
||||
# if ENABLE_RAL
|
||||
|
||||
@@ -844,15 +844,15 @@ rrc_eNB_process_S1AP_DOWNLINK_NAS(
|
||||
LOG_F(RRC,"\n");
|
||||
#endif
|
||||
/* Transfer data to PDCP */
|
||||
pdcp_rrc_data_req (
|
||||
&ctxt,
|
||||
DCCH,
|
||||
*rrc_eNB_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
length,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
|
||||
rrc_data_req (
|
||||
&ctxt,
|
||||
DCCH,
|
||||
*rrc_eNB_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
length,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,7 +118,62 @@ const char* eurecomVariablesNames[] = {
|
||||
"mp_alloc",
|
||||
"mp_free",
|
||||
"ue_inst_cnt_rx",
|
||||
"ue_inst_cnt_tx"
|
||||
"ue_inst_cnt_tx",
|
||||
"dci_info",
|
||||
"ue0_BSR",
|
||||
"ue0_BO",
|
||||
"ue0_scheduled",
|
||||
"ue0_timing_advance",
|
||||
"ue0_SR_ENERGY",
|
||||
"ue0_SR_THRES",
|
||||
"ue0_rssi0",
|
||||
"ue0_rssi1",
|
||||
"ue0_rssi2",
|
||||
"ue0_rssi3",
|
||||
"ue0_rssi4",
|
||||
"ue0_rssi5",
|
||||
"ue0_rssi6",
|
||||
"ue0_rssi7",
|
||||
"ue0_res0",
|
||||
"ue0_res1",
|
||||
"ue0_res2",
|
||||
"ue0_res3",
|
||||
"ue0_res4",
|
||||
"ue0_res5",
|
||||
"ue0_res6",
|
||||
"ue0_res7",
|
||||
"ue0_MCS0",
|
||||
"ue0_MCS1",
|
||||
"ue0_MCS2",
|
||||
"ue0_MCS3",
|
||||
"ue0_MCS4",
|
||||
"ue0_MCS5",
|
||||
"ue0_MCS6",
|
||||
"ue0_MCS7",
|
||||
"ue0_RB0",
|
||||
"ue0_RB1",
|
||||
"ue0_RB2",
|
||||
"ue0_RB3",
|
||||
"ue0_RB4",
|
||||
"ue0_RB5",
|
||||
"ue0_RB6",
|
||||
"ue0_RB7",
|
||||
"ue0_ROUND0",
|
||||
"ue0_ROUND1",
|
||||
"ue0_ROUND2",
|
||||
"ue0_ROUND3",
|
||||
"ue0_ROUND4",
|
||||
"ue0_ROUND5",
|
||||
"ue0_ROUND6",
|
||||
"ue0_ROUND7",
|
||||
"ue0_SFN0",
|
||||
"ue0_SFN1",
|
||||
"ue0_SFN2",
|
||||
"ue0_SFN3",
|
||||
"ue0_SFN4",
|
||||
"ue0_SFN5",
|
||||
"ue0_SFN6",
|
||||
"ue0_SFN7",
|
||||
};
|
||||
|
||||
const char* eurecomFunctionsNames[] = {
|
||||
@@ -200,7 +255,15 @@ const char* eurecomFunctionsNames[] = {
|
||||
"macxface_phy_config_sib2_eNB",
|
||||
"macxface_phy_config_dedicated_eNB",
|
||||
"phy_ue_compute_prach",
|
||||
"phy_enb_ulsch_decoding",
|
||||
"phy_enb_ulsch_msg3",
|
||||
"phy_enb_ulsch_decoding0",
|
||||
"phy_enb_ulsch_decoding1",
|
||||
"phy_enb_ulsch_decoding2",
|
||||
"phy_enb_ulsch_decoding3",
|
||||
"phy_enb_ulsch_decoding4",
|
||||
"phy_enb_ulsch_decoding5",
|
||||
"phy_enb_ulsch_decoding6",
|
||||
"phy_enb_ulsch_decoding7",
|
||||
"phy_enb_sfgen",
|
||||
"phy_enb_prach_rx",
|
||||
"phy_enb_pdcch_tx",
|
||||
|
||||
@@ -91,6 +91,61 @@ typedef enum {
|
||||
VCD_SIGNAL_DUMPER_VARIABLE_MP_FREE,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_BO,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SCHEDULED,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_TIMING_ADVANCE,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SR_ENERGY,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SR_THRES,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI0,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI1,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI2,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI3,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI4,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI5,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI6,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI7,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES0,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES1,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES2,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES3,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES4,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES5,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES6,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES7,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS0,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS1,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS2,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS3,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS4,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS5,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS6,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS7,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB0,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB1,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB2,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB3,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB4,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB5,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB6,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB7,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND0,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND1,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND2,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND3,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND4,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND5,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND6,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND7,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN0,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN1,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN2,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN3,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN4,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN5,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN6,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN7,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_LAST,
|
||||
VCD_SIGNAL_DUMPER_VARIABLES_END = VCD_SIGNAL_DUMPER_VARIABLES_LAST,
|
||||
} vcd_signal_dump_variables;
|
||||
@@ -174,7 +229,15 @@ typedef enum {
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_CONFIG_SIB2_ENB,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_CONFIG_DEDICATED_ENB,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_COMPUTE_PRACH,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING0,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING1,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING2,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING3,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING4,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING5,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING6,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING7,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,
|
||||
|
||||
@@ -515,7 +515,7 @@ int init_opt(char *path, char *ip, char *port, radio_type_t radio_type_p)
|
||||
strncpy( in_path, path, sizeof(in_path) );
|
||||
in_path[sizeof(in_path) - 1] = 0; // terminate string
|
||||
} else {
|
||||
strcpy( in_path, "/tmp/oai_opt.pcap" );
|
||||
strcpy( in_path, "/tmp/opt.pcap" );
|
||||
}
|
||||
|
||||
if (ip != NULL) {
|
||||
|
||||
Reference in New Issue
Block a user