bugfix: test free RBs and CCE allocation feasible only for new transmissions
This commit is contained in:
@@ -1415,34 +1415,6 @@ schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
/* This is the actual CC_id in the list */
|
/* This is the actual CC_id in the list */
|
||||||
CC_id = UE_list->ordered_ULCCids[n][UE_id];
|
CC_id = UE_list->ordered_ULCCids[n][UE_id];
|
||||||
|
|
||||||
/* Be sure that there are some free RBs */
|
|
||||||
if (first_rb_slice[CC_id] >= n_rb_ul_tab[CC_id] - 1) {
|
|
||||||
LOG_W(MAC, "[eNB %d] frame %d, subframe %d, UE %d/%x CC %d: dropping, not enough RBs\n",
|
|
||||||
module_idP,
|
|
||||||
frameP,
|
|
||||||
subframeP,
|
|
||||||
UE_id,
|
|
||||||
rnti,
|
|
||||||
CC_id);
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Should format_flag be 2 in CCE_allocation_infeasible??? */
|
|
||||||
/* This test seems to be way too long, can we provide an optimization? */
|
|
||||||
if (CCE_allocation_infeasible(module_idP, CC_id, 1, subframeP, aggregation, rnti)) {
|
|
||||||
LOG_W(MAC, "[eNB %d] frame %d, subframe %d, UE %d/%x CC %d: not enough CCE\n",
|
|
||||||
module_idP,
|
|
||||||
frameP,
|
|
||||||
subframeP,
|
|
||||||
UE_id,
|
|
||||||
rnti,
|
|
||||||
CC_id);
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* UE is active and can be scheduled, setting up struct */
|
|
||||||
UE_template_ptr = &(UE_list->UE_template[CC_id][UE_id]);
|
UE_template_ptr = &(UE_list->UE_template[CC_id][UE_id]);
|
||||||
UE_sched_ctrl_ptr = &(UE_list->UE_sched_ctrl[UE_id]);
|
UE_sched_ctrl_ptr = &(UE_list->UE_sched_ctrl[UE_id]);
|
||||||
harq_pid = subframe2harqpid(&cc[CC_id], sched_frame, sched_subframeP);
|
harq_pid = subframe2harqpid(&cc[CC_id], sched_frame, sched_subframeP);
|
||||||
@@ -1474,7 +1446,6 @@ schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
* If there is information on bsr of DCCH, DTCH or if there is UL_SR,
|
* 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
|
* or if there is a packet to retransmit, or we want to schedule a periodic feedback
|
||||||
*/
|
*/
|
||||||
/* Shouldn't this test be done earlier?? */
|
|
||||||
if (UE_is_to_be_scheduled(module_idP, CC_id, UE_id) > 0 || round_index > 0) {
|
if (UE_is_to_be_scheduled(module_idP, CC_id, UE_id) > 0 || round_index > 0) {
|
||||||
LOG_D(MAC, "[eNB %d][PUSCH %d] Frame %d subframe %d Scheduling UE %d/%x in round %d(SR %d,UL_inactivity timer %d,UL_failure timer %d,cqi_req_timer %d)\n",
|
LOG_D(MAC, "[eNB %d][PUSCH %d] Frame %d subframe %d Scheduling UE %d/%x in round %d(SR %d,UL_inactivity timer %d,UL_failure timer %d,cqi_req_timer %d)\n",
|
||||||
module_idP,
|
module_idP,
|
||||||
@@ -1492,98 +1463,125 @@ schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
// reset the scheduling request
|
// reset the scheduling request
|
||||||
UE_template_ptr->ul_SR = 0;
|
UE_template_ptr->ul_SR = 0;
|
||||||
status = mac_eNB_get_rrc_status(module_idP, rnti);
|
status = mac_eNB_get_rrc_status(module_idP, rnti);
|
||||||
cqi_req = 0;
|
|
||||||
|
|
||||||
/* Handle the aperiodic CQI report */
|
|
||||||
/* These aperiodic reports behave as periodic ones... */
|
|
||||||
if (status >= RRC_CONNECTED && UE_sched_ctrl_ptr->cqi_req_timer > 30) {
|
|
||||||
if (UE_sched_ctrl_ptr->cqi_received == 0) {
|
|
||||||
if (nfapi_mode) {
|
|
||||||
cqi_req = 0;
|
|
||||||
} else {
|
|
||||||
cqi_req = 1;
|
|
||||||
|
|
||||||
/* TDD: to be safe, do not ask CQI in special Subframes:36.213/7.2.3 CQI definition */
|
|
||||||
if (cc[CC_id].tdd_Config) {
|
|
||||||
switch (cc[CC_id].tdd_Config->subframeAssignment) {
|
|
||||||
case 1:
|
|
||||||
if(subframeP == 1 || subframeP == 6) {
|
|
||||||
cqi_req=0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
if(subframeP == 1) {
|
|
||||||
cqi_req=0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
LOG_E(MAC," TDD config not supported\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(cqi_req == 1) {
|
|
||||||
UE_sched_ctrl_ptr->cqi_req_flag |= 1 << sched_subframeP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
UE_sched_ctrl_ptr->cqi_req_flag = 0;
|
|
||||||
UE_sched_ctrl_ptr->cqi_received = 0;
|
|
||||||
UE_sched_ctrl_ptr->cqi_req_timer = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Power control */
|
|
||||||
/*
|
|
||||||
* Compute the expected ULSCH RX power (for the stats)
|
|
||||||
* This is the normalized RX power and this should be constant (regardless of mcs)
|
|
||||||
* Is not in dBm, unit from nfapi, converting to dBm
|
|
||||||
* ToDo: Noise power hard coded to 30
|
|
||||||
*/
|
|
||||||
normalized_rx_power = ((5 * UE_sched_ctrl_ptr->pusch_snr[CC_id] - 640) / 10) + 30;
|
|
||||||
target_rx_power = (mac->puSch10xSnr / 10) + 30;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This assumes accumulated tpc
|
|
||||||
* Make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out
|
|
||||||
*/
|
|
||||||
framex10psubframe = (UE_template_ptr->pusch_tpc_tx_frame * 10) + UE_template_ptr->pusch_tpc_tx_subframe;
|
|
||||||
|
|
||||||
if (((framex10psubframe + 10) <= (frameP * 10 + subframeP)) || // normal case
|
|
||||||
((framex10psubframe > (frameP * 10 + subframeP)) && (((10240 - framex10psubframe + frameP * 10 + subframeP) >= 10)))) { //frame wrap-around
|
|
||||||
|
|
||||||
UE_template_ptr->pusch_tpc_tx_frame = frameP;
|
|
||||||
UE_template_ptr->pusch_tpc_tx_subframe = subframeP;
|
|
||||||
|
|
||||||
if (normalized_rx_power > (target_rx_power + 4)) {
|
|
||||||
tpc = 0; // -1
|
|
||||||
tpc_accumulated--;
|
|
||||||
} else if (normalized_rx_power < (target_rx_power - 4)) {
|
|
||||||
tpc = 2; // +1
|
|
||||||
tpc_accumulated++;
|
|
||||||
} else {
|
|
||||||
tpc = 1; // 0
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
tpc = 1; // 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tpc != 1) {
|
|
||||||
LOG_D(MAC, "[eNB %d] ULSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n",
|
|
||||||
module_idP,
|
|
||||||
frameP,
|
|
||||||
subframeP,
|
|
||||||
harq_pid,
|
|
||||||
tpc,
|
|
||||||
tpc_accumulated,
|
|
||||||
normalized_rx_power,
|
|
||||||
target_rx_power);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* New transmission */
|
/* New transmission */
|
||||||
if (round_index == 0) {
|
if (round_index == 0) {
|
||||||
|
/* Be sure that there are some free RBs */
|
||||||
|
if (first_rb_slice[CC_id] >= n_rb_ul_tab[CC_id] - 1) {
|
||||||
|
LOG_W(MAC, "[eNB %d] frame %d, subframe %d, UE %d/%x CC %d: dropping, not enough RBs\n",
|
||||||
|
module_idP,
|
||||||
|
frameP,
|
||||||
|
subframeP,
|
||||||
|
UE_id,
|
||||||
|
rnti,
|
||||||
|
CC_id);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Should format_flag be 2 in CCE_allocation_infeasible??? */
|
||||||
|
/* This test seems to be way too long, can we provide an optimization? */
|
||||||
|
if (CCE_allocation_infeasible(module_idP, CC_id, 1, subframeP, aggregation, rnti)) {
|
||||||
|
LOG_W(MAC, "[eNB %d] frame %d, subframe %d, UE %d/%x CC %d: not enough CCE\n",
|
||||||
|
module_idP,
|
||||||
|
frameP,
|
||||||
|
subframeP,
|
||||||
|
UE_id,
|
||||||
|
rnti,
|
||||||
|
CC_id);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle the aperiodic CQI report */
|
||||||
|
cqi_req = 0;
|
||||||
|
|
||||||
|
if (status >= RRC_CONNECTED && UE_sched_ctrl_ptr->cqi_req_timer > 30) {
|
||||||
|
if (UE_sched_ctrl_ptr->cqi_received == 0) {
|
||||||
|
if (nfapi_mode) {
|
||||||
|
cqi_req = 0;
|
||||||
|
} else {
|
||||||
|
cqi_req = 1;
|
||||||
|
|
||||||
|
/* TDD: to be safe, do not ask CQI in special Subframes:36.213/7.2.3 CQI definition */
|
||||||
|
if (cc[CC_id].tdd_Config) {
|
||||||
|
switch (cc[CC_id].tdd_Config->subframeAssignment) {
|
||||||
|
case 1:
|
||||||
|
if(subframeP == 1 || subframeP == 6) {
|
||||||
|
cqi_req=0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
if(subframeP == 1) {
|
||||||
|
cqi_req=0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
LOG_E(MAC," TDD config not supported\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cqi_req == 1) {
|
||||||
|
UE_sched_ctrl_ptr->cqi_req_flag |= 1 << sched_subframeP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
UE_sched_ctrl_ptr->cqi_req_flag = 0;
|
||||||
|
UE_sched_ctrl_ptr->cqi_received = 0;
|
||||||
|
UE_sched_ctrl_ptr->cqi_req_timer = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Power control */
|
||||||
|
/*
|
||||||
|
* Compute the expected ULSCH RX power (for the stats)
|
||||||
|
* This is the normalized RX power and this should be constant (regardless of mcs)
|
||||||
|
* Is not in dBm, unit from nfapi, converting to dBm
|
||||||
|
* ToDo: Noise power hard coded to 30
|
||||||
|
*/
|
||||||
|
normalized_rx_power = ((5 * UE_sched_ctrl_ptr->pusch_snr[CC_id] - 640) / 10) + 30;
|
||||||
|
target_rx_power = (mac->puSch10xSnr / 10) + 30;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This assumes accumulated tpc
|
||||||
|
* Make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out
|
||||||
|
*/
|
||||||
|
framex10psubframe = (UE_template_ptr->pusch_tpc_tx_frame * 10) + UE_template_ptr->pusch_tpc_tx_subframe;
|
||||||
|
|
||||||
|
if (((framex10psubframe + 10) <= (frameP * 10 + subframeP)) || // normal case
|
||||||
|
((framex10psubframe > (frameP * 10 + subframeP)) && (((10240 - framex10psubframe + frameP * 10 + subframeP) >= 10)))) { //frame wrap-around
|
||||||
|
|
||||||
|
UE_template_ptr->pusch_tpc_tx_frame = frameP;
|
||||||
|
UE_template_ptr->pusch_tpc_tx_subframe = subframeP;
|
||||||
|
|
||||||
|
if (normalized_rx_power > (target_rx_power + 4)) {
|
||||||
|
tpc = 0; // -1
|
||||||
|
tpc_accumulated--;
|
||||||
|
} else if (normalized_rx_power < (target_rx_power - 4)) {
|
||||||
|
tpc = 2; // +1
|
||||||
|
tpc_accumulated++;
|
||||||
|
} else {
|
||||||
|
tpc = 1; // 0
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tpc = 1; // 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tpc != 1) {
|
||||||
|
LOG_D(MAC, "[eNB %d] ULSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n",
|
||||||
|
module_idP,
|
||||||
|
frameP,
|
||||||
|
subframeP,
|
||||||
|
harq_pid,
|
||||||
|
tpc,
|
||||||
|
tpc_accumulated,
|
||||||
|
normalized_rx_power,
|
||||||
|
target_rx_power);
|
||||||
|
}
|
||||||
|
|
||||||
ndi = 1 - UE_template_ptr->oldNDI_UL[harq_pid]; // NDI: new data indicator
|
ndi = 1 - UE_template_ptr->oldNDI_UL[harq_pid]; // NDI: new data indicator
|
||||||
UE_template_ptr->oldNDI_UL[harq_pid] = ndi;
|
UE_template_ptr->oldNDI_UL[harq_pid] = ndi;
|
||||||
UE_list->eNB_UE_stats[CC_id][UE_id].normalized_rx_power = normalized_rx_power;
|
UE_list->eNB_UE_stats[CC_id][UE_id].normalized_rx_power = normalized_rx_power;
|
||||||
|
|||||||
Reference in New Issue
Block a user