Refactor update_cellGroupConfig()
This commit is contained in:
@@ -391,132 +391,6 @@ void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO temp function (to remove once CSI meas config harmonization is done)
|
|
||||||
void update_cqitables(struct NR_SetupRelease_PDSCH_Config *pdsch_Config,
|
|
||||||
NR_CSI_MeasConfig_t *csi_MeasConfig) {
|
|
||||||
int nb_csi = csi_MeasConfig->csi_ReportConfigToAddModList->list.count;
|
|
||||||
for (int i = 0; i < nb_csi; i++) {
|
|
||||||
NR_CSI_ReportConfig_t *csirep = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[i];
|
|
||||||
if(csirep->cqi_Table) {
|
|
||||||
if(pdsch_Config->choice.setup->mcs_Table!=NULL)
|
|
||||||
*csirep->cqi_Table = NR_CSI_ReportConfig__cqi_Table_table2;
|
|
||||||
else
|
|
||||||
*csirep->cqi_Table = NR_CSI_ReportConfig__cqi_Table_table1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
|
|
||||||
const int uid,
|
|
||||||
NR_UE_NR_Capability_t *uecap,
|
|
||||||
const gNB_RrcConfigurationReq* configuration) {
|
|
||||||
|
|
||||||
NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig;
|
|
||||||
|
|
||||||
if (SpCellConfig == NULL) return;
|
|
||||||
|
|
||||||
NR_ServingCellConfigCommon_t *scc = configuration ? configuration->scc : NULL;
|
|
||||||
|
|
||||||
if(scc) {
|
|
||||||
|
|
||||||
int curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
|
||||||
NR_UplinkConfig_t *uplinkConfig = SpCellConfig && SpCellConfig->spCellConfigDedicated ? SpCellConfig->spCellConfigDedicated->uplinkConfig : NULL;
|
|
||||||
|
|
||||||
uint8_t ul_max_layers = 1;
|
|
||||||
if (uecap &&
|
|
||||||
uecap->featureSets &&
|
|
||||||
uecap->featureSets->featureSetsUplinkPerCC &&
|
|
||||||
uecap->featureSets->featureSetsUplinkPerCC->list.count > 0) {
|
|
||||||
NR_FeatureSetUplinkPerCC_t *ul_feature_setup_per_cc = uecap->featureSets->featureSetsUplinkPerCC->list.array[0];
|
|
||||||
if (ul_feature_setup_per_cc->mimo_CB_PUSCH->maxNumberMIMO_LayersCB_PUSCH) {
|
|
||||||
switch (*ul_feature_setup_per_cc->mimo_CB_PUSCH->maxNumberMIMO_LayersCB_PUSCH) {
|
|
||||||
case NR_MIMO_LayersUL_twoLayers:
|
|
||||||
ul_max_layers = 2;
|
|
||||||
break;
|
|
||||||
case NR_MIMO_LayersUL_fourLayers:
|
|
||||||
ul_max_layers = 4;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ul_max_layers = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ul_max_layers = min(ul_max_layers, configuration->pusch_AntennaPorts);
|
|
||||||
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 = ul_max_layers;
|
|
||||||
}
|
|
||||||
if (uplinkConfig->pusch_ServingCellConfig == NULL) {
|
|
||||||
uplinkConfig->pusch_ServingCellConfig = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig));
|
|
||||||
uplinkConfig->pusch_ServingCellConfig->present = NR_SetupRelease_PUSCH_ServingCellConfig_PR_setup;
|
|
||||||
uplinkConfig->pusch_ServingCellConfig->choice.setup = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup));
|
|
||||||
uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1 = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1));
|
|
||||||
uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers));
|
|
||||||
}
|
|
||||||
*uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers = ul_max_layers;
|
|
||||||
}
|
|
||||||
|
|
||||||
long maxMIMO_Layers = uplinkConfig &&
|
|
||||||
uplinkConfig->pusch_ServingCellConfig &&
|
|
||||||
uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1 &&
|
|
||||||
uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers ?
|
|
||||||
*uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers : 1;
|
|
||||||
|
|
||||||
// UL and SRS configuration
|
|
||||||
if (configuration->do_SRS && uplinkConfig && uplinkConfig->initialUplinkBWP) {
|
|
||||||
if (!uplinkConfig->initialUplinkBWP->srs_Config) {
|
|
||||||
uplinkConfig->initialUplinkBWP->srs_Config = calloc(1, sizeof(*uplinkConfig->initialUplinkBWP->srs_Config));
|
|
||||||
}
|
|
||||||
config_srs(scc,
|
|
||||||
SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config,
|
|
||||||
uecap,
|
|
||||||
curr_bwp,
|
|
||||||
uid,
|
|
||||||
0,
|
|
||||||
maxMIMO_Layers,
|
|
||||||
configuration->do_SRS);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set DL MCS table
|
|
||||||
NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP;
|
|
||||||
set_dl_mcs_table(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing,
|
|
||||||
configuration->force_256qam_off ? NULL : uecap, bwp_Dedicated, scc);
|
|
||||||
struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
|
|
||||||
struct NR_UplinkConfig__uplinkBWP_ToAddModList *UL_BWP_list = uplinkConfig->uplinkBWP_ToAddModList;
|
|
||||||
if (DL_BWP_list) {
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (configuration->do_SRS && 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;
|
|
||||||
if (pusch_Config->maxRank == NULL) {
|
|
||||||
pusch_Config->maxRank = calloc(1, sizeof(*pusch_Config->maxRank));
|
|
||||||
}
|
|
||||||
*pusch_Config->maxRank = ul_max_layers;
|
|
||||||
}
|
|
||||||
config_srs(scc,
|
|
||||||
ul_bwp->bwp_Dedicated->srs_Config,
|
|
||||||
uecap,
|
|
||||||
bwp_size,
|
|
||||||
uid,
|
|
||||||
i+1,
|
|
||||||
maxMIMO_Layers,
|
|
||||||
configuration->do_SRS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
update_cqitables(bwp_Dedicated->pdsch_Config, SpCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
|
int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
|
||||||
uint8_t *const buffer,
|
uint8_t *const buffer,
|
||||||
|
|||||||
@@ -69,11 +69,6 @@ NR_RLC_BearerConfig_t *get_SRB_RLC_BearerConfig(
|
|||||||
long priority,
|
long priority,
|
||||||
e_NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration bucketSizeDuration);
|
e_NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration bucketSizeDuration);
|
||||||
|
|
||||||
void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
|
|
||||||
const int uid,
|
|
||||||
NR_UE_NR_Capability_t *uecap,
|
|
||||||
const gNB_RrcConfigurationReq *configuration);
|
|
||||||
|
|
||||||
void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
|
void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
|
||||||
NR_CellGroupConfig_t *ue_context_mastercellGroup,
|
NR_CellGroupConfig_t *ue_context_mastercellGroup,
|
||||||
int use_rlc_um_for_drb,
|
int use_rlc_um_for_drb,
|
||||||
|
|||||||
@@ -1578,6 +1578,20 @@ void config_rsrp_meas_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
|
|||||||
asn1cSeqAdd(&csi_MeasConfig->csi_ReportConfigToAddModList->list, csirep);
|
asn1cSeqAdd(&csi_MeasConfig->csi_ReportConfigToAddModList->list, csirep);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void update_cqitables(struct NR_SetupRelease_PDSCH_Config *pdsch_Config, NR_CSI_MeasConfig_t *csi_MeasConfig)
|
||||||
|
{
|
||||||
|
int nb_csi = csi_MeasConfig->csi_ReportConfigToAddModList->list.count;
|
||||||
|
for (int i = 0; i < nb_csi; i++) {
|
||||||
|
NR_CSI_ReportConfig_t *csirep = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[i];
|
||||||
|
if(csirep->cqi_Table) {
|
||||||
|
if(pdsch_Config->choice.setup->mcs_Table!=NULL)
|
||||||
|
*csirep->cqi_Table = NR_CSI_ReportConfig__cqi_Table_table2;
|
||||||
|
else
|
||||||
|
*csirep->cqi_Table = NR_CSI_ReportConfig__cqi_Table_table1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
NR_BCCH_BCH_Message_t *get_new_MIB_NR(const NR_ServingCellConfigCommon_t *scc)
|
NR_BCCH_BCH_Message_t *get_new_MIB_NR(const NR_ServingCellConfigCommon_t *scc)
|
||||||
{
|
{
|
||||||
NR_BCCH_BCH_Message_t *mib = calloc(1, sizeof(*mib));
|
NR_BCCH_BCH_Message_t *mib = calloc(1, sizeof(*mib));
|
||||||
@@ -2281,6 +2295,118 @@ NR_CellGroupConfig_t *get_initial_cellGroupConfig(int uid,
|
|||||||
return cellGroupConfig;
|
return cellGroupConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
|
||||||
|
const int uid,
|
||||||
|
NR_UE_NR_Capability_t *uecap,
|
||||||
|
const gNB_RrcConfigurationReq *configuration)
|
||||||
|
{
|
||||||
|
DevAssert(cellGroupConfig != NULL);
|
||||||
|
/* this is wrong: we should not call this function is spCellConfig is not
|
||||||
|
* allocated */
|
||||||
|
if (cellGroupConfig->spCellConfig == NULL)
|
||||||
|
return;
|
||||||
|
/* same as for spCellConfig */
|
||||||
|
if (configuration == NULL)
|
||||||
|
return;
|
||||||
|
DevAssert(configuration->scc != NULL);
|
||||||
|
|
||||||
|
NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig;
|
||||||
|
NR_ServingCellConfigCommon_t *scc = configuration->scc;
|
||||||
|
|
||||||
|
int curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||||
|
NR_UplinkConfig_t *uplinkConfig =
|
||||||
|
SpCellConfig && SpCellConfig->spCellConfigDedicated ? SpCellConfig->spCellConfigDedicated->uplinkConfig : NULL;
|
||||||
|
|
||||||
|
uint8_t ul_max_layers = 1;
|
||||||
|
if (uecap && uecap->featureSets && uecap->featureSets->featureSetsUplinkPerCC
|
||||||
|
&& uecap->featureSets->featureSetsUplinkPerCC->list.count > 0) {
|
||||||
|
NR_FeatureSetUplinkPerCC_t *ul_feature_setup_per_cc = uecap->featureSets->featureSetsUplinkPerCC->list.array[0];
|
||||||
|
if (ul_feature_setup_per_cc->mimo_CB_PUSCH->maxNumberMIMO_LayersCB_PUSCH) {
|
||||||
|
switch (*ul_feature_setup_per_cc->mimo_CB_PUSCH->maxNumberMIMO_LayersCB_PUSCH) {
|
||||||
|
case NR_MIMO_LayersUL_twoLayers:
|
||||||
|
ul_max_layers = 2;
|
||||||
|
break;
|
||||||
|
case NR_MIMO_LayersUL_fourLayers:
|
||||||
|
ul_max_layers = 4;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ul_max_layers = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ul_max_layers = min(ul_max_layers, configuration->pusch_AntennaPorts);
|
||||||
|
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 = ul_max_layers;
|
||||||
|
}
|
||||||
|
if (uplinkConfig->pusch_ServingCellConfig == NULL) {
|
||||||
|
uplinkConfig->pusch_ServingCellConfig = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig));
|
||||||
|
uplinkConfig->pusch_ServingCellConfig->present = NR_SetupRelease_PUSCH_ServingCellConfig_PR_setup;
|
||||||
|
uplinkConfig->pusch_ServingCellConfig->choice.setup = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup));
|
||||||
|
uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1 =
|
||||||
|
calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1));
|
||||||
|
uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers =
|
||||||
|
calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers));
|
||||||
|
}
|
||||||
|
*uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers = ul_max_layers;
|
||||||
|
}
|
||||||
|
|
||||||
|
long maxMIMO_Layers = uplinkConfig && uplinkConfig->pusch_ServingCellConfig
|
||||||
|
&& uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1
|
||||||
|
&& uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers
|
||||||
|
? *uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers
|
||||||
|
: 1;
|
||||||
|
|
||||||
|
// UL and SRS configuration
|
||||||
|
if (configuration->do_SRS && uplinkConfig && uplinkConfig->initialUplinkBWP) {
|
||||||
|
if (!uplinkConfig->initialUplinkBWP->srs_Config) {
|
||||||
|
uplinkConfig->initialUplinkBWP->srs_Config = calloc(1, sizeof(*uplinkConfig->initialUplinkBWP->srs_Config));
|
||||||
|
}
|
||||||
|
config_srs(scc,
|
||||||
|
SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config,
|
||||||
|
uecap,
|
||||||
|
curr_bwp,
|
||||||
|
uid,
|
||||||
|
0,
|
||||||
|
maxMIMO_Layers,
|
||||||
|
configuration->do_SRS);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set DL MCS table
|
||||||
|
NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP;
|
||||||
|
set_dl_mcs_table(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing,
|
||||||
|
configuration->force_256qam_off ? NULL : uecap,
|
||||||
|
bwp_Dedicated,
|
||||||
|
scc);
|
||||||
|
struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list =
|
||||||
|
SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
|
||||||
|
struct NR_UplinkConfig__uplinkBWP_ToAddModList *UL_BWP_list = uplinkConfig->uplinkBWP_ToAddModList;
|
||||||
|
if (DL_BWP_list) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (configuration->do_SRS && 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;
|
||||||
|
if (pusch_Config->maxRank == NULL) {
|
||||||
|
pusch_Config->maxRank = calloc(1, sizeof(*pusch_Config->maxRank));
|
||||||
|
}
|
||||||
|
*pusch_Config->maxRank = ul_max_layers;
|
||||||
|
}
|
||||||
|
config_srs(scc, ul_bwp->bwp_Dedicated->srs_Config, uecap, bwp_size, uid, i + 1, maxMIMO_Layers, configuration->do_SRS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
update_cqitables(bwp_Dedicated->pdsch_Config, SpCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup);
|
||||||
|
}
|
||||||
|
|
||||||
void free_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig)
|
void free_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig)
|
||||||
{
|
{
|
||||||
ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig, cellGroupConfig);
|
ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig, cellGroupConfig);
|
||||||
|
|||||||
@@ -119,6 +119,10 @@ NR_CellGroupConfig_t *get_initial_cellGroupConfig(int uid,
|
|||||||
const NR_ServingCellConfigCommon_t *scc,
|
const NR_ServingCellConfigCommon_t *scc,
|
||||||
const NR_ServingCellConfig_t *servingcellconfigdedicated,
|
const NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||||
const gNB_RrcConfigurationReq *configuration);
|
const gNB_RrcConfigurationReq *configuration);
|
||||||
|
void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
|
||||||
|
const int uid,
|
||||||
|
NR_UE_NR_Capability_t *uecap,
|
||||||
|
const gNB_RrcConfigurationReq *configuration);
|
||||||
void free_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig);
|
void free_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig);
|
||||||
int encode_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, uint8_t *buffer, int max_buffer_size);
|
int encode_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, uint8_t *buffer, int max_buffer_size);
|
||||||
NR_CellGroupConfig_t *decode_cellGroupConfig(const uint8_t *buffer, int max_buffer_size);
|
NR_CellGroupConfig_t *decode_cellGroupConfig(const uint8_t *buffer, int max_buffer_size);
|
||||||
|
|||||||
Reference in New Issue
Block a user