Commit d9602208 authored by ChiehChun's avatar ChiehChun

Create function for find CCE and retransmission

parent 49e92e83
...@@ -363,31 +363,11 @@ void nr_store_dlsch_buffer(module_id_t module_id, ...@@ -363,31 +363,11 @@ void nr_store_dlsch_buffer(module_id_t module_id,
} }
} }
void pf_dl(module_id_t module_id, bool find_free_CCE(module_id_t module_id,
frame_t frame,
sub_frame_t slot, sub_frame_t slot,
NR_UE_info_t *UE_info, NR_UE_info_t *UE_info,
int n_rb_sched, int UE_id){
uint8_t *rballoc_mask,
int max_num_ue) {
const int UE_id = 0;
/* Loop UE_info->list to check retransmission */
for (int UE_id = UE_info->list.head; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) {
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
// for now HARQ PID is fixed and should be the same as in post-processor
const int current_harq_pid = slot % 8;
NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid];
const rnti_t rnti = UE_info->rnti[UE_id];
/* Calculate Throughput */
/* retransmission */
if (harq->round != 0) {
/* Find a free CCE */
const int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific; const int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
sched_ctrl->search_space = get_searchspace(sched_ctrl->active_bwp, target_ss); sched_ctrl->search_space = get_searchspace(sched_ctrl->active_bwp, target_ss);
uint8_t nr_of_candidates; uint8_t nr_of_candidates;
...@@ -407,36 +387,28 @@ void pf_dl(module_id_t module_id, ...@@ -407,36 +387,28 @@ void pf_dl(module_id_t module_id,
nr_of_candidates); nr_of_candidates);
if (sched_ctrl->cce_index < 0) { if (sched_ctrl->cce_index < 0) {
LOG_E(MAC, "%s(): could not find CCE for UE %d\n", __func__, UE_id); LOG_E(MAC, "%s(): could not find CCE for UE %d\n", __func__, UE_id);
return; return false;
} }
UE_info->num_pdcch_cand[UE_id][cid]++; UE_info->num_pdcch_cand[UE_id][cid]++;
return true;
}
/* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH bool allocate_retransmission(module_id_t module_id,
* allocation after CCE alloc fail would be more complex) */ uint8_t *rballoc_mask,
const bool alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot); int *n_rb_sched,
if (!alloc) { NR_UE_info_t *UE_info,
LOG_W(MAC, int UE_id,
"%s(): could not find PUCCH for UE %d/%04x@%d.%d\n", int current_harq_pid){
__func__, NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
UE_id, const uint16_t rnti = UE_info->rnti[UE_id];
rnti,
frame,
slot);
UE_info->num_pdcch_cand[UE_id][cid]--;
int *cce_list = RC.nrmac[module_id]->cce_list[sched_ctrl->active_bwp->bwp_Id][cid];
for (int i = 0; i < sched_ctrl->aggregation_level; i++)
cce_list[sched_ctrl->cce_index + i] = 0;
return;
}
/* Allocate retransmission */
NR_UE_ret_info_t *retInfo = &sched_ctrl->retInfo[current_harq_pid]; NR_UE_ret_info_t *retInfo = &sched_ctrl->retInfo[current_harq_pid];
const uint16_t bwpSize = NRRIV2BW(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, 275);
int rbStart = NRRIV2PRBOFFSET(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, 275);
sched_ctrl->time_domain_allocation = retInfo->time_domain_allocation; sched_ctrl->time_domain_allocation = retInfo->time_domain_allocation;
/* ensure that there is a free place for RB allocation */ /* ensure that there is a free place for RB allocation */
int rbSize = 0; int rbSize = 0;
const uint16_t bwpSize = NRRIV2BW(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, 275);
int rbStart = NRRIV2PRBOFFSET(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, 275);
while (rbSize < retInfo->rbSize) { while (rbSize < retInfo->rbSize) {
rbStart += rbSize; /* last iteration rbSize was not enough, skip it */ rbStart += rbSize; /* last iteration rbSize was not enough, skip it */
rbSize = 0; rbSize = 0;
...@@ -446,7 +418,7 @@ void pf_dl(module_id_t module_id, ...@@ -446,7 +418,7 @@ void pf_dl(module_id_t module_id,
"cannot allocate retransmission for UE %d/RNTI %04x: no resources\n", "cannot allocate retransmission for UE %d/RNTI %04x: no resources\n",
UE_id, UE_id,
rnti); rnti);
return; return false;
} }
while (rbStart + rbSize < bwpSize while (rbStart + rbSize < bwpSize
&& rballoc_mask[rbStart + rbSize] && rballoc_mask[rbStart + rbSize]
...@@ -460,6 +432,65 @@ void pf_dl(module_id_t module_id, ...@@ -460,6 +432,65 @@ void pf_dl(module_id_t module_id,
sched_ctrl->mcsTableIdx = retInfo->mcsTableIdx; sched_ctrl->mcsTableIdx = retInfo->mcsTableIdx;
sched_ctrl->mcs = retInfo->mcs; sched_ctrl->mcs = retInfo->mcs;
sched_ctrl->numDmrsCdmGrpsNoData = retInfo->numDmrsCdmGrpsNoData; sched_ctrl->numDmrsCdmGrpsNoData = retInfo->numDmrsCdmGrpsNoData;
/* retransmissions: directly allocate */
*n_rb_sched -= sched_ctrl->rbSize;
for (int rb = 0; rb < sched_ctrl->rbSize; rb++)
rballoc_mask[rb+sched_ctrl->rbStart] = 0;
return true;
}
void pf_dl(module_id_t module_id,
frame_t frame,
sub_frame_t slot,
NR_UE_info_t *UE_info,
int n_rb_sched,
uint8_t *rballoc_mask,
int max_num_ue) {
const int UE_id = 0;
/* Loop UE_info->list to check retransmission */
for (int UE_id = UE_info->list.head; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) {
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
// for now HARQ PID is fixed and should be the same as in post-processor
const int current_harq_pid = slot % 8;
NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid];
const rnti_t rnti = UE_info->rnti[UE_id];
/* Calculate Throughput */
/* retransmission */
if (harq->round != 0) {
/* Find a free CCE */
bool freeCCEE = find_free_CCE(module_id, slot, UE_info, UE_id);
if (!freeCCEE)
continue;
/* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH
* allocation after CCE alloc fail would be more complex) */
const bool alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot);
if (!alloc) {
LOG_W(MAC,
"%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
__func__,
UE_id,
rnti,
frame,
slot);
int cid = sched_ctrl->coreset->controlResourceSetId;
UE_info->num_pdcch_cand[UE_id][cid]--;
int *cce_list = RC.nrmac[module_id]->cce_list[sched_ctrl->active_bwp->bwp_Id][cid];
for (int i = 0; i < sched_ctrl->aggregation_level; i++)
cce_list[sched_ctrl->cce_index + i] = 0;
return;
}
/* Allocate retransmission */
bool r = allocate_retransmission(module_id, rballoc_mask, &n_rb_sched, UE_info, UE_id, current_harq_pid);
if (!r) {
LOG_E(MAC, "%4d.%2d retransmission can NOT be allocated\n", frame, slot);
return;
}
} else { } else {
/* Check DL buffer */ /* Check DL buffer */
...@@ -485,29 +516,9 @@ void pf_dl(module_id_t module_id, ...@@ -485,29 +516,9 @@ void pf_dl(module_id_t module_id,
/* Find max coeff from UE_sched*/ /* Find max coeff from UE_sched*/
/* Find a free CCE */ /* Find a free CCE */
const int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific; bool freeCCEE = find_free_CCE(module_id, slot, UE_info, UE_id);
sched_ctrl->search_space = get_searchspace(sched_ctrl->active_bwp, target_ss); if (!freeCCEE)
uint8_t nr_of_candidates;
find_aggregation_candidates(&sched_ctrl->aggregation_level,
&nr_of_candidates,
sched_ctrl->search_space);
sched_ctrl->coreset = get_coreset(sched_ctrl->active_bwp, sched_ctrl->search_space, 1 /* dedicated */);
int cid = sched_ctrl->coreset->controlResourceSetId;
const uint16_t Y = UE_info->Y[UE_id][cid][slot];
const int m = UE_info->num_pdcch_cand[UE_id][cid];
sched_ctrl->cce_index = allocate_nr_CCEs(RC.nrmac[module_id],
sched_ctrl->active_bwp,
sched_ctrl->coreset,
sched_ctrl->aggregation_level,
Y,
m,
nr_of_candidates);
if (sched_ctrl->cce_index < 0) {
LOG_E(MAC, "%s(): could not find CCE for UE %d\n", __func__, UE_id);
return; return;
}
UE_info->num_pdcch_cand[UE_id][cid]++;
/* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH /* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH
* allocation after CCE alloc fail would be more complex) */ * allocation after CCE alloc fail would be more complex) */
const bool alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot); const bool alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot);
...@@ -519,6 +530,7 @@ void pf_dl(module_id_t module_id, ...@@ -519,6 +530,7 @@ void pf_dl(module_id_t module_id,
rnti, rnti,
frame, frame,
slot); slot);
int cid = sched_ctrl->coreset->controlResourceSetId;
UE_info->num_pdcch_cand[UE_id][cid]--; UE_info->num_pdcch_cand[UE_id][cid]--;
int *cce_list = RC.nrmac[module_id]->cce_list[sched_ctrl->active_bwp->bwp_Id][cid]; int *cce_list = RC.nrmac[module_id]->cce_list[sched_ctrl->active_bwp->bwp_Id][cid];
for (int i = 0; i < sched_ctrl->aggregation_level; i++) for (int i = 0; i < sched_ctrl->aggregation_level; i++)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment