From 395ca4b4b0cdd2b363afd03812be97f323c4cc1b Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 27 Mar 2023 15:51:26 +0200 Subject: [PATCH] Refactor update_cellGroupConfig() --- openair2/RRC/NR/MESSAGES/asn1_msg.c | 126 ---------------------------- openair2/RRC/NR/MESSAGES/asn1_msg.h | 5 -- openair2/RRC/NR/nr_rrc_config.c | 126 ++++++++++++++++++++++++++++ openair2/RRC/NR/nr_rrc_config.h | 4 + 4 files changed, 130 insertions(+), 131 deletions(-) diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index 6f77c929e5..e556349523 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -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; ilist.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; ilist.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, uint8_t *const buffer, diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.h b/openair2/RRC/NR/MESSAGES/asn1_msg.h index abb79c0602..b42bef9e84 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.h +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.h @@ -69,11 +69,6 @@ NR_RLC_BearerConfig_t *get_SRB_RLC_BearerConfig( long priority, 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, NR_CellGroupConfig_t *ue_context_mastercellGroup, int use_rlc_um_for_drb, diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index c5ce621d58..1172990d93 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -1578,6 +1578,20 @@ void config_rsrp_meas_report(NR_CSI_MeasConfig_t *csi_MeasConfig, 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 *mib = calloc(1, sizeof(*mib)); @@ -2281,6 +2295,118 @@ NR_CellGroupConfig_t *get_initial_cellGroupConfig(int uid, 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) { ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig, cellGroupConfig); diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h index 0f87568d30..6846503262 100644 --- a/openair2/RRC/NR/nr_rrc_config.h +++ b/openair2/RRC/NR/nr_rrc_config.h @@ -119,6 +119,10 @@ NR_CellGroupConfig_t *get_initial_cellGroupConfig(int uid, const NR_ServingCellConfigCommon_t *scc, const NR_ServingCellConfig_t *servingcellconfigdedicated, 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); 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);