commiting a patch on behalf of Raymond that fixes the some timing issues in the HARQ process
git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7800 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
@@ -729,6 +729,13 @@ typedef struct {
|
||||
|
||||
uint16_t priority[MAX_NUM_LCID];
|
||||
|
||||
// resource scheduling information
|
||||
uint8_t harq_pid[MAX_NUM_CCs];
|
||||
uint8_t round[MAX_NUM_CCs];
|
||||
uint8_t dl_pow_off[MAX_NUM_CCs];
|
||||
uint16_t pre_nb_available_rbs[MAX_NUM_CCs];
|
||||
unsigned char rballoc_sub_UE[MAX_NUM_CCs][N_RBG_MAX];
|
||||
|
||||
} UE_sched_ctrl;
|
||||
/*! \brief eNB template for the Random access information */
|
||||
typedef struct {
|
||||
|
||||
@@ -314,8 +314,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
break;
|
||||
}
|
||||
} else { //FDD
|
||||
//schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
||||
//fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,3,7,nCCE);
|
||||
|
||||
}
|
||||
@@ -350,9 +350,9 @@ 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, nprb, nCCE);
|
||||
// schedule_RA(module_idP,frameP, subframeP, 0, nprb, nCCE);
|
||||
// schedule_ulsch(module_idP, frameP, cooperation_flag, 4, 8, nCCE);
|
||||
//schedule_ue_spec(module_idP, frameP, subframeP, nprb, nCCE, mbsfn_status);
|
||||
schedule_ue_spec(module_idP, frameP, subframeP, nprb, nCCE, mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP, frameP, subframeP, RBalloc, 1, mbsfn_status);
|
||||
|
||||
}
|
||||
@@ -369,9 +369,9 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
|
||||
//schedule_RA(module_idP,frameP,subframeP,5,nprb,nCCE);
|
||||
if (mac_xface->lte_frame_parms->frame_type == FDD) {
|
||||
// schedule_RA(module_idP,frameP,subframeP,1,nprb,nCCE);
|
||||
schedule_RA(module_idP,frameP,subframeP,1,nprb,nCCE);
|
||||
// schedule_ulsch(module_idP,frameP,cooperation_flag,5,9,nCCE);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,1,mbsfn_status);
|
||||
|
||||
} else if ((mac_xface->lte_frame_parms->tdd_config == 0) || // TDD Config 0
|
||||
(mac_xface->lte_frame_parms->tdd_config == 6)) { // TDD Config 6
|
||||
|
||||
@@ -445,9 +445,9 @@ schedule_ue_spec(
|
||||
void *DLSCH_dci = NULL;
|
||||
LTE_eNB_UE_stats *eNB_UE_stats = NULL;
|
||||
uint16_t sdu_length_total = 0;
|
||||
uint8_t dl_pow_off[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
|
||||
unsigned char rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX];
|
||||
uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
|
||||
// uint8_t dl_pow_off[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
|
||||
// unsigned char rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX];
|
||||
// uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
|
||||
int mcs;
|
||||
uint16_t min_rb_unit[MAX_NUM_CCs];
|
||||
short ta_update = 0;
|
||||
@@ -458,7 +458,7 @@ schedule_ue_spec(
|
||||
int32_t normalized_rx_power, target_rx_power;
|
||||
int32_t tpc=1;
|
||||
static int32_t tpc_accumulated=0;
|
||||
|
||||
UE_sched_ctrl *ue_sched_ctl;
|
||||
|
||||
if (UE_list->head==-1) {
|
||||
return;
|
||||
@@ -493,10 +493,7 @@ schedule_ue_spec(
|
||||
dlsch_scheduler_pre_processor(module_idP,
|
||||
frameP,
|
||||
subframeP,
|
||||
dl_pow_off,
|
||||
pre_nb_available_rbs,
|
||||
N_RBG,
|
||||
rballoc_sub_UE,
|
||||
mbsfn_flag);
|
||||
stop_meas(&eNB->schedule_dlsch_preprocessor);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR,VCD_FUNCTION_OUT);
|
||||
@@ -512,6 +509,7 @@ schedule_ue_spec(
|
||||
continue_flag=0; // reset the flag to allow allocation for the remaining UEs
|
||||
rnti = UE_RNTI(module_idP,UE_id);
|
||||
eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti);
|
||||
ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
|
||||
|
||||
if (rnti==NOT_A_RNTI) {
|
||||
LOG_D(MAC,"Cannot find rnti for UE_id %d (num_UEs %d)\n",UE_id,UE_list->num_UEs);
|
||||
@@ -525,9 +523,9 @@ schedule_ue_spec(
|
||||
continue_flag=1;
|
||||
}
|
||||
|
||||
if ((pre_nb_available_rbs[CC_id][UE_id] == 0) || (nCCE[CC_id] < (1<<aggregation))) {
|
||||
if ((ue_sched_ctl->pre_nb_available_rbs[CC_id] == 0) || (nCCE[CC_id] < (1<<aggregation))) {
|
||||
LOG_D(MAC,"[eNB %d] Frame %d : no RB allocated for UE %d on CC_id %d: continue \n",
|
||||
module_idP, frameP, UE_id, CC_id, nb_rb_used0[CC_id], pre_nb_available_rbs[CC_id][UE_id], nCCE[CC_id], aggregation);
|
||||
module_idP, frameP, UE_id, CC_id, nb_rb_used0[CC_id], ue_sched_ctl->pre_nb_available_rbs[CC_id], nCCE[CC_id], aggregation);
|
||||
//if(mac_xface->get_transmission_mode(module_idP,rnti)==5)
|
||||
continue_flag=1; //to next user (there might be rbs availiable for other UEs in TM5
|
||||
// else
|
||||
@@ -554,11 +552,12 @@ schedule_ue_spec(
|
||||
continue;
|
||||
}
|
||||
|
||||
nb_available_rb = pre_nb_available_rbs[CC_id][UE_id];
|
||||
nb_available_rb = ue_sched_ctl->pre_nb_available_rbs[CC_id];
|
||||
harq_pid = ue_sched_ctl->harq_pid[CC_id];
|
||||
round = ue_sched_ctl->round[CC_id];
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].crnti= rnti;
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status=mac_eNB_get_rrc_status(module_idP,rnti);
|
||||
mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0);
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].harq_pid = harq_pid;
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].harq_pid = harq_pid;
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].harq_round = round;
|
||||
|
||||
sdu_length_total=0;
|
||||
@@ -615,17 +614,17 @@ schedule_ue_spec(
|
||||
|
||||
if (nb_rb <= nb_available_rb) {
|
||||
|
||||
if(nb_rb == pre_nb_available_rbs[CC_id][UE_id]) {
|
||||
if(nb_rb == ue_sched_ctl->pre_nb_available_rbs[CC_id]) {
|
||||
for(j=0; j<frame_parms[CC_id]->N_RBG; j++) { // for indicating the rballoc for each sub-band
|
||||
UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = rballoc_sub_UE[CC_id][UE_id][j];
|
||||
UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j];
|
||||
}
|
||||
} else {
|
||||
nb_rb_temp = nb_rb;
|
||||
j = 0;
|
||||
|
||||
while((nb_rb_temp > 0) && (j<frame_parms[CC_id]->N_RBG)) {
|
||||
if(rballoc_sub_UE[CC_id][UE_id][j] == 1) {
|
||||
UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = rballoc_sub_UE[CC_id][UE_id][j];
|
||||
if(ue_sched_ctl->rballoc_sub_UE[CC_id][j] == 1) {
|
||||
UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j];
|
||||
|
||||
if((j == frame_parms[CC_id]->N_RBG-1) &&
|
||||
((frame_parms[CC_id]->N_RB_DL == 25)||
|
||||
@@ -647,7 +646,7 @@ schedule_ue_spec(
|
||||
|
||||
|
||||
PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = nb_rb;
|
||||
PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].dl_pow_off = dl_pow_off[CC_id][UE_id];
|
||||
PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].dl_pow_off = ue_sched_ctl->dl_pow_off[CC_id];
|
||||
|
||||
for(j=0; j<frame_parms[CC_id]->N_RBG; j++) {
|
||||
PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].rballoc_sub[j] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j];
|
||||
@@ -763,11 +762,11 @@ schedule_ue_spec(
|
||||
((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rv = round&3;
|
||||
((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3;
|
||||
|
||||
if(dl_pow_off[CC_id][UE_id] == 2) {
|
||||
dl_pow_off[CC_id][UE_id] = 1;
|
||||
if(ue_sched_ctl->dl_pow_off[CC_id] == 2) {
|
||||
ue_sched_ctl->dl_pow_off[CC_id] = 1;
|
||||
}
|
||||
|
||||
((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = dl_pow_off[CC_id][UE_id];
|
||||
((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = ue_sched_ctl->dl_pow_off[CC_id];
|
||||
// }
|
||||
break;
|
||||
|
||||
@@ -1006,17 +1005,17 @@ schedule_ue_spec(
|
||||
TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,nb_rb);
|
||||
}
|
||||
|
||||
if(nb_rb == pre_nb_available_rbs[CC_id][UE_id]) {
|
||||
if(nb_rb == ue_sched_ctl->pre_nb_available_rbs[CC_id]) {
|
||||
for(j=0; j<frame_parms[CC_id]->N_RBG; j++) { // for indicating the rballoc for each sub-band
|
||||
UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = rballoc_sub_UE[CC_id][UE_id][j];
|
||||
UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j];
|
||||
}
|
||||
} else {
|
||||
nb_rb_temp = nb_rb;
|
||||
j = 0;
|
||||
|
||||
while((nb_rb_temp > 0) && (j<frame_parms[CC_id]->N_RBG)) {
|
||||
if(rballoc_sub_UE[CC_id][UE_id][j] == 1) {
|
||||
UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = rballoc_sub_UE[CC_id][UE_id][j];
|
||||
if(ue_sched_ctl->rballoc_sub_UE[CC_id][j] == 1) {
|
||||
UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j];
|
||||
|
||||
if ((j == frame_parms[CC_id]->N_RBG-1) &&
|
||||
((frame_parms[CC_id]->N_RB_DL == 25)||
|
||||
@@ -1032,7 +1031,7 @@ schedule_ue_spec(
|
||||
}
|
||||
|
||||
PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = nb_rb;
|
||||
PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].dl_pow_off = dl_pow_off[CC_id][UE_id];
|
||||
PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].dl_pow_off = ue_sched_ctl->dl_pow_off[CC_id];
|
||||
|
||||
for(j=0; j<frame_parms[CC_id]->N_RBG; j++) {
|
||||
PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].rballoc_sub[j] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j];
|
||||
@@ -1046,8 +1045,8 @@ schedule_ue_spec(
|
||||
}
|
||||
|
||||
// if we have decreased too much or we don't have enough RBs, increase MCS
|
||||
while ((TBS < (sdu_length_total + header_len_dcch + header_len_dtch + ta_len)) && ((( dl_pow_off[CC_id][UE_id]>0) && (mcs<28))
|
||||
|| ( (dl_pow_off[CC_id][UE_id]==0) && (mcs<=15)))) {
|
||||
while ((TBS < (sdu_length_total + header_len_dcch + header_len_dtch + ta_len)) && ((( ue_sched_ctl->dl_pow_off[CC_id]>0) && (mcs<28))
|
||||
|| ( (ue_sched_ctl->dl_pow_off[CC_id]==0) && (mcs<=15)))) {
|
||||
mcs++;
|
||||
TBS = mac_xface->get_TBS_DL(mcs,nb_rb);
|
||||
}
|
||||
@@ -1462,11 +1461,11 @@ schedule_ue_spec(
|
||||
((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3;
|
||||
((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->TPC = tpc;
|
||||
|
||||
if(dl_pow_off[CC_id][UE_id] == 2) {
|
||||
dl_pow_off[CC_id][UE_id] = 1;
|
||||
if(ue_sched_ctl->dl_pow_off[CC_id] == 2) {
|
||||
ue_sched_ctl->dl_pow_off[CC_id] = 1;
|
||||
}
|
||||
|
||||
((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = dl_pow_off[CC_id][UE_id];
|
||||
((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = ue_sched_ctl->dl_pow_off[CC_id];
|
||||
((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->tpmi = 5;
|
||||
break;
|
||||
|
||||
@@ -2152,7 +2151,8 @@ fill_DLSCH_dci(
|
||||
// clear scheduling flag
|
||||
eNB_dlsch_info[module_idP][CC_id][UE_id].status = S_DL_WAITING;
|
||||
rnti = UE_RNTI(module_idP,UE_id);
|
||||
mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0);
|
||||
// mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0);
|
||||
harq_pid = UE_list->UE_sched_ctrl[UE_id].harq_pid[CC_id];
|
||||
nb_rb = UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid];
|
||||
|
||||
DLSCH_dci = (void *)UE_list->UE_template[CC_id][UE_id].DLSCH_DCI[harq_pid];
|
||||
|
||||
@@ -126,30 +126,37 @@ void rx_sdu(
|
||||
break;
|
||||
|
||||
case CRNTI:
|
||||
LOG_W(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : Received CRNTI %2.2x%2.2x\n",
|
||||
enb_mod_idP, CC_idP, rx_ces[i], payload_ptr[0], payload_ptr[1]);
|
||||
LOG_D(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d (ce %d/%d): Received CRNTI %2.2x%2.2x\n",
|
||||
enb_mod_idP, CC_idP, rx_ces[i], i,num_ce, payload_ptr[0], payload_ptr[1]);
|
||||
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 : CRNTI %x (UE_id %d) in Msg3\n",enb_mod_idP, CC_idP, rx_ces[i], (((uint16_t)payload_ptr[0])<<8) + payload_ptr[1],UE_id);
|
||||
|
||||
payload_ptr+=2;
|
||||
/* FIXME we don't process this CE yet */
|
||||
/* we don't process this CE yet */
|
||||
if (msg3_flagP != NULL) {
|
||||
LOG_W(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : CRNTI in Msg3 not handled\n");
|
||||
*msg3_flagP = 0;
|
||||
*msg3_flagP = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case TRUNCATED_BSR:
|
||||
case SHORT_BSR: {
|
||||
uint8_t lcgid;
|
||||
lcgid = (payload_ptr[0] >> 6);
|
||||
|
||||
LOG_D(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : Received short BSR LCGID = %u bsr = %d\n",
|
||||
enb_mod_idP, CC_idP, rx_ces[i], lcgid, payload_ptr[0] & 0x3f);
|
||||
|
||||
if (UE_id != -1) {
|
||||
uint8_t lcgid;
|
||||
lcgid = (payload_ptr[0] >> 6);
|
||||
LOG_D(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : Received short BSR LCGID = %u bsr = %d\n",
|
||||
enb_mod_idP, CC_idP, rx_ces[i], lcgid, payload_ptr[0] & 0x3f);
|
||||
|
||||
UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid] = (payload_ptr[0] & 0x3f);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
}
|
||||
payload_ptr += 1;//sizeof(SHORT_BSR); // fixme
|
||||
}
|
||||
break;
|
||||
@@ -743,7 +750,7 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
LOG_T(MAC,"[eNB %d] Frame %d, subframeP %d, UE %d CC %d : got harq pid %d round %d (nCCE %d, rnti %x,mode %s)\n",
|
||||
module_idP,frameP,subframeP,UE_id,CC_id, harq_pid, round,nCCE[CC_id],rnti,mode_string[eNB_UE_stats->mode]);
|
||||
|
||||
|
||||
#undef EXMIMO_IOT
|
||||
|
||||
#ifndef EXMIMO_IOT
|
||||
|
||||
|
||||
@@ -157,7 +157,7 @@ void assign_rbs_required (module_id_t Mod_id,
|
||||
LTE_eNB_UE_stats *eNB_UE_stats[MAX_NUM_CCs];
|
||||
int UE_id,n,i,j,CC_id,pCCid,tmp;
|
||||
UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list;
|
||||
UE_TEMPLATE *UE_template;
|
||||
// UE_TEMPLATE *UE_template;
|
||||
LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs];
|
||||
|
||||
// clear rb allocations across all CC_ids
|
||||
@@ -250,12 +250,14 @@ void assign_rbs_required (module_id_t Mod_id,
|
||||
int maxround(module_id_t Mod_id,uint16_t rnti,int frame,sub_frame_t subframe,uint8_t ul_flag )
|
||||
{
|
||||
|
||||
uint8_t round,round_max=0,harq_pid;
|
||||
uint8_t round,round_max=0,UE_id;
|
||||
int CC_id;
|
||||
UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list;
|
||||
|
||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||
mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,frame,subframe,&harq_pid,&round,ul_flag);
|
||||
|
||||
UE_id = find_UE_id(Mod_id,rnti);
|
||||
round = UE_list->UE_sched_ctrl[UE_id].round[CC_id];
|
||||
if (round > round_max) {
|
||||
round_max = round;
|
||||
}
|
||||
@@ -303,7 +305,7 @@ void sort_UEs (module_id_t Mod_idP,
|
||||
int UE_id1,UE_id2;
|
||||
int pCC_id1,pCC_id2;
|
||||
int cqi1,cqi2,round1,round2;
|
||||
int i=0,ii=0,j=0;
|
||||
int i=0,ii=0;//,j=0;
|
||||
rnti_t rnti1,rnti2;
|
||||
|
||||
UE_list_t *UE_list = &eNB_mac_inst[Mod_idP].UE_list;
|
||||
@@ -362,32 +364,39 @@ void sort_UEs (module_id_t Mod_idP,
|
||||
void dlsch_scheduler_pre_processor (module_id_t Mod_id,
|
||||
frame_t frameP,
|
||||
sub_frame_t subframeP,
|
||||
uint8_t dl_pow_off[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
int N_RBG[MAX_NUM_CCs],
|
||||
unsigned char rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX],
|
||||
int *mbsfn_flag)
|
||||
{
|
||||
|
||||
unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX],harq_pid=0,harq_pid1=0,harq_pid2=0,round=0,round1=0,round2=0,total_ue_count;
|
||||
unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX],harq_pid=0,round=0,total_ue_count;
|
||||
unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX];
|
||||
int UE_id, UE_id2, i;
|
||||
int UE_id, i;
|
||||
uint16_t ii,j;
|
||||
uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
|
||||
uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
|
||||
uint16_t nb_rbs_required_remaining_1[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
|
||||
uint16_t i1,i2,i3,r1=0;
|
||||
uint16_t average_rbs_per_user[MAX_NUM_CCs] = {0};
|
||||
rnti_t rnti,rnti1,rnti2;
|
||||
LTE_eNB_UE_stats *eNB_UE_stats1 = NULL;
|
||||
LTE_eNB_UE_stats *eNB_UE_stats2 = NULL;
|
||||
rnti_t rnti;
|
||||
int min_rb_unit[MAX_NUM_CCs];
|
||||
|
||||
uint16_t r1=0;
|
||||
uint8_t CC_id;
|
||||
UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list;
|
||||
LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs] = {0};
|
||||
int rrc_status = RRC_IDLE;
|
||||
|
||||
int transmission_mode = 0;
|
||||
UE_sched_ctrl *ue_sched_ctl;
|
||||
// int rrc_status = RRC_IDLE;
|
||||
|
||||
#ifdef TM5
|
||||
int harq_pid1=0,harq_pid2=0;
|
||||
int round1=0,round2=0;
|
||||
int UE_id2;
|
||||
uint16_t i1,i2,i3;
|
||||
rnti_t rnti1,rnti2;
|
||||
LTE_eNB_UE_stats *eNB_UE_stats1 = NULL;
|
||||
LTE_eNB_UE_stats *eNB_UE_stats2 = NULL;
|
||||
UE_sched_ctrl *ue_sched_ctl1,*ue_sched_ctl2;
|
||||
#endif
|
||||
|
||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||
|
||||
@@ -402,16 +411,17 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id,
|
||||
for (i=UE_list->head; i>=0; i=UE_list->next[i]) {
|
||||
UE_id = i;
|
||||
// Initialize scheduling information for all active UEs
|
||||
|
||||
|
||||
dlsch_scheduler_pre_processor_reset(
|
||||
|
||||
dlsch_scheduler_pre_processor_reset(Mod_id,
|
||||
UE_id,
|
||||
CC_id,
|
||||
frameP,
|
||||
subframeP,
|
||||
N_RBG[CC_id],
|
||||
dl_pow_off,
|
||||
nb_rbs_required,
|
||||
pre_nb_available_rbs,
|
||||
nb_rbs_required_remaining,
|
||||
rballoc_sub_UE,
|
||||
rballoc_sub,
|
||||
MIMO_mode_indicator);
|
||||
|
||||
@@ -419,7 +429,6 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id,
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Store the DLSCH buffer for each logical channel
|
||||
store_dlsch_buffer (Mod_id,frameP,subframeP);
|
||||
|
||||
@@ -446,14 +455,21 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id,
|
||||
|
||||
UE_id = i;
|
||||
|
||||
// if there is no available harq_process, skip the UE
|
||||
if (UE_list->UE_sched_ctrl[UE_id].harq_pid[CC_id]<0)
|
||||
continue;
|
||||
|
||||
for (ii=0; ii<UE_num_active_CC(UE_list,UE_id); ii++) {
|
||||
CC_id = UE_list->ordered_CCids[ii][UE_id];
|
||||
ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
|
||||
harq_pid = ue_sched_ctl->harq_pid[CC_id];
|
||||
round = ue_sched_ctl->round[CC_id];
|
||||
|
||||
average_rbs_per_user[CC_id]=0;
|
||||
|
||||
frame_parms[CC_id] = mac_xface->get_lte_frame_parms(Mod_id,CC_id);
|
||||
|
||||
mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0);
|
||||
// mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0);
|
||||
|
||||
if(round>0) {
|
||||
nb_rbs_required[CC_id][UE_id] = UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid];
|
||||
@@ -524,7 +540,7 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id,
|
||||
nb_rbs_required_remaining[CC_id][i],
|
||||
nb_rbs_required_remaining_1[CC_id][i],
|
||||
nb_rbs_required[CC_id][i],
|
||||
pre_nb_available_rbs[CC_id][i],
|
||||
UE_list->UE_sched_ctrl[i].pre_nb_available_rbs[CC_id],
|
||||
N_RBG[CC_id],
|
||||
min_rb_unit[CC_id]);
|
||||
|
||||
@@ -537,6 +553,9 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id,
|
||||
|
||||
for (ii=0; ii<UE_num_active_CC(UE_list,UE_id); ii++) {
|
||||
CC_id = UE_list->ordered_CCids[ii][UE_id];
|
||||
ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
|
||||
harq_pid = ue_sched_ctl->harq_pid[CC_id];
|
||||
round = ue_sched_ctl->round[CC_id];
|
||||
|
||||
rnti = UE_RNTI(Mod_id,UE_id);
|
||||
|
||||
@@ -545,8 +564,8 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id,
|
||||
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);
|
||||
rrc_status = mac_eNB_get_rrc_status(Mod_id,rnti);
|
||||
// mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0);
|
||||
//rrc_status = mac_eNB_get_rrc_status(Mod_id,rnti);
|
||||
/* 1st allocate for the retx */
|
||||
|
||||
// retransmission in data channels
|
||||
@@ -560,11 +579,8 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id,
|
||||
transmission_mode,
|
||||
min_rb_unit[CC_id],
|
||||
frame_parms[CC_id]->N_RB_DL,
|
||||
dl_pow_off,
|
||||
nb_rbs_required,
|
||||
pre_nb_available_rbs,
|
||||
nb_rbs_required_remaining,
|
||||
rballoc_sub_UE,
|
||||
rballoc_sub,
|
||||
MIMO_mode_indicator);
|
||||
|
||||
@@ -573,50 +589,52 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id,
|
||||
// data chanel TM5: to be revisted
|
||||
if ((round == 0 ) &&
|
||||
(transmission_mode == 5) &&
|
||||
(dl_pow_off[CC_id][UE_id] != 1)) {
|
||||
(ue_sched_ctl->dl_pow_off[CC_id] != 1)) {
|
||||
|
||||
for(j=0; j<N_RBG[CC_id]; j+=2) {
|
||||
|
||||
if( (((j == (N_RBG[CC_id]-1))&& (rballoc_sub[CC_id][j] == 0) && (rballoc_sub_UE[CC_id][UE_id][j] == 0)) ||
|
||||
((j < (N_RBG[CC_id]-1)) && (rballoc_sub[CC_id][j+1] == 0) && (rballoc_sub_UE[CC_id][UE_id][j+1] == 0)) ) &&
|
||||
if( (((j == (N_RBG[CC_id]-1))&& (rballoc_sub[CC_id][j] == 0) && (ue_sched_ctl->rballoc_sub_UE[CC_id][j] == 0)) ||
|
||||
((j < (N_RBG[CC_id]-1)) && (rballoc_sub[CC_id][j+1] == 0) && (ue_sched_ctl->rballoc_sub_UE[CC_id][j+1] == 0)) ) &&
|
||||
(nb_rbs_required_remaining[CC_id][UE_id]>0)) {
|
||||
|
||||
for (ii = UE_list->next[i+1]; ii >=0; ii=UE_list->next[ii]) {
|
||||
|
||||
UE_id2 = ii;
|
||||
rnti2 = UE_RNTI(Mod_id,UE_id2);
|
||||
|
||||
ue_sched_ctl2 = &UE_list->UE_sched_ctrl[UE_id2];
|
||||
harq_pid2 = ue_sched_ctl2->harq_pid[CC_id];
|
||||
round2 = ue_sched_ctl2->round[CC_id];
|
||||
if(rnti2 == NOT_A_RNTI)
|
||||
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);
|
||||
//mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti2,frameP,subframeP,&harq_pid2,&round2,0);
|
||||
|
||||
if ((mac_eNB_get_rrc_status(Mod_id,rnti2) >= RRC_RECONFIGURED) &&
|
||||
(round2==0) &&
|
||||
(mac_xface->get_transmission_mode(Mod_id,CC_id,rnti2)==5) &&
|
||||
(dl_pow_off[CC_id][UE_id2] != 1)) {
|
||||
(ue_sched_ctl->dl_pow_off[CC_id] != 1)) {
|
||||
|
||||
if( (((j == (N_RBG[CC_id]-1)) && (rballoc_sub_UE[CC_id][UE_id2][j] == 0)) ||
|
||||
((j < (N_RBG[CC_id]-1)) && (rballoc_sub_UE[CC_id][UE_id2][j+1] == 0)) ) &&
|
||||
if( (((j == (N_RBG[CC_id]-1)) && (ue_sched_ctl->rballoc_sub_UE[CC_id][j] == 0)) ||
|
||||
((j < (N_RBG[CC_id]-1)) && (ue_sched_ctl->rballoc_sub_UE[CC_id][j+1] == 0)) ) &&
|
||||
(nb_rbs_required_remaining[CC_id][UE_id2]>0)) {
|
||||
|
||||
if((((eNB_UE_stats2->DL_pmi_single^eNB_UE_stats1->DL_pmi_single)<<(14-j))&0xc000)== 0x4000) { //MU-MIMO only for 25 RBs configuration
|
||||
|
||||
rballoc_sub[CC_id][j] = 1;
|
||||
rballoc_sub_UE[CC_id][UE_id][j] = 1;
|
||||
rballoc_sub_UE[CC_id][UE_id2][j] = 1;
|
||||
ue_sched_ctl->rballoc_sub_UE[CC_id][j] = 1;
|
||||
ue_sched_ctl2->rballoc_sub_UE[CC_id][j] = 1;
|
||||
MIMO_mode_indicator[CC_id][j] = 0;
|
||||
|
||||
if (j< N_RBG[CC_id]-1) {
|
||||
rballoc_sub[CC_id][j+1] = 1;
|
||||
rballoc_sub_UE[CC_id][UE_id][j+1] = 1;
|
||||
rballoc_sub_UE[CC_id][UE_id2][j+1] = 1;
|
||||
ue_sched_ctl->rballoc_sub_UE[CC_id][j+1] = 1;
|
||||
ue_sched_ctl2->rballoc_sub_UE[CC_id][j+1] = 1;
|
||||
MIMO_mode_indicator[CC_id][j+1] = 0;
|
||||
}
|
||||
|
||||
dl_pow_off[CC_id][UE_id] = 0;
|
||||
dl_pow_off[CC_id][UE_id2] = 0;
|
||||
ue_sched_ctl->dl_pow_off[CC_id] = 0;
|
||||
ue_sched_ctl2->dl_pow_off[CC_id] = 0;
|
||||
|
||||
|
||||
if ((j == N_RBG[CC_id]-1) &&
|
||||
@@ -624,15 +642,15 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id,
|
||||
(PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms.N_RB_DL == 50))) {
|
||||
|
||||
nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] - min_rb_unit[CC_id]+1;
|
||||
pre_nb_available_rbs[CC_id][UE_id] = pre_nb_available_rbs[CC_id][UE_id] + min_rb_unit[CC_id]-1;
|
||||
ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit[CC_id]-1;
|
||||
nb_rbs_required_remaining[CC_id][UE_id2] = nb_rbs_required_remaining[CC_id][UE_id2] - min_rb_unit[CC_id]+1;
|
||||
pre_nb_available_rbs[CC_id][UE_id2] = pre_nb_available_rbs[CC_id][UE_id2] + min_rb_unit[CC_id]-1;
|
||||
ue_sched_ctl2->pre_nb_available_rbs[CC_id] = ue_sched_ctl2->pre_nb_available_rbs[CC_id] + min_rb_unit[CC_id]-1;
|
||||
} else {
|
||||
|
||||
nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] - 4;
|
||||
pre_nb_available_rbs[CC_id][UE_id] = pre_nb_available_rbs[CC_id][UE_id] + 4;
|
||||
ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + 4;
|
||||
nb_rbs_required_remaining[CC_id][UE_id2] = nb_rbs_required_remaining[CC_id][UE_id2] - 4;
|
||||
pre_nb_available_rbs[CC_id][UE_id2] = pre_nb_available_rbs[CC_id][UE_id2] + 4;
|
||||
ue_sched_ctl2->pre_nb_available_rbs[CC_id] = ue_sched_ctl2->pre_nb_available_rbs[CC_id] + 4;
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -688,48 +706,60 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id,
|
||||
|
||||
for(i=UE_list->head; i>=0; i=UE_list->next[i]) {
|
||||
UE_id = i;
|
||||
ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
|
||||
|
||||
for (ii=0; ii<UE_num_active_CC(UE_list,UE_id); ii++) {
|
||||
CC_id = UE_list->ordered_CCids[ii][UE_id];
|
||||
//PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].dl_pow_off = dl_pow_off[UE_id];
|
||||
|
||||
if (pre_nb_available_rbs[CC_id][UE_id] > 0 ) {
|
||||
if (ue_sched_ctl->pre_nb_available_rbs[CC_id] > 0 ) {
|
||||
LOG_D(MAC,"******************DL Scheduling Information for UE%d ************************\n",UE_id);
|
||||
LOG_D(MAC,"dl power offset UE%d = %d \n",UE_id,dl_pow_off[CC_id][UE_id]);
|
||||
LOG_D(MAC,"dl power offset UE%d = %d \n",UE_id,ue_sched_ctl->dl_pow_off[CC_id]);
|
||||
LOG_D(MAC,"***********RB Alloc for every subband for UE%d ***********\n",UE_id);
|
||||
|
||||
for(j=0; j<N_RBG[CC_id]; j++) {
|
||||
//PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].rballoc_sub[i] = rballoc_sub_UE[CC_id][UE_id][i];
|
||||
LOG_D(MAC,"RB Alloc for UE%d and Subband%d = %d\n",UE_id,j,rballoc_sub_UE[CC_id][UE_id][j]);
|
||||
LOG_D(MAC,"RB Alloc for UE%d and Subband%d = %d\n",UE_id,j,ue_sched_ctl->rballoc_sub_UE[CC_id][j]);
|
||||
}
|
||||
|
||||
//PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = pre_nb_available_rbs[CC_id][UE_id];
|
||||
LOG_D(MAC,"Total RBs allocated for UE%d = %d\n",UE_id,pre_nb_available_rbs[CC_id][UE_id]);
|
||||
LOG_D(MAC,"Total RBs allocated for UE%d = %d\n",UE_id,ue_sched_ctl->pre_nb_available_rbs[CC_id]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void dlsch_scheduler_pre_processor_reset (int UE_id,
|
||||
void dlsch_scheduler_pre_processor_reset (int module_idP,
|
||||
int UE_id,
|
||||
uint8_t CC_id,
|
||||
int frameP,
|
||||
int subframeP,
|
||||
int N_RBG,
|
||||
uint8_t dl_pow_off[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
unsigned char rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX],
|
||||
unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX],
|
||||
unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX])
|
||||
{
|
||||
int i;
|
||||
UE_list_t *UE_list=&eNB_mac_inst[module_idP].UE_list;
|
||||
UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
|
||||
rnti_t rnti = UE_RNTI(module_idP,UE_id);
|
||||
|
||||
// initialize harq_pid and round
|
||||
mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,
|
||||
frameP,subframeP,
|
||||
&ue_sched_ctl->harq_pid[CC_id],
|
||||
&ue_sched_ctl->round[CC_id],
|
||||
0);
|
||||
|
||||
nb_rbs_required[CC_id][UE_id]=0;
|
||||
pre_nb_available_rbs[CC_id][UE_id] = 0;
|
||||
dl_pow_off[CC_id][UE_id] = 2;
|
||||
ue_sched_ctl->pre_nb_available_rbs[CC_id] = 0;
|
||||
ue_sched_ctl->dl_pow_off[CC_id] = 2;
|
||||
nb_rbs_required_remaining[CC_id][UE_id] = 0;
|
||||
|
||||
for (i=0; i<N_RBG; i++) {
|
||||
rballoc_sub_UE[CC_id][UE_id][i] = 0;
|
||||
ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 0;
|
||||
rballoc_sub[CC_id][i] = 0;
|
||||
MIMO_mode_indicator[CC_id][i] = 2;
|
||||
}
|
||||
@@ -743,46 +773,45 @@ void dlsch_scheduler_pre_processor_allocate (module_id_t Mod_id,
|
||||
int transmission_mode,
|
||||
int min_rb_unit,
|
||||
uint8_t N_RB_DL,
|
||||
uint8_t dl_pow_off[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
unsigned char rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX],
|
||||
unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX],
|
||||
unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX])
|
||||
{
|
||||
|
||||
int i;
|
||||
UE_list_t *UE_list=&eNB_mac_inst[Mod_id].UE_list;
|
||||
UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
|
||||
|
||||
for(i=0; i<N_RBG; i++) {
|
||||
|
||||
if((rballoc_sub[CC_id][i] == 0) &&
|
||||
(rballoc_sub_UE[CC_id][UE_id][i] == 0) &&
|
||||
(ue_sched_ctl->rballoc_sub_UE[CC_id][i] == 0) &&
|
||||
(nb_rbs_required_remaining[CC_id][UE_id]>0) &&
|
||||
(pre_nb_available_rbs[CC_id][UE_id] < nb_rbs_required[CC_id][UE_id])) {
|
||||
(ue_sched_ctl->pre_nb_available_rbs[CC_id] < nb_rbs_required[CC_id][UE_id])) {
|
||||
|
||||
// if this UE is not scheduled for TM5
|
||||
if (dl_pow_off[CC_id][UE_id] != 0 ) {
|
||||
if (ue_sched_ctl->dl_pow_off[CC_id] != 0 ) {
|
||||
|
||||
if ((i == N_RBG-1) && ((N_RB_DL == 25) || (N_RB_DL == 50))) {
|
||||
rballoc_sub[CC_id][i] = 1;
|
||||
rballoc_sub_UE[CC_id][UE_id][i] = 1;
|
||||
ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1;
|
||||
MIMO_mode_indicator[CC_id][i] = 1;
|
||||
if (transmission_mode == 5 ) {
|
||||
dl_pow_off[CC_id][UE_id] = 1;
|
||||
ue_sched_ctl->dl_pow_off[CC_id] = 1;
|
||||
}
|
||||
nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] - min_rb_unit+1;
|
||||
pre_nb_available_rbs[CC_id][UE_id] = pre_nb_available_rbs[CC_id][UE_id] + min_rb_unit - 1;
|
||||
ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit - 1;
|
||||
} else {
|
||||
if (nb_rbs_required_remaining[CC_id][UE_id] >= min_rb_unit){
|
||||
rballoc_sub[CC_id][i] = 1;
|
||||
rballoc_sub_UE[CC_id][UE_id][i] = 1;
|
||||
ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1;
|
||||
MIMO_mode_indicator[CC_id][i] = 1;
|
||||
if (transmission_mode == 5 ) {
|
||||
dl_pow_off[CC_id][UE_id] = 1;
|
||||
ue_sched_ctl->dl_pow_off[CC_id] = 1;
|
||||
}
|
||||
nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] - min_rb_unit;
|
||||
pre_nb_available_rbs[CC_id][UE_id] = pre_nb_available_rbs[CC_id][UE_id] + min_rb_unit;
|
||||
ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit;
|
||||
}
|
||||
}
|
||||
} // dl_pow_off[CC_id][UE_id] ! = 0
|
||||
@@ -887,9 +916,9 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LOG_D(MAC,"[eNB %d] Frame %d subframe %d: total ue to be scheduled %d/%d\n",
|
||||
module_idP, frameP, subframeP,total_ue_count, max_num_ue_to_be_scheduled);
|
||||
if (total_ue_count > 0)
|
||||
LOG_D(MAC,"[eNB %d] Frame %d subframe %d: total ue to be scheduled %d/%d\n",
|
||||
module_idP, frameP, subframeP,total_ue_count, max_num_ue_to_be_scheduled);
|
||||
|
||||
//LOG_D(MAC,"step3\n");
|
||||
|
||||
|
||||
@@ -178,14 +178,13 @@ void mac_top_cleanup(void);
|
||||
|
||||
void mac_UE_out_of_sync_ind(module_id_t module_idP,frame_t frameP, uint16_t eNB_index);
|
||||
|
||||
void dlsch_scheduler_pre_processor_reset (int UE_id,
|
||||
void dlsch_scheduler_pre_processor_reset (int module_idP,int UE_id,
|
||||
uint8_t CC_id,
|
||||
int frameP,
|
||||
int subframeP,
|
||||
int N_RBG,
|
||||
uint8_t dl_pow_off[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
unsigned char rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX],
|
||||
unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX],
|
||||
unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]);
|
||||
|
||||
@@ -194,20 +193,14 @@ void dlsch_scheduler_pre_processor_reset (int UE_id,
|
||||
@param Mod_id Instance ID of eNB
|
||||
@param frame Index of frame
|
||||
@param subframe Index of current subframe
|
||||
@param dl_pow_off Pointer to store resulting power offset for DCI
|
||||
@param pre_nb_available_rbs Pointer to store number of remaining rbs after scheduling
|
||||
@param N_RBS Number of resource block groups
|
||||
@param rb_alloc_sub Table of resource block groups allocated to each UE
|
||||
*/
|
||||
|
||||
|
||||
void dlsch_scheduler_pre_processor (module_id_t module_idP,
|
||||
frame_t frameP,
|
||||
sub_frame_t subframe,
|
||||
uint8_t dl_pow_off[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
int N_RBG[MAX_NUM_CCs],
|
||||
unsigned char rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX],
|
||||
int *mbsfn_flag);
|
||||
|
||||
|
||||
@@ -218,11 +211,8 @@ void dlsch_scheduler_pre_processor_allocate (module_id_t Mod_id,
|
||||
int transmission_mode,
|
||||
int min_rb_unit,
|
||||
uint8_t N_RB_DL,
|
||||
uint8_t dl_pow_off[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||
unsigned char rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX],
|
||||
unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX],
|
||||
unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]);
|
||||
|
||||
|
||||
@@ -1643,7 +1643,7 @@ do_RRCConnectionSetup(
|
||||
// SchedulingRequestConfig
|
||||
|
||||
physicalConfigDedicated2->schedulingRequestConfig->present = SchedulingRequestConfig_PR_setup;
|
||||
physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex = ue_context_pP->local_uid;
|
||||
physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex = 3;//ue_context_pP->local_uid;
|
||||
|
||||
if (frame_parms->frame_type == 0) { // FDD
|
||||
physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_ConfigIndex = 5+(ue_context_pP->local_uid%10); // Isr = 5 (every 10 subframes, offset=2+UE_id mod3)
|
||||
|
||||
@@ -539,6 +539,23 @@ rrc_eNB_get_next_transaction_identifier(
|
||||
//}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// return 1 if there is already an UE with ue_identityP, 0 otherwise
|
||||
static int
|
||||
rrc_eNB_ue_context_random_exist(
|
||||
const protocol_ctxt_t* const ctxt_pP,
|
||||
const uint64_t ue_identityP
|
||||
)
|
||||
//-----------------------------------------------------------------------------
|
||||
{
|
||||
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.random_ue_identity == ue_identityP)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// return a new ue context structure if ue_identityP, ctxt_pP->rnti not found in collection
|
||||
static struct rrc_eNB_ue_context_s*
|
||||
@@ -3610,10 +3627,23 @@ rrc_eNB_decode_ccch(
|
||||
} else {
|
||||
rrcConnectionRequest = &ul_ccch_msg->message.choice.c1.choice.rrcConnectionRequest.criticalExtensions.choice.rrcConnectionRequest_r8;
|
||||
{
|
||||
AssertFatal(rrcConnectionRequest->ue_Identity.present == InitialUE_Identity_PR_randomValue,
|
||||
"unsupported InitialUE-Identity in RRCConnectionRequest");
|
||||
AssertFatal(rrcConnectionRequest->ue_Identity.choice.randomValue.size == 5,
|
||||
"wrong InitialUE-Identity randomValue size, expected 5, provided %d",
|
||||
rrcConnectionRequest->ue_Identity.choice.randomValue.size);
|
||||
memcpy(((uint8_t*) & random_value) + 3,
|
||||
rrcConnectionRequest->ue_Identity.choice.randomValue.buf,
|
||||
rrcConnectionRequest->ue_Identity.choice.randomValue.size);
|
||||
ue_context_p = rrc_eNB_get_next_free_ue_context(ctxt_pP, random_value);
|
||||
/* if there is already a registered UE (with another RNTI) with this random_value,
|
||||
* the current one must be removed from MAC/PHY (zombie UE)
|
||||
*/
|
||||
if (rrc_eNB_ue_context_random_exist(ctxt_pP, random_value)) {
|
||||
AssertFatal(0 == 1, "TODO: remove UE fro MAC/PHY (how?)");
|
||||
ue_context_p = NULL;
|
||||
} else {
|
||||
ue_context_p = rrc_eNB_get_next_free_ue_context(ctxt_pP, random_value);
|
||||
}
|
||||
}
|
||||
LOG_D(RRC,
|
||||
PROTOCOL_RRC_CTXT_UE_FMT" UE context: %X\n",
|
||||
|
||||
Reference in New Issue
Block a user