diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c index 1844fb2b72c5d85f40140f70e4cf0f78604bb162..d270f7e8c95049a213b53e70c17d8e598a6b6ff2 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c @@ -339,6 +339,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, clear_nr_nfapi_information(RC.nrmac[module_idP], CC_id, frame_txP, slot_txP); } + memset(RC.nrmac[module_idP]->cce_list[0][0],0,sizeof(int)*MAX_NUM_CCE); // refresh UE list based on UEs dropped by PHY in previous subframe /* diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index 6ea7829d533d4a127444f205741892644faa3548..d3e7da5a871bbf041156854eb064342d01233956 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -69,15 +69,20 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, uint16_t rnti = 0x1234; + // int time_domain_assignment,k0; NR_ServingCellConfigCommon_t *scc=cc->ServingCellConfigCommon; int dlBWP_carrier_bandwidth = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,275); - // everything here is hard-coded to 30 kHz + + /* int scs = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing; + int slots_per_frame = 10*(1<<scs); + int FR = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] >= 257 ? nr_FR2 : nr_FR1; + */ for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { LOG_D(MAC, "Scheduling common search space DCI type 1 dlBWP BW.firstRB %d.%d\n", @@ -97,7 +102,7 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, dl_tti_pdsch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdsch_pdu)); - nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15; + // nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15; nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15; pdsch_pdu_rel15->pduBitmap = 0; @@ -132,9 +137,8 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, pdsch_pdu_rel15->VRBtoPRBMapping = 1; // non-interleaved, check if this is ok for initialBWP // choose shortest PDSCH int startSymbolAndLength=0; - int StartSymbolIndex,NrOfSymbols=14,k0=0; + int StartSymbolIndex=-1,NrOfSymbols=14; int StartSymbolIndex_tmp,NrOfSymbols_tmp; - int time_domain_assignment=0; for (int i=0; i<scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count; @@ -144,10 +148,11 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, if (NrOfSymbols_tmp < NrOfSymbols) { NrOfSymbols = NrOfSymbols_tmp; StartSymbolIndex = StartSymbolIndex_tmp; - k0 = *scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->k0; - time_domain_assignment = i; + // k0 = *scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->k0; + // time_domain_assignment = i; } } + AssertFatal(StartSymbolIndex>=0,"StartSymbolIndex is negative\n"); pdsch_pdu_rel15->StartSymbolIndex = StartSymbolIndex; pdsch_pdu_rel15->NrOfSymbols = NrOfSymbols; pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(NULL, @@ -241,6 +246,7 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, } int configure_fapi_dl_Tx(int Mod_idP, + int *CCEIndex, nfapi_nr_dl_tti_request_body_t *dl_req, nfapi_nr_pdu_t *TX_req) { @@ -255,15 +261,10 @@ int configure_fapi_dl_Tx(int Mod_idP, int bwp_id=1; - int UE_id = 0; NR_UE_list_t *UE_list = &RC.nrmac[Mod_idP]->UE_list; - AssertFatal(UE_list->active[UE_id] >=0,"Cannot find UE_id %d is not active\n",UE_id); - - - LOG_I(PHY,"UE_id %d\n",UE_id); @@ -364,20 +365,20 @@ int configure_fapi_dl_Tx(int Mod_idP, dci_pdu_rel15[0].tb_scaling, dci_pdu_rel15[0].ndi, dci_pdu_rel15[0].rv); - + + nr_configure_pdcch(pdcch_pdu_rel15, 1, // ue-specific scc, bwp); + + - pdcch_pdu_rel15->BWPSize = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,275); - pdcch_pdu_rel15->BWPStart = NRRIV2PRBOFFSET(bwp->bwp_Common->genericParameters.locationAndBandwidth,275); - pdcch_pdu_rel15->SubcarrierSpacing = bwp->bwp_Common->genericParameters.subcarrierSpacing; pdcch_pdu_rel15->numDlDci = 1; pdcch_pdu_rel15->AggregationLevel[0] = 4; pdcch_pdu_rel15->RNTI[0]=UE_list->rnti[0]; - pdcch_pdu_rel15->CceIndex[0] = 0; + pdcch_pdu_rel15->CceIndex[0] = CCEIndex[0]; pdcch_pdu_rel15->beta_PDCCH_1_0[0]=0; pdcch_pdu_rel15->powerControlOffsetSS[0]=1; @@ -469,7 +470,7 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP, //NR_ServingCellConfigCommon_t *scc=cc->ServingCellConfigCommon; nfapi_nr_dl_tti_request_body_t *dl_req; nfapi_nr_pdu_t *TX_req; - uint16_t rnti = 0x1234; + int TBS; int TBS_bytes; @@ -486,12 +487,12 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP, int UE_id = 0; unsigned char sdu_lcids[NB_RB_MAX]; int padding = 0, post_padding = 0; - UE_list_t *UE_list = &nr_mac->UE_list; - + NR_UE_list_t *UE_list = &nr_mac->UE_list; + uint16_t rnti = UE_list->rnti[UE_id]; DLSCH_PDU dlsch_pdu; //PDSCH_PDU *pdsch_pdu = (PDSCH_PDU*) malloc(sizeof(PDSCH_PDU)); - + int CCEIndex=-1; LOG_D(MAC, "Scheduling UE specific search space DCI type 1\n"); int CC_id=0; @@ -540,7 +541,16 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP, lcid, header_length_total, TBS); - + + CCEIndex = allocate_nr_CCEs(nr_mac, + 1, // bwp_id + 0, // coreset_id + 4, // aggregation, + 1, // search_space, 0 common, 1 ue-specific + UE_id, + 0); // m + if (CCEIndex == -1) return; + sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP, rnti, module_idP, frameP, ENB_FLAG_YES, MBMS_FLAG_NO, lcid, TBS, (char *)&dlsch_buffer[sdu_length_total] @@ -557,17 +567,10 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP, sdu_lcids[num_sdus] = lcid; sdu_length_total += sdu_lengths[num_sdus]; - UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[lcid]++; - UE_list->eNB_UE_stats[CC_id][UE_id].lcid_sdu[num_sdus] = lcid; - UE_list->eNB_UE_stats[CC_id][UE_id].sdu_length_tx[lcid] = sdu_lengths[num_sdus]; - UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[lcid] += sdu_lengths[num_sdus]; - header_length_last = 1 + 1 + (sdu_lengths[num_sdus] >= 128); header_length_total += header_length_last; num_sdus++; - - UE_list->UE_sched_ctrl[UE_id].uplane_inactivity_timer = 0; } } else { // no TBS left @@ -615,8 +618,13 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP, //UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0][offset + sdu_length_total + j] = 0; nr_mac->UE_list.DLSCH_pdu[0][0].payload[0][offset + sdu_length_total + j] = 0; } - + + AssertFatal(CCEIndex>0,"CCEIndex is negative\n"); + int CCEIndices[2]; + CCEIndices[0] = CCEIndex; + TBS_bytes = configure_fapi_dl_Tx(module_idP, + CCEIndices, dl_req, TX_req); @@ -641,7 +649,19 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP, //When the --NOS1 option is not enabled, DLSCH transmissions with random data //occur every time that the current function is called (dlsch phytest mode) else{ - TBS_bytes = configure_fapi_dl_Tx(module_idP,dl_req, TX_req); + CCEIndex = allocate_nr_CCEs(nr_mac, + 1, // bwp_id + 0, // coreset_id + 4, // aggregation, + 1, // search_space, 0 common, 1 ue-specific + UE_id, + 0); // m + if (CCEIndex == -1) return; + + int CCEIndices[2]; + CCEIndices[0] = CCEIndex; + + TBS_bytes = configure_fapi_dl_Tx(module_idP,CCEIndices,dl_req, TX_req); // HOT FIX for all zero pdu problem // ------------------------------------------------------------------------------------------------ diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index facece2aaec4a71dae4dbd8802b83782c24566d6..ecec1efbe26b8897f1a7bb63513aa977fa371156 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -64,6 +64,8 @@ #define ENABLE_MAC_PAYLOAD_DEBUG #define DEBUG_gNB_SCHEDULER 1 +#define CEILIDIV(a,b) ((a+b-1)/b) + #include "common/ran_context.h" extern RAN_CONTEXT_t RC; @@ -134,6 +136,67 @@ int is_nr_UL_slot(NR_COMMON_channels_t * ccP, int slot){ return (0); } +int allocate_nr_CCEs(gNB_MAC_INST *nr_mac, + int bwp_id, + int coreset_id, + int aggregation, + int search_space, // 0 common, 1 ue-specific + int UE_id, + int m + ) { + + NR_COMMON_channels_t *cc = nr_mac->common_channels; + NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; + NR_UE_list_t *UE_list = &nr_mac->UE_list; + + NR_BWP_Downlink_t *bwp; + NR_CellGroupConfig_t *secondaryCellGroup; + + NR_ControlResourceSet_t *coreset; + + if (search_space == 1) { + AssertFatal(UE_list->active[UE_id] >=0,"Cannot find UE_id %d is not active\n",UE_id); + bwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1]; + secondaryCellGroup = UE_list->secondaryCellGroup[UE_id]; + coreset = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[coreset_id]; + } + else { + AssertFatal(1==0,"Add code for common search space\n"); + } + + int *cce_list = nr_mac->cce_list[bwp_id][coreset_id]; + + + int n_rb=0; + for (int i=0;i<6;i++) + for (int j=0;j<8;j++) { + n_rb+=((coreset->frequencyDomainResources.buf[i]>>j)&1); + } + n_rb*=6; + + uint16_t N_reg = n_rb * coreset->duration; + uint16_t Y=0, N_cce, M_s_max, n_CI=0, tmp, C=0; + uint16_t n_RNTI = search_space == 1 ? UE_list->rnti[UE_id]:0; + uint32_t A[3]={39827,39829,39839}; + + N_cce = N_reg / NR_NB_REG_PER_CCE; + + M_s_max = (aggregation==4)?4:(aggregation==8)?2:1; + + if (search_space == 1) { + Y = (A[0]*n_RNTI)%65537; // Candidate 0, antenna port 0 + } + int first_cce = aggregation * (( Y + (m*N_cce)/(aggregation*M_s_max) + n_CI ) % CEILIDIV(N_cce,aggregation)); + + for (int i=0;i<aggregation;i++) + if (cce_list[first_cce+i] != 0) return(-1); + + for (int i=0;i<aggregation;i++) cce_list[first_cce+i] = 1; + + return(first_cce); + +} + void nr_configure_css_dci_initial(nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu, nr_scs_e scs_common, nr_scs_e pdcch_scs, diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h index 84c8e30c2385e131c14c8d8c985d460de2762c99..d7147b4fa9830d86477c2c37a34f768a5c8f0a3e 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h @@ -66,6 +66,7 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, sub_frame_t subframeP); int configure_fapi_dl_Tx(int Mod_id, + int *CCEIndeces, nfapi_nr_dl_tti_request_body_t *dl_req, nfapi_nr_pdu_t *TX_req); @@ -155,4 +156,13 @@ uint16_t nr_dci_size(nr_dci_format_t format, nr_rnti_type_t rnti_type, uint16_t N_RB); +int allocate_nr_CCEs(gNB_MAC_INST *nr_mac, + int bwp_id, + int coreset_id, + int aggregation, + int search_space, // 0 common, 1 ue-specific + int UE_id, + int m + ); + #endif /*__LAYER2_NR_MAC_PROTO_H__*/ diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index 10a98db7c0f7038d05dface832f9a5d5408780b8..224cc12a7b45f8f9e8c1fc2efc68882999bdb869 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -59,6 +59,9 @@ #include "PHY/TOOLS/time_meas.h" #include "targets/ARCH/COMMON/common_lib.h" +#define MAX_NUM_BWP 2 +#define MAX_NUM_CORESET 2 +#define MAX_NUM_CCE 90 /*! \brief gNB common channels */ typedef struct { @@ -173,6 +176,8 @@ typedef struct gNB_MAC_INST_s { time_stats_t rx_ulsch_sdu; // include rlc_data_ind /// processing time of eNB PCH scheduler time_stats_t schedule_pch; + /// CCE lists + int cce_list[MAX_NUM_BWP][MAX_NUM_CORESET][MAX_NUM_CCE]; } gNB_MAC_INST; typedef struct {