configure only 1 BWP at a given time (1st active BWP)

This commit is contained in:
francescomani
2025-09-04 18:43:12 +02:00
parent db93bc022f
commit 22cd4e9312
+226 -263
View File
@@ -1665,15 +1665,15 @@ static NR_SetupRelease_PDSCH_Config_t *config_pdsch(uint64_t ssb_bitmap, int bwp
return setup_pdsch_Config; return setup_pdsch_Config;
} }
static void config_downlinkBWP(NR_BWP_Downlink_t *bwp, static NR_BWP_Downlink_t *config_downlinkBWP(const NR_ServingCellConfigCommon_t *scc,
const NR_ServingCellConfigCommon_t *scc, const NR_UE_NR_Capability_t *uecap,
const NR_UE_NR_Capability_t *uecap, int dl_antenna_ports,
int dl_antenna_ports, bool force_256qam_off,
bool force_256qam_off, int bwp_loop,
int bwp_loop, bool is_SA,
bool is_SA, const nr_mac_config_t *configuration)
const nr_mac_config_t *configuration)
{ {
NR_BWP_Downlink_t *bwp = calloc_or_fail(1, sizeof(*bwp));
bwp->bwp_Common = calloc(1,sizeof(*bwp->bwp_Common)); bwp->bwp_Common = calloc(1,sizeof(*bwp->bwp_Common));
if(configuration->num_additional_bwps > 0) { if(configuration->num_additional_bwps > 0) {
const nr_bwp_config_t *bwp_config = &configuration->bwp_config[bwp_loop]; const nr_bwp_config_t *bwp_config = &configuration->bwp_config[bwp_loop];
@@ -1772,17 +1772,18 @@ static void config_downlinkBWP(NR_BWP_Downlink_t *bwp,
force_256qam_off ? NULL : uecap, force_256qam_off ? NULL : uecap,
bwp->bwp_Dedicated, bwp->bwp_Dedicated,
scc); scc);
return bwp;
} }
static void config_uplinkBWP(NR_BWP_Uplink_t *ubwp, static NR_BWP_Uplink_t *config_uplinkBWP(long bwp_loop,
long bwp_loop, bool is_SA,
bool is_SA, int uid,
int uid, int maxMIMO_Layers,
int maxMIMO_Layers, const nr_mac_config_t *configuration,
const nr_mac_config_t *configuration, const NR_ServingCellConfigCommon_t *scc,
const NR_ServingCellConfigCommon_t *scc, const NR_UE_NR_Capability_t *uecap)
const NR_UE_NR_Capability_t *uecap)
{ {
NR_BWP_Uplink_t *ubwp = calloc_or_fail(1, sizeof(*ubwp));
ubwp->bwp_Common = calloc(1, sizeof(*ubwp->bwp_Common)); ubwp->bwp_Common = calloc(1, sizeof(*ubwp->bwp_Common));
if(configuration->num_additional_bwps > 0) { if(configuration->num_additional_bwps > 0) {
ubwp->bwp_Id = configuration->bwp_config[bwp_loop].id; ubwp->bwp_Id = configuration->bwp_config[bwp_loop].id;
@@ -1843,6 +1844,7 @@ static void config_uplinkBWP(NR_BWP_Uplink_t *ubwp,
ubwp->bwp_Dedicated->configuredGrantConfig = NULL; ubwp->bwp_Dedicated->configuredGrantConfig = NULL;
ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL; ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL;
return ubwp;
} }
static void set_phr_config(NR_MAC_CellGroupConfig_t *mac_CellGroupConfig) static void set_phr_config(NR_MAC_CellGroupConfig_t *mac_CellGroupConfig)
@@ -3103,16 +3105,28 @@ static NR_MAC_CellGroupConfig_t *configure_mac_cellgroup(const nr_mac_timers_t *
return mac_CellGroupConfig; return mac_CellGroupConfig;
} }
// Set HARQ related IEs according to the number of DL, UL harqprocesses configured static void allocate_32_harq(NR_PDSCH_Config_t *pdsch_Config)
static void fill_harq_IEs(NR_ServingCellConfig_t *scc, int num_dlharq, int num_ulharq)
{ {
if (!pdsch_Config->ext3)
pdsch_Config->ext3 = calloc(1, sizeof(*pdsch_Config->ext3));
asn1cCallocOne(pdsch_Config->ext3->harq_ProcessNumberSizeDCI_1_1_r17, 5);
}
AssertFatal(scc && scc->pdsch_ServingCellConfig && static void allocate_32_ul_harq(NR_PUSCH_Config_t *pusch_Config)
scc->pdsch_ServingCellConfig->present == NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup, {
if (!pusch_Config->ext2)
pusch_Config->ext2 = calloc(1, sizeof(*pusch_Config->ext2));
asn1cCallocOne(pusch_Config->ext2->harq_ProcessNumberSizeDCI_0_1_r17, 5);
}
// Set HARQ related IEs according to the number of DL, UL harqprocesses configured
static void fill_harq_IEs(NR_ServingCellConfig_t *scc, int num_dlharq, int num_ulharq, int bwp_id)
{
AssertFatal(scc
&& scc->pdsch_ServingCellConfig
&& scc->pdsch_ServingCellConfig->present == NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup,
"PDSCH_Servingcellconfig IEs NOT present\n"); "PDSCH_Servingcellconfig IEs NOT present\n");
NR_PDSCH_ServingCellConfig_t *pdsch_scc = scc->pdsch_ServingCellConfig->choice.setup; NR_PDSCH_ServingCellConfig_t *pdsch_scc = scc->pdsch_ServingCellConfig->choice.setup;
switch (num_dlharq) { switch (num_dlharq) {
case 2: case 2:
*pdsch_scc->nrofHARQ_ProcessesForPDSCH = NR_PDSCH_ServingCellConfig__nrofHARQ_ProcessesForPDSCH_n2; *pdsch_scc->nrofHARQ_ProcessesForPDSCH = NR_PDSCH_ServingCellConfig__nrofHARQ_ProcessesForPDSCH_n2;
@@ -3141,34 +3155,27 @@ static void fill_harq_IEs(NR_ServingCellConfig_t *scc, int num_dlharq, int num_u
pdsch_scc->ext3 = calloc(1, sizeof(*pdsch_scc->ext3)); pdsch_scc->ext3 = calloc(1, sizeof(*pdsch_scc->ext3));
asn1cCallocOne(pdsch_scc->ext3->nrofHARQ_ProcessesForPDSCH_v1700, asn1cCallocOne(pdsch_scc->ext3->nrofHARQ_ProcessesForPDSCH_v1700,
NR_PDSCH_ServingCellConfig__ext3__nrofHARQ_ProcessesForPDSCH_v1700_n32); NR_PDSCH_ServingCellConfig__ext3__nrofHARQ_ProcessesForPDSCH_v1700_n32);
NR_BWP_DownlinkDedicated_t *dlbwp = scc->initialDownlinkBWP; NR_BWP_DownlinkDedicated_t *dlbwp = NULL;
if (dlbwp && dlbwp->pdsch_Config && if (bwp_id == 0) {
dlbwp->pdsch_Config->present == NR_SetupRelease_PDSCH_Config_PR_setup) { dlbwp = scc->initialDownlinkBWP;
NR_PDSCH_Config_t *dlcfg = scc->initialDownlinkBWP->pdsch_Config->choice.setup; if (dlbwp && dlbwp->pdsch_Config && dlbwp->pdsch_Config->present == NR_SetupRelease_PDSCH_Config_PR_setup)
if (!dlcfg->ext3) allocate_32_harq(scc->initialDownlinkBWP->pdsch_Config->choice.setup);
dlcfg->ext3 = calloc(1, sizeof(*dlcfg->ext3)); } else {
asn1cCallocOne(dlcfg->ext3->harq_ProcessNumberSizeDCI_1_1_r17, 5); for (int i = 0; i < scc->downlinkBWP_ToAddModList->list.count; i++) {
} if (scc->downlinkBWP_ToAddModList->list.array[i]->bwp_Id != bwp_id)
int num_dl_bwp = 0; continue;
if (scc->downlinkBWP_ToAddModList) dlbwp = scc->downlinkBWP_ToAddModList->list.array[i]->bwp_Dedicated;
num_dl_bwp = scc->downlinkBWP_ToAddModList->list.count; if (dlbwp && dlbwp->pdsch_Config && dlbwp->pdsch_Config->present == NR_SetupRelease_PDSCH_Config_PR_setup)
for (int i = 0;i < num_dl_bwp; i++) { allocate_32_harq(dlbwp->pdsch_Config->choice.setup);
dlbwp = scc->downlinkBWP_ToAddModList->list.array[i]->bwp_Dedicated;
if (dlbwp && dlbwp->pdsch_Config &&
dlbwp->pdsch_Config->present == NR_SetupRelease_PDSCH_Config_PR_setup) {
NR_PDSCH_Config_t *dlcfg = dlbwp->pdsch_Config->choice.setup;
if (!dlcfg->ext3)
dlcfg->ext3 = calloc(1, sizeof(*dlcfg->ext3));
asn1cCallocOne(dlcfg->ext3->harq_ProcessNumberSizeDCI_1_1_r17, 5);
} }
} }
break; break;
default: // Already IE should have been set to 16 harq processes default: // Already IE should have been set to 16 harq processes
AssertFatal(false, "Invalid number of HARQ processes\n");
break; break;
} }
AssertFatal(scc->uplinkConfig, "uplinkConfig IE NOT present\n");
AssertFatal(scc->uplinkConfig,"uplinkConfig IE NOT present\n");
if (num_ulharq == 32) { if (num_ulharq == 32) {
if (!scc->uplinkConfig->pusch_ServingCellConfig) if (!scc->uplinkConfig->pusch_ServingCellConfig)
@@ -3181,25 +3188,18 @@ static void fill_harq_IEs(NR_ServingCellConfig_t *scc, int num_dlharq, int num_u
pusch_scc->ext3 = calloc(1, sizeof(*pusch_scc->ext3)); pusch_scc->ext3 = calloc(1, sizeof(*pusch_scc->ext3));
asn1cCallocOne(pusch_scc->ext3->nrofHARQ_ProcessesForPUSCH_r17, asn1cCallocOne(pusch_scc->ext3->nrofHARQ_ProcessesForPUSCH_r17,
NR_PUSCH_ServingCellConfig__ext3__nrofHARQ_ProcessesForPUSCH_r17_n32); NR_PUSCH_ServingCellConfig__ext3__nrofHARQ_ProcessesForPUSCH_r17_n32);
NR_BWP_UplinkDedicated_t *ulbwp = scc->uplinkConfig->initialUplinkBWP; NR_BWP_UplinkDedicated_t *ulbwp = NULL;
if (ulbwp && ulbwp->pusch_Config && if (bwp_id == 0) {
ulbwp->pusch_Config->present == NR_SetupRelease_PUSCH_Config_PR_setup) { ulbwp = scc->uplinkConfig->initialUplinkBWP;
NR_PUSCH_Config_t *ulcfg = ulbwp->pusch_Config->choice.setup; if (ulbwp && ulbwp->pusch_Config && ulbwp->pusch_Config->present == NR_SetupRelease_PUSCH_Config_PR_setup)
if (!ulcfg->ext2) allocate_32_ul_harq(ulbwp->pusch_Config->choice.setup);
ulcfg->ext2 = calloc(1, sizeof(*ulcfg->ext2)); } else {
asn1cCallocOne(ulcfg->ext2->harq_ProcessNumberSizeDCI_0_1_r17, 5); for (int i = 0; i < scc->uplinkConfig->uplinkBWP_ToAddModList->list.count; i++) {
} if (bwp_id != scc->uplinkConfig->uplinkBWP_ToAddModList->list.array[i]->bwp_Id)
int num_ul_bwp = 0; continue;
if (scc->uplinkConfig->uplinkBWP_ToAddModList) ulbwp = scc->uplinkConfig->uplinkBWP_ToAddModList->list.array[i]->bwp_Dedicated;
num_ul_bwp = scc->uplinkConfig->uplinkBWP_ToAddModList->list.count; if (ulbwp && ulbwp->pusch_Config && ulbwp->pusch_Config->present == NR_SetupRelease_PUSCH_Config_PR_setup)
for (int i = 0;i < num_ul_bwp; i++) { allocate_32_ul_harq(ulbwp->pusch_Config->choice.setup);
ulbwp = scc->uplinkConfig->uplinkBWP_ToAddModList->list.array[i]->bwp_Dedicated;
if (ulbwp && ulbwp->pusch_Config &&
ulbwp->pusch_Config->present == NR_SetupRelease_PUSCH_Config_PR_setup) {
NR_PUSCH_Config_t *ulcfg = ulbwp->pusch_Config->choice.setup;
if (!ulcfg->ext2)
ulcfg->ext2 = calloc(1, sizeof(*ulcfg->ext2));
asn1cCallocOne(ulcfg->ext2->harq_ProcessNumberSizeDCI_0_1_r17, 5);
} }
} }
} }
@@ -3321,43 +3321,29 @@ static NR_SpCellConfig_t *get_initial_SpCellConfig(int uid,
} }
uint64_t bitmap = get_ssb_bitmap(scc); uint64_t bitmap = get_ssb_bitmap(scc);
uplinkConfig->initialUplinkBWP = configure_initial_ul_bwp(scc, configuration, maxMIMO_Layers, uid); int first_active_bwp = 0;
configDedicated->initialDownlinkBWP = configure_initial_dl_bwp(scc, pdsch_AntennaPorts, bitmap, configuration); if (configuration->num_additional_bwps > 0)
first_active_bwp = configuration->first_active_bwp;
// Downlink BWPs asn1cCallocOne(configDedicated->firstActiveDownlinkBWP_Id, first_active_bwp);
int n_dl_bwp = configuration->num_additional_bwps; asn1cCallocOne(uplinkConfig->firstActiveUplinkBWP_Id, first_active_bwp);
int first_active_dl_bwp = 0; if (first_active_bwp == 0) {
if (n_dl_bwp > 0) { uplinkConfig->initialUplinkBWP = configure_initial_ul_bwp(scc, configuration, maxMIMO_Layers, uid);
configDedicated->initialDownlinkBWP = configure_initial_dl_bwp(scc, pdsch_AntennaPorts, bitmap, configuration);
} else {
configDedicated->downlinkBWP_ToAddModList = calloc(1, sizeof(*configDedicated->downlinkBWP_ToAddModList)); configDedicated->downlinkBWP_ToAddModList = calloc(1, sizeof(*configDedicated->downlinkBWP_ToAddModList));
for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) { NR_BWP_Downlink_t *bwp = config_downlinkBWP(scc,
NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp)); NULL,
config_downlinkBWP(bwp, 0,
scc, false,
NULL, first_active_bwp - 1,
0, true,
false, configuration);
bwp_loop, asn1cSeqAdd(&configDedicated->downlinkBWP_ToAddModList->list, bwp);
true,
configuration);
asn1cSeqAdd(&configDedicated->downlinkBWP_ToAddModList->list, bwp);
}
first_active_dl_bwp = configuration->first_active_bwp;
}
asn1cCallocOne(configDedicated->firstActiveDownlinkBWP_Id, first_active_dl_bwp);
// Uplink BWPs
int n_ul_bwp = configuration->num_additional_bwps;
int first_active_ul_bwp = 0;
if (n_ul_bwp > 0) {
uplinkConfig->uplinkBWP_ToAddModList = calloc(1, sizeof(*uplinkConfig->uplinkBWP_ToAddModList)); uplinkConfig->uplinkBWP_ToAddModList = calloc(1, sizeof(*uplinkConfig->uplinkBWP_ToAddModList));
for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) { NR_BWP_Uplink_t *ubwp = config_uplinkBWP(first_active_bwp - 1, true, uid, maxMIMO_Layers, configuration, scc, NULL);
NR_BWP_Uplink_t *ubwp = calloc(1, sizeof(*ubwp)); asn1cSeqAdd(&uplinkConfig->uplinkBWP_ToAddModList->list, ubwp);
config_uplinkBWP(ubwp, bwp_loop, true, uid, maxMIMO_Layers, configuration, scc, NULL);
asn1cSeqAdd(&uplinkConfig->uplinkBWP_ToAddModList->list, ubwp);
}
first_active_ul_bwp = configuration->first_active_bwp;
} }
asn1cCallocOne(uplinkConfig->firstActiveUplinkBWP_Id, first_active_ul_bwp);
configDedicated->csi_MeasConfig = calloc(1, sizeof(*configDedicated->csi_MeasConfig)); configDedicated->csi_MeasConfig = calloc(1, sizeof(*configDedicated->csi_MeasConfig));
configDedicated->csi_MeasConfig->present = NR_SetupRelease_CSI_MeasConfig_PR_setup; configDedicated->csi_MeasConfig->present = NR_SetupRelease_CSI_MeasConfig_PR_setup;
@@ -3384,97 +3370,93 @@ static NR_SpCellConfig_t *get_initial_SpCellConfig(int uid,
} }
asn1cSeqAdd(&csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list, ssbresset0); asn1cSeqAdd(&csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list, ssbresset0);
int bwp_loop_end = n_dl_bwp + 1; int curr_bwp, bwp_id;
for (int bwp_loop = 0; bwp_loop < bwp_loop_end; bwp_loop++) { NR_SetupRelease_PDSCH_Config_t *pdsch_Config;
int curr_bwp, bwp_id; if (first_active_bwp == 0) {
struct NR_SetupRelease_PDSCH_Config *pdsch_Config; pdsch_Config = configDedicated->initialDownlinkBWP->pdsch_Config;
if (bwp_loop == 0) { curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
pdsch_Config = configDedicated->initialDownlinkBWP->pdsch_Config; bwp_id = 0;
curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); } else {
bwp_id = 0; NR_BWP_Downlink_t *bwp = configDedicated->downlinkBWP_ToAddModList->list.array[0];
} else { pdsch_Config = bwp->bwp_Dedicated->pdsch_Config;
NR_BWP_Downlink_t *bwp = configDedicated->downlinkBWP_ToAddModList->list.array[bwp_loop - 1]; curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
pdsch_Config = bwp->bwp_Dedicated->pdsch_Config; bwp_id = bwp->bwp_Id;
curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
bwp_id = bwp->bwp_Id;
}
config_csirs(scc, csi_MeasConfig, pdsch_AntennaPorts, curr_bwp, configuration->do_CSIRS, bwp_loop);
config_csiim(configuration->do_CSIRS, pdsch_AntennaPorts, curr_bwp, csi_MeasConfig, bwp_loop);
NR_CSI_ResourceConfig_t *csires1 = calloc(1, sizeof(*csires1));
csires1->csi_ResourceConfigId = bwp_id + 20;
csires1->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB;
csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB =
calloc(1, sizeof(*csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList =
calloc(1, sizeof(*csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList));
NR_CSI_SSB_ResourceSetId_t *ssbres00 = calloc(1, sizeof(*ssbres00));
*ssbres00 = 0;
asn1cSeqAdd(&csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list, ssbres00);
csires1->bwp_Id = bwp_id;
csires1->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list, csires1);
int pucch_Resource = 2;
if (configuration->do_CSIRS) {
NR_CSI_ResourceConfig_t *csires0 = calloc(1, sizeof(*csires0));
csires0->csi_ResourceConfigId = bwp_id;
csires0->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB;
csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB =
calloc(1, sizeof(*csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList =
calloc(1, sizeof(*csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList));
NR_NZP_CSI_RS_ResourceSetId_t *nzp0 = calloc(1, sizeof(*nzp0));
*nzp0 = bwp_loop;
asn1cSeqAdd(&csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list, nzp0);
csires0->bwp_Id = bwp_id;
csires0->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list, csires0);
}
if (configuration->do_CSIRS && pdsch_AntennaPorts > 1) {
NR_CSI_ResourceConfig_t *csires2 = calloc(1, sizeof(*csires2));
csires2->csi_ResourceConfigId = bwp_id + 10;
csires2->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_csi_IM_ResourceSetList;
csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList =
calloc(1, sizeof(*csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList));
NR_CSI_IM_ResourceSetId_t *csiim00 = calloc(1, sizeof(*csiim00));
*csiim00 = bwp_loop;
asn1cSeqAdd(&csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList->list, csiim00);
csires2->bwp_Id = bwp_id;
csires2->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list, csires2);
NR_PUCCH_CSI_Resource_t *pucchcsi = calloc(1, sizeof(*pucchcsi));
pucchcsi->uplinkBandwidthPartId = bwp_id;
pucchcsi->pucch_Resource = pucch_Resource;
config_csi_meas_report(csi_MeasConfig,
scc,
pucchcsi,
pdsch_Config,
&configuration->pdsch_AntennaPorts,
*pdsch_servingcellconfig->ext1->maxMIMO_Layers,
bwp_id,
uid,
curr_bwp);
}
NR_PUCCH_CSI_Resource_t *pucchrsrp = calloc(1, sizeof(*pucchrsrp));
pucchrsrp->uplinkBandwidthPartId = bwp_id;
pucchrsrp->pucch_Resource = pucch_Resource;
config_rsrp_meas_report(csi_MeasConfig,
scc,
pucchrsrp,
configuration->do_CSIRS,
bwp_id + 10,
uid,
curr_bwp,
pdsch_AntennaPorts,
configuration->do_SINR);
} }
fill_harq_IEs(configDedicated, configuration->num_dlharq, configuration->num_ulharq); config_csirs(scc, csi_MeasConfig, pdsch_AntennaPorts, curr_bwp, configuration->do_CSIRS, first_active_bwp);
config_csiim(configuration->do_CSIRS, pdsch_AntennaPorts, curr_bwp, csi_MeasConfig, first_active_bwp);
NR_CSI_ResourceConfig_t *csires1 = calloc(1, sizeof(*csires1));
csires1->csi_ResourceConfigId = bwp_id + 20;
csires1->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB;
csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB =
calloc(1, sizeof(*csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList =
calloc(1, sizeof(*csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList));
NR_CSI_SSB_ResourceSetId_t *ssbres00 = calloc(1, sizeof(*ssbres00));
*ssbres00 = 0;
asn1cSeqAdd(&csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list, ssbres00);
csires1->bwp_Id = bwp_id;
csires1->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list, csires1);
int pucch_Resource = 2;
if (configuration->do_CSIRS) {
NR_CSI_ResourceConfig_t *csires0 = calloc(1, sizeof(*csires0));
csires0->csi_ResourceConfigId = bwp_id;
csires0->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB;
csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB =
calloc(1, sizeof(*csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList =
calloc(1, sizeof(*csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList));
NR_NZP_CSI_RS_ResourceSetId_t *nzp0 = calloc(1, sizeof(*nzp0));
*nzp0 = first_active_bwp;
asn1cSeqAdd(&csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list, nzp0);
csires0->bwp_Id = bwp_id;
csires0->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list, csires0);
}
if (configuration->do_CSIRS && pdsch_AntennaPorts > 1) {
NR_CSI_ResourceConfig_t *csires2 = calloc(1, sizeof(*csires2));
csires2->csi_ResourceConfigId = bwp_id + 10;
csires2->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_csi_IM_ResourceSetList;
csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList =
calloc(1, sizeof(*csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList));
NR_CSI_IM_ResourceSetId_t *csiim00 = calloc(1, sizeof(*csiim00));
*csiim00 = first_active_bwp;
asn1cSeqAdd(&csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList->list, csiim00);
csires2->bwp_Id = bwp_id;
csires2->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list, csires2);
NR_PUCCH_CSI_Resource_t *pucchcsi = calloc(1, sizeof(*pucchcsi));
pucchcsi->uplinkBandwidthPartId = bwp_id;
pucchcsi->pucch_Resource = pucch_Resource;
config_csi_meas_report(csi_MeasConfig,
scc,
pucchcsi,
pdsch_Config,
&configuration->pdsch_AntennaPorts,
*pdsch_servingcellconfig->ext1->maxMIMO_Layers,
bwp_id,
uid,
curr_bwp);
}
NR_PUCCH_CSI_Resource_t *pucchrsrp = calloc(1, sizeof(*pucchrsrp));
pucchrsrp->uplinkBandwidthPartId = bwp_id;
pucchrsrp->pucch_Resource = pucch_Resource;
config_rsrp_meas_report(csi_MeasConfig,
scc,
pucchrsrp,
configuration->do_CSIRS,
bwp_id + 10,
uid,
curr_bwp,
pdsch_AntennaPorts,
configuration->do_SINR);
fill_harq_IEs(configDedicated, configuration->num_dlharq, configuration->num_ulharq, first_active_bwp);
SpCellConfig->spCellConfigDedicated = configDedicated; SpCellConfig->spCellConfigDedicated = configDedicated;
if (LOG_DEBUGFLAG(DEBUG_ASN1)) { if (LOG_DEBUGFLAG(DEBUG_ASN1)) {
@@ -3709,33 +3691,24 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
{ {
DevAssert(cellGroupConfig != NULL); DevAssert(cellGroupConfig != NULL);
DevAssert(cellGroupConfig->spCellConfig != NULL); DevAssert(cellGroupConfig->spCellConfig != NULL);
DevAssert(cellGroupConfig->spCellConfig->spCellConfigDedicated != NULL);
DevAssert(configuration != NULL); DevAssert(configuration != NULL);
DevAssert(scc != NULL); DevAssert(scc != NULL);
NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig; NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig;
NR_ServingCellConfig_t *spCellConfigDedicated = SpCellConfig->spCellConfigDedicated;
NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig = SpCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup; NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig = spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup;
set_dl_maxmimolayers(pdsch_servingcellconfig, scc, uecap, configuration->maxMIMO_layers); set_dl_maxmimolayers(pdsch_servingcellconfig, scc, uecap, configuration->maxMIMO_layers);
NR_CSI_MeasConfig_t *csi_MeasConfig = SpCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup; NR_CSI_MeasConfig_t *csi_MeasConfig = spCellConfigDedicated->csi_MeasConfig->choice.setup;
for (int report = 0; report < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; report++) { for (int report = 0; report < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; report++) {
NR_CSI_ReportConfig_t *csirep = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[report]; NR_CSI_ReportConfig_t *csirep = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[report];
if(csirep->codebookConfig) if(csirep->codebookConfig)
config_csi_codebook(&configuration->pdsch_AntennaPorts, *pdsch_servingcellconfig->ext1->maxMIMO_Layers, csirep->codebookConfig); config_csi_codebook(&configuration->pdsch_AntennaPorts, *pdsch_servingcellconfig->ext1->maxMIMO_Layers, csirep->codebookConfig);
} }
int curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); NR_UplinkConfig_t *uplinkConfig = spCellConfigDedicated->uplinkConfig;
NR_UplinkConfig_t *uplinkConfig =
SpCellConfig && SpCellConfig->spCellConfigDedicated ? SpCellConfig->spCellConfigDedicated->uplinkConfig : NULL;
long maxMIMO_Layers = set_ul_max_layers(configuration, uecap); long maxMIMO_Layers = set_ul_max_layers(configuration, uecap);
if (uplinkConfig->initialUplinkBWP->pusch_Config) {
NR_PUSCH_Config_t *pusch_Config = uplinkConfig->initialUplinkBWP->pusch_Config->choice.setup;
if (pusch_Config->maxRank == NULL) {
pusch_Config->maxRank = calloc(1, sizeof(*pusch_Config->maxRank));
}
*pusch_Config->maxRank = maxMIMO_Layers;
}
if (!uplinkConfig->pusch_ServingCellConfig) if (!uplinkConfig->pusch_ServingCellConfig)
uplinkConfig->pusch_ServingCellConfig = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig)); uplinkConfig->pusch_ServingCellConfig = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig));
uplinkConfig->pusch_ServingCellConfig->present = NR_SetupRelease_PUSCH_ServingCellConfig_PR_setup; uplinkConfig->pusch_ServingCellConfig->present = NR_SetupRelease_PUSCH_ServingCellConfig_PR_setup;
@@ -3746,64 +3719,57 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1)); calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1));
asn1cCallocOne(uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers, maxMIMO_Layers); asn1cCallocOne(uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers, maxMIMO_Layers);
// UL and SRS configuration // Update UL BWP
if (configuration->do_SRS && uplinkConfig && uplinkConfig->initialUplinkBWP) { NR_BWP_UplinkDedicated_t *ul_bwp_Dedicated = NULL;
ASN_STRUCT_FREE(asn_DEF_NR_SetupRelease_SRS_Config, uplinkConfig->initialUplinkBWP->srs_Config); int curr_bwp = 0;
uplinkConfig->initialUplinkBWP->srs_Config = get_config_srs(scc, int bwp_id = 0;
uecap, if (uplinkConfig && uplinkConfig->initialUplinkBWP) {
curr_bwp, ul_bwp_Dedicated = uplinkConfig->initialUplinkBWP;
uid, curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
0, } else if (uplinkConfig && uplinkConfig->uplinkBWP_ToAddModList) {
maxMIMO_Layers, struct NR_UplinkConfig__uplinkBWP_ToAddModList *UL_BWP_list = uplinkConfig->uplinkBWP_ToAddModList;
configuration->minRXTXTIME, AssertFatal(UL_BWP_list->list.count == 1, "We should only have 1 BWP configured at a given time\n");
configuration->do_SRS); NR_BWP_Uplink_t *ul_bwp = UL_BWP_list->list.array[0];
curr_bwp = NRRIV2BW(ul_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
ul_bwp_Dedicated = ul_bwp->bwp_Dedicated;
bwp_id = ul_bwp->bwp_Id;
} }
if (ul_bwp_Dedicated) {
// Set DL MCS table NR_PUSCH_Config_t *pusch_Config = ul_bwp_Dedicated->pusch_Config->choice.setup;
NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP; if (!pusch_Config->maxRank)
set_dl_mcs_table(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing, pusch_Config->maxRank = calloc(1, sizeof(*pusch_Config->maxRank));
configuration->force_256qam_off ? NULL : uecap, *pusch_Config->maxRank = maxMIMO_Layers;
bwp_Dedicated, if (configuration->do_SRS) {
scc); ASN_STRUCT_FREE(asn_DEF_NR_SetupRelease_SRS_Config, ul_bwp_Dedicated->srs_Config);
ul_bwp_Dedicated->srs_Config = get_config_srs(scc,
NR_BWP_UplinkDedicated_t *ul_bwp_Dedicated = SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP; uecap,
set_ul_mcs_table(configuration->force_UL256qam_off ? NULL : uecap, scc, ul_bwp_Dedicated->pusch_Config->choice.setup); curr_bwp,
uid,
struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = bwp_id,
SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList; maxMIMO_Layers,
struct NR_UplinkConfig__uplinkBWP_ToAddModList *UL_BWP_list = uplinkConfig ? uplinkConfig->uplinkBWP_ToAddModList : NULL; configuration->minRXTXTIME,
if (DL_BWP_list) { configuration->do_SRS);
for (int i = 0; i < DL_BWP_list->list.count; i++) {
NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[i];
int scs = bwp->bwp_Common->genericParameters.subcarrierSpacing;
set_dl_mcs_table(scs, configuration->force_256qam_off ? NULL : uecap, bwp->bwp_Dedicated, scc);
} }
set_ul_mcs_table(configuration->force_UL256qam_off ? NULL : uecap, scc, pusch_Config);
} }
if (UL_BWP_list) {
for (int i = 0; i < UL_BWP_list->list.count; i++) {
NR_BWP_Uplink_t *ul_bwp = UL_BWP_list->list.array[i];
int bwp_size = NRRIV2BW(ul_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
if (ul_bwp->bwp_Dedicated->pusch_Config) {
NR_PUSCH_Config_t *pusch_Config = ul_bwp->bwp_Dedicated->pusch_Config->choice.setup;
set_ul_mcs_table(configuration->force_UL256qam_off ? NULL : uecap, scc, pusch_Config);
if (pusch_Config->maxRank == NULL) {
pusch_Config->maxRank = calloc(1, sizeof(*pusch_Config->maxRank));
}
*pusch_Config->maxRank = maxMIMO_Layers;
}
ASN_STRUCT_FREE(asn_DEF_NR_SetupRelease_SRS_Config, ul_bwp->bwp_Dedicated->srs_Config); // Update DL BWP
ul_bwp->bwp_Dedicated->srs_Config = get_config_srs(scc, NR_BWP_DownlinkDedicated_t *bwp_Dedicated = NULL;
uecap, int scs = -1;
bwp_size, if (spCellConfigDedicated->initialDownlinkBWP) {
uid, bwp_Dedicated = spCellConfigDedicated->initialDownlinkBWP;
i + 1, scs = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing;
maxMIMO_Layers, } else if (spCellConfigDedicated->downlinkBWP_ToAddModList) {
configuration->minRXTXTIME, struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = spCellConfigDedicated->downlinkBWP_ToAddModList;
configuration->do_SRS); AssertFatal(DL_BWP_list->list.count == 1, "We should only have 1 BWP configured at a given time\n");
} NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[0];
bwp_Dedicated = bwp->bwp_Dedicated;
scs = bwp->bwp_Common->genericParameters.subcarrierSpacing;
}
if (bwp_Dedicated) {
set_dl_mcs_table(scs, configuration->force_256qam_off ? NULL : uecap, bwp_Dedicated, scc);
update_cqitables(bwp_Dedicated->pdsch_Config, csi_MeasConfig);
} }
update_cqitables(bwp_Dedicated->pdsch_Config, csi_MeasConfig);
} }
void free_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig) void free_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig)
@@ -3935,15 +3901,13 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC
} }
configDedicated->downlinkBWP_ToAddModList = calloc(1, sizeof(*configDedicated->downlinkBWP_ToAddModList)); configDedicated->downlinkBWP_ToAddModList = calloc(1, sizeof(*configDedicated->downlinkBWP_ToAddModList));
for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) { for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) {
NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp)); NR_BWP_Downlink_t *bwp = config_downlinkBWP(servingcellconfigcommon,
config_downlinkBWP(bwp, uecap,
servingcellconfigcommon, dl_antenna_ports,
uecap, configuration->force_256qam_off,
dl_antenna_ports, bwp_loop,
configuration->force_256qam_off, false,
bwp_loop, configuration);
false,
configuration);
asn1cSeqAdd(&configDedicated->downlinkBWP_ToAddModList->list, bwp); asn1cSeqAdd(&configDedicated->downlinkBWP_ToAddModList->list, bwp);
configDedicated->firstActiveDownlinkBWP_Id = calloc(1, sizeof(*configDedicated->firstActiveDownlinkBWP_Id)); configDedicated->firstActiveDownlinkBWP_Id = calloc(1, sizeof(*configDedicated->firstActiveDownlinkBWP_Id));
*configDedicated->firstActiveDownlinkBWP_Id = firstActiveDownlinkBWP_Id; *configDedicated->firstActiveDownlinkBWP_Id = firstActiveDownlinkBWP_Id;
@@ -3961,8 +3925,7 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC
if (n_ul_bwp > 0) { if (n_ul_bwp > 0) {
ulConfig->uplinkBWP_ToAddModList = calloc(1, sizeof(*ulConfig->uplinkBWP_ToAddModList)); ulConfig->uplinkBWP_ToAddModList = calloc(1, sizeof(*ulConfig->uplinkBWP_ToAddModList));
for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) { for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) {
NR_BWP_Uplink_t *ubwp = calloc(1, sizeof(*ubwp)); NR_BWP_Uplink_t *ubwp = config_uplinkBWP(bwp_loop, false, uid, maxMIMO_Layers, configuration, servingcellconfigcommon, uecap);
config_uplinkBWP(ubwp, bwp_loop, false, uid, maxMIMO_Layers, configuration, servingcellconfigcommon, uecap);
asn1cSeqAdd(&ulConfig->uplinkBWP_ToAddModList->list, ubwp); asn1cSeqAdd(&ulConfig->uplinkBWP_ToAddModList->list, ubwp);
} }
ulConfig->firstActiveUplinkBWP_Id = calloc(1, sizeof(*ulConfig->firstActiveUplinkBWP_Id)); ulConfig->firstActiveUplinkBWP_Id = calloc(1, sizeof(*ulConfig->firstActiveUplinkBWP_Id));
@@ -4125,7 +4088,7 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC
configDedicated->pathlossReferenceLinking = NULL; configDedicated->pathlossReferenceLinking = NULL;
configDedicated->servingCellMO = NULL; configDedicated->servingCellMO = NULL;
fill_harq_IEs(configDedicated, configuration->num_dlharq, configuration->num_ulharq); fill_harq_IEs(configDedicated, configuration->num_dlharq, configuration->num_ulharq, firstActiveDownlinkBWP_Id);
secondaryCellGroup->spCellConfig->spCellConfigDedicated = configDedicated; secondaryCellGroup->spCellConfig->spCellConfigDedicated = configDedicated;
if (LOG_DEBUGFLAG(DEBUG_ASN1)) { if (LOG_DEBUGFLAG(DEBUG_ASN1)) {