diff --git a/common/utils/oai_asn1.h b/common/utils/oai_asn1.h index f55150d17f..91d354ddbd 100644 --- a/common/utils/oai_asn1.h +++ b/common/utils/oai_asn1.h @@ -27,6 +27,111 @@ //-----------------------begin func ------------------- +// Macro updates DESTINATION with configuration from ORIGIN by swapping pointers +// Old configuration is freed after completing configuration +#define UPDATE_IE(DESTINATION, ORIGIN, TYPE) \ + do { \ + TYPE *tmp = ORIGIN; \ + ORIGIN = DESTINATION; \ + DESTINATION = tmp; \ + } while(0); \ + +// Same as above but swapping ASN1 elements that are not pointers +#define UPDATE_NP_IE(DESTINATION, ORIGIN, TYPE) \ + do { \ + TYPE tmp = ORIGIN; \ + ORIGIN = DESTINATION; \ + DESTINATION = tmp; \ + } while(0); \ + +// Macro handles reception of SetupRelease element ORIGIN (see NR_SetupRelease.h) +// If release (NR_SetupRelease_xxx_PR_release equivalent to 1), removing structure from DESTINATION +// If setup (NR_SetupRelease_xxx_PR_setup equivalent to 2), add or modify structure in DESTINATION +// Destination is not a SetupRelease structure +#define HANDLE_SETUPRELEASE_DIRECT(DESTINATION, ORIGIN, TYPE, ASN_DEF) \ + do { \ + if (ORIGIN->present == 1) { \ + asn1cFreeStruc(ASN_DEF, DESTINATION); \ + } \ + if (ORIGIN->present == 2) \ + UPDATE_IE(DESTINATION, ORIGIN->choice.setup, TYPE); \ + } while(0); \ + +// Macro handles reception of SetupRelease element ORIGIN (see NR_SetupRelease.h) +// If release (NR_SetupRelease_xxx_PR_release equivalent to 1), removing structure from DESTINATION +// If setup (NR_SetupRelease_xxx_PR_setup equivalent to 2), add or modify structure in DESTINATION +// Destination is a SetupRelease structure +#define HANDLE_SETUPRELEASE_IE(DESTINATION, ORIGIN, TYPE, ASN_DEF) \ + do { \ + if (ORIGIN->present == 1) { \ + asn1cFreeStruc(ASN_DEF, DESTINATION); \ + } \ + if (ORIGIN->present == 2) { \ + if (!DESTINATION) \ + DESTINATION = calloc(1, sizeof(*DESTINATION)); \ + DESTINATION->present = ORIGIN->present; \ + UPDATE_IE(DESTINATION->choice.setup, ORIGIN->choice.setup, TYPE); \ + } \ + } while(0); \ + +// Macro releases entries in list TARGET if the corresponding ID is found in list SOURCE. +// Prints an error if ID not found in list. +#define RELEASE_IE_FROMLIST(SOURCE, TARGET, FIELD) \ + do { \ + for (int iI = 0; iI < SOURCE->list.count; iI++) { \ + long eL = *SOURCE->list.array[iI]; \ + int iJ; \ + for (iJ = 0; iJ < TARGET->list.count; iJ++) { \ + if (eL == TARGET->list.array[iJ]->FIELD) \ + break; \ + } \ + if (iJ == TARGET->list.count) \ + asn_sequence_del(&TARGET->list, iJ, 1); \ + else \ + LOG_E(NR_MAC, "Element not present in the list, impossible to release\n"); \ + } \ + } while (0) \ + +// Macro adds or modifies entries of type TYPE in list TARGET with elements received in list SOURCE +#define ADDMOD_IE_FROMLIST(SOURCE, TARGET, FIELD, TYPE) \ + do { \ + for (int iI = 0; iI < SOURCE->list.count; iI++) { \ + long eL = SOURCE->list.array[iI]->FIELD; \ + int iJ; \ + for (iJ = 0; iJ < TARGET->list.count; iJ++) { \ + if (eL == TARGET->list.array[iJ]->FIELD) \ + break; \ + } \ + if (iJ == TARGET->list.count) { \ + TYPE *nEW = calloc(1, sizeof(*nEW)); \ + ASN_SEQUENCE_ADD(&TARGET->list, nEW); \ + } \ + UPDATE_IE(TARGET->list.array[iJ], \ + SOURCE->list.array[iI], \ + TYPE); \ + } \ + } while (0) \ + +// Macro adds or modifies entries of type TYPE in list TARGET with elements received in list SOURCE +// Action performed by function FUNC +#define ADDMOD_IE_FROMLIST_WFUNCTION(SOURCE, TARGET, FIELD, TYPE, FUNC) \ + do { \ + for (int iI = 0; iI < SOURCE->list.count; iI++) { \ + long eL = SOURCE->list.array[iI]->FIELD; \ + int iJ; \ + for (iJ = 0; iJ < TARGET->list.count; iJ++) { \ + if (eL == TARGET->list.array[iJ]->FIELD) \ + break; \ + } \ + if (iJ == TARGET->list.count) { \ + TYPE *nEW = calloc(1, sizeof(*nEW)); \ + ASN_SEQUENCE_ADD(&TARGET->list, nEW); \ + } \ + FUNC(TARGET->list.array[iJ], \ + SOURCE->list.array[iI]); \ + } \ + } while (0) + /*! \fn uint8_t BIT_STRING_to_uint8(BIT_STRING_t *) *\brief This function extract at most a 8 bits value from a BIT_STRING_t object, the exact bits number depend on the BIT_STRING_t contents. *\param[in] pointer to the BIT_STRING_t object. diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index f2527e1e8c..6a528f8548 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -427,18 +427,18 @@ static void modlist_ss(NR_SearchSpace_t *source, NR_SearchSpace_t *target) { target->searchSpaceId = source->searchSpaceId; if (source->controlResourceSetId) - UPDATE_MAC_IE(target->controlResourceSetId, source->controlResourceSetId, NR_ControlResourceSetId_t); + UPDATE_IE(target->controlResourceSetId, source->controlResourceSetId, NR_ControlResourceSetId_t); if (source->monitoringSlotPeriodicityAndOffset) - UPDATE_MAC_IE(target->monitoringSlotPeriodicityAndOffset, - source->monitoringSlotPeriodicityAndOffset, - struct NR_SearchSpace__monitoringSlotPeriodicityAndOffset); - UPDATE_MAC_IE(target->duration, source->duration, long); + UPDATE_IE(target->monitoringSlotPeriodicityAndOffset, + source->monitoringSlotPeriodicityAndOffset, + struct NR_SearchSpace__monitoringSlotPeriodicityAndOffset); + UPDATE_IE(target->duration, source->duration, long); if (source->monitoringSymbolsWithinSlot) - UPDATE_MAC_IE(target->monitoringSymbolsWithinSlot, source->monitoringSymbolsWithinSlot, BIT_STRING_t); + UPDATE_IE(target->monitoringSymbolsWithinSlot, source->monitoringSymbolsWithinSlot, BIT_STRING_t); if (source->nrofCandidates) - UPDATE_MAC_IE(target->nrofCandidates, source->nrofCandidates, struct NR_SearchSpace__nrofCandidates); + UPDATE_IE(target->nrofCandidates, source->nrofCandidates, struct NR_SearchSpace__nrofCandidates); if (source->searchSpaceType) - UPDATE_MAC_IE(target->searchSpaceType, source->searchSpaceType, struct NR_SearchSpace__searchSpaceType); + UPDATE_IE(target->searchSpaceType, source->searchSpaceType, struct NR_SearchSpace__searchSpaceType); } static NR_SearchSpace_t *get_common_search_space(const NR_UE_MAC_INST_t *mac, @@ -493,7 +493,7 @@ static void configure_common_ss_coreset(const NR_UE_MAC_INST_t *mac, get_common_search_space(mac, pdcch_ConfigCommon->commonSearchSpaceList, pdcch, *pdcch_ConfigCommon->pagingSearchSpace); } - UPDATE_MAC_IE(pdcch->commonControlResourceSet, pdcch_ConfigCommon->commonControlResourceSet, NR_ControlResourceSet_t); + UPDATE_IE(pdcch->commonControlResourceSet, pdcch_ConfigCommon->commonControlResourceSet, NR_ControlResourceSet_t); } } @@ -516,15 +516,15 @@ static void modlist_coreset(NR_ControlResourceSet_t *source, NR_ControlResourceS target->cce_REG_MappingType.choice.interleaved->reg_BundleSize = source->cce_REG_MappingType.choice.interleaved->reg_BundleSize; target->cce_REG_MappingType.choice.interleaved->interleaverSize = source->cce_REG_MappingType.choice.interleaved->interleaverSize; - UPDATE_MAC_IE(target->cce_REG_MappingType.choice.interleaved->shiftIndex, - source->cce_REG_MappingType.choice.interleaved->shiftIndex, - long); + UPDATE_IE(target->cce_REG_MappingType.choice.interleaved->shiftIndex, + source->cce_REG_MappingType.choice.interleaved->shiftIndex, + long); } else { free(shiftIndex); target->cce_REG_MappingType = source->cce_REG_MappingType; } - UPDATE_MAC_IE(target->tci_PresentInDCI, source->tci_PresentInDCI, long); - UPDATE_MAC_IE(target->pdcch_DMRS_ScramblingID, source->pdcch_DMRS_ScramblingID, long); + UPDATE_IE(target->tci_PresentInDCI, source->tci_PresentInDCI, long); + UPDATE_IE(target->pdcch_DMRS_ScramblingID, source->pdcch_DMRS_ScramblingID, long); // TCI States if (source->tci_StatesPDCCH_ToReleaseList) { for (int i = 0; i < source->tci_StatesPDCCH_ToReleaseList->list.count; i++) { @@ -553,9 +553,9 @@ static void modlist_coreset(NR_ControlResourceSet_t *source, NR_ControlResourceS ASN_SEQUENCE_ADD(&target->tci_StatesPDCCH_ToAddList->list, source->tci_StatesPDCCH_ToAddList->list.array[i]); } } else - UPDATE_MAC_IE(target->tci_StatesPDCCH_ToAddList, - source->tci_StatesPDCCH_ToAddList, - struct NR_ControlResourceSet__tci_StatesPDCCH_ToAddList); + UPDATE_IE(target->tci_StatesPDCCH_ToAddList, + source->tci_StatesPDCCH_ToAddList, + struct NR_ControlResourceSet__tci_StatesPDCCH_ToAddList); } // end TCI States } @@ -812,14 +812,14 @@ void nr_rrc_mac_config_req_mib(module_id_t module_id, static void setup_puschpowercontrol(NR_PUSCH_PowerControl_t *source, NR_PUSCH_PowerControl_t *target) { - UPDATE_MAC_IE(target->tpc_Accumulation, source->tpc_Accumulation, long); - UPDATE_MAC_IE(target->msg3_Alpha, source->msg3_Alpha, NR_Alpha_t); + UPDATE_IE(target->tpc_Accumulation, source->tpc_Accumulation, long); + UPDATE_IE(target->msg3_Alpha, source->msg3_Alpha, NR_Alpha_t); if (source->p0_NominalWithoutGrant) - UPDATE_MAC_IE(target->p0_NominalWithoutGrant, source->p0_NominalWithoutGrant, long); + UPDATE_IE(target->p0_NominalWithoutGrant, source->p0_NominalWithoutGrant, long); if (source->p0_AlphaSets) - UPDATE_MAC_IE(target->p0_AlphaSets, source->p0_AlphaSets, struct NR_PUSCH_PowerControl__p0_AlphaSets); - UPDATE_MAC_IE(target->twoPUSCH_PC_AdjustmentStates, source->twoPUSCH_PC_AdjustmentStates, long); - UPDATE_MAC_IE(target->deltaMCS, source->deltaMCS, long); + UPDATE_IE(target->p0_AlphaSets, source->p0_AlphaSets, struct NR_PUSCH_PowerControl__p0_AlphaSets); + UPDATE_IE(target->twoPUSCH_PC_AdjustmentStates, source->twoPUSCH_PC_AdjustmentStates, long); + UPDATE_IE(target->deltaMCS, source->deltaMCS, long); if (source->pathlossReferenceRSToReleaseList) { RELEASE_IE_FROMLIST(source->pathlossReferenceRSToReleaseList, target->pathlossReferenceRSToAddModList, @@ -850,8 +850,8 @@ static void setup_puschpowercontrol(NR_PUSCH_PowerControl_t *source, NR_PUSCH_Po static void setup_puschconfig(NR_PUSCH_Config_t *source, NR_PUSCH_Config_t *target) { - UPDATE_MAC_IE(target->dataScramblingIdentityPUSCH, source->dataScramblingIdentityPUSCH, long); - UPDATE_MAC_IE(target->txConfig, source->txConfig, long); + UPDATE_IE(target->dataScramblingIdentityPUSCH, source->dataScramblingIdentityPUSCH, long); + UPDATE_IE(target->txConfig, source->txConfig, long); if (source->dmrs_UplinkForPUSCH_MappingTypeA) HANDLE_SETUPRELEASE_IE(target->dmrs_UplinkForPUSCH_MappingTypeA, source->dmrs_UplinkForPUSCH_MappingTypeA, @@ -867,25 +867,25 @@ static void setup_puschconfig(NR_PUSCH_Config_t *source, NR_PUSCH_Config_t *targ target->pusch_PowerControl = calloc(1, sizeof(*target->pusch_PowerControl)); setup_puschpowercontrol(source->pusch_PowerControl, target->pusch_PowerControl); } - UPDATE_MAC_IE(target->frequencyHopping, source->frequencyHopping, long); + UPDATE_IE(target->frequencyHopping, source->frequencyHopping, long); if (source->frequencyHoppingOffsetLists) - UPDATE_MAC_IE(target->frequencyHoppingOffsetLists, - source->frequencyHoppingOffsetLists, - struct NR_PUSCH_Config__frequencyHoppingOffsetLists); + UPDATE_IE(target->frequencyHoppingOffsetLists, + source->frequencyHoppingOffsetLists, + struct NR_PUSCH_Config__frequencyHoppingOffsetLists); target->resourceAllocation = source->resourceAllocation; if (source->pusch_TimeDomainAllocationList) HANDLE_SETUPRELEASE_IE(target->pusch_TimeDomainAllocationList, source->pusch_TimeDomainAllocationList, NR_PUSCH_TimeDomainResourceAllocationList_t, asn_DEF_NR_SetupRelease_PUSCH_TimeDomainResourceAllocationList); - UPDATE_MAC_IE(target->pusch_AggregationFactor, source->pusch_AggregationFactor, long); - UPDATE_MAC_IE(target->mcs_Table, source->mcs_Table, long); - UPDATE_MAC_IE(target->mcs_TableTransformPrecoder, source->mcs_TableTransformPrecoder, long); - UPDATE_MAC_IE(target->transformPrecoder, source->transformPrecoder, long); - UPDATE_MAC_IE(target->codebookSubset, source->codebookSubset, long); - UPDATE_MAC_IE(target->maxRank, source->maxRank, long); - UPDATE_MAC_IE(target->rbg_Size, source->rbg_Size, long); - UPDATE_MAC_IE(target->tp_pi2BPSK, source->tp_pi2BPSK, long); + UPDATE_IE(target->pusch_AggregationFactor, source->pusch_AggregationFactor, long); + UPDATE_IE(target->mcs_Table, source->mcs_Table, long); + UPDATE_IE(target->mcs_TableTransformPrecoder, source->mcs_TableTransformPrecoder, long); + UPDATE_IE(target->transformPrecoder, source->transformPrecoder, long); + UPDATE_IE(target->codebookSubset, source->codebookSubset, long); + UPDATE_IE(target->maxRank, source->maxRank, long); + UPDATE_IE(target->rbg_Size, source->rbg_Size, long); + UPDATE_IE(target->tp_pi2BPSK, source->tp_pi2BPSK, long); if (source->uci_OnPUSCH) { if (source->uci_OnPUSCH->present == NR_SetupRelease_UCI_OnPUSCH_PR_release) asn1cFreeStruc(asn_DEF_NR_UCI_OnPUSCH, target->uci_OnPUSCH); @@ -893,9 +893,9 @@ static void setup_puschconfig(NR_PUSCH_Config_t *source, NR_PUSCH_Config_t *targ if (target->uci_OnPUSCH) { target->uci_OnPUSCH->choice.setup->scaling = source->uci_OnPUSCH->choice.setup->scaling; if (source->uci_OnPUSCH->choice.setup->betaOffsets) - UPDATE_MAC_IE(target->uci_OnPUSCH->choice.setup->betaOffsets, - source->uci_OnPUSCH->choice.setup->betaOffsets, - struct NR_UCI_OnPUSCH__betaOffsets); + UPDATE_IE(target->uci_OnPUSCH->choice.setup->betaOffsets, + source->uci_OnPUSCH->choice.setup->betaOffsets, + struct NR_UCI_OnPUSCH__betaOffsets); } } } @@ -903,7 +903,7 @@ static void setup_puschconfig(NR_PUSCH_Config_t *source, NR_PUSCH_Config_t *targ static void setup_pdschconfig(NR_PDSCH_Config_t *source, NR_PDSCH_Config_t *target) { - UPDATE_MAC_IE(target->dataScramblingIdentityPDSCH, source->dataScramblingIdentityPDSCH, long); + UPDATE_IE(target->dataScramblingIdentityPDSCH, source->dataScramblingIdentityPDSCH, long); if (source->dmrs_DownlinkForPDSCH_MappingTypeA) HANDLE_SETUPRELEASE_IE(target->dmrs_DownlinkForPDSCH_MappingTypeA, source->dmrs_DownlinkForPDSCH_MappingTypeA, @@ -929,14 +929,14 @@ static void setup_pdschconfig(NR_PDSCH_Config_t *source, NR_PDSCH_Config_t *targ NR_TCI_State_t); } // end TCI States - UPDATE_MAC_IE(target->vrb_ToPRB_Interleaver, source->vrb_ToPRB_Interleaver, long); + UPDATE_IE(target->vrb_ToPRB_Interleaver, source->vrb_ToPRB_Interleaver, long); target->resourceAllocation = source->resourceAllocation; if (source->pdsch_TimeDomainAllocationList) HANDLE_SETUPRELEASE_IE(target->pdsch_TimeDomainAllocationList, source->pdsch_TimeDomainAllocationList, NR_PDSCH_TimeDomainResourceAllocationList_t, asn_DEF_NR_SetupRelease_PDSCH_TimeDomainResourceAllocationList); - UPDATE_MAC_IE(target->pdsch_AggregationFactor, source->pdsch_AggregationFactor, long); + UPDATE_IE(target->pdsch_AggregationFactor, source->pdsch_AggregationFactor, long); // rateMatchPattern if (source->rateMatchPatternToReleaseList) { RELEASE_IE_FROMLIST(source->rateMatchPatternToReleaseList, @@ -952,12 +952,12 @@ static void setup_pdschconfig(NR_PDSCH_Config_t *source, NR_PDSCH_Config_t *targ NR_RateMatchPattern_t); } // end rateMatchPattern - UPDATE_MAC_IE(target->rateMatchPatternGroup1, source->rateMatchPatternGroup1, NR_RateMatchPatternGroup_t); - UPDATE_MAC_IE(target->rateMatchPatternGroup2, source->rateMatchPatternGroup2, NR_RateMatchPatternGroup_t); + UPDATE_IE(target->rateMatchPatternGroup1, source->rateMatchPatternGroup1, NR_RateMatchPatternGroup_t); + UPDATE_IE(target->rateMatchPatternGroup2, source->rateMatchPatternGroup2, NR_RateMatchPatternGroup_t); target->rbg_Size = source->rbg_Size; - UPDATE_MAC_IE(target->mcs_Table, source->mcs_Table, long); - UPDATE_MAC_IE(target->maxNrofCodeWordsScheduledByDCI, source->maxNrofCodeWordsScheduledByDCI, long); - UPDATE_MAC_NP_IE(target->prb_BundlingType, source->prb_BundlingType, struct NR_PDSCH_Config__prb_BundlingType); + UPDATE_IE(target->mcs_Table, source->mcs_Table, long); + UPDATE_IE(target->maxNrofCodeWordsScheduledByDCI, source->maxNrofCodeWordsScheduledByDCI, long); + UPDATE_NP_IE(target->prb_BundlingType, source->prb_BundlingType, struct NR_PDSCH_Config__prb_BundlingType); AssertFatal(source->zp_CSI_RS_ResourceToAddModList == NULL, "Not handled\n"); AssertFatal(source->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList == NULL, "Not handled\n"); AssertFatal(source->sp_ZP_CSI_RS_ResourceSetsToAddModList == NULL, "Not handled\n"); @@ -968,11 +968,11 @@ static void setup_sr_resource(NR_SchedulingRequestResourceConfig_t *target, NR_S target->schedulingRequestResourceId = source->schedulingRequestResourceId; target->schedulingRequestID = source->schedulingRequestID; if (source->periodicityAndOffset) - UPDATE_MAC_IE(target->periodicityAndOffset, - source->periodicityAndOffset, - struct NR_SchedulingRequestResourceConfig__periodicityAndOffset); + UPDATE_IE(target->periodicityAndOffset, + source->periodicityAndOffset, + struct NR_SchedulingRequestResourceConfig__periodicityAndOffset); if (source->resource) - UPDATE_MAC_IE(target->resource, source->resource, NR_PUCCH_ResourceId_t); + UPDATE_IE(target->resource, source->resource, NR_PUCCH_ResourceId_t); } static void setup_pucchconfig(NR_PUCCH_Config_t *source, NR_PUCCH_Config_t *target) @@ -1043,11 +1043,11 @@ static void setup_pucchconfig(NR_PUCCH_Config_t *source, NR_PUCCH_Config_t *targ } if (source->multi_CSI_PUCCH_ResourceList) - UPDATE_MAC_IE(target->multi_CSI_PUCCH_ResourceList, - source->multi_CSI_PUCCH_ResourceList, - struct NR_PUCCH_Config__multi_CSI_PUCCH_ResourceList); + UPDATE_IE(target->multi_CSI_PUCCH_ResourceList, + source->multi_CSI_PUCCH_ResourceList, + struct NR_PUCCH_Config__multi_CSI_PUCCH_ResourceList); if (source->dl_DataToUL_ACK) - UPDATE_MAC_IE(target->dl_DataToUL_ACK, source->dl_DataToUL_ACK, struct NR_PUCCH_Config__dl_DataToUL_ACK); + UPDATE_IE(target->dl_DataToUL_ACK, source->dl_DataToUL_ACK, struct NR_PUCCH_Config__dl_DataToUL_ACK); // PUCCH-SpatialRelationInfo if (source->spatialRelationInfoToAddModList) { if (!target->spatialRelationInfoToAddModList) @@ -1066,20 +1066,20 @@ static void setup_pucchconfig(NR_PUCCH_Config_t *source, NR_PUCCH_Config_t *targ if (source->pucch_PowerControl) { if (!target->pucch_PowerControl) target->pucch_PowerControl = calloc(1, sizeof(*target->pucch_PowerControl)); - UPDATE_MAC_IE(target->pucch_PowerControl->deltaF_PUCCH_f0, source->pucch_PowerControl->deltaF_PUCCH_f0, long); - UPDATE_MAC_IE(target->pucch_PowerControl->deltaF_PUCCH_f1, source->pucch_PowerControl->deltaF_PUCCH_f1, long); - UPDATE_MAC_IE(target->pucch_PowerControl->deltaF_PUCCH_f2, source->pucch_PowerControl->deltaF_PUCCH_f2, long); - UPDATE_MAC_IE(target->pucch_PowerControl->deltaF_PUCCH_f3, source->pucch_PowerControl->deltaF_PUCCH_f3, long); - UPDATE_MAC_IE(target->pucch_PowerControl->deltaF_PUCCH_f4, source->pucch_PowerControl->deltaF_PUCCH_f4, long); + UPDATE_IE(target->pucch_PowerControl->deltaF_PUCCH_f0, source->pucch_PowerControl->deltaF_PUCCH_f0, long); + UPDATE_IE(target->pucch_PowerControl->deltaF_PUCCH_f1, source->pucch_PowerControl->deltaF_PUCCH_f1, long); + UPDATE_IE(target->pucch_PowerControl->deltaF_PUCCH_f2, source->pucch_PowerControl->deltaF_PUCCH_f2, long); + UPDATE_IE(target->pucch_PowerControl->deltaF_PUCCH_f3, source->pucch_PowerControl->deltaF_PUCCH_f3, long); + UPDATE_IE(target->pucch_PowerControl->deltaF_PUCCH_f4, source->pucch_PowerControl->deltaF_PUCCH_f4, long); if (source->pucch_PowerControl->p0_Set) - UPDATE_MAC_IE(target->pucch_PowerControl->p0_Set, source->pucch_PowerControl->p0_Set, struct NR_PUCCH_PowerControl__p0_Set); + UPDATE_IE(target->pucch_PowerControl->p0_Set, source->pucch_PowerControl->p0_Set, struct NR_PUCCH_PowerControl__p0_Set); if (source->pucch_PowerControl->pathlossReferenceRSs) - UPDATE_MAC_IE(target->pucch_PowerControl->pathlossReferenceRSs, - source->pucch_PowerControl->pathlossReferenceRSs, - struct NR_PUCCH_PowerControl__pathlossReferenceRSs); - UPDATE_MAC_IE(target->pucch_PowerControl->twoPUCCH_PC_AdjustmentStates, - source->pucch_PowerControl->twoPUCCH_PC_AdjustmentStates, - long); + UPDATE_IE(target->pucch_PowerControl->pathlossReferenceRSs, + source->pucch_PowerControl->pathlossReferenceRSs, + struct NR_PUCCH_PowerControl__pathlossReferenceRSs); + UPDATE_IE(target->pucch_PowerControl->twoPUCCH_PC_AdjustmentStates, + source->pucch_PowerControl->twoPUCCH_PC_AdjustmentStates, + long); } } @@ -1088,22 +1088,22 @@ static void handle_aperiodic_srs_type(struct NR_SRS_ResourceSet__resourceType__a { target->aperiodicSRS_ResourceTrigger = source->aperiodicSRS_ResourceTrigger; if (source->csi_RS) - UPDATE_MAC_IE(target->csi_RS, source->csi_RS, NR_NZP_CSI_RS_ResourceId_t); - UPDATE_MAC_IE(target->slotOffset, source->slotOffset, long); + UPDATE_IE(target->csi_RS, source->csi_RS, NR_NZP_CSI_RS_ResourceId_t); + UPDATE_IE(target->slotOffset, source->slotOffset, long); if (source->ext1 && source->ext1->aperiodicSRS_ResourceTriggerList) - UPDATE_MAC_IE(target->ext1->aperiodicSRS_ResourceTriggerList, - source->ext1->aperiodicSRS_ResourceTriggerList, - struct NR_SRS_ResourceSet__resourceType__aperiodic__ext1__aperiodicSRS_ResourceTriggerList); + UPDATE_IE(target->ext1->aperiodicSRS_ResourceTriggerList, + source->ext1->aperiodicSRS_ResourceTriggerList, + struct NR_SRS_ResourceSet__resourceType__aperiodic__ext1__aperiodicSRS_ResourceTriggerList); } static void setup_srsresourceset(NR_SRS_ResourceSet_t *target, NR_SRS_ResourceSet_t *source) { target->srs_ResourceSetId = source->srs_ResourceSetId; if (source->srs_ResourceIdList) - UPDATE_MAC_IE(target->srs_ResourceIdList, source->srs_ResourceIdList, struct NR_SRS_ResourceSet__srs_ResourceIdList); + UPDATE_IE(target->srs_ResourceIdList, source->srs_ResourceIdList, struct NR_SRS_ResourceSet__srs_ResourceIdList); if (target->resourceType.present != source->resourceType.present) { - UPDATE_MAC_NP_IE(target->resourceType, source->resourceType, struct NR_SRS_ResourceSet__resourceType); + UPDATE_NP_IE(target->resourceType, source->resourceType, struct NR_SRS_ResourceSet__resourceType); } else { switch (source->resourceType.present) { @@ -1112,32 +1112,32 @@ static void setup_srsresourceset(NR_SRS_ResourceSet_t *target, NR_SRS_ResourceSe break; case NR_SRS_ResourceSet__resourceType_PR_periodic: if (source->resourceType.choice.periodic->associatedCSI_RS) - UPDATE_MAC_IE(target->resourceType.choice.periodic->associatedCSI_RS, - source->resourceType.choice.periodic->associatedCSI_RS, - NR_NZP_CSI_RS_ResourceId_t); + UPDATE_IE(target->resourceType.choice.periodic->associatedCSI_RS, + source->resourceType.choice.periodic->associatedCSI_RS, + NR_NZP_CSI_RS_ResourceId_t); break; case NR_SRS_ResourceSet__resourceType_PR_semi_persistent: if (source->resourceType.choice.semi_persistent->associatedCSI_RS) - UPDATE_MAC_IE(target->resourceType.choice.semi_persistent->associatedCSI_RS, - source->resourceType.choice.semi_persistent->associatedCSI_RS, - NR_NZP_CSI_RS_ResourceId_t); + UPDATE_IE(target->resourceType.choice.semi_persistent->associatedCSI_RS, + source->resourceType.choice.semi_persistent->associatedCSI_RS, + NR_NZP_CSI_RS_ResourceId_t); break; default: break; } } target->usage = source->usage; - UPDATE_MAC_IE(target->alpha, source->alpha, NR_Alpha_t); + UPDATE_IE(target->alpha, source->alpha, NR_Alpha_t); if (source->p0) - UPDATE_MAC_IE(target->p0, source->p0, long); + UPDATE_IE(target->p0, source->p0, long); if (source->pathlossReferenceRS) - UPDATE_MAC_IE(target->pathlossReferenceRS, source->pathlossReferenceRS, struct NR_PathlossReferenceRS_Config); - UPDATE_MAC_IE(target->srs_PowerControlAdjustmentStates, source->srs_PowerControlAdjustmentStates, long); + UPDATE_IE(target->pathlossReferenceRS, source->pathlossReferenceRS, struct NR_PathlossReferenceRS_Config); + UPDATE_IE(target->srs_PowerControlAdjustmentStates, source->srs_PowerControlAdjustmentStates, long); } static void setup_srsconfig(NR_SRS_Config_t *source, NR_SRS_Config_t *target) { - UPDATE_MAC_IE(target->tpc_Accumulation, source->tpc_Accumulation, long); + UPDATE_IE(target->tpc_Accumulation, source->tpc_Accumulation, long); // SRS-Resource if (source->srs_ResourceToAddModList) { if (!target->srs_ResourceToAddModList) @@ -1297,9 +1297,9 @@ static void configure_common_BWP_dl(NR_UE_MAC_INST_t *mac, int bwp_id, NR_BWP_Do } if (dl_common->pdsch_ConfigCommon) { if (dl_common->pdsch_ConfigCommon->present == NR_SetupRelease_PDSCH_ConfigCommon_PR_setup) - UPDATE_MAC_IE(bwp->tdaList_Common, - dl_common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList, - NR_PDSCH_TimeDomainResourceAllocationList_t); + UPDATE_IE(bwp->tdaList_Common, + dl_common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList, + NR_PDSCH_TimeDomainResourceAllocationList_t); if (dl_common->pdsch_ConfigCommon->present == NR_SetupRelease_PDSCH_ConfigCommon_PR_release) asn1cFreeStruc(asn_DEF_NR_PDSCH_TimeDomainResourceAllocationList, bwp->tdaList_Common); } @@ -1340,10 +1340,10 @@ static void configure_common_BWP_ul(NR_UE_MAC_INST_t *mac, int bwp_id, NR_BWP_Up asn_DEF_NR_PUCCH_ConfigCommon); if (ul_common->pusch_ConfigCommon) { if (ul_common->pusch_ConfigCommon->present == NR_SetupRelease_PUSCH_ConfigCommon_PR_setup) { - UPDATE_MAC_IE(bwp->tdaList_Common, - ul_common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList, - NR_PUSCH_TimeDomainResourceAllocationList_t); - UPDATE_MAC_IE(bwp->msg3_DeltaPreamble, ul_common->pusch_ConfigCommon->choice.setup->msg3_DeltaPreamble, long); + UPDATE_IE(bwp->tdaList_Common, + ul_common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList, + NR_PUSCH_TimeDomainResourceAllocationList_t); + UPDATE_IE(bwp->msg3_DeltaPreamble, ul_common->pusch_ConfigCommon->choice.setup->msg3_DeltaPreamble, long); } if (ul_common->pusch_ConfigCommon->present == NR_SetupRelease_PUSCH_ConfigCommon_PR_release) { asn1cFreeStruc(asn_DEF_NR_PUSCH_TimeDomainResourceAllocationList, bwp->tdaList_Common); @@ -1400,8 +1400,8 @@ void nr_rrc_mac_config_req_sib1(module_id_t module_id, NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); AssertFatal(scc, "SIB1 SCC should not be NULL\n"); - UPDATE_MAC_IE(mac->tdd_UL_DL_ConfigurationCommon, scc->tdd_UL_DL_ConfigurationCommon, NR_TDD_UL_DL_ConfigCommon_t); - UPDATE_MAC_IE(mac->si_SchedulingInfo, si_SchedulingInfo, NR_SI_SchedulingInfo_t); + UPDATE_IE(mac->tdd_UL_DL_ConfigurationCommon, scc->tdd_UL_DL_ConfigurationCommon, NR_TDD_UL_DL_ConfigCommon_t); + UPDATE_IE(mac->si_SchedulingInfo, si_SchedulingInfo, NR_SI_SchedulingInfo_t); config_common_ue_sa(mac, scc, cc_idP); configure_common_BWP_dl(mac, @@ -1440,7 +1440,7 @@ static void handle_reconfiguration_with_sync(NR_UE_MAC_INST_t *mac, AssertFatal( reconfigurationWithSync->rach_ConfigDedicated->present == NR_ReconfigurationWithSync__rach_ConfigDedicated_PR_uplink, "RACH on supplementaryUplink not supported\n"); - UPDATE_MAC_IE(ra->rach_ConfigDedicated, reconfigurationWithSync->rach_ConfigDedicated->choice.uplink, NR_RACH_ConfigDedicated_t); + UPDATE_IE(ra->rach_ConfigDedicated, reconfigurationWithSync->rach_ConfigDedicated->choice.uplink, NR_RACH_ConfigDedicated_t); } if (reconfigurationWithSync->spCellConfigCommon) { @@ -1448,7 +1448,7 @@ static void handle_reconfiguration_with_sync(NR_UE_MAC_INST_t *mac, if (scc->physCellId) mac->physCellId = *scc->physCellId; mac->dmrs_TypeA_Position = scc->dmrs_TypeA_Position; - UPDATE_MAC_IE(mac->tdd_UL_DL_ConfigurationCommon, scc->tdd_UL_DL_ConfigurationCommon, NR_TDD_UL_DL_ConfigCommon_t); + UPDATE_IE(mac->tdd_UL_DL_ConfigurationCommon, scc->tdd_UL_DL_ConfigurationCommon, NR_TDD_UL_DL_ConfigCommon_t); config_common_ue(mac, scc, cc_idP); if (scc->downlinkConfigCommon) configure_common_BWP_dl(mac, @@ -1549,9 +1549,9 @@ static void configure_maccellgroup(NR_UE_MAC_INST_t *mac, const NR_MAC_CellGroup static void configure_csi_resourcemapping(NR_CSI_RS_ResourceMapping_t *target, NR_CSI_RS_ResourceMapping_t *source) { if (target->frequencyDomainAllocation.present != source->frequencyDomainAllocation.present) { - UPDATE_MAC_NP_IE(target->frequencyDomainAllocation, - source->frequencyDomainAllocation, - struct NR_CSI_RS_ResourceMapping__frequencyDomainAllocation); + UPDATE_NP_IE(target->frequencyDomainAllocation, + source->frequencyDomainAllocation, + struct NR_CSI_RS_ResourceMapping__frequencyDomainAllocation); } else { switch (source->frequencyDomainAllocation.present) { @@ -1597,7 +1597,7 @@ static void configure_csi_resourcemapping(NR_CSI_RS_ResourceMapping_t *target, N } target->nrofPorts = source->nrofPorts; target->firstOFDMSymbolInTimeDomain = source->firstOFDMSymbolInTimeDomain; - UPDATE_MAC_IE(target->firstOFDMSymbolInTimeDomain2, source->firstOFDMSymbolInTimeDomain2, long); + UPDATE_IE(target->firstOFDMSymbolInTimeDomain2, source->firstOFDMSymbolInTimeDomain2, long); target->cdm_Type = source->cdm_Type; target->density = source->density; target->freqBand = source->freqBand; @@ -1607,24 +1607,24 @@ static void configure_csirs_resource(NR_NZP_CSI_RS_Resource_t *target, NR_NZP_CS { configure_csi_resourcemapping(&target->resourceMapping, &source->resourceMapping); target->powerControlOffset = source->powerControlOffset; - UPDATE_MAC_IE(target->powerControlOffsetSS, source->powerControlOffsetSS, long); + UPDATE_IE(target->powerControlOffsetSS, source->powerControlOffsetSS, long); target->scramblingID = source->scramblingID; if (source->periodicityAndOffset) - UPDATE_MAC_IE(target->periodicityAndOffset, source->periodicityAndOffset, NR_CSI_ResourcePeriodicityAndOffset_t); + UPDATE_IE(target->periodicityAndOffset, source->periodicityAndOffset, NR_CSI_ResourcePeriodicityAndOffset_t); if (source->qcl_InfoPeriodicCSI_RS) - UPDATE_MAC_IE(target->qcl_InfoPeriodicCSI_RS, source->qcl_InfoPeriodicCSI_RS, NR_TCI_StateId_t); + UPDATE_IE(target->qcl_InfoPeriodicCSI_RS, source->qcl_InfoPeriodicCSI_RS, NR_TCI_StateId_t); } static void configure_csiim_resource(NR_CSI_IM_Resource_t *target, NR_CSI_IM_Resource_t *source) { if (source->csi_IM_ResourceElementPattern) - UPDATE_MAC_IE(target->csi_IM_ResourceElementPattern, - source->csi_IM_ResourceElementPattern, - struct NR_CSI_IM_Resource__csi_IM_ResourceElementPattern); + UPDATE_IE(target->csi_IM_ResourceElementPattern, + source->csi_IM_ResourceElementPattern, + struct NR_CSI_IM_Resource__csi_IM_ResourceElementPattern); if (source->freqBand) - UPDATE_MAC_IE(target->freqBand, source->freqBand, NR_CSI_FrequencyOccupation_t); + UPDATE_IE(target->freqBand, source->freqBand, NR_CSI_FrequencyOccupation_t); if (source->periodicityAndOffset) - UPDATE_MAC_IE(target->periodicityAndOffset, source->periodicityAndOffset, NR_CSI_ResourcePeriodicityAndOffset_t); + UPDATE_IE(target->periodicityAndOffset, source->periodicityAndOffset, NR_CSI_ResourcePeriodicityAndOffset_t); } static void configure_csiconfig(NR_UE_ServingCell_Info_t *sc_info, struct NR_SetupRelease_CSI_MeasConfig *csi_MeasConfig_sr) @@ -1637,12 +1637,12 @@ static void configure_csiconfig(NR_UE_ServingCell_Info_t *sc_info, struct NR_Set break; case NR_SetupRelease_CSI_MeasConfig_PR_setup: if (!sc_info->csi_MeasConfig) { // setup - UPDATE_MAC_IE(sc_info->csi_MeasConfig, csi_MeasConfig_sr->choice.setup, NR_CSI_MeasConfig_t); + UPDATE_IE(sc_info->csi_MeasConfig, csi_MeasConfig_sr->choice.setup, NR_CSI_MeasConfig_t); } else { // modification NR_CSI_MeasConfig_t *target = sc_info->csi_MeasConfig; NR_CSI_MeasConfig_t *csi_MeasConfig = csi_MeasConfig_sr->choice.setup; if (csi_MeasConfig->reportTriggerSize) - UPDATE_MAC_IE(target->reportTriggerSize, csi_MeasConfig->reportTriggerSize, long); + UPDATE_IE(target->reportTriggerSize, csi_MeasConfig->reportTriggerSize, long); if (csi_MeasConfig->aperiodicTriggerStateList) HANDLE_SETUPRELEASE_DIRECT(sc_info->aperiodicTriggerStateList, csi_MeasConfig->aperiodicTriggerStateList, @@ -1766,9 +1766,9 @@ static void configure_servingcell_info(NR_UE_ServingCell_Info_t *sc_info, NR_Ser configure_csiconfig(sc_info, scd->csi_MeasConfig); if (scd->supplementaryUplink) - UPDATE_MAC_IE(sc_info->supplementaryUplink, scd->supplementaryUplink, NR_UplinkConfig_t); + UPDATE_IE(sc_info->supplementaryUplink, scd->supplementaryUplink, NR_UplinkConfig_t); if (scd->crossCarrierSchedulingConfig) - UPDATE_MAC_IE(sc_info->crossCarrierSchedulingConfig, scd->crossCarrierSchedulingConfig, NR_CrossCarrierSchedulingConfig_t); + UPDATE_IE(sc_info->crossCarrierSchedulingConfig, scd->crossCarrierSchedulingConfig, NR_CrossCarrierSchedulingConfig_t); if (scd->pdsch_ServingCellConfig) { switch (scd->pdsch_ServingCellConfig->present) { case NR_SetupRelease_PDSCH_ServingCellConfig_PR_NOTHING: @@ -1793,9 +1793,9 @@ static void configure_servingcell_info(NR_UE_ServingCell_Info_t *sc_info, NR_Ser pdsch_servingcellconfig->codeBlockGroupTransmission, NR_PDSCH_CodeBlockGroupTransmission_t, asn_DEF_NR_PDSCH_CodeBlockGroupTransmission); - UPDATE_MAC_IE(sc_info->xOverhead_PDSCH, pdsch_servingcellconfig->xOverhead, long); + UPDATE_IE(sc_info->xOverhead_PDSCH, pdsch_servingcellconfig->xOverhead, long); if (pdsch_servingcellconfig->ext1 && pdsch_servingcellconfig->ext1->maxMIMO_Layers) - UPDATE_MAC_IE(sc_info->maxMIMO_Layers_PDSCH, pdsch_servingcellconfig->ext1->maxMIMO_Layers, long); + UPDATE_IE(sc_info->maxMIMO_Layers_PDSCH, pdsch_servingcellconfig->ext1->maxMIMO_Layers, long); break; } default: @@ -1825,10 +1825,10 @@ static void configure_servingcell_info(NR_UE_ServingCell_Info_t *sc_info, NR_Ser break; case NR_SetupRelease_PUSCH_ServingCellConfig_PR_setup: { NR_PUSCH_ServingCellConfig_t *pusch_servingcellconfig = scd->uplinkConfig->pusch_ServingCellConfig->choice.setup; - UPDATE_MAC_IE(sc_info->rateMatching_PUSCH, pusch_servingcellconfig->rateMatching, long); - UPDATE_MAC_IE(sc_info->xOverhead_PUSCH, pusch_servingcellconfig->xOverhead, long); + UPDATE_IE(sc_info->rateMatching_PUSCH, pusch_servingcellconfig->rateMatching, long); + UPDATE_IE(sc_info->xOverhead_PUSCH, pusch_servingcellconfig->xOverhead, long); if (pusch_servingcellconfig->ext1 && pusch_servingcellconfig->ext1->maxMIMO_Layers) - UPDATE_MAC_IE(sc_info->maxMIMO_Layers_PUSCH, pusch_servingcellconfig->ext1->maxMIMO_Layers, long); + UPDATE_IE(sc_info->maxMIMO_Layers_PUSCH, pusch_servingcellconfig->ext1->maxMIMO_Layers, long); if (pusch_servingcellconfig->codeBlockGroupTransmission) HANDLE_SETUPRELEASE_DIRECT(sc_info->pusch_CGB_Transmission, pusch_servingcellconfig->codeBlockGroupTransmission, diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h index ec3a0d608f..7322024e7b 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h @@ -41,111 +41,6 @@ #define NR_DL_MAX_DAI (4) /* TS 38.213 table 9.1.3-1 Value of counter DAI for DCI format 1_0 and 1_1 */ #define NR_DL_MAX_NB_CW (2) /* number of downlink code word */ -// Macro updates DESTINATION with configuration from ORIGIN by swapping pointers -// Old configuration is freed after completing configuration -#define UPDATE_MAC_IE(DESTINATION, ORIGIN, TYPE) \ - do { \ - TYPE *tmp = ORIGIN; \ - ORIGIN = DESTINATION; \ - DESTINATION = tmp; \ - } while(0); \ - -// Same as above but swapping ASN1 elements that are not pointers -#define UPDATE_MAC_NP_IE(DESTINATION, ORIGIN, TYPE) \ - do { \ - TYPE tmp = ORIGIN; \ - ORIGIN = DESTINATION; \ - DESTINATION = tmp; \ - } while(0); \ - -// Macro handles reception of SetupRelease element ORIGIN (see NR_SetupRelease.h) -// If release (NR_SetupRelease_xxx_PR_release equivalent to 1), removing structure from DESTINATION -// If setup (NR_SetupRelease_xxx_PR_setup equivalent to 2), add or modify structure in DESTINATION -// Destination is not a SetupRelease structure -#define HANDLE_SETUPRELEASE_DIRECT(DESTINATION, ORIGIN, TYPE, ASN_DEF) \ - do { \ - if (ORIGIN->present == 1) { \ - asn1cFreeStruc(ASN_DEF, DESTINATION); \ - } \ - if (ORIGIN->present == 2) \ - UPDATE_MAC_IE(DESTINATION, ORIGIN->choice.setup, TYPE); \ - } while(0); \ - -// Macro handles reception of SetupRelease element ORIGIN (see NR_SetupRelease.h) -// If release (NR_SetupRelease_xxx_PR_release equivalent to 1), removing structure from DESTINATION -// If setup (NR_SetupRelease_xxx_PR_setup equivalent to 2), add or modify structure in DESTINATION -// Destination is a SetupRelease structure -#define HANDLE_SETUPRELEASE_IE(DESTINATION, ORIGIN, TYPE, ASN_DEF) \ - do { \ - if (ORIGIN->present == 1) { \ - asn1cFreeStruc(ASN_DEF, DESTINATION); \ - } \ - if (ORIGIN->present == 2) { \ - if (!DESTINATION) \ - DESTINATION = calloc(1, sizeof(*DESTINATION)); \ - DESTINATION->present = ORIGIN->present; \ - UPDATE_MAC_IE(DESTINATION->choice.setup, ORIGIN->choice.setup, TYPE); \ - } \ - } while(0); \ - -// Macro releases entries in list TARGET if the corresponding ID is found in list SOURCE. -// Prints an error if ID not found in list. -#define RELEASE_IE_FROMLIST(SOURCE, TARGET, FIELD) \ - do { \ - for (int iI = 0; iI < SOURCE->list.count; iI++) { \ - long eL = *SOURCE->list.array[iI]; \ - int iJ; \ - for (iJ = 0; iJ < TARGET->list.count; iJ++) { \ - if (eL == TARGET->list.array[iJ]->FIELD) \ - break; \ - } \ - if (iJ == TARGET->list.count) \ - asn_sequence_del(&TARGET->list, iJ, 1); \ - else \ - LOG_E(NR_MAC, "Element not present in the list, impossible to release\n"); \ - } \ - } while (0) \ - -// Macro adds or modifies entries of type TYPE in list TARGET with elements received in list SOURCE -#define ADDMOD_IE_FROMLIST(SOURCE, TARGET, FIELD, TYPE) \ - do { \ - for (int iI = 0; iI < SOURCE->list.count; iI++) { \ - long eL = SOURCE->list.array[iI]->FIELD; \ - int iJ; \ - for (iJ = 0; iJ < TARGET->list.count; iJ++) { \ - if (eL == TARGET->list.array[iJ]->FIELD) \ - break; \ - } \ - if (iJ == TARGET->list.count) { \ - TYPE *nEW = calloc(1, sizeof(*nEW)); \ - ASN_SEQUENCE_ADD(&TARGET->list, nEW); \ - } \ - UPDATE_MAC_IE(TARGET->list.array[iJ], \ - SOURCE->list.array[iI], \ - TYPE); \ - } \ - } while (0) \ - -// Macro adds or modifies entries of type TYPE in list TARGET with elements received in list SOURCE -// Action performed by function FUNC -#define ADDMOD_IE_FROMLIST_WFUNCTION(SOURCE, TARGET, FIELD, TYPE, FUNC) \ - do { \ - for (int iI = 0; iI < SOURCE->list.count; iI++) { \ - long eL = SOURCE->list.array[iI]->FIELD; \ - int iJ; \ - for (iJ = 0; iJ < TARGET->list.count; iJ++) { \ - if (eL == TARGET->list.array[iJ]->FIELD) \ - break; \ - } \ - if (iJ == TARGET->list.count) { \ - TYPE *nEW = calloc(1, sizeof(*nEW)); \ - ASN_SEQUENCE_ADD(&TARGET->list, nEW); \ - } \ - FUNC(TARGET->list.array[iJ], \ - SOURCE->list.array[iI]); \ - } \ - } while (0) - /**\brief initialize the field in nr_mac instance \param mac MAC pointer */ void nr_ue_init_mac(NR_UE_MAC_INST_t *mac); diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index 50ca63e178..dc60308d34 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -150,7 +150,7 @@ static void nr_rrc_ue_process_masterCellGroup(NR_UE_RRC_INST_t *rrc, OCTET_STRING_t *masterCellGroup, long *fullConfig); -void nr_rrc_ue_process_measConfig(rrcPerNB_t *rrc, NR_MeasConfig_t *const measConfig); +static void nr_rrc_ue_process_measConfig(rrcPerNB_t *rrc, NR_MeasConfig_t *const measConfig, NR_UE_Timers_Constants_t *timers); static NR_RB_status_t get_DRB_status(const NR_UE_RRC_INST_t *rrc, NR_DRB_Identity_t drb_id) { @@ -230,8 +230,7 @@ static void nr_rrc_ue_process_rrcReconfiguration(NR_UE_RRC_INST_t *rrc, } if (ie->measConfig != NULL) { LOG_I(NR_RRC, "Measurement Configuration is present\n"); - // if some element need to be updated - nr_rrc_ue_process_measConfig(rrcNB, ie->measConfig); + nr_rrc_ue_process_measConfig(rrcNB, ie->measConfig, &rrc->timers_and_constants); } if (ie->lateNonCriticalExtension != NULL) { // unuse now @@ -1107,109 +1106,249 @@ static void nr_rrc_ue_process_securityModeCommand(NR_UE_RRC_INST_t *ue_rrc, securityModeCommand->criticalExtensions.present); } - //----------------------------------------------------------------------------- -void nr_rrc_ue_process_measConfig(rrcPerNB_t *rrc, NR_MeasConfig_t *const measConfig) -//----------------------------------------------------------------------------- +static void handle_meas_reporting_remove(rrcPerNB_t *rrc, int id, NR_UE_Timers_Constants_t *timers) { - int i; - long ind; - NR_MeasObjectToAddMod_t *measObj = NULL; - NR_ReportConfigToAddMod_t *reportConfig = NULL; + // remove the measurement reporting entry for this measId if included + asn1cFreeStruc(asn_DEF_NR_VarMeasReport, rrc->MeasReport[id]); + // TODO stop the periodical reporting timer or timer T321, whichever is running, + // and reset the associated information (e.g. timeToTrigger) for this measId + nr_timer_stop(&timers->T321); +} - if (measConfig->measObjectToRemoveList != NULL) { - for (i = 0; i < measConfig->measObjectToRemoveList->list.count; i++) { - ind = *measConfig->measObjectToRemoveList->list.array[i]; - free(rrc->MeasObj[ind - 1]); - } - } - - if (measConfig->measObjectToAddModList != NULL) { - LOG_I(NR_RRC, "Measurement Object List is present\n"); - for (i = 0; i < measConfig->measObjectToAddModList->list.count; i++) { - measObj = measConfig->measObjectToAddModList->list.array[i]; - ind = measConfig->measObjectToAddModList->list.array[i]->measObjectId; - - if (rrc->MeasObj[ind - 1]) { - LOG_D(NR_RRC, "Modifying measurement object %ld\n", ind); - memcpy(rrc->MeasObj[ind - 1], (char *)measObj, sizeof(NR_MeasObjectToAddMod_t)); - } else { - LOG_I(NR_RRC, "Adding measurement object %ld\n", ind); - - if (measObj->measObject.present == NR_MeasObjectToAddMod__measObject_PR_measObjectNR) { - rrc->MeasObj[ind - 1] = measObj; - } - } - } - - LOG_I(NR_RRC, "call rrc_mac_config_req \n"); - // rrc_mac_config_req_ue - } - - if (measConfig->reportConfigToRemoveList != NULL) { - for (i = 0; i < measConfig->reportConfigToRemoveList->list.count; i++) { - ind = *measConfig->reportConfigToRemoveList->list.array[i]; - free(rrc->ReportConfig[ind - 1]); - } - } - - if (measConfig->reportConfigToAddModList != NULL) { - LOG_I(NR_RRC, "Report Configuration List is present\n"); - for (i = 0; i < measConfig->reportConfigToAddModList->list.count; i++) { - ind = measConfig->reportConfigToAddModList->list.array[i]->reportConfigId; - reportConfig = measConfig->reportConfigToAddModList->list.array[i]; - - if (rrc->ReportConfig[ind - 1]) { - LOG_I(NR_RRC, "Modifying Report Configuration %ld\n", ind - 1); - memcpy(rrc->ReportConfig[ind - 1], - (char *)measConfig->reportConfigToAddModList->list.array[i], - sizeof(NR_ReportConfigToAddMod_t)); - } else { - LOG_D(NR_RRC, "Adding Report Configuration %ld %p \n", ind - 1, measConfig->reportConfigToAddModList->list.array[i]); - if (reportConfig->reportConfig.present == NR_ReportConfigToAddMod__reportConfig_PR_reportConfigNR) { - rrc->ReportConfig[ind - 1] = measConfig->reportConfigToAddModList->list.array[i]; +static void handle_measobj_remove(rrcPerNB_t *rrc, struct NR_MeasObjectToRemoveList *remove_list, NR_UE_Timers_Constants_t *timers) +{ + // section 5.5.2.4 in 38.331 + for (int i = 0; i < remove_list->list.count; i++) { + // for each measObjectId included in the received measObjectToRemoveList + // that is part of measObjectList in the configuration + NR_MeasObjectId_t id = *remove_list->list.array[i]; + if (rrc->MeasObj[id - 1]) { + // remove the entry with the matching measObjectId from the measObjectList + asn1cFreeStruc(asn_DEF_NR_MeasObjectToAddMod, rrc->MeasObj[id - 1]); + // remove all measId associated with this measObjectId from the measIdList + for (int j = 0; j < MAX_MEAS_ID; j++) { + if (rrc->MeasId[j] && rrc->MeasId[j]->measObjectId == id) { + asn1cFreeStruc(asn_DEF_NR_MeasIdToAddMod, rrc->MeasId[j]); + handle_meas_reporting_remove(rrc, j, timers); } } } } +} - if (measConfig->measIdToRemoveList != NULL) { - for (i = 0; i < measConfig->measIdToRemoveList->list.count; i++) { - ind = *measConfig->measIdToRemoveList->list.array[i]; - free(rrc->MeasId[ind - 1]); +static void update_ssb_configmob(NR_SSB_ConfigMobility_t *source, NR_SSB_ConfigMobility_t *target) +{ + if (source->ssb_ToMeasure) + HANDLE_SETUPRELEASE_IE(target->ssb_ToMeasure, source->ssb_ToMeasure, NR_SSB_ToMeasure_t, asn_DEF_NR_SSB_ToMeasure); + target->deriveSSB_IndexFromCell = source->deriveSSB_IndexFromCell; + if (source->ss_RSSI_Measurement) + UPDATE_IE(target->ss_RSSI_Measurement, source->ss_RSSI_Measurement, NR_SS_RSSI_Measurement_t); +} + +static void update_nr_measobj(NR_MeasObjectNR_t *source, NR_MeasObjectNR_t *target) +{ + UPDATE_IE(target->ssbFrequency, source->ssbFrequency, NR_ARFCN_ValueNR_t); + UPDATE_IE(target->ssbSubcarrierSpacing, source->ssbSubcarrierSpacing, NR_SubcarrierSpacing_t); + UPDATE_IE(target->smtc1, source->smtc1, NR_SSB_MTC_t); + if (source->smtc2) { + target->smtc2->periodicity = source->smtc2->periodicity; + if (source->smtc2->pci_List) + UPDATE_IE(target->smtc2->pci_List, source->smtc2->pci_List, struct NR_SSB_MTC2__pci_List); + } + else + asn1cFreeStruc(asn_DEF_NR_SSB_MTC2, target->smtc2); + UPDATE_IE(target->refFreqCSI_RS, source->refFreqCSI_RS, NR_ARFCN_ValueNR_t); + if (source->referenceSignalConfig.ssb_ConfigMobility) + update_ssb_configmob(source->referenceSignalConfig.ssb_ConfigMobility, target->referenceSignalConfig.ssb_ConfigMobility); + UPDATE_IE(target->absThreshSS_BlocksConsolidation, source->absThreshSS_BlocksConsolidation, NR_ThresholdNR_t); + UPDATE_IE(target->absThreshCSI_RS_Consolidation, source->absThreshCSI_RS_Consolidation, NR_ThresholdNR_t); + UPDATE_IE(target->nrofSS_BlocksToAverage, source->nrofSS_BlocksToAverage, long); + UPDATE_IE(target->nrofCSI_RS_ResourcesToAverage, source->nrofCSI_RS_ResourcesToAverage, long); + target->quantityConfigIndex = source->quantityConfigIndex; + target->offsetMO = source->offsetMO; + if (source->cellsToRemoveList) { + RELEASE_IE_FROMLIST(source->cellsToRemoveList, target->cellsToAddModList, physCellId); + } + if (source->cellsToAddModList) { + if (!target->cellsToAddModList) + target->cellsToAddModList = calloc(1, sizeof(*target->cellsToAddModList)); + ADDMOD_IE_FROMLIST(source->cellsToAddModList, target->cellsToAddModList, physCellId, NR_CellsToAddMod_t); + } + if (source->excludedCellsToRemoveList) { + RELEASE_IE_FROMLIST(source->excludedCellsToRemoveList, target->excludedCellsToAddModList, pci_RangeIndex); + } + if (source->excludedCellsToAddModList) { + if (!target->excludedCellsToAddModList) + target->excludedCellsToAddModList = calloc(1, sizeof(*target->excludedCellsToAddModList)); + ADDMOD_IE_FROMLIST(source->excludedCellsToAddModList, target->excludedCellsToAddModList, pci_RangeIndex, NR_PCI_RangeElement_t); + } + if (source->allowedCellsToRemoveList) { + RELEASE_IE_FROMLIST(source->allowedCellsToRemoveList, target->allowedCellsToAddModList, pci_RangeIndex); + } + if (source->allowedCellsToAddModList) { + if (!target->allowedCellsToAddModList) + target->allowedCellsToAddModList = calloc(1, sizeof(*target->allowedCellsToAddModList)); + ADDMOD_IE_FROMLIST(source->allowedCellsToAddModList, target->allowedCellsToAddModList, pci_RangeIndex, NR_PCI_RangeElement_t); + } + if (source->ext1) { + UPDATE_IE(target->ext1->freqBandIndicatorNR, source->ext1->freqBandIndicatorNR, NR_FreqBandIndicatorNR_t); + UPDATE_IE(target->ext1->measCycleSCell, source->ext1->measCycleSCell, long); + } +} + +static void handle_measobj_addmod(rrcPerNB_t *rrc, struct NR_MeasObjectToAddModList *addmod_list) +{ + // section 5.5.2.5 in 38.331 + for (int i = 0; i < addmod_list->list.count; i++) { + NR_MeasObjectToAddMod_t *measObj = addmod_list->list.array[i]; + if (measObj->measObject.present != NR_MeasObjectToAddMod__measObject_PR_measObjectNR) { + LOG_E(NR_RRC, "Cannot handle MeasObjt other than NR\n"); + continue; + } + NR_MeasObjectId_t id = measObj->measObjectId; + if (rrc->MeasObj[id]) { + update_nr_measobj(measObj->measObject.choice.measObjectNR, rrc->MeasObj[id]->measObject.choice.measObjectNR); + } + else { + // add a new entry for the received measObject to the measObjectList + UPDATE_IE(rrc->MeasObj[id], addmod_list->list.array[i], NR_MeasObjectToAddMod_t); } } +} - if (measConfig->measIdToAddModList != NULL) { - for (i = 0; i < measConfig->measIdToAddModList->list.count; i++) { - ind = measConfig->measIdToAddModList->list.array[i]->measId; - - if (rrc->MeasId[ind - 1]) { - LOG_D(NR_RRC, "Modifying Measurement ID %ld\n", ind - 1); - memcpy(rrc->MeasId[ind - 1], (char *)measConfig->measIdToAddModList->list.array[i], sizeof(NR_MeasIdToAddMod_t)); - } else { - LOG_D(NR_RRC, "Adding Measurement ID %ld %p\n", ind - 1, measConfig->measIdToAddModList->list.array[i]); - rrc->MeasId[ind - 1] = measConfig->measIdToAddModList->list.array[i]; +static void handle_reportconfig_remove(rrcPerNB_t *rrc, + struct NR_ReportConfigToRemoveList *remove_list, + NR_UE_Timers_Constants_t *timers) +{ + for (int i = 0; i < remove_list->list.count; i++) { + NR_ReportConfigId_t id = *remove_list->list.array[i]; + // remove the entry with the matching reportConfigId from the reportConfigList + asn1cFreeStruc(asn_DEF_NR_ReportConfigToAddMod, rrc->ReportConfig[id]); + for (int j = 0; j < MAX_MEAS_ID; j++) { + if (rrc->MeasId[j] && rrc->MeasId[j]->reportConfigId == id) { + // remove all measId associated with the reportConfigId from the measIdList + asn1cFreeStruc(asn_DEF_NR_MeasIdToAddMod, rrc->MeasId[j]); + handle_meas_reporting_remove(rrc, j, timers); } } } +} - if (measConfig->quantityConfig != NULL) { - if (rrc->QuantityConfig) { - LOG_D(NR_RRC, "Modifying Quantity Configuration \n"); - memcpy(rrc->QuantityConfig, (char *)measConfig->quantityConfig, sizeof(NR_QuantityConfig_t)); - } else { - LOG_D(NR_RRC, "Adding Quantity configuration\n"); - rrc->QuantityConfig = measConfig->quantityConfig; +static void handle_reportconfig_addmod(rrcPerNB_t *rrc, + struct NR_ReportConfigToAddModList *addmod_list, + NR_UE_Timers_Constants_t *timers) +{ + for (int i = 0; i < addmod_list->list.count; i++) { + NR_ReportConfigToAddMod_t *rep = addmod_list->list.array[i]; + if (rep->reportConfig.present != NR_ReportConfigToAddMod__reportConfig_PR_reportConfigNR) { + LOG_E(NR_RRC, "Cannot handle reportConfig type other than NR\n"); + continue; + } + NR_ReportConfigId_t id = rep->reportConfigId; + if (rrc->ReportConfig[id]) { + for (int j = 0; j < MAX_MEAS_ID; j++) { + // for each measId associated with this reportConfigId included in the measIdList + if (rrc->MeasId[j] && rrc->MeasId[j]->reportConfigId == id) + handle_meas_reporting_remove(rrc, j, timers); + } + } + UPDATE_IE(rrc->ReportConfig[id], addmod_list->list.array[i], NR_ReportConfigToAddMod_t); + } +} + +static void handle_quantityconfig(rrcPerNB_t *rrc, NR_QuantityConfig_t *quantityConfig, NR_UE_Timers_Constants_t *timers) +{ + if (quantityConfig->quantityConfigNR_List) { + for (int i = 0; i < quantityConfig->quantityConfigNR_List->list.count; i++) { + NR_QuantityConfigNR_t *quantityNR = quantityConfig->quantityConfigNR_List->list.array[i]; + if (!rrc->QuantityConfig[i]) + rrc->QuantityConfig[i] = calloc(1, sizeof(*rrc->QuantityConfig[i])); + rrc->QuantityConfig[i]->quantityConfigCell = quantityNR->quantityConfigCell; + if (quantityNR->quantityConfigRS_Index) + UPDATE_IE(rrc->QuantityConfig[i]->quantityConfigRS_Index, quantityNR->quantityConfigRS_Index, struct NR_QuantityConfigRS); } } + for (int j = 0; j < MAX_MEAS_ID; j++) { + // for each measId included in the measIdList + if (rrc->MeasId[j]) + handle_meas_reporting_remove(rrc, j, timers); + } +} - if (measConfig->measGapConfig != NULL) { - if (rrc->measGapConfig) { - memcpy(rrc->measGapConfig, (char *)measConfig->measGapConfig, sizeof(NR_MeasGapConfig_t)); - } else { - rrc->measGapConfig = measConfig->measGapConfig; +static void handle_measid_remove(rrcPerNB_t *rrc, struct NR_MeasIdToRemoveList *remove_list, NR_UE_Timers_Constants_t *timers) +{ + for (int i = 0; i < remove_list->list.count; i++) { + NR_MeasId_t id = *remove_list->list.array[i]; + if (rrc->MeasId[id]) { + asn1cFreeStruc(asn_DEF_NR_MeasIdToAddMod, rrc->MeasId[id]); + handle_meas_reporting_remove(rrc, id, timers); } } +} + +static void handle_measid_addmod(rrcPerNB_t *rrc, struct NR_MeasIdToAddModList *addmod_list, NR_UE_Timers_Constants_t *timers) +{ + for (int i = 0; i < addmod_list->list.count; i++) { + NR_MeasId_t id = addmod_list->list.array[i]->measId; + NR_ReportConfigId_t reportId = addmod_list->list.array[i]->reportConfigId; + NR_MeasObjectId_t measObjectId = addmod_list->list.array[i]->measObjectId; + UPDATE_IE(rrc->MeasId[id], addmod_list->list.array[i], NR_MeasIdToAddMod_t); + handle_meas_reporting_remove(rrc, id, timers); + if (rrc->ReportConfig[reportId]) { + NR_ReportConfigToAddMod_t *report = rrc->ReportConfig[reportId]; + AssertFatal(report->reportConfig.present == NR_ReportConfigToAddMod__reportConfig_PR_reportConfigNR, + "Only NR config report is supported\n"); + NR_ReportConfigNR_t *reportNR = report->reportConfig.choice.reportConfigNR; + // if the reportType is set to reportCGI in the reportConfig associated with this measId + if (reportNR->reportType.present == NR_ReportConfigNR__reportType_PR_reportCGI) { + if (rrc->MeasObj[measObjectId]) { + if (rrc->MeasObj[measObjectId]->measObject.present == NR_MeasObjectToAddMod__measObject_PR_measObjectNR) { + NR_MeasObjectNR_t *obj_nr = rrc->MeasObj[measObjectId]->measObject.choice.measObjectNR; + NR_ARFCN_ValueNR_t freq = 0; + if (obj_nr->ssbFrequency) + freq = *obj_nr->ssbFrequency; + else if (obj_nr->refFreqCSI_RS) + freq = *obj_nr->refFreqCSI_RS; + AssertFatal(freq > 0, "Invalid ARFCN frequency for this measurement object\n"); + if (freq > 2016666) + nr_timer_setup(&timers->T321, 16000, 10); // 16 seconds for FR2 + else + nr_timer_setup(&timers->T321, 2000, 10); // 2 seconds for FR1 + } + else // EUTRA + nr_timer_setup(&timers->T321, 1000, 10); // 1 second for EUTRA + nr_timer_start(&timers->T321); + } + } + } + } +} + +static void nr_rrc_ue_process_measConfig(rrcPerNB_t *rrc, NR_MeasConfig_t *const measConfig, NR_UE_Timers_Constants_t *timers) +{ + if (measConfig->measObjectToRemoveList) + handle_measobj_remove(rrc, measConfig->measObjectToRemoveList, timers); + + if (measConfig->measObjectToAddModList) + handle_measobj_addmod(rrc, measConfig->measObjectToAddModList); + + if (measConfig->reportConfigToRemoveList) + handle_reportconfig_remove(rrc, measConfig->reportConfigToRemoveList, timers); + + if (measConfig->reportConfigToAddModList) + handle_reportconfig_addmod(rrc, measConfig->reportConfigToAddModList, timers); + + if (measConfig->quantityConfig) + handle_quantityconfig(rrc, measConfig->quantityConfig, timers); + + if (measConfig->measIdToRemoveList) + handle_measid_remove(rrc, measConfig->measIdToRemoveList, timers); + + if (measConfig->measIdToAddModList) + handle_measid_addmod(rrc, measConfig->measIdToAddModList, timers); + + AssertFatal(!measConfig->measGapConfig, "Measurement gaps not yet supported\n"); + AssertFatal(!measConfig->measGapSharingConfig, "Measurement gaps not yet supported\n"); if (measConfig->s_MeasureConfig) { if (measConfig->s_MeasureConfig->present == NR_MeasConfig__s_MeasureConfig_PR_ssb_RSRP) { diff --git a/openair2/RRC/NR_UE/rrc_defs.h b/openair2/RRC/NR_UE/rrc_defs.h index df9533ce65..936247f655 100644 --- a/openair2/RRC/NR_UE/rrc_defs.h +++ b/openair2/RRC/NR_UE/rrc_defs.h @@ -57,6 +57,8 @@ #include "NR_SL-PreconfigurationNR-r16.h" #include "NR_MasterInformationBlockSidelink.h" #include "NR_ReestablishmentCause.h" +#include "NR_MeasurementReport.h" +#include "NR_VarMeasReport.h" #include "RRC/NR/nr_rrc_common.h" #include "as_message.h" @@ -66,6 +68,7 @@ #define MAX_MEAS_OBJ 7 #define MAX_MEAS_CONFIG 7 #define MAX_MEAS_ID 7 +#define MAX_QUANTITY_CONFIG 2 typedef uint32_t channel_t; @@ -154,6 +157,7 @@ typedef struct NR_UE_Timers_Constants_s { NR_timer_t T311; NR_timer_t T319; NR_timer_t T320; + NR_timer_t T321; NR_timer_t T325; NR_timer_t T390; // counters @@ -174,8 +178,9 @@ typedef enum { RB_NOT_PRESENT, RB_ESTABLISHED, RB_SUSPENDED } NR_RB_status_t; typedef struct rrcPerNB { NR_MeasObjectToAddMod_t *MeasObj[MAX_MEAS_OBJ]; NR_ReportConfigToAddMod_t *ReportConfig[MAX_MEAS_CONFIG]; - NR_QuantityConfig_t *QuantityConfig; + NR_QuantityConfigNR_t *QuantityConfig[MAX_QUANTITY_CONFIG]; NR_MeasIdToAddMod_t *MeasId[MAX_MEAS_ID]; + NR_VarMeasReport_t *MeasReport[MAX_MEAS_ID]; NR_MeasGapConfig_t *measGapConfig; NR_UE_RRC_SI_INFO SInfo; NR_RSRP_Range_t s_measure;