Commit d7d21efc authored by Robert Schmidt's avatar Robert Schmidt

Post-processor: enable multi-UE handling

parent 059f585e
...@@ -548,193 +548,193 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -548,193 +548,193 @@ void nr_schedule_ue_spec(module_id_t module_id,
frame_t frame, frame_t frame,
sub_frame_t slot, sub_frame_t slot,
int num_slots_per_tdd) { int num_slots_per_tdd) {
gNB_MAC_INST *gNB_mac = RC.nrmac[module_id];
NR_UE_info_t *UE_info = &gNB_mac->UE_info;
if (UE_info->num_UEs == 0)
return;
/* PREPROCESSOR */ /* PREPROCESSOR */
nr_simple_dlsch_preprocessor(module_id, frame, slot, num_slots_per_tdd); nr_simple_dlsch_preprocessor(module_id, frame, slot, num_slots_per_tdd);
gNB_MAC_INST *gNB_mac = RC.nrmac[module_id];
NR_UE_info_t *UE_info = &gNB_mac->UE_info;
const int ta_len = gNB_mac->ta_len; const int ta_len = gNB_mac->ta_len;
const int UE_id = 0;
const int CC_id = 0; const int CC_id = 0;
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; NR_UE_list_t *UE_list = &UE_info->list;
if (sched_ctrl->rbSize < 0 && !get_softmodem_params()->phy_test) for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
return; NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
if (sched_ctrl->rbSize <= 0 && !get_softmodem_params()->phy_test)
/* POST processing */ continue;
struct NR_PDSCH_TimeDomainResourceAllocationList *tdaList =
sched_ctrl->active_bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList; /* POST processing */
AssertFatal(sched_ctrl->time_domain_allocation < tdaList->list.count, struct NR_PDSCH_TimeDomainResourceAllocationList *tdaList =
"time_domain_allocation %d>=%d\n", sched_ctrl->active_bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
sched_ctrl->time_domain_allocation, AssertFatal(sched_ctrl->time_domain_allocation < tdaList->list.count,
tdaList->list.count); "time_domain_allocation %d>=%d\n",
sched_ctrl->time_domain_allocation,
const int startSymbolAndLength = tdaList->list.count);
tdaList->list.array[sched_ctrl->time_domain_allocation]->startSymbolAndLength;
int startSymbolIndex, nrOfSymbols; const int startSymbolAndLength =
SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); tdaList->list.array[sched_ctrl->time_domain_allocation]->startSymbolAndLength;
int startSymbolIndex, nrOfSymbols;
uint8_t N_PRB_DMRS = SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols);
getN_PRB_DMRS(sched_ctrl->active_bwp, sched_ctrl->numDmrsCdmGrpsNoData);
const uint32_t TBS = uint8_t N_PRB_DMRS =
nr_compute_tbs(nr_get_Qm_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx), getN_PRB_DMRS(sched_ctrl->active_bwp, sched_ctrl->numDmrsCdmGrpsNoData);
nr_get_code_rate_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx), const uint32_t TBS =
sched_ctrl->rbSize, nr_compute_tbs(nr_get_Qm_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx),
nrOfSymbols, nr_get_code_rate_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx),
N_PRB_DMRS, // FIXME // This should be multiplied by the sched_ctrl->rbSize,
// number of dmrs symbols nrOfSymbols,
0 /* N_PRB_oh, 0 for initialBWP */, N_PRB_DMRS, // FIXME // This should be multiplied by the
0 /* tb_scaling */, // number of dmrs symbols
1 /* nrOfLayers */) 0 /* N_PRB_oh, 0 for initialBWP */,
>> 3; 0 /* tb_scaling */,
1 /* nrOfLayers */)
/* Get RLC data TODO: remove random data retrieval */ >> 3;
int header_length_total = 0;
int header_length_last = 0; /* Get RLC data TODO: remove random data retrieval */
int sdu_length_total = 0; int header_length_total = 0;
int num_sdus = 0; int header_length_last = 0;
uint16_t sdu_lengths[NB_RB_MAX] = {0}; int sdu_length_total = 0;
uint8_t mac_sdus[MAX_NR_DLSCH_PAYLOAD_BYTES]; int num_sdus = 0;
unsigned char sdu_lcids[NB_RB_MAX] = {0}; uint16_t sdu_lengths[NB_RB_MAX] = {0};
const rnti_t rnti = UE_info->rnti[UE_id]; uint8_t mac_sdus[MAX_NR_DLSCH_PAYLOAD_BYTES];
const int lcid = DL_SCH_LCID_DTCH; unsigned char sdu_lcids[NB_RB_MAX] = {0};
if (sched_ctrl->num_total_bytes > 0) { const rnti_t rnti = UE_info->rnti[UE_id];
LOG_D(MAC, const int lcid = DL_SCH_LCID_DTCH;
"[gNB %d][USER-PLANE DEFAULT DRB] Frame %d : DTCH->DLSCH, Requesting " if (sched_ctrl->num_total_bytes > 0) {
"%d bytes from RLC (lcid %d total hdr len %d), TBS: %d \n \n", LOG_D(MAC,
"[gNB %d][USER-PLANE DEFAULT DRB] Frame %d : DTCH->DLSCH, Requesting "
"%d bytes from RLC (lcid %d total hdr len %d), TBS: %d \n \n",
module_id,
frame,
TBS - ta_len - header_length_total - sdu_length_total - 3,
lcid,
header_length_total,
TBS);
sdu_lengths[num_sdus] = mac_rlc_data_req(module_id,
rnti,
module_id, module_id,
frame, frame,
TBS - ta_len - header_length_total - sdu_length_total - 3, ENB_FLAG_YES,
MBMS_FLAG_NO,
lcid, lcid,
header_length_total, TBS - ta_len - header_length_total - sdu_length_total - 3,
TBS); (char *)&mac_sdus[sdu_length_total],
0,
0);
sdu_lengths[num_sdus] = mac_rlc_data_req(module_id, LOG_D(MAC,
rnti, "[gNB %d][USER-PLANE DEFAULT DRB] Got %d bytes for DTCH %d \n",
module_id, module_id,
frame, sdu_lengths[num_sdus],
ENB_FLAG_YES, lcid);
MBMS_FLAG_NO,
lcid,
TBS - ta_len - header_length_total - sdu_length_total - 3,
(char *)&mac_sdus[sdu_length_total],
0,
0);
LOG_D(MAC, sdu_lcids[num_sdus] = lcid;
"[gNB %d][USER-PLANE DEFAULT DRB] Got %d bytes for DTCH %d \n", sdu_length_total += sdu_lengths[num_sdus];
module_id, header_length_last = 1 + 1 + (sdu_lengths[num_sdus] >= 128);
sdu_lengths[num_sdus], header_length_total += header_length_last;
lcid);
sdu_lcids[num_sdus] = lcid; num_sdus++;
sdu_length_total += sdu_lengths[num_sdus];
header_length_last = 1 + 1 + (sdu_lengths[num_sdus] >= 128);
header_length_total += header_length_last;
num_sdus++; //ue_sched_ctl->uplane_inactivity_timer = 0;
}
else if (get_softmodem_params()->phy_test) {
LOG_D(MAC, "Configuring DL_TX in %d.%d: random data\n", frame, slot);
// fill dlsch_buffer with random data
for (int i = 0; i < TBS; i++)
mac_sdus[i] = (unsigned char) (lrand48()&0xff);
sdu_lcids[0] = 0x3f; // DRB
sdu_lengths[0] = TBS - ta_len - 3;
header_length_total += 2 + (sdu_lengths[0] >= 128);
sdu_length_total += sdu_lengths[0];
num_sdus +=1;
}
//ue_sched_ctl->uplane_inactivity_timer = 0; // there is at least one SDU or TA command
} // if (num_sdus > 0 ){
else if (get_softmodem_params()->phy_test) { if (ta_len + sdu_length_total + header_length_total == 0) {
LOG_D(MAC, "Configuring DL_TX in %d.%d: random data\n", frame, slot); // There is no data from RLC or MAC header, so don't schedule
// fill dlsch_buffer with random data return;
for (int i = 0; i < TBS; i++) }
mac_sdus[i] = (unsigned char) (lrand48()&0xff);
sdu_lcids[0] = 0x3f; // DRB
sdu_lengths[0] = TBS - ta_len - 3;
header_length_total += 2 + (sdu_lengths[0] >= 128);
sdu_length_total += sdu_lengths[0];
num_sdus +=1;
}
// there is at least one SDU or TA command // Check if there is data from RLC or CE
// if (num_sdus > 0 ){ const int post_padding = TBS >= 2 + header_length_total + sdu_length_total + ta_len;
if (ta_len + sdu_length_total + header_length_total == 0) { // padding param currently not in use
// There is no data from RLC or MAC header, so don't schedule //padding = TBS - header_length_total - sdu_length_total - ta_len - 1;
return;
}
// Check if there is data from RLC or CE const int offset = nr_generate_dlsch_pdu(
const int post_padding = TBS >= 2 + header_length_total + sdu_length_total + ta_len; module_id,
// padding param currently not in use (unsigned char *)mac_sdus,
//padding = TBS - header_length_total - sdu_length_total - ta_len - 1; (unsigned char *)gNB_mac->UE_info.DLSCH_pdu[0][0].payload[0],
num_sdus, // num_sdus
const int offset = nr_generate_dlsch_pdu( sdu_lengths,
module_id, sdu_lcids,
(unsigned char *)mac_sdus, 255, // no drx
(unsigned char *)gNB_mac->UE_info.DLSCH_pdu[0][0].payload[0], NULL, // contention res id
num_sdus, // num_sdus post_padding);
sdu_lengths,
sdu_lcids, // Padding: fill remainder of DLSCH with 0
255, // no drx if (post_padding > 0) {
NULL, // contention res id for (int j = 0; j < TBS - offset; j++)
post_padding); gNB_mac->UE_info.DLSCH_pdu[0][0].payload[0][offset + j] = 0;
}
// Padding: fill remainder of DLSCH with 0
if (post_padding > 0) {
for (int j = 0; j < TBS - offset; j++)
gNB_mac->UE_info.DLSCH_pdu[0][0].payload[0][offset + j] = 0;
}
const int current_harq_pid = sched_ctrl->current_harq_pid; const int current_harq_pid = sched_ctrl->current_harq_pid;
NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid]; NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid];
NR_sched_pucch *pucch = &sched_ctrl->sched_pucch[sched_ctrl->pucch_sched_idx]; NR_sched_pucch *pucch = &sched_ctrl->sched_pucch[sched_ctrl->pucch_sched_idx];
harq->feedback_slot = pucch->ul_slot; harq->feedback_slot = pucch->ul_slot;
harq->is_waiting = 1; harq->is_waiting = 1;
UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++; UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++;
if (harq->round == 0) if (harq->round == 0)
UE_info->mac_stats[UE_id].dlsch_total_bytes += TBS; UE_info->mac_stats[UE_id].dlsch_total_bytes += TBS;
nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body; nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body;
nr_fill_nfapi_dl_pdu(module_id, nr_fill_nfapi_dl_pdu(module_id,
UE_id, UE_id,
sched_ctrl->active_bwp->bwp_Id, sched_ctrl->active_bwp->bwp_Id,
sched_ctrl->search_space, sched_ctrl->search_space,
sched_ctrl->coreset, sched_ctrl->coreset,
dl_req, dl_req,
pucch, pucch,
1 /* nrOfLayers */, 1 /* nrOfLayers */,
sched_ctrl->mcs, sched_ctrl->mcs,
sched_ctrl->rbSize, sched_ctrl->rbSize,
sched_ctrl->rbStart, sched_ctrl->rbStart,
sched_ctrl->numDmrsCdmGrpsNoData, sched_ctrl->numDmrsCdmGrpsNoData,
getDmrsConfigType(sched_ctrl->active_bwp), getDmrsConfigType(sched_ctrl->active_bwp),
sched_ctrl->mcsTableIdx, sched_ctrl->mcsTableIdx,
nr_get_code_rate_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx), nr_get_code_rate_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx),
nr_get_Qm_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx), nr_get_Qm_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx),
TBS, TBS,
sched_ctrl->time_domain_allocation, sched_ctrl->time_domain_allocation,
startSymbolIndex, startSymbolIndex,
nrOfSymbols, nrOfSymbols,
sched_ctrl->aggregation_level, sched_ctrl->aggregation_level,
sched_ctrl->cce_index, sched_ctrl->cce_index,
current_harq_pid, current_harq_pid,
harq->ndi, harq->ndi,
harq->round); harq->round);
nfapi_nr_pdu_t *tx_req = &gNB_mac->TX_req[CC_id].pdu_list[gNB_mac->TX_req[CC_id].Number_of_PDUs]; nfapi_nr_pdu_t *tx_req = &gNB_mac->TX_req[CC_id].pdu_list[gNB_mac->TX_req[CC_id].Number_of_PDUs];
configure_fapi_dl_Tx(module_id, configure_fapi_dl_Tx(module_id,
frame, frame,
slot, slot,
dl_req, dl_req,
tx_req, tx_req,
TBS, TBS,
gNB_mac->pdu_index[CC_id]); gNB_mac->pdu_index[CC_id]);
#if defined(ENABLE_MAC_PAYLOAD_DEBUG) #if defined(ENABLE_MAC_PAYLOAD_DEBUG)
if (frame%100 == 0){ if (frame%100 == 0){
LOG_I(MAC, LOG_I(MAC,
"%d.%d, first 10 payload bytes, TBS size: %d \n", "%d.%d, first 10 payload bytes, TBS size: %d \n",
frame, frame,
slot, slot,
TBS); TBS);
for(int i = 0; i < 10; i++) { for(int i = 0; i < 10; i++) {
LOG_I(MAC, "byte %d : %x\n", i,((uint8_t *)gNB_mac->UE_info.DLSCH_pdu[0][0].payload[0])[i]); LOG_I(MAC, "byte %d : %x\n", i,((uint8_t *)gNB_mac->UE_info.DLSCH_pdu[0][0].payload[0])[i]);
}
} }
}
#endif #endif
}
} }
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