|
|
|
@@ -21,11 +21,11 @@
|
|
|
|
|
|
|
|
|
|
/* \file nr_ue_dci_configuration.c
|
|
|
|
|
* \brief functions for generating dci search procedures based on RRC Serving Cell Group Configuration
|
|
|
|
|
* \author R. Knopp
|
|
|
|
|
* \author R. Knopp, G. Casati
|
|
|
|
|
* \date 2020
|
|
|
|
|
* \version 0.1
|
|
|
|
|
* \company Eurecom
|
|
|
|
|
* \email: knopp@eurecom.fr
|
|
|
|
|
* \version 0.2
|
|
|
|
|
* \company Eurecom, Fraunhofer IIS
|
|
|
|
|
* \email: knopp@eurecom.fr, guido.casati@iis.fraunhofer.de
|
|
|
|
|
* \note
|
|
|
|
|
* \warning
|
|
|
|
|
*/
|
|
|
|
@@ -61,134 +61,212 @@ void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pd
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl_config, int slot) {
|
|
|
|
|
void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl_config, frame_t frame, int slot) {
|
|
|
|
|
|
|
|
|
|
// check if DL slot
|
|
|
|
|
if (slot == 1 || slot == 7) {
|
|
|
|
|
NR_ServingCellConfig_t *scd = mac->scd;
|
|
|
|
|
NR_BWP_Downlink_t *bwp;
|
|
|
|
|
NR_BWP_DownlinkCommon_t *bwp_Common;
|
|
|
|
|
NR_BWP_DownlinkDedicated_t *dl_bwp_Dedicated;
|
|
|
|
|
NR_SetupRelease_PDCCH_Config_t *pdcch_Config;
|
|
|
|
|
NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon;
|
|
|
|
|
struct NR_PDCCH_Config__controlResourceSetToAddModList *controlResourceSetToAddModList;
|
|
|
|
|
struct NR_PDCCH_Config__searchSpacesToAddModList *searchSpacesToAddModList;
|
|
|
|
|
struct NR_UplinkConfig__uplinkBWP_ToAddModList *uplinkBWP_ToAddModList;
|
|
|
|
|
NR_SearchSpace_t *NR_SearchSpace;
|
|
|
|
|
NR_ControlResourceSet_t *coreset;
|
|
|
|
|
|
|
|
|
|
// get BWP 1, Coreset 0, SearchSpace 0
|
|
|
|
|
if (mac->DLbwp[0]==NULL) {
|
|
|
|
|
AssertFatal(mac->scd->downlinkBWP_ToAddModList!=NULL,"downlinkBWP_ToAddModList is null\n");
|
|
|
|
|
AssertFatal(mac->scd->downlinkBWP_ToAddModList->list.count==1,"downlinkBWP_ToAddModList->list->count is %d\n",
|
|
|
|
|
mac->scd->downlinkBWP_ToAddModList->list.count);
|
|
|
|
|
mac->DLbwp[0] = mac->scd->downlinkBWP_ToAddModList->list.array[0];
|
|
|
|
|
AssertFatal(mac->DLbwp[0]->bwp_Dedicated!=NULL,"bwp_Dedicated is null\n");
|
|
|
|
|
AssertFatal(mac->DLbwp[0]->bwp_Dedicated->pdcch_Config!=NULL,"pdcch_Config is null\n");
|
|
|
|
|
AssertFatal(mac->DLbwp[0]->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList!=NULL,"controlResourceSetToAddModList is null\n");
|
|
|
|
|
AssertFatal(mac->DLbwp[0]->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.count==1,"controlResourceSetToAddModList->list.count=%d\n",
|
|
|
|
|
mac->DLbwp[0]->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.count);
|
|
|
|
|
mac->coreset[0][0] = mac->DLbwp[0]->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[0];
|
|
|
|
|
AssertFatal(mac->coreset[0][0]!=NULL,"coreset[0][0] is null\n");
|
|
|
|
|
|
|
|
|
|
AssertFatal(mac->DLbwp[0]->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList!=NULL,"searchPsacesToAddModList is null\n");
|
|
|
|
|
AssertFatal(mac->DLbwp[0]->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count>0,
|
|
|
|
|
"searchPsacesToAddModList is empty\n");
|
|
|
|
|
NR_SearchSpace_t *ss;
|
|
|
|
|
int ss_id=0;
|
|
|
|
|
AssertFatal(mac->DLbwp[0]->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count<FAPI_NR_MAX_SS_PER_CORESET,
|
|
|
|
|
"too many searchpaces per coreset %d\n",
|
|
|
|
|
mac->DLbwp[0]->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count);
|
|
|
|
|
for (int i=0;i<mac->DLbwp[0]->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count;i++) {
|
|
|
|
|
ss=mac->DLbwp[0]->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.array[i];
|
|
|
|
|
AssertFatal(ss->controlResourceSetId != NULL,"ss->controlResourceSetId is null\n");
|
|
|
|
|
AssertFatal(ss->searchSpaceType != NULL,"ss->searchSpaceType is null\n");
|
|
|
|
|
AssertFatal(*ss->controlResourceSetId == mac->coreset[0][0]->controlResourceSetId,"ss->controlResourceSetId is unknown\n");
|
|
|
|
|
mac->SSpace[0][0][ss_id] = ss;
|
|
|
|
|
ss_id++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (mac->ULbwp[0]==NULL) {
|
|
|
|
|
AssertFatal(mac->scd->uplinkConfig->uplinkBWP_ToAddModList!=NULL,"uplinkBWP_ToAddModList is null\n");
|
|
|
|
|
AssertFatal(mac->scd->uplinkConfig->uplinkBWP_ToAddModList->list.count==1,"uplinkBWP_ToAddModList->list->count is %d\n",
|
|
|
|
|
mac->scd->uplinkConfig->uplinkBWP_ToAddModList->list.count);
|
|
|
|
|
mac->ULbwp[0] = mac->scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0];
|
|
|
|
|
AssertFatal(mac->ULbwp[0]->bwp_Dedicated!=NULL,"bwp_Dedicated is null\n");
|
|
|
|
|
}
|
|
|
|
|
// check search spaces
|
|
|
|
|
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15;
|
|
|
|
|
|
|
|
|
|
int ss_id=0;
|
|
|
|
|
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15;
|
|
|
|
|
int sps =mac->DLbwp[0]->bwp_Common->genericParameters.cyclicPrefix == NULL ? 14 : 12;
|
|
|
|
|
uint8_t bwp_id = 1;
|
|
|
|
|
int ss_id, sps;
|
|
|
|
|
|
|
|
|
|
// get PDCCH configuration(s) (Coreset, SearchSpace, etc...) from BWP Dedicated in serving cell config dedicated (scd)
|
|
|
|
|
// get BWP 1, Coreset ID 0, SearchSpace ID 0 (i.e. configured in MIB and in ServingCellConfigCommon)
|
|
|
|
|
|
|
|
|
|
// Check dedicated DL BWP
|
|
|
|
|
if (mac->DLbwp[0] == NULL) {
|
|
|
|
|
NR_SearchSpace_t *ss;
|
|
|
|
|
int ss_id = 0;
|
|
|
|
|
|
|
|
|
|
AssertFatal(scd->downlinkBWP_ToAddModList != NULL, "downlinkBWP_ToAddModList is null\n");
|
|
|
|
|
AssertFatal(scd->downlinkBWP_ToAddModList->list.count == 1, "downlinkBWP_ToAddModList->list->count is %d\n", scd->downlinkBWP_ToAddModList->list.count);
|
|
|
|
|
mac->DLbwp[0] = scd->downlinkBWP_ToAddModList->list.array[bwp_id - 1];
|
|
|
|
|
|
|
|
|
|
dl_bwp_Dedicated = mac->DLbwp[0]->bwp_Dedicated;
|
|
|
|
|
AssertFatal(dl_bwp_Dedicated != NULL, "dl_bwp_Dedicated is null\n");
|
|
|
|
|
|
|
|
|
|
bwp_Common = mac->DLbwp[0]->bwp_Common;
|
|
|
|
|
AssertFatal(bwp_Common != NULL, "bwp_Common is null\n");
|
|
|
|
|
|
|
|
|
|
pdcch_Config = dl_bwp_Dedicated->pdcch_Config;
|
|
|
|
|
AssertFatal(pdcch_Config != NULL, "pdcch_Config is null\n");
|
|
|
|
|
|
|
|
|
|
pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon;
|
|
|
|
|
AssertFatal(pdcch_ConfigCommon != NULL, "pdcch_ConfigCommon is null\n");
|
|
|
|
|
AssertFatal(pdcch_ConfigCommon->choice.setup->ra_SearchSpace != NULL, "ra_SearchSpace must be available in DL BWP\n");
|
|
|
|
|
|
|
|
|
|
controlResourceSetToAddModList = pdcch_Config->choice.setup->controlResourceSetToAddModList;
|
|
|
|
|
AssertFatal(controlResourceSetToAddModList != NULL, "controlResourceSetToAddModList is null\n");
|
|
|
|
|
|
|
|
|
|
AssertFatal(controlResourceSetToAddModList->list.count == 1, "controlResourceSetToAddModList->list.count=%d\n", controlResourceSetToAddModList->list.count);
|
|
|
|
|
|
|
|
|
|
mac->coreset[0][0] = controlResourceSetToAddModList->list.array[0];
|
|
|
|
|
coreset = mac->coreset[0][0];
|
|
|
|
|
AssertFatal(coreset != NULL, "coreset[0][0] is null\n");
|
|
|
|
|
|
|
|
|
|
while(mac->SSpace[0][0][ss_id]!=NULL &&
|
|
|
|
|
ss_id < mac->DLbwp[0]->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count) {
|
|
|
|
|
|
|
|
|
|
AssertFatal(mac->SSpace[0][0][ss_id]->monitoringSymbolsWithinSlot!=NULL,"ss->monitoringSymbolsWithinSlot is null\n");
|
|
|
|
|
AssertFatal(mac->SSpace[0][0][ss_id]->monitoringSymbolsWithinSlot->buf!=NULL,"ss->monitoringSymbolsWithinSlot->buf is null\n");
|
|
|
|
|
|
|
|
|
|
searchSpacesToAddModList = pdcch_Config->choice.setup->searchSpacesToAddModList;
|
|
|
|
|
AssertFatal(searchSpacesToAddModList != NULL, "searchSpacesToAddModList is null\n");
|
|
|
|
|
AssertFatal(searchSpacesToAddModList->list.count > 0, "searchSpacesToAddModList is empty\n");
|
|
|
|
|
AssertFatal(searchSpacesToAddModList->list.count < FAPI_NR_MAX_SS_PER_CORESET, "too many searchpaces per coreset %d\n", searchSpacesToAddModList->list.count);
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < searchSpacesToAddModList->list.count; i++) {
|
|
|
|
|
ss = searchSpacesToAddModList->list.array[i];
|
|
|
|
|
AssertFatal(ss->controlResourceSetId != NULL, "ss->controlResourceSetId is null\n");
|
|
|
|
|
AssertFatal(ss->searchSpaceType != NULL, "ss->searchSpaceType is null\n");
|
|
|
|
|
AssertFatal(*ss->controlResourceSetId == coreset->controlResourceSetId, "ss->controlResourceSetId is unknown\n");
|
|
|
|
|
mac->SSpace[0][0][ss_id] = ss;
|
|
|
|
|
ss_id++;
|
|
|
|
|
}
|
|
|
|
|
if (mac->ra_state == WAIT_RAR) {
|
|
|
|
|
// check for RAR
|
|
|
|
|
rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
|
|
|
|
|
// rel15->rnti = 2;//get_RA_RNTI(mac,frame,slot); // WIP
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check dedicated UL BWP
|
|
|
|
|
if (mac->ULbwp[0] == NULL) {
|
|
|
|
|
uplinkBWP_ToAddModList = scd->uplinkConfig->uplinkBWP_ToAddModList;
|
|
|
|
|
AssertFatal(uplinkBWP_ToAddModList != NULL, "uplinkBWP_ToAddModList is null\n");
|
|
|
|
|
AssertFatal(uplinkBWP_ToAddModList->list.count == 1, "uplinkBWP_ToAddModList->list->count is %d\n", uplinkBWP_ToAddModList->list.count);
|
|
|
|
|
mac->ULbwp[0] = uplinkBWP_ToAddModList->list.array[bwp_id - 1];
|
|
|
|
|
AssertFatal(mac->ULbwp[0]->bwp_Dedicated != NULL, "UL bwp_Dedicated is null\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bwp = mac->DLbwp[0];
|
|
|
|
|
bwp_Common = bwp->bwp_Common;
|
|
|
|
|
pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon;
|
|
|
|
|
dl_bwp_Dedicated = bwp->bwp_Dedicated;
|
|
|
|
|
pdcch_Config = dl_bwp_Dedicated->pdcch_Config;
|
|
|
|
|
searchSpacesToAddModList = pdcch_Config->choice.setup->searchSpacesToAddModList;
|
|
|
|
|
|
|
|
|
|
// check USSs
|
|
|
|
|
ss_id = 0;
|
|
|
|
|
NR_SearchSpace = mac->SSpace[0][0][ss_id];
|
|
|
|
|
while(NR_SearchSpace != NULL && ss_id < searchSpacesToAddModList->list.count) {
|
|
|
|
|
AssertFatal(NR_SearchSpace->monitoringSymbolsWithinSlot != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot is null\n");
|
|
|
|
|
AssertFatal(NR_SearchSpace->monitoringSymbolsWithinSlot->buf != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot->buf is null\n");
|
|
|
|
|
ss_id++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mac->crnti > 0) {
|
|
|
|
|
|
|
|
|
|
NR_SearchSpace_t *css;
|
|
|
|
|
NR_SearchSpace_t *uss;
|
|
|
|
|
NR_ServingCellConfigCommon_t *scc;
|
|
|
|
|
NR_SearchSpaceId_t ra_SearchSpaceId;
|
|
|
|
|
rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
|
|
|
|
|
uint16_t monitoringSymbolsWithinSlot;
|
|
|
|
|
uint8_t add_dci = 1;
|
|
|
|
|
|
|
|
|
|
AssertFatal(mac->scc != NULL, "scc is null\n");
|
|
|
|
|
|
|
|
|
|
scc = mac->scc;
|
|
|
|
|
rel15->dci_format = NR_DL_DCI_FORMAT_1_0;
|
|
|
|
|
|
|
|
|
|
// CoReSet configuration
|
|
|
|
|
coreset = mac->coreset[0][0];
|
|
|
|
|
rel15->coreset.duration = coreset->duration;
|
|
|
|
|
for (int i = 0; i < 6; i++)
|
|
|
|
|
rel15->coreset.frequency_domain_resource[i] = coreset->frequencyDomainResources.buf[i];
|
|
|
|
|
|
|
|
|
|
rel15->coreset.CceRegMappingType = coreset->cce_REG_MappingType.present == NR_ControlResourceSet__cce_REG_MappingType_PR_interleaved ? FAPI_NR_CCE_REG_MAPPING_TYPE_INTERLEAVED : FAPI_NR_CCE_REG_MAPPING_TYPE_NON_INTERLEAVED;
|
|
|
|
|
|
|
|
|
|
if (rel15->coreset.CceRegMappingType == FAPI_NR_CCE_REG_MAPPING_TYPE_INTERLEAVED) {
|
|
|
|
|
struct NR_ControlResourceSet__cce_REG_MappingType__interleaved *interleaved = coreset->cce_REG_MappingType.choice.interleaved;
|
|
|
|
|
rel15->coreset.RegBundleSize = (interleaved->reg_BundleSize == NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6) ? 6 : (2 + interleaved->reg_BundleSize);
|
|
|
|
|
rel15->coreset.InterleaverSize = (interleaved->interleaverSize == NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n6) ? 6 : (2 + interleaved->interleaverSize);
|
|
|
|
|
AssertFatal(scc->physCellId != NULL, "mac->scc->physCellId is null\n");
|
|
|
|
|
rel15->coreset.ShiftIndex = interleaved->shiftIndex != NULL ? *interleaved->shiftIndex : *scc->physCellId;
|
|
|
|
|
} else {
|
|
|
|
|
rel15->coreset.RegBundleSize = 0;
|
|
|
|
|
rel15->coreset.InterleaverSize = 0;
|
|
|
|
|
rel15->coreset.ShiftIndex = 0;
|
|
|
|
|
}
|
|
|
|
|
else if (mac->ra_state == WAIT_CONTENTION_RESOLUTION) {
|
|
|
|
|
rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
|
|
|
|
|
rel15->rnti = mac->t_crnti;
|
|
|
|
|
//dl_config->number_pdus = dl_config->number_pdus + 1;
|
|
|
|
|
|
|
|
|
|
rel15->coreset.CoreSetType = 1;
|
|
|
|
|
rel15->coreset.precoder_granularity = coreset->precoderGranularity;
|
|
|
|
|
|
|
|
|
|
// Scrambling RNTI
|
|
|
|
|
if (coreset->pdcch_DMRS_ScramblingID) {
|
|
|
|
|
rel15->coreset.pdcch_dmrs_scrambling_id = *coreset->pdcch_DMRS_ScramblingID;
|
|
|
|
|
rel15->coreset.scrambling_rnti = mac->t_crnti;
|
|
|
|
|
} else {
|
|
|
|
|
rel15->coreset.pdcch_dmrs_scrambling_id = *scc->physCellId;
|
|
|
|
|
rel15->coreset.scrambling_rnti = 0;
|
|
|
|
|
}
|
|
|
|
|
if (mac->crnti>0) {
|
|
|
|
|
rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
|
|
|
|
|
rel15->dci_format = NR_DL_DCI_FORMAT_1_0;
|
|
|
|
|
|
|
|
|
|
if (slot == 0 || slot == 1){
|
|
|
|
|
rel15->BWPSize = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth,275);
|
|
|
|
|
rel15->dci_length = nr_dci_size(rel15->dci_format, NR_RNTI_C, rel15->BWPSize);
|
|
|
|
|
} else if (slot == 7){
|
|
|
|
|
rel15->BWPSize = NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, 275);
|
|
|
|
|
rel15->dci_length = nr_dci_size(rel15->dci_format, NR_RNTI_RA, rel15->BWPSize);
|
|
|
|
|
}
|
|
|
|
|
if (mac->ra_state == WAIT_RAR){
|
|
|
|
|
|
|
|
|
|
rel15->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth,275);
|
|
|
|
|
rel15->SubcarrierSpacing = mac->DLbwp[0]->bwp_Common->genericParameters.subcarrierSpacing;
|
|
|
|
|
// get UE-specific search space
|
|
|
|
|
for (ss_id=0;ss_id<FAPI_NR_MAX_SS_PER_CORESET && mac->SSpace[0][0][ss_id]!=NULL;ss_id++)
|
|
|
|
|
if (mac->SSpace[0][0][ss_id]->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_ue_Specific) break;
|
|
|
|
|
AssertFatal(ss_id<FAPI_NR_MAX_SS_PER_CORESET,"couldn't find a UE-specific SS\n");
|
|
|
|
|
// for SPS=14 8 MSBs in positions 13 downto 6,
|
|
|
|
|
uint16_t monitoringSymbolsWithinSlot = (mac->SSpace[0][0][ss_id]->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) |
|
|
|
|
|
(mac->SSpace[0][0][ss_id]->monitoringSymbolsWithinSlot->buf[1]>>(16-sps));
|
|
|
|
|
|
|
|
|
|
for (int i=0; i<sps; i++)
|
|
|
|
|
if ((monitoringSymbolsWithinSlot>>(sps-1-i))&1) {
|
|
|
|
|
rel15->coreset.StartSymbolIndex=i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
rel15->coreset.duration = mac->coreset[0][0]->duration;
|
|
|
|
|
for (int i=0;i<6;i++)
|
|
|
|
|
rel15->coreset.frequency_domain_resource[i] = mac->coreset[0][0]->frequencyDomainResources.buf[i];
|
|
|
|
|
|
|
|
|
|
rel15->coreset.CceRegMappingType = mac->coreset[0][0]->cce_REG_MappingType.present == NR_ControlResourceSet__cce_REG_MappingType_PR_interleaved?
|
|
|
|
|
FAPI_NR_CCE_REG_MAPPING_TYPE_INTERLEAVED : FAPI_NR_CCE_REG_MAPPING_TYPE_NON_INTERLEAVED;
|
|
|
|
|
if (rel15->coreset.CceRegMappingType == FAPI_NR_CCE_REG_MAPPING_TYPE_INTERLEAVED) {
|
|
|
|
|
rel15->coreset.RegBundleSize = (mac->coreset[0][0]->cce_REG_MappingType.choice.interleaved->reg_BundleSize == NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6) ? 6 : (2+mac->coreset[0][0]->cce_REG_MappingType.choice.interleaved->reg_BundleSize);
|
|
|
|
|
rel15->coreset.InterleaverSize = (mac->coreset[0][0]->cce_REG_MappingType.choice.interleaved->interleaverSize==NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n6) ? 6 : (2+mac->coreset[0][0]->cce_REG_MappingType.choice.interleaved->interleaverSize);
|
|
|
|
|
AssertFatal(mac->scc->physCellId != NULL,"mac->scc->physCellId is null\n");
|
|
|
|
|
rel15->coreset.ShiftIndex = mac->coreset[0][0]->cce_REG_MappingType.choice.interleaved->shiftIndex != NULL ? *mac->coreset[0][0]->cce_REG_MappingType.choice.interleaved->shiftIndex : *mac->scc->physCellId;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
rel15->coreset.RegBundleSize = 0;
|
|
|
|
|
rel15->coreset.InterleaverSize = 0;
|
|
|
|
|
rel15->coreset.ShiftIndex = 0;
|
|
|
|
|
}
|
|
|
|
|
rel15->coreset.CoreSetType = 1;
|
|
|
|
|
rel15->coreset.precoder_granularity = mac->coreset[0][0]->precoderGranularity;
|
|
|
|
|
NR_BWP_DownlinkCommon_t *initialDownlinkBWP = scc->downlinkConfigCommon->initialDownlinkBWP;
|
|
|
|
|
struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
|
|
|
|
|
AssertFatal(commonSearchSpaceList->list.count > 0, "PDCCH CSS list has 0 elements\n");
|
|
|
|
|
|
|
|
|
|
if (mac->coreset[0][0]->pdcch_DMRS_ScramblingID) {
|
|
|
|
|
rel15->coreset.pdcch_dmrs_scrambling_id = *mac->coreset[0][0]->pdcch_DMRS_ScramblingID;
|
|
|
|
|
rel15->coreset.scrambling_rnti = mac->t_crnti;
|
|
|
|
|
} else {
|
|
|
|
|
rel15->coreset.pdcch_dmrs_scrambling_id = *mac->scc->physCellId;
|
|
|
|
|
rel15->coreset.scrambling_rnti = 0;
|
|
|
|
|
}
|
|
|
|
|
ra_SearchSpaceId = *pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
|
|
|
|
|
|
|
|
|
|
if (get_softmodem_params()->do_ra && slot == 7)
|
|
|
|
|
// fetch the CSS for RA from the CSS list
|
|
|
|
|
for (int i = 0; i < commonSearchSpaceList->list.count; i++) {
|
|
|
|
|
css = commonSearchSpaceList->list.array[i];
|
|
|
|
|
if(css->searchSpaceId == ra_SearchSpaceId)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// check CSSs
|
|
|
|
|
if(css != NULL) {
|
|
|
|
|
AssertFatal(css->monitoringSymbolsWithinSlot != NULL, "css->monitoringSymbolsWithinSlot is null\n");
|
|
|
|
|
AssertFatal(css->monitoringSymbolsWithinSlot->buf != NULL, "css->monitoringSymbolsWithinSlot->buf is null\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (frame == mac->msg2_rx_frame && slot == mac->msg2_rx_slot){
|
|
|
|
|
sps = initialDownlinkBWP->genericParameters.cyclicPrefix == NULL ? 14 : 12;
|
|
|
|
|
monitoringSymbolsWithinSlot = (css->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) | (css->monitoringSymbolsWithinSlot->buf[1]>>(16-sps));
|
|
|
|
|
rel15->rnti = mac->ra_rnti;
|
|
|
|
|
else
|
|
|
|
|
rel15->rnti = mac->crnti;
|
|
|
|
|
rel15->BWPSize = NRRIV2BW(initialDownlinkBWP->genericParameters.locationAndBandwidth, 275);
|
|
|
|
|
rel15->BWPStart = NRRIV2PRBOFFSET(bwp_Common->genericParameters.locationAndBandwidth, 275); // NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, 275);
|
|
|
|
|
rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing;
|
|
|
|
|
rel15->dci_length = nr_dci_size(rel15->dci_format, NR_RNTI_RA, rel15->BWPSize);
|
|
|
|
|
for (int i = 0; i < sps; i++)
|
|
|
|
|
if ((monitoringSymbolsWithinSlot >> (sps - 1 - i)) & 1) {
|
|
|
|
|
rel15->coreset.StartSymbolIndex = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
fill_dci_search_candidates(css, rel15);
|
|
|
|
|
} else {
|
|
|
|
|
add_dci = 0;
|
|
|
|
|
}
|
|
|
|
|
} else if (mac->ra_state == WAIT_CONTENTION_RESOLUTION){
|
|
|
|
|
|
|
|
|
|
fill_dci_search_candidates(mac->SSpace[0][0][ss_id],rel15);
|
|
|
|
|
rel15->rnti = mac->t_crnti;
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
rel15->rnti = mac->crnti;
|
|
|
|
|
rel15->BWPSize = NRRIV2BW(bwp_Common->genericParameters.locationAndBandwidth, 275);
|
|
|
|
|
rel15->BWPStart = NRRIV2PRBOFFSET(bwp_Common->genericParameters.locationAndBandwidth, 275);
|
|
|
|
|
rel15->SubcarrierSpacing = bwp_Common->genericParameters.subcarrierSpacing;
|
|
|
|
|
rel15->dci_length = nr_dci_size(rel15->dci_format, NR_RNTI_C, rel15->BWPSize);
|
|
|
|
|
// get UE-specific search space
|
|
|
|
|
for (ss_id = 0; ss_id < FAPI_NR_MAX_SS_PER_CORESET && mac->SSpace[0][0][ss_id] != NULL; ss_id++){
|
|
|
|
|
uss = mac->SSpace[0][0][ss_id];
|
|
|
|
|
if (uss->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_ue_Specific) break;
|
|
|
|
|
}
|
|
|
|
|
AssertFatal(ss_id < FAPI_NR_MAX_SS_PER_CORESET, "couldn't find a UE-specific SS\n");
|
|
|
|
|
sps = bwp_Common->genericParameters.cyclicPrefix == NULL ? 14 : 12;
|
|
|
|
|
// for SPS=14 8 MSBs in positions 13 down to 6
|
|
|
|
|
monitoringSymbolsWithinSlot = (uss->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) | (uss->monitoringSymbolsWithinSlot->buf[1]>>(16-sps));
|
|
|
|
|
for (int i = 0; i < sps; i++)
|
|
|
|
|
if ((monitoringSymbolsWithinSlot >> (sps - 1 - i)) & 1) {
|
|
|
|
|
rel15->coreset.StartSymbolIndex = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
fill_dci_search_candidates(uss, rel15);
|
|
|
|
|
}
|
|
|
|
|
if (add_dci){
|
|
|
|
|
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DCI;
|
|
|
|
|
dl_config->number_pdus = dl_config->number_pdus + 1;
|
|
|
|
|
}
|
|
|
|
|