From daf8e3732f67f9347c6792a01e4824f14176a4b7 Mon Sep 17 00:00:00 2001 From: Raghavendra Dinavahi Date: Thu, 29 Jun 2023 17:55:55 +0200 Subject: [PATCH 1/4] Preparation of NR Sidelink Pre-Configuration message --- CMakeLists.txt | 1 + openair2/RRC/NR_UE/rrc_UE.c | 4 + openair2/RRC/NR_UE/rrc_proto.h | 1 + openair2/RRC/NR_UE/rrc_sl_preconfig.c | 587 ++++++++++++++++++++++++++ 4 files changed, 593 insertions(+) create mode 100644 openair2/RRC/NR_UE/rrc_sl_preconfig.c diff --git a/CMakeLists.txt b/CMakeLists.txt index bef6278246..3b5c9b9abd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1311,6 +1311,7 @@ set(NR_L2_SRC_UE ${NR_UE_RRC_DIR}/rrc_UE.c ${NR_UE_RRC_DIR}/rrc_nsa.c ${NR_UE_RRC_DIR}/rrc_timers_and_constants.c + ${NR_UE_RRC_DIR}/rrc_sl_preconfig.c ) set (MAC_SRC diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index 3ffae4b07d..411d3cbcd2 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -451,6 +451,10 @@ NR_UE_RRC_INST_t* openair_rrc_top_init_ue_nr(char* uecap_file, char* rrc_config_ { LOG_D(NR_RRC, "In NSA mode \n"); } + + if (get_softmodem_params()->sl_mode) { + configure_NR_SL_Preconfig(); + } } else{ NR_UE_rrc_inst = NULL; diff --git a/openair2/RRC/NR_UE/rrc_proto.h b/openair2/RRC/NR_UE/rrc_proto.h index 6d453dbec5..dca74bf481 100644 --- a/openair2/RRC/NR_UE/rrc_proto.h +++ b/openair2/RRC/NR_UE/rrc_proto.h @@ -173,6 +173,7 @@ void handle_rlf_sync(NR_UE_Timers_Constants_t *tac, void nr_rrc_handle_SetupRelease_RLF_TimersAndConstants(NR_UE_RRC_INST_t *rrc, struct NR_SetupRelease_RLF_TimersAndConstants *rlf_TimersAndConstants); +void configure_NR_SL_Preconfig(void); /** @}*/ #endif diff --git a/openair2/RRC/NR_UE/rrc_sl_preconfig.c b/openair2/RRC/NR_UE/rrc_sl_preconfig.c new file mode 100644 index 0000000000..a9eb1ce282 --- /dev/null +++ b/openair2/RRC/NR_UE/rrc_sl_preconfig.c @@ -0,0 +1,587 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/* \file rrc_sl_preconfig.c + * \brief Preparation of Sidelink-Preconfiguration message + * \author Raghavendra Dinavahi + * \date + * \version + * \company Fraunhofer IIS + * \email + * \note + * \warning + */ + +#define RRC_SL_PRECONFIG +#define RRC_SL_PRECONFIG_C + +#include "oai_asn1.h" +#include "NR_SL-PreconfigurationNR-r16.h" +#include "common/utils/LOG/log.h" + +static void prepare_NR_SL_SyncConfig(NR_SL_SyncConfig_r16_t *sl_syncconfig) { + + // Hysteris when evaluating SyncRef UE + sl_syncconfig->sl_SyncRefMinHyst_r16 = NULL; + + // Hysteris when evaluating SyncRef UE + sl_syncconfig->sl_SyncRefDiffHyst_r16 = NULL; + + // Filtering for SL RSRP + sl_syncconfig->sl_filterCoefficient_r16 = NULL; + + // SSB Periodicity within 16 frames. + sl_syncconfig->sl_SSB_TimeAllocation1_r16 = calloc(1, sizeof(NR_SL_SSB_TimeAllocation_r16_t)); + sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_NumSSB_WithinPeriod_r16 = calloc(1, sizeof(long)); + sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_TimeOffsetSSB_r16 = calloc(1, sizeof(long)); + sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_TimeInterval_r16 = calloc(1, sizeof(long)); + *sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_NumSSB_WithinPeriod_r16 = NR_SL_SSB_TimeAllocation_r16__sl_NumSSB_WithinPeriod_r16_n2; + *sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_TimeOffsetSSB_r16 = 8; + *sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_TimeInterval_r16 = 120; + + sl_syncconfig->sl_SSB_TimeAllocation2_r16 = NULL; + sl_syncconfig->sl_SSB_TimeAllocation3_r16 = NULL; + + //SLSS Id + sl_syncconfig->sl_SSID_r16 = NULL; + + // Threshold to be used in coverage + sl_syncconfig->txParameters_r16.syncTxThreshIC_r16 = NULL; + + // Threshold to be used when Out of coverage + sl_syncconfig->txParameters_r16.syncTxThreshOoC_r16 = NULL; + + // Syncconfig is used when UE is synced to GNSS if set, else if UE is synced to eNB/gNB + sl_syncconfig->gnss_Sync_r16 = calloc(1, sizeof(long)); + *sl_syncconfig->gnss_Sync_r16 = 0; // GNSS +} + +static void prepare_NR_SL_ResourcePool(NR_SL_ResourcePool_r16_t *sl_res_pool, + uint16_t is_txpool, + uint16_t is_sl_syncsource) { + + // PSCCH configuration + sl_res_pool->sl_PSCCH_Config_r16 = calloc(1, sizeof(*sl_res_pool->sl_PSCCH_Config_r16)); + sl_res_pool->sl_PSCCH_Config_r16->present = NR_SetupRelease_SL_PSCCH_Config_r16_PR_setup; + sl_res_pool->sl_PSCCH_Config_r16->choice.setup = calloc(1, sizeof(NR_SL_PSCCH_Config_r16_t)); + // Indicates number of symbols for PSCCH in a resource pool + sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_TimeResourcePSCCH_r16 = calloc(1, sizeof(long)); + *sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_TimeResourcePSCCH_r16 = NR_SL_PSCCH_Config_r16__sl_TimeResourcePSCCH_r16_n3; + + // Indicates number of PRBs for PSCCH in a resource pool + sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_FreqResourcePSCCH_r16 = calloc(1, sizeof(long)); + *sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_FreqResourcePSCCH_r16 = NR_SL_PSCCH_Config_r16__sl_FreqResourcePSCCH_r16_n25; + + // Inititation during PSCCH DMRS Sequence generation + sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_DMRS_ScrambleID_r16 = calloc(1, sizeof(long)); + *sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_DMRS_ScrambleID_r16 = 0; + + // num reserve bits used for first stage SCI + sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_NumReservedBits_r16 = calloc(1, sizeof(long)); + *sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_NumReservedBits_r16 = 2; + + //PSSCH Configuration + sl_res_pool->sl_PSSCH_Config_r16 = calloc(1, sizeof(NR_SetupRelease_SL_PSSCH_Config_r16_t)); + sl_res_pool->sl_PSSCH_Config_r16->present = NR_SetupRelease_SL_PSSCH_Config_r16_PR_setup; + sl_res_pool->sl_PSSCH_Config_r16->choice.setup = calloc(1, sizeof(NR_SL_PSSCH_Config_r16_t)); + sl_res_pool->sl_PSSCH_Config_r16->choice.setup->sl_PSSCH_DMRS_TimePatternList_r16 = + calloc(1, sizeof(*sl_res_pool->sl_PSSCH_Config_r16->choice.setup->sl_PSSCH_DMRS_TimePatternList_r16)); + for(int i=0; i<3; i++) { + long *p = calloc(1, sizeof(long)); + *p = 2+i; // valid values: 2..4 + ASN_SEQUENCE_ADD(&sl_res_pool->sl_PSSCH_Config_r16->choice.setup->sl_PSSCH_DMRS_TimePatternList_r16->list, p); + } + + //PSFCH configuration + sl_res_pool->sl_PSFCH_Config_r16 = NULL; + + // indicates allowed sync sources which are allowed to use this resource pool + sl_res_pool->sl_SyncAllowed_r16 = calloc(1, sizeof(NR_SL_SyncAllowed_r16_t)); + + //configured resources can be used if UE is directly/indirectly synced to network. + sl_res_pool->sl_SyncAllowed_r16->gnbEnb_Sync_r16 = NULL; + + //configured resources can be used if UE is directly/indirectly synced to GNSS. + sl_res_pool->sl_SyncAllowed_r16->gnss_Sync_r16 = calloc(1, sizeof(long)); + *sl_res_pool->sl_SyncAllowed_r16->gnss_Sync_r16 = NR_SL_SyncAllowed_r16__gnss_Sync_r16_true; + + //configured resources can be used if UE is directly/indirectly synced to SYNC REF UE. + sl_res_pool->sl_SyncAllowed_r16->ue_Sync_r16 = calloc(1, sizeof(long)); + *sl_res_pool->sl_SyncAllowed_r16->ue_Sync_r16 = NR_SL_SyncAllowed_r16__ue_Sync_r16_true; + + //Min freq domain resources used for resource sensing. Size of Subchannels + sl_res_pool->sl_SubchannelSize_r16 = calloc(1, sizeof(long)); + *sl_res_pool->sl_SubchannelSize_r16 = NR_SL_ResourcePool_r16__sl_SubchannelSize_r16_n50; + + sl_res_pool->dummy = NULL; + + // lowest RB index of lowest subch in this resource pool + sl_res_pool->sl_StartRB_Subchannel_r16 = calloc(1, sizeof(long)); + *sl_res_pool->sl_StartRB_Subchannel_r16 = 0; // STARTs from RB0 + + //number of subchannels in this res pool. contiguous PRBs + sl_res_pool->sl_NumSubchannel_r16 = calloc(1, sizeof(long)); + *sl_res_pool->sl_NumSubchannel_r16 = 1; + + + // 64QAM table is default. in case other MCS tables needs tobe used. + sl_res_pool->sl_Additional_MCS_Table_r16 = NULL; + + sl_res_pool->sl_ThreshS_RSSI_CBR_r16 = NULL; + sl_res_pool->sl_TimeWindowSizeCBR_r16 = NULL; + sl_res_pool->sl_TimeWindowSizeCR_r16 = NULL; + sl_res_pool->sl_PTRS_Config_r16 = NULL; + sl_res_pool->sl_UE_SelectedConfigRP_r16 = NULL; + sl_res_pool->sl_RxParametersNcell_r16 = NULL; + sl_res_pool->sl_ZoneConfigMCR_List_r16 = NULL; + sl_res_pool->sl_FilterCoefficient_r16 = NULL; + + //number of contiguous PRBS in this res pool. + sl_res_pool->sl_RB_Number_r16 = calloc(1, sizeof(long)); + *sl_res_pool->sl_RB_Number_r16 = 50; + + sl_res_pool->sl_PreemptionEnable_r16 = NULL; + sl_res_pool->sl_PriorityThreshold_UL_URLLC_r16 = NULL; + sl_res_pool->sl_PriorityThreshold_r16 = NULL; + sl_res_pool->sl_X_Overhead_r16 = NULL; + sl_res_pool->sl_PowerControl_r16 = NULL; + sl_res_pool->sl_TxPercentageList_r16 = NULL; + sl_res_pool->sl_MinMaxMCS_List_r16 = NULL; + + sl_res_pool->ext1 = calloc(1, sizeof(*sl_res_pool->ext1)); + sl_res_pool->ext1->sl_TimeResource_r16 = calloc(1, sizeof(*sl_res_pool->ext1->sl_TimeResource_r16)); + sl_res_pool->ext1->sl_TimeResource_r16->size = 8; + sl_res_pool->ext1->sl_TimeResource_r16->bits_unused = 4; + sl_res_pool->ext1->sl_TimeResource_r16->buf = calloc(sl_res_pool->ext1->sl_TimeResource_r16->size, sizeof(uint8_t)); + // EX: BITMAP 10101010.. indicating every alternating slot supported for sidelink + for (int i=0;iext1->sl_TimeResource_r16->size;i++) { + if (is_txpool) { + sl_res_pool->ext1->sl_TimeResource_r16->buf[i] = (is_sl_syncsource) ? 0xAA //0x88;//0xAA; + : 0x55;//0x11;//0x55; + } else { + sl_res_pool->ext1->sl_TimeResource_r16->buf[i] = (is_sl_syncsource) ? 0x55 //0x88;//0xAA; + : 0xAA;//0x11;//0x55; + } + } + + // mask out unused bits + sl_res_pool->ext1->sl_TimeResource_r16->buf[sl_res_pool->ext1->sl_TimeResource_r16->size - 1] &= (0 - (1 << (sl_res_pool->ext1->sl_TimeResource_r16->bits_unused))); + +} + +static void prepare_NR_SL_BWPConfigCommon(NR_SL_BWP_ConfigCommon_r16_t *sl_bwp, + uint16_t num_tx_pools, + uint16_t num_rx_pools, + uint16_t sl_syncsource) { + + sl_bwp->sl_BWP_Generic_r16 = calloc(1, sizeof(NR_SL_BWP_Generic_r16_t)); + sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16 = calloc(1, sizeof(NR_BWP_t)); + // if Cyclicprefix is NULL, then default value Normal cyclic prefix is configured. else EXT CP. + sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->cyclicPrefix = NULL; + + //30Khz and 40Mhz - 106 RBs + sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->locationAndBandwidth = 28875; + sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->subcarrierSpacing = NR_SubcarrierSpacing_kHz30; + + sl_bwp->sl_BWP_Generic_r16->sl_LengthSymbols_r16 = calloc(1, sizeof(long)); + // Value can be between symbols 7 to 14 + *sl_bwp->sl_BWP_Generic_r16->sl_LengthSymbols_r16 = NR_SL_BWP_Generic_r16__sl_LengthSymbols_r16_sym14; + + sl_bwp->sl_BWP_Generic_r16->sl_StartSymbol_r16 = calloc(1, sizeof(long)); + // Value can be between symbols 0 to 7 + *sl_bwp->sl_BWP_Generic_r16->sl_StartSymbol_r16 = NR_SL_BWP_Generic_r16__sl_StartSymbol_r16_sym0; + + sl_bwp->sl_BWP_Generic_r16->sl_PSBCH_Config_r16 = calloc(1,sizeof(NR_SL_PSBCH_Config_r16_t)); + // PSBCH CONFIG contains PO and alpha for PSBCH powercontrol. + sl_bwp->sl_BWP_Generic_r16->sl_PSBCH_Config_r16->present = NR_SetupRelease_SL_PSBCH_Config_r16_PR_release; + + sl_bwp->sl_BWP_Generic_r16->sl_TxDirectCurrentLocation_r16 = NULL; + + sl_bwp->sl_BWP_PoolConfigCommon_r16 = calloc(1, sizeof(NR_SL_BWP_PoolConfigCommon_r16_t)); + + if (num_rx_pools) { + AssertFatal(num_rx_pools >= 1, "Currently supports only 1 RX pool\n"); + // Receiving resource pool. + NR_SL_ResourcePool_r16_t *respool = calloc(1, sizeof(*respool)); + sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16 = calloc(1, sizeof(*sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16)); + ASN_SEQUENCE_ADD(&sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16->list, respool); + // Fill RX resource pool + prepare_NR_SL_ResourcePool(sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16->list.array[0], 0, sl_syncsource); + } else + sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16 = NULL; + + if (num_tx_pools) { + AssertFatal(num_tx_pools >= 1, "Currently supports only 1 TX pool\n"); + //resource pool(s) to transmit NR SL + NR_SL_ResourcePoolConfig_r16_t *respoolcfg = calloc(1, sizeof(*respoolcfg)); + sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16 = calloc(1, sizeof(*sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16)); + ASN_SEQUENCE_ADD(&sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list, respoolcfg); + sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[0]->sl_ResourcePoolID_r16 = 1; + sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[0]->sl_ResourcePool_r16 = calloc(1, sizeof(NR_SL_ResourcePool_r16_t)); + // Fill tx resource pool + prepare_NR_SL_ResourcePool(sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[0]->sl_ResourcePool_r16, num_tx_pools, sl_syncsource); + } else + sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16 = NULL; + + sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolExceptional_r16 = NULL; +} + +static void prepare_NR_SL_FreqConfigCommon(NR_SL_FreqConfigCommon_r16_t *sl_fcfg, + uint16_t num_tx_pools, + uint16_t num_rx_pools, + uint16_t sl_syncsource) { + + // Sub carrier spacing used on this frequency configured. + NR_SCS_SpecificCarrier_t *scs_specific = calloc(1, sizeof(*scs_specific)); + ASN_SEQUENCE_ADD(&sl_fcfg->sl_SCS_SpecificCarrierList_r16.list, scs_specific); + sl_fcfg->sl_SCS_SpecificCarrierList_r16.list.array[0]->offsetToCarrier = 0; + sl_fcfg->sl_SCS_SpecificCarrierList_r16.list.array[0]->subcarrierSpacing = NR_SubcarrierSpacing_kHz30; + sl_fcfg->sl_SCS_SpecificCarrierList_r16.list.array[0]->carrierBandwidth = 106; //40Mhz + + // NR bands for Sidelink n47, n38. + // N47band - 5855Mhz - 5925Mhz + sl_fcfg->sl_AbsoluteFrequencyPointA_r16 = 792000; //freq 5880Mhz + + //SL SSB chosen to be located from RB10 to RB21. points to the middle of the SSB block. + //SSB location should be within Sidelink BWP + //792000 + 10*12*2 + 66*2. channel raster is 15Khz for band47 + sl_fcfg->sl_AbsoluteFrequencySSB_r16 = calloc(1, sizeof(NR_ARFCN_ValueNR_t)); + *sl_fcfg->sl_AbsoluteFrequencySSB_r16 = 792372; + + //NR SL transmission with a 7.5 Khz shift to the LTE raster. if absent, freq shift is disabled. + //Required if carrier freq configured for NR SL shared by LTE SL + sl_fcfg->frequencyShift7p5khzSL_r16 = NULL; + + //NR SL transmission with valueN*5Khz shift to LTE raster. + sl_fcfg->valueN_r16 = 0; + + // Sidelink BWP configuration. + // In REL16, 17 SUPPORTS only 1 SIDELINK Bandwidth part + NR_SL_BWP_ConfigCommon_r16_t *bwpcfgcommon = calloc(1, sizeof(*bwpcfgcommon)); + sl_fcfg->sl_BWP_List_r16 = calloc(1, sizeof(*sl_fcfg->sl_BWP_List_r16)); + ASN_SEQUENCE_ADD(&sl_fcfg->sl_BWP_List_r16->list, bwpcfgcommon); + prepare_NR_SL_BWPConfigCommon(sl_fcfg->sl_BWP_List_r16->list.array[0], num_tx_pools, num_rx_pools, sl_syncsource); + + // sync prio between GNSS and gNB/eNB + sl_fcfg->sl_SyncPriority_r16 = calloc(1, sizeof(long)); + *sl_fcfg->sl_SyncPriority_r16 = 0; // Set to GNSS + + // If TRUE/1 - Network can be selected as sync source directly/indirectly in case syncprio = GNSS. + sl_fcfg->sl_NbAsSync_r16 = calloc(1, sizeof(long)); + *sl_fcfg->sl_NbAsSync_r16 = 1; + + // config info related to rx and tx of SL SYNC SIGNALS (SLSS) + NR_SL_SyncConfig_r16_t *synccfg = calloc(1, sizeof(*synccfg)); + sl_fcfg->sl_SyncConfigList_r16 = calloc(1, sizeof(*sl_fcfg->sl_SyncConfigList_r16)); + ASN_SEQUENCE_ADD(&sl_fcfg->sl_SyncConfigList_r16->list, synccfg); + prepare_NR_SL_SyncConfig(sl_fcfg->sl_SyncConfigList_r16->list.array[0]); + +} + +NR_SL_PreconfigurationNR_r16_t *prepare_NR_SL_PRECONFIGURATION(uint16_t num_tx_pools, + uint16_t num_rx_pools, + uint16_t sl_syncsource) { + + NR_SL_PreconfigurationNR_r16_t *sl_preconfiguration = CALLOC(1, sizeof(NR_SL_PreconfigurationNR_r16_t)); + NR_SidelinkPreconfigNR_r16_t *sl_preconfig = &sl_preconfiguration->sidelinkPreconfigNR_r16; + + //FILL in Frequency config common + NR_SL_FreqConfigCommon_r16_t *freqcfgcommon = calloc(1, sizeof(*freqcfgcommon)); + sl_preconfig->sl_PreconfigFreqInfoList_r16 = calloc(1, sizeof(*sl_preconfig->sl_PreconfigFreqInfoList_r16)); + //Supported only 1 FREQs for NR SL communication. + ASN_SEQUENCE_ADD(&sl_preconfig->sl_PreconfigFreqInfoList_r16->list, freqcfgcommon); + + prepare_NR_SL_FreqConfigCommon(sl_preconfig->sl_PreconfigFreqInfoList_r16->list.array[0], + num_tx_pools, num_rx_pools, sl_syncsource); + + // NR Frequency list + sl_preconfig->sl_PreconfigNR_AnchorCarrierFreqList_r16 = NULL; + + // EUTRA Frequency list + sl_preconfig->sl_PreconfigEUTRA_AnchorCarrierFreqList_r16 = NULL; + + // NR sidelink radio bearer(s) configuration(s) + sl_preconfig->sl_RadioBearerPreConfigList_r16 = NULL; // fill later + + // NR sidelink RLC bearer(s) configuration(s) + sl_preconfig->sl_RLC_BearerPreConfigList_r16 = NULL; // fill later + + //Measurement and reporting configuration + sl_preconfig->sl_MeasPreConfig_r16 = NULL; + + //DFN timing offset used if GNSS is used as sync source. + //1-.001ms, 2 - .002ms so on. value 0 if absent. + sl_preconfig->sl_OffsetDFN_r16 = NULL; + + // t400 started upon txn of RRCreconfSidelink. + sl_preconfig->t400_r16 = NULL; + + //Max num consecutive HARQ DTX before triggering SL RLF. + sl_preconfig->sl_MaxNumConsecutiveDTX_r16 = NULL; + + //Priority of SSB transmission and reception. used in comparison to UL rxns/txns + sl_preconfig->sl_SSB_PriorityNR_r16 = NULL; + + //Contains TDD ULDL confiuguration to be used by the sync source UE. + //Currently set to the default used in OAI 5G. Changes TBD.. + //For the UE with sync reference as another UE, TDD ULDL config is determined from SL-MIB + sl_preconfig->sl_PreconfigGeneral_r16 = calloc(1, sizeof(NR_SL_PreconfigGeneral_r16_t)); + sl_preconfig->sl_PreconfigGeneral_r16->sl_TDD_Configuration_r16 = calloc(1, sizeof(NR_TDD_UL_DL_ConfigCommon_t)); + NR_TDD_UL_DL_ConfigCommon_t *tdd_ul_dl_cfg = sl_preconfig->sl_PreconfigGeneral_r16->sl_TDD_Configuration_r16; + tdd_ul_dl_cfg->pattern1.dl_UL_TransmissionPeriodicity = NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms2p5; + tdd_ul_dl_cfg->pattern1.nrofDownlinkSlots = 7; + tdd_ul_dl_cfg->pattern1.nrofDownlinkSymbols = 10; + tdd_ul_dl_cfg->pattern1.nrofUplinkSlots = 2; + tdd_ul_dl_cfg->pattern1.nrofUplinkSymbols = 4; + tdd_ul_dl_cfg->pattern1.ext1 = NULL; + tdd_ul_dl_cfg->pattern2 = NULL; + + // Configurations used for UE autonomous resource selection + sl_preconfig->sl_UE_SelectedPreConfig_r16 = NULL; + + // indicates if CSI reporting supported in SL unicast. + sl_preconfig->sl_CSI_Acquisition_r16 = NULL; + + // ROHC profiles for NR SL + sl_preconfig->sl_RoHC_Profiles_r16 = NULL; + + // MaxCID value for PDCP as specified in 38.323 + sl_preconfig->sl_MaxCID_r16 = NULL; + + + return sl_preconfiguration; +} + + +static void dump_NR_SL_ResourcePoolParams(NR_SL_ResourcePool_r16_t *respool) { + + if (respool->sl_PSCCH_Config_r16 && + respool->sl_PSCCH_Config_r16->present == NR_SetupRelease_SL_PSCCH_Config_r16_PR_setup) { + + NR_SL_PSCCH_Config_r16_t *pscch_cfg = respool->sl_PSCCH_Config_r16->choice.setup; + LOG_I(NR_RRC,"PSCCH config: sl_TimeResourcePSCCH:%ld, sl_FreqResourcePSCCH:%ld, sl_DMRS_ScrambleID:%ld, sl_NumReservedBits:%ld\n", + (pscch_cfg->sl_TimeResourcePSCCH_r16)? *pscch_cfg->sl_TimeResourcePSCCH_r16 : 0, + (pscch_cfg->sl_FreqResourcePSCCH_r16)? *pscch_cfg->sl_FreqResourcePSCCH_r16 : 0, + (pscch_cfg->sl_DMRS_ScrambleID_r16)? *pscch_cfg->sl_DMRS_ScrambleID_r16 : 0, + (pscch_cfg->sl_NumReservedBits_r16)? *pscch_cfg->sl_NumReservedBits_r16 : 0); + } else { + LOG_I(NR_RRC,"PSCCH CONFIG: not present\n"); + } + + if (respool->sl_PSSCH_Config_r16 && + respool->sl_PSSCH_Config_r16->present == NR_SetupRelease_SL_PSSCH_Config_r16_PR_setup) { + + LOG_I(NR_RRC,"PSSCH config: present\n"); + } else { + LOG_I(NR_RRC,"PSSCH CONFIG: not present\n"); + } + if (respool->sl_PSFCH_Config_r16 && + respool->sl_PSFCH_Config_r16->present == NR_SetupRelease_SL_PSFCH_Config_r16_PR_setup) { + + LOG_I(NR_RRC,"PSFCH config: present\n"); + } else { + LOG_I(NR_RRC,"PSFCH CONFIG: not present\n"); + } + + LOG_I(NR_RRC,"Subchannels info: sl_SubchannelSize:%ld, sl_StartRB_Subchannel:%ld, sl_NumSubchannel:%ld, sl_RB_Number:%ld\n", + (respool->sl_SubchannelSize_r16)? *respool->sl_SubchannelSize_r16 : 0, + (respool->sl_StartRB_Subchannel_r16)? *respool->sl_StartRB_Subchannel_r16 : 0, + (respool->sl_NumSubchannel_r16)? *respool->sl_NumSubchannel_r16 : 0, + (respool->sl_RB_Number_r16)? *respool->sl_RB_Number_r16 : 0); + + if (respool->ext1 && + respool->ext1->sl_TimeResource_r16) { + int size = respool->ext1->sl_TimeResource_r16->size; + int unused = respool->ext1->sl_TimeResource_r16->bits_unused; + LOG_I(NR_RRC, "sl_TimeResource bitmap len:%d\n",size*8-unused); + for (int i=0;iext1->sl_TimeResource_r16->buf[i]); + } + } + +} + +static void dump_NR_SL_FreqConfigCommonParams(NR_SL_FreqConfigCommon_r16_t *sl_fcfg) { + + LOG_I(NR_RRC, "NR_SL_FreqConfigCommon_r16 IEs.............\n"); + + LOG_I(NR_RRC, "sl_AbsoluteFrequencyPointA:%ld \n", sl_fcfg->sl_AbsoluteFrequencyPointA_r16); + + if (sl_fcfg->sl_AbsoluteFrequencySSB_r16) { + LOG_I(NR_RRC, "*sl_AbsoluteFrequencySSB_r16:%ld \n", *sl_fcfg->sl_AbsoluteFrequencySSB_r16); + } + + int num = sl_fcfg->sl_SCS_SpecificCarrierList_r16.list.count; + for (int i = 0; i < num; i++) { + LOG_I(NR_RRC," SCS entry[%d]: offsetToCarrier:%ld, subcarrierSpacing:%ld, carrierBw:%ld \n", + i, sl_fcfg->sl_SCS_SpecificCarrierList_r16.list.array[i]->offsetToCarrier, + sl_fcfg->sl_SCS_SpecificCarrierList_r16.list.array[i]->subcarrierSpacing, + sl_fcfg->sl_SCS_SpecificCarrierList_r16.list.array[i]->carrierBandwidth); + } + + LOG_I(NR_RRC, "valueN_r16:%ld \n", sl_fcfg->valueN_r16); + + if (sl_fcfg->sl_BWP_List_r16) { + num = sl_fcfg->sl_BWP_List_r16->list.count; + LOG_I(NR_RRC, "Sidelink BWPs configured:%d\n", num); + for (int i = 0; i < num; i++) { + NR_SL_BWP_ConfigCommon_r16_t *sl_bwp = sl_fcfg->sl_BWP_List_r16->list.array[i]; + if (sl_bwp->sl_BWP_Generic_r16 && + sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16) { + LOG_I(NR_RRC," SL-BWP[%d]: CyclicPrefix:%s, scs:%ld, locandBw:%ld\n", + i, (sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->cyclicPrefix) ? "EXTENDED" : "NORMAL", + sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->subcarrierSpacing, + sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->locationAndBandwidth); + + LOG_I(NR_RRC," SL-BWP[%d]: sl_LengthSymbols:%ld, sl_StartSymbol:%ld\n", + i, *sl_bwp->sl_BWP_Generic_r16->sl_LengthSymbols_r16, + *sl_bwp->sl_BWP_Generic_r16->sl_StartSymbol_r16); + + + if (sl_bwp->sl_BWP_PoolConfigCommon_r16 && + sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16) { + + int num_rxpools = sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16->list.count; + LOG_I(NR_RRC, "NUM RX RESOURCE POOLs:%d\n", num_rxpools); + for (int i=0; isl_BWP_PoolConfigCommon_r16->sl_RxPool_r16->list.array[i]); + } + } + if (sl_bwp->sl_BWP_PoolConfigCommon_r16 && + sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16) { + + int num_txpools = sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.count; + LOG_I(NR_RRC, "NUM TX RESOURCE POOLs:%d\n", num_txpools); + for (int i=0; isl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[i]->sl_ResourcePool_r16); + } + } + } + } + } + + if (sl_fcfg->sl_SyncConfigList_r16) { + int num = sl_fcfg->sl_SyncConfigList_r16->list.count; + LOG_I(NR_RRC, "NUM SyncConfig entries:%d\n", num); + for (int i=0;isl_SyncConfigList_r16->list.array[i]; + if (synccfg->sl_SSB_TimeAllocation1_r16) { + NR_SL_SSB_TimeAllocation_r16_t *ssb_ta = synccfg->sl_SSB_TimeAllocation1_r16; + LOG_I(NR_RRC, "syncconfig[%d]: Timealloc1, sl_NumSSB_WithinPeriod:%ld, sl_TimeOffsetSSB:%ld,sl_TimeInterval:%ld\n", + i, (ssb_ta->sl_NumSSB_WithinPeriod_r16) ? *ssb_ta->sl_NumSSB_WithinPeriod_r16 : 0, + (ssb_ta->sl_TimeOffsetSSB_r16) ? *ssb_ta->sl_TimeOffsetSSB_r16 : 0, + (ssb_ta->sl_TimeInterval_r16) ? *ssb_ta->sl_TimeInterval_r16 : 0); + } else { + LOG_I(NR_RRC, "syncconfig[%d]: Timealloc1 not present\n",i); + } + if (synccfg->sl_SSB_TimeAllocation2_r16) { + NR_SL_SSB_TimeAllocation_r16_t *ssb_ta = synccfg->sl_SSB_TimeAllocation2_r16; + LOG_I(NR_RRC, "syncconfig[%d]: Timealloc2, sl_NumSSB_WithinPeriod:%ld, sl_TimeOffsetSSB:%ld,sl_TimeInterval:%ld\n", + i, (ssb_ta->sl_NumSSB_WithinPeriod_r16) ? *ssb_ta->sl_NumSSB_WithinPeriod_r16 : 0, + (ssb_ta->sl_TimeOffsetSSB_r16) ? *ssb_ta->sl_TimeOffsetSSB_r16 : 0, + (ssb_ta->sl_TimeInterval_r16) ? *ssb_ta->sl_TimeInterval_r16 : 0); + } else { + LOG_I(NR_RRC, "syncconfig[%d]: Timealloc2 not present\n",i); + } + if (synccfg->sl_SSB_TimeAllocation3_r16) { + NR_SL_SSB_TimeAllocation_r16_t *ssb_ta = synccfg->sl_SSB_TimeAllocation3_r16; + LOG_I(NR_RRC, "syncconfig[%d]: Timealloc3, sl_NumSSB_WithinPeriod:%ld, sl_TimeOffsetSSB:%ld,sl_TimeInterval:%ld\n", + i, (ssb_ta->sl_NumSSB_WithinPeriod_r16) ? *ssb_ta->sl_NumSSB_WithinPeriod_r16 : 0, + (ssb_ta->sl_TimeOffsetSSB_r16) ? *ssb_ta->sl_TimeOffsetSSB_r16 : 0, + (ssb_ta->sl_TimeInterval_r16) ? *ssb_ta->sl_TimeInterval_r16 : 0); + } else { + LOG_I(NR_RRC, "syncconfig[%d]: Timealloc3 not present\n",i); + } + } + } +} + + +void dump_NR_SL_Preconfiguration(NR_SL_PreconfigurationNR_r16_t *sl_preconfiguration) { + + NR_SidelinkPreconfigNR_r16_t *sl_preconfig = &sl_preconfiguration->sidelinkPreconfigNR_r16; + + AssertFatal(sl_preconfiguration || sl_preconfig ,"Sl_preconf cannot be NULL\n"); + + LOG_I(NR_RRC, "-------------START of NR_SL_Preconfiguration IEs............\n"); + + if (sl_preconfig->sl_PreconfigFreqInfoList_r16) { + int num = sl_preconfig->sl_PreconfigFreqInfoList_r16->list.count; + LOG_I(NR_RRC, "Number of Sidelink Frequencies configured:%d\n", num); + + for (int i=0;isl_PreconfigFreqInfoList_r16->list.array[0]); + } + } + + if (sl_preconfig->sl_PreconfigGeneral_r16 && + sl_preconfig->sl_PreconfigGeneral_r16->sl_TDD_Configuration_r16) { + + NR_TDD_UL_DL_ConfigCommon_t *tdd_ul_dl_cfg = sl_preconfig->sl_PreconfigGeneral_r16->sl_TDD_Configuration_r16; + LOG_I(NR_RRC,"SL-TDD ULDL config: Transmissionperiod:%ld,DL-Slots:%ld,Sym:%ld, UL-Slots:%ld,Symbols:%ld\n", + tdd_ul_dl_cfg->pattern1.dl_UL_TransmissionPeriodicity, + tdd_ul_dl_cfg->pattern1.nrofDownlinkSlots, tdd_ul_dl_cfg->pattern1.nrofDownlinkSymbols, + tdd_ul_dl_cfg->pattern1.nrofUplinkSlots, tdd_ul_dl_cfg->pattern1.nrofUplinkSymbols); + + if (tdd_ul_dl_cfg->pattern1.ext1 && + tdd_ul_dl_cfg->pattern1.ext1->dl_UL_TransmissionPeriodicity_v1530) { + LOG_I(NR_RRC, "SL-TDD ULDL config: Transmissionperiod_v1530:%ld\n", + *tdd_ul_dl_cfg->pattern1.ext1->dl_UL_TransmissionPeriodicity_v1530); + } + + AssertFatal(tdd_ul_dl_cfg->pattern2 == NULL ,"pattern2 not supported\n"); + } + + LOG_I(NR_RRC, "-------------END OF NR_SL_Preconfiguration IEs............\n\n"); +} + +int configure_NR_SL_Preconfig() { + + //Example configurations to check and test + //UE needs to be set with only 1 PREconfiguration. TBD.. Remove these later. + + //SL-Preconfiguration with 1 txpool, 1 rxpool and not syncsource + NR_SL_PreconfigurationNR_r16_t *sl_preconfig = prepare_NR_SL_PRECONFIGURATION(1,1,0); + dump_NR_SL_Preconfiguration(sl_preconfig); + + ASN_STRUCT_FREE(asn_DEF_NR_SL_PreconfigurationNR_r16, sl_preconfig); + sl_preconfig = NULL; + //END....... + + //SL-Preconfiguration with 1 txpool, 0 rxpool and UE is syncsource + sl_preconfig = prepare_NR_SL_PRECONFIGURATION(1,0,1); + dump_NR_SL_Preconfiguration(sl_preconfig); + + ASN_STRUCT_FREE(asn_DEF_NR_SL_PreconfigurationNR_r16, sl_preconfig); + sl_preconfig = NULL; + //END + + //SL-Preconfiguration with 0 txpool, 1 rxpool and UE is not a syncsource + sl_preconfig = prepare_NR_SL_PRECONFIGURATION(0,1,0); + dump_NR_SL_Preconfiguration(sl_preconfig); + + ASN_STRUCT_FREE(asn_DEF_NR_SL_PreconfigurationNR_r16, sl_preconfig); + sl_preconfig = NULL; + + return 0; +} \ No newline at end of file From 4b51859b88e63b1ddb89149f35caf5b4e48e6484 Mon Sep 17 00:00:00 2001 From: Raghavendra Dinavahi Date: Fri, 30 Jun 2023 10:11:26 +0200 Subject: [PATCH 2/4] Enabling configuration files read for SL-Preconfig - for example when running nr-uesoftmodem with sidelink use "-O ../../../targets/PROJECTS/NR-SIDELINK/CONF/sidelink_preconfig_1rxpool_1txpool.conf" --- openair2/RRC/NR_UE/rrc_sl_preconfig.c | 138 ++++++++++++++++ openair2/RRC/NR_UE/sl_preconfig_paramvalues.h | 151 ++++++++++++++++++ .../CONF/sidelink_preconfig_1rxpool.conf | 69 ++++++++ .../sidelink_preconfig_1rxpool_1txpool.conf | 89 +++++++++++ .../CONF/sidelink_preconfig_1txpool.conf | 69 ++++++++ 5 files changed, 516 insertions(+) create mode 100644 openair2/RRC/NR_UE/sl_preconfig_paramvalues.h create mode 100644 targets/PROJECTS/NR-SIDELINK/CONF/sidelink_preconfig_1rxpool.conf create mode 100644 targets/PROJECTS/NR-SIDELINK/CONF/sidelink_preconfig_1rxpool_1txpool.conf create mode 100644 targets/PROJECTS/NR-SIDELINK/CONF/sidelink_preconfig_1txpool.conf diff --git a/openair2/RRC/NR_UE/rrc_sl_preconfig.c b/openair2/RRC/NR_UE/rrc_sl_preconfig.c index a9eb1ce282..147ee69f81 100644 --- a/openair2/RRC/NR_UE/rrc_sl_preconfig.c +++ b/openair2/RRC/NR_UE/rrc_sl_preconfig.c @@ -36,6 +36,8 @@ #include "oai_asn1.h" #include "NR_SL-PreconfigurationNR-r16.h" #include "common/utils/LOG/log.h" +#include "sl_preconfig_paramvalues.h" +#include "common/config/config_userapi.h" static void prepare_NR_SL_SyncConfig(NR_SL_SyncConfig_r16_t *sl_syncconfig) { @@ -370,6 +372,127 @@ NR_SL_PreconfigurationNR_r16_t *prepare_NR_SL_PRECONFIGURATION(uint16_t num_tx_p return sl_preconfiguration; } +static void get_NR_SL_Preconfig_params(NR_SL_PreconfigurationNR_r16_t *sl_preconfig) { + + char aprefix[MAX_OPTNAME_SIZE*2 + 8]; + + sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION,0); + + NR_TDD_UL_DL_ConfigCommon_t *sl_tdd_uldl_cfg = + sl_preconfig->sidelinkPreconfigNR_r16.sl_PreconfigGeneral_r16->sl_TDD_Configuration_r16; + paramdef_t SLTDDCFG_PARAMS[] = SL_TDDCONFIGPARAMS_DESC(sl_tdd_uldl_cfg); + config_get(SLTDDCFG_PARAMS,sizeof(SLTDDCFG_PARAMS)/sizeof(paramdef_t),aprefix); + + NR_SL_FreqConfigCommon_r16_t *sl_fcc = sl_preconfig->sidelinkPreconfigNR_r16.sl_PreconfigFreqInfoList_r16->list.array[0]; + paramdef_t SL_FCCPARAMS[] = SL_FCCPARAMS_DESC(sl_fcc); + paramlist_def_t SL_FCCParamList = {SL_CONFIG_STRING_SL_FCC_LIST, NULL, 0}; + sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION,0); + config_getlist(&SL_FCCParamList, NULL, 0, aprefix); + LOG_I(RRC, "NUM SL-FCC elem in cfg file:%d\n", SL_FCCParamList.numelt); + if (SL_FCCParamList.numelt > 0) { + sprintf(aprefix, "%s.[%i].%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION,0, SL_CONFIG_STRING_SL_FCC_LIST, 0); + config_get( SL_FCCPARAMS,sizeof(SL_FCCPARAMS)/sizeof(paramdef_t),aprefix); + } + + NR_SL_BWP_ConfigCommon_r16_t *sl_bwp = sl_fcc->sl_BWP_List_r16->list.array[0]; + paramdef_t SL_BWPPARAMS[] = SL_BWPPARAMS_DESC(sl_bwp); + paramlist_def_t SL_BWPParamList = {SL_CONFIG_STRING_SL_BWP_LIST, NULL, 0}; + sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0); + config_getlist(&SL_BWPParamList, NULL, 0, aprefix); + LOG_I(RRC, "NUM SL-BWP elem in cfg file:%d\n", SL_BWPParamList.numelt); + if (SL_BWPParamList.numelt > 0) { + sprintf(aprefix, "%s.[%i].%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0, SL_CONFIG_STRING_SL_BWP_LIST, 0); + config_get( SL_BWPPARAMS,sizeof(SL_BWPPARAMS)/sizeof(paramdef_t),aprefix); + } + + sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->subcarrierSpacing = + sl_fcc->sl_SCS_SpecificCarrierList_r16.list.array[0]->subcarrierSpacing; + sl_tdd_uldl_cfg->referenceSubcarrierSpacing = + sl_fcc->sl_SCS_SpecificCarrierList_r16.list.array[0]->subcarrierSpacing; + + NR_SL_SyncConfig_r16_t *sl_synccfg = sl_fcc->sl_SyncConfigList_r16->list.array[0]; + paramdef_t SL_SYNCCFGPARAMS[] = SL_SYNCPARAMS_DESC(sl_synccfg); + paramlist_def_t SL_SYNCFGParamList = {SL_CONFIG_STRING_SL_SYNCCONFIG_LIST, NULL, 0}; + sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0); + config_getlist(&SL_SYNCFGParamList, NULL, 0, aprefix); + LOG_I(RRC, "NUM SL-SYNCCFG elem in cfg file:%d\n", SL_SYNCFGParamList.numelt); + if (SL_SYNCFGParamList.numelt > 0) { + sprintf(aprefix, "%s.[%i].%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0,SL_CONFIG_STRING_SL_SYNCCONFIG_LIST, 0); + config_get(SL_SYNCCFGPARAMS,sizeof(SL_SYNCCFGPARAMS)/sizeof(paramdef_t),aprefix); + } + + paramlist_def_t SL_RxPoolParamList = {SL_CONFIG_STRING_SL_RX_RPOOL_LIST, NULL, 0}; + sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0); + config_getlist(&SL_RxPoolParamList, NULL, 0, aprefix); + LOG_I(RRC, "NUM Rx RPOOLs in cfg file:%d\n", SL_RxPoolParamList.numelt); + AssertFatal(SL_RxPoolParamList.numelt <= 1, "Only Max 1 RX Respool Supported now\n"); + + if (SL_RxPoolParamList.numelt > 0) { + + NR_SL_ResourcePool_r16_t *rxpool = NULL; + + if (sl_bwp->sl_BWP_PoolConfigCommon_r16 == NULL) + sl_bwp->sl_BWP_PoolConfigCommon_r16 = calloc(1, sizeof(*sl_bwp->sl_BWP_PoolConfigCommon_r16)); + if (sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16 == NULL) + sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16 = calloc(1, sizeof(*sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16)); + if (sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16->list.count == 0) { + rxpool = calloc(1, sizeof(NR_SL_ResourcePool_r16_t)); + sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16 = calloc(1, sizeof(*sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16)); + ASN_SEQUENCE_ADD(&sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16->list, rxpool); + // Fill RX resource pool + prepare_NR_SL_ResourcePool(sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16->list.array[0], 0, 0); + } + + rxpool = sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16->list.array[0]; + paramdef_t SL_RXPOOLPARAMS[] = SL_RESPOOLPARAMS_DESC(rxpool); + sprintf(aprefix, "%s.[%i].%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0,SL_CONFIG_STRING_SL_RX_RPOOL_LIST, 0); + config_get(SL_RXPOOLPARAMS,sizeof(SL_RXPOOLPARAMS)/sizeof(paramdef_t),aprefix); + + } else { + + if (sl_bwp->sl_BWP_PoolConfigCommon_r16) + ASN_STRUCT_FREE(asn_DEF_NR_SL_BWP_ConfigCommon_r16, sl_bwp->sl_BWP_PoolConfigCommon_r16); + } + + paramlist_def_t SL_TxPoolParamList = {SL_CONFIG_STRING_SL_TX_RPOOL_LIST, NULL, 0}; + sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0); + config_getlist(&SL_TxPoolParamList, NULL, 0, aprefix); + LOG_I(RRC, "NUM Tx RPOOL in cfg file:%d\n", SL_TxPoolParamList.numelt); + AssertFatal(SL_TxPoolParamList.numelt <= 1, "Only Max 1 TX Respool Supported now\n"); + + if (SL_TxPoolParamList.numelt > 0) { + + NR_SL_ResourcePool_r16_t *txpool = NULL; + + if (sl_bwp->sl_BWP_PoolConfigCommon_r16 == NULL) + sl_bwp->sl_BWP_PoolConfigCommon_r16 = calloc(1, sizeof(*sl_bwp->sl_BWP_PoolConfigCommon_r16)); + if (sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16 == NULL) + sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16 = + calloc(1, sizeof(*sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16)); + if (sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.count == 0) { + NR_SL_ResourcePoolConfig_r16_t *respoolcfg = calloc(1, sizeof(*respoolcfg)); + respoolcfg->sl_ResourcePoolID_r16 = 0; + respoolcfg->sl_ResourcePool_r16 = calloc(1, sizeof(NR_SL_ResourcePool_r16_t)); + ASN_SEQUENCE_ADD(&sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list, respoolcfg); + // Fill TX resource pool + prepare_NR_SL_ResourcePool(sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[0]->sl_ResourcePool_r16, 1, 0); + } + + txpool = sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[0]->sl_ResourcePool_r16; + paramdef_t SL_TXPOOLPARAMS[] = SL_RESPOOLPARAMS_DESC(txpool); + sprintf(aprefix, "%s.[%i].%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0,SL_CONFIG_STRING_SL_TX_RPOOL_LIST, 0); + config_get(SL_TXPOOLPARAMS,sizeof(SL_TXPOOLPARAMS)/sizeof(paramdef_t),aprefix); + } else { + + if (sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16) { + ASN_STRUCT_FREE(asn_DEF_NR_SL_ResourcePoolConfig_r16, sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[0]); + free(sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16); + sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16 = NULL; + } + } + + return; +} static void dump_NR_SL_ResourcePoolParams(NR_SL_ResourcePool_r16_t *respool) { @@ -564,6 +687,11 @@ int configure_NR_SL_Preconfig() { NR_SL_PreconfigurationNR_r16_t *sl_preconfig = prepare_NR_SL_PRECONFIGURATION(1,1,0); dump_NR_SL_Preconfiguration(sl_preconfig); + if (!CONFIG_ISFLAGSET(CONFIG_NOOOPT)) { + get_NR_SL_Preconfig_params(sl_preconfig); + dump_NR_SL_Preconfiguration(sl_preconfig); + } + ASN_STRUCT_FREE(asn_DEF_NR_SL_PreconfigurationNR_r16, sl_preconfig); sl_preconfig = NULL; //END....... @@ -572,6 +700,11 @@ int configure_NR_SL_Preconfig() { sl_preconfig = prepare_NR_SL_PRECONFIGURATION(1,0,1); dump_NR_SL_Preconfiguration(sl_preconfig); + if (!CONFIG_ISFLAGSET(CONFIG_NOOOPT)) { + get_NR_SL_Preconfig_params(sl_preconfig); + dump_NR_SL_Preconfiguration(sl_preconfig); + } + ASN_STRUCT_FREE(asn_DEF_NR_SL_PreconfigurationNR_r16, sl_preconfig); sl_preconfig = NULL; //END @@ -580,6 +713,11 @@ int configure_NR_SL_Preconfig() { sl_preconfig = prepare_NR_SL_PRECONFIGURATION(0,1,0); dump_NR_SL_Preconfiguration(sl_preconfig); + if (!CONFIG_ISFLAGSET(CONFIG_NOOOPT)) { + get_NR_SL_Preconfig_params(sl_preconfig); + dump_NR_SL_Preconfiguration(sl_preconfig); + } + ASN_STRUCT_FREE(asn_DEF_NR_SL_PreconfigurationNR_r16, sl_preconfig); sl_preconfig = NULL; diff --git a/openair2/RRC/NR_UE/sl_preconfig_paramvalues.h b/openair2/RRC/NR_UE/sl_preconfig_paramvalues.h new file mode 100644 index 0000000000..026b486881 --- /dev/null +++ b/openair2/RRC/NR_UE/sl_preconfig_paramvalues.h @@ -0,0 +1,151 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/* \file sl_preconfig_paramvalues.h + * \brief + * \author Raghavendra Dinavahi + * \date + * \version 0.1 + * \company + * \email: + * \note + * \warning + */ + +#ifndef __SL_PRECONFIG_PARAMSVALUES__H__ +#define __SL_PRECONFIG_PARAMSVALUES__H__ + +#include "NR_SL-PreconfigurationNR-r16.h" +#include "common/config/config_userapi.h" + +#define SL_CONFIG_STRING_SL_PRECONFIGURATION "SIDELINK_PRECONFIGURATION" + +/* Sidelink Frequency common configuration in SL-Preconfig */ +#define SL_CONFIG_STRING_SL_FCC_LIST "sl_FrequencyCommonConfig" +#define SL_CONFIG_STRING_SLOFFSETTOCARRIER "sl_offstToCarrier" +#define SL_CONFIG_STRING_FCC_SUBCARRIERSPACING "sl_subcarrierSpacing" +#define SL_CONFIG_STRING_SLCARRIERBANDWIDTH "sl_carrierBandwidth" +#define SL_CONFIG_STRING_SLABSOLUTEFREQUENCYSSB "sl_absoluteFrequencySSB" +#define SL_CONFIG_STRING_SLABSOLUEFREQUENCYPOINTA "sl_absoluteFrequencyPointA" + +// Sidelink TDD ULDL configuration parameters in SL-Preconfig +#define SL_CONFIG_STRING_DLULTRANSMISSIONPERIODICITY "sl_dl_UL_TransmissionPeriodicity" +#define SL_CONFIG_STRING_NROFDOWNLINKSLOTS "sl_nrofDownlinkSlots" +#define SL_CONFIG_STRING_NROFDOWNLINKSYMBOLS "sl_nrofDownlinkSymbols" +#define SL_CONFIG_STRING_NROFUPLINKSLOTS "sl_nrofUplinkSlots" +#define SL_CONFIG_STRING_NROFUPLINKSYMBOLS "sl_nrofUplinkSymbols" + + +// Sidelink sync config parameters in SL-Preconfig. +// 3 sets possible per sync config list entry +#define SL_CONFIG_STRING_SL_SYNCCONFIG_LIST "sl_syncCfg" +#define SL_CONFIG_STRING_SL_NUMSSB_WITHINPERIOD_0 "sl_NumSSB_WithinPeriod_0" +#define SL_CONFIG_STRING_SL_TIMEOFFSET_SSB_0 "sl_TimeOffsetSSB_0" +#define SL_CONFIG_STRING_SL_TIMEINTERVAL_0 "sl_TimeInterval_0" +#define SL_CONFIG_STRING_SL_NUMSSB_WITHINPERIOD_1 "sl_NumSSB_WithinPeriod_1" +#define SL_CONFIG_STRING_SL_TIMEOFFSET_SSB_1 "sl_TimeOffsetSSB_1" +#define SL_CONFIG_STRING_SL_TIMEINTERVAL_1 "sl_TimeInterval_1" +#define SL_CONFIG_STRING_SL_NUMSSB_WITHINPERIOD_2 "sl_NumSSB_WithinPeriod_2" +#define SL_CONFIG_STRING_SL_TIMEOFFSET_SSB_2 "sl_TimeOffsetSSB_2" +#define SL_CONFIG_STRING_SL_TIMEINTERVAL_2 "sl_TimeInterval_2" + + +/*Sidelink Bandwidth related parameters in SL-Preconfig */ +#define SL_CONFIG_STRING_SL_BWP_LIST "sl_BWP" +#define SL_CONFIG_STRING_SL_BWP_START_AND_SIZE "sl_locationAndBandwidth" +#define SL_CONFIG_STRING_SL_BWP_NUM_SYMBOLS "sl_LengthSymbols" +#define SL_CONFIG_STRING_SL_BWP_START_SYMBOL "sl_StartSymbol" + + + +/*Sidelink Resource pool related parameters in SL-Preconfig */ +#define SL_CONFIG_STRING_SL_RX_RPOOL_LIST "sl_RxResPools" +#define SL_CONFIG_STRING_SL_TX_RPOOL_LIST "sl_TxResPools" +#define SL_CONFIG_STRING_RESPOOL_PSCCH_NUMSYM "sl_TimeResourcePSCCH" +#define SL_CONFIG_STRING_RESPOOL_PSCCH_NUMRBS "sl_FreqResourcePSCCH" +#define SL_CONFIG_STRING_RESPOOL_SUBCH_SIZE_IN_RBS "sl_SubchannelSize" +#define SL_CONFIG_STRING_RESPOOL_SUBCH_START_RB "sl_StartRB_Subchannel" +#define SL_CONFIG_STRING_RESPOOL_NUM_RBS "sl_RB_Number" +#define SL_CONFIG_STRING_RESPOOL_NUM_SUBCHS "sl_NumSubchannel" + + + +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* Params to fill Sidelink PRECONFIG */ +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define SL_PRECONFIG_DESC(x,y) {\ +{SL_CONFIG_STRING_SL_BWP_NUM_RX_POOLS,NULL,0,.uptr=&x,.defintval=0,TYPE_UINT,0},\ +{SL_CONFIG_STRING_SL_BWP_NUM_RX_POOLS,NULL,0,.uptr=&y,.defintval=0,TYPE_UINT,0}} + + + +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* Sidelink Frequency common Cell Config parameters */ +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define SL_FCCPARAMS_DESC(sl_fcc) { \ +{SL_CONFIG_STRING_SLOFFSETTOCARRIER,NULL,0,.i64ptr=&sl_fcc->sl_SCS_SpecificCarrierList_r16.list.array[0]->offsetToCarrier,.defint64val=0,TYPE_INT64,0}, \ +{SL_CONFIG_STRING_FCC_SUBCARRIERSPACING,NULL,0,.i64ptr=&sl_fcc->sl_SCS_SpecificCarrierList_r16.list.array[0]->subcarrierSpacing,.defint64val=NR_SubcarrierSpacing_kHz30,TYPE_INT64,0},\ +{SL_CONFIG_STRING_SLCARRIERBANDWIDTH,NULL,0,.i64ptr=&sl_fcc->sl_SCS_SpecificCarrierList_r16.list.array[0]->carrierBandwidth,.defint64val=106,TYPE_INT64,0}, \ +{SL_CONFIG_STRING_SLABSOLUEFREQUENCYPOINTA,NULL,0,.i64ptr=&sl_fcc->sl_AbsoluteFrequencyPointA_r16,.defint64val=792000,TYPE_INT64,0},\ +{SL_CONFIG_STRING_SLABSOLUTEFREQUENCYSSB,NULL,0,.i64ptr=sl_fcc->sl_AbsoluteFrequencySSB_r16,.defint64val=792372,TYPE_INT64,0}} + + +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* Sidelink TDD ULDL Config parameters */ +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define SL_TDDCONFIGPARAMS_DESC(sl_tdd_ul_dl_cfg) { \ +{SL_CONFIG_STRING_DLULTRANSMISSIONPERIODICITY,NULL,0,.i64ptr=&sl_tdd_ul_dl_cfg->pattern1.dl_UL_TransmissionPeriodicity,.defint64val=6,TYPE_INT64,0}, \ +{SL_CONFIG_STRING_NROFDOWNLINKSLOTS,NULL,0,.i64ptr=&sl_tdd_ul_dl_cfg->pattern1.nrofDownlinkSlots,.defint64val=7,TYPE_INT64,0},\ +{SL_CONFIG_STRING_NROFDOWNLINKSYMBOLS,NULL,0,.i64ptr=&sl_tdd_ul_dl_cfg->pattern1.nrofDownlinkSymbols,.defint64val=10,TYPE_INT64,0}, \ +{SL_CONFIG_STRING_NROFUPLINKSLOTS,NULL,0,.i64ptr=&sl_tdd_ul_dl_cfg->pattern1.nrofUplinkSlots,.defint64val=2,TYPE_INT64,0},\ +{SL_CONFIG_STRING_NROFUPLINKSYMBOLS,NULL,0,.i64ptr=&sl_tdd_ul_dl_cfg->pattern1.nrofUplinkSymbols,.defint64val=4,TYPE_INT64,0}} + + +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* Sidelink Sync config parameters */ +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define SL_SYNCPARAMS_DESC(sl_syncconfig) { \ +{SL_CONFIG_STRING_SL_NUMSSB_WITHINPERIOD_0,NULL,0,.i64ptr=sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_NumSSB_WithinPeriod_r16,.defint64val=8,TYPE_INT64,0}, \ +{SL_CONFIG_STRING_SL_TIMEOFFSET_SSB_0,NULL,0,.i64ptr=sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_TimeOffsetSSB_r16,.defint64val=8,TYPE_INT64,0},\ +{SL_CONFIG_STRING_SL_TIMEINTERVAL_0,NULL,0,.i64ptr=sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_TimeInterval_r16,.defint64val=60,TYPE_INT64,0}} + + +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* Sidelink BWP Config parameters */ +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define SL_BWPPARAMS_DESC(sl_bwp) { \ +{SL_CONFIG_STRING_SL_BWP_START_AND_SIZE,NULL,0,.i64ptr=&sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->locationAndBandwidth,.defint64val=28875,TYPE_INT64,0}, \ +{SL_CONFIG_STRING_SL_BWP_NUM_SYMBOLS,NULL,0,.i64ptr=sl_bwp->sl_BWP_Generic_r16->sl_LengthSymbols_r16,.defint64val=14,TYPE_INT64,0}, \ +{SL_CONFIG_STRING_SL_BWP_START_SYMBOL,NULL,0,.i64ptr=sl_bwp->sl_BWP_Generic_r16->sl_StartSymbol_r16,.defint64val=0,TYPE_INT64,0}} + +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* Sidelink Resource pool parameters */ +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define SL_RESPOOLPARAMS_DESC(sl_res_pool) { \ +{SL_CONFIG_STRING_RESPOOL_PSCCH_NUMSYM,NULL,0,.i64ptr=sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_TimeResourcePSCCH_r16,.defint64val=1,TYPE_INT64,0}, \ +{SL_CONFIG_STRING_RESPOOL_PSCCH_NUMRBS,NULL,0,.i64ptr=sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_FreqResourcePSCCH_r16,.defint64val=4,TYPE_INT64,0}, \ +{SL_CONFIG_STRING_RESPOOL_SUBCH_SIZE_IN_RBS,NULL,0,.i64ptr=sl_res_pool->sl_SubchannelSize_r16,.defint64val=0,TYPE_INT64,0},\ +{SL_CONFIG_STRING_RESPOOL_SUBCH_START_RB,NULL,0,.i64ptr=sl_res_pool->sl_StartRB_Subchannel_r16,.defint64val=0,TYPE_INT64,0},\ +{SL_CONFIG_STRING_RESPOOL_NUM_RBS,NULL,0,.i64ptr=sl_res_pool->sl_RB_Number_r16,.defint64val=106,TYPE_INT64,0},\ +{SL_CONFIG_STRING_RESPOOL_NUM_SUBCHS,NULL,0,.i64ptr=sl_res_pool->sl_NumSubchannel_r16,.defint64val=10,TYPE_INT64,0}} + + +#endif diff --git a/targets/PROJECTS/NR-SIDELINK/CONF/sidelink_preconfig_1rxpool.conf b/targets/PROJECTS/NR-SIDELINK/CONF/sidelink_preconfig_1rxpool.conf new file mode 100644 index 0000000000..f6a934e0a3 --- /dev/null +++ b/targets/PROJECTS/NR-SIDELINK/CONF/sidelink_preconfig_1rxpool.conf @@ -0,0 +1,69 @@ + +#Configure Sidelink Preconfiguration params here. +SIDELINK_PRECONFIGURATION = ( + { + # TDD ULDL CONFIG used for sidelink + sl_dl_UL_TransmissionPeriodicity = 6; + sl_nrofDownlinkSlots = 7; + sl_nrofDownlinkSymbols = 10; + sl_nrofUplinkSlots = 2; + sl_nrofUplinkSymbols = 4; + + sl_FrequencyCommonConfig = ( + { + sl_offstToCarrier = 0; + sl_subcarrierSpacing = 1;//0-15Khz, 1-30Khz + sl_carrierBandwidth = 106;//numPRBs +#NR bands for Sidelink n47, n38. N47 - 5855Mhz - 5925Mhz +#SL SSB chosen to be located from RB10 to RB21. points to the middle of the SSB block. +#SSB location should be within Sidelink BWP +#792000 + 10*12*2 + 66*2. channel raster is 15Khz for band47 + sl_absoluteFrequencySSB = 792372; + sl_absoluteFrequencyPointA = 792000; + } + ); + + sl_BWP = ( + { +#RB start 0, RB size = 106. occupies complete Bw. + sl_locationAndBandwidth = 28875; +#Num Symbols used for Sidelink in an uplink slot +#Value can be between 0 to 7 indicating 7 to 14 symbols. + sl_LengthSymbols = 4; +#Sidelink Starting symbol in a slot +#Value can be between symbols 0 to 7 + sl_StartSymbol = 0; + } + ); + + sl_syncCfg = ( + { +#NUM SL-SSB within 16 frames + sl_NumSSB_WithinPeriod_0 = 2; +#Slot Offset for the first txn in the 16 frame period + sl_TimeOffsetSSB_0 = 8; +#interval in slots for repetition of SL-SSB + sl_TimeInterval_0 = 120; + } + ); + + sl_RxResPools = ( + { +#Number of symbols which carry PSCCH. +#Possible values 0 means 2 symbols, 1 - means 3 symbols. + sl_TimeResourcePSCCH = 1; +#Number of RBS which carry PSCCH +#Possible values {n10,n12,n15,n20,n25} + sl_FreqResourcePSCCH = 4; //25RBs +#Size of subchannel in RBs +#Possible values - {n10,n12,n15,n20,n25,n50,n75,n100} + sl_SubchannelSize = 5;//50RBs +#start in RB of the lowest subchannel in a rpool + sl_StartRB_Subchannel = 0; +#number of PRBs in a rpool + sl_RB_Number = 50; + sl_NumSubchannel = 1; + } + ); + } +); diff --git a/targets/PROJECTS/NR-SIDELINK/CONF/sidelink_preconfig_1rxpool_1txpool.conf b/targets/PROJECTS/NR-SIDELINK/CONF/sidelink_preconfig_1rxpool_1txpool.conf new file mode 100644 index 0000000000..b65b785393 --- /dev/null +++ b/targets/PROJECTS/NR-SIDELINK/CONF/sidelink_preconfig_1rxpool_1txpool.conf @@ -0,0 +1,89 @@ + +#Configure Sidelink Preconfiguration params here. +SIDELINK_PRECONFIGURATION = ( + { + # TDD ULDL CONFIG used for sidelink + sl_dl_UL_TransmissionPeriodicity = 6; + sl_nrofDownlinkSlots = 7; + sl_nrofDownlinkSymbols = 10; + sl_nrofUplinkSlots = 2; + sl_nrofUplinkSymbols = 4; + + sl_FrequencyCommonConfig = ( + { + sl_offstToCarrier = 0; + sl_subcarrierSpacing = 1;//0-15Khz, 1-30Khz + sl_carrierBandwidth = 106;//numPRBs +#NR bands for Sidelink n47, n38. N47 - 5855Mhz - 5925Mhz +#SL SSB chosen to be located from RB10 to RB21. points to the middle of the SSB block. +#SSB location should be within Sidelink BWP +#792000 + 10*12*2 + 66*2. channel raster is 15Khz for band47 + sl_absoluteFrequencySSB = 792372; + sl_absoluteFrequencyPointA = 792000; + } + ); + + sl_BWP = ( + { +#RB start 0, RB size = 106. occupies complete Bw. + sl_locationAndBandwidth = 28875; +#Num Symbols used for Sidelink in an uplink slot +#Value can be between symbols 7 to 14 + sl_LengthSymbols = 4; +#Sidelink Starting symbol in a slot +#Value can be between symbols 0 to 7 + sl_StartSymbol = 0; + } + ); + + sl_syncCfg = ( + { +#NUM SL-SSB within 16 frames + sl_NumSSB_WithinPeriod_0 = 2; +#Slot Offset for the first txn in the 16 frame period + sl_TimeOffsetSSB_0 = 8; +#interval in slots for repetition of SL-SSB + sl_TimeInterval_0 = 120; + } + ); + + sl_RxResPools = ( + { +#Number of symbols which carry PSCCH. +#Possible values 0 means 2 symbols, 1 - means 3 symbols. + sl_TimeResourcePSCCH = 1; +#Number of RBS which carry PSCCH +#Possible values {n10,n12,n15,n20,n25} + sl_FreqResourcePSCCH = 4; //25RBs +#Size of subchannel in RBs +#Possible values - {n10,n12,n15,n20,n25,n50,n75,n100} + sl_SubchannelSize = 5;//10RBs +#start in RB of the lowest subchannel in a rpool + sl_StartRB_Subchannel = 0; +#number of PRBs in a rpool + sl_RB_Number = 50; + sl_NumSubchannel = 1; + } + ); + + sl_TxResPools = ( + { +#Number of symbols which carry PSCCH. +#Possible values 0 means 2 symbols, 1 - means 3 symbols. + sl_TimeResourcePSCCH = 1; +#Number of RBS which carry PSCCH +#Possible values {n10,n12,n15,n20,n25} + sl_FreqResourcePSCCH = 4; //25RBs +#Size of subchannel in RBs +#Possible values - {n10,n12,n15,n20,n25,n50,n75,n100} + sl_SubchannelSize = 5;//50RBs +#start in RB of the lowest subchannel in a rpool + sl_StartRB_Subchannel = 0; +#number of PRBs in a rpool + sl_RB_Number = 50; + sl_NumSubchannel = 1; + } + ); + + } +); diff --git a/targets/PROJECTS/NR-SIDELINK/CONF/sidelink_preconfig_1txpool.conf b/targets/PROJECTS/NR-SIDELINK/CONF/sidelink_preconfig_1txpool.conf new file mode 100644 index 0000000000..46a2773f5a --- /dev/null +++ b/targets/PROJECTS/NR-SIDELINK/CONF/sidelink_preconfig_1txpool.conf @@ -0,0 +1,69 @@ + +#Configure Sidelink Preconfiguration params here. +SIDELINK_PRECONFIGURATION = ( + { + # TDD ULDL CONFIG used for sidelink + sl_dl_UL_TransmissionPeriodicity = 6; + sl_nrofDownlinkSlots = 7; + sl_nrofDownlinkSymbols = 10; + sl_nrofUplinkSlots = 2; + sl_nrofUplinkSymbols = 4; + + sl_FrequencyCommonConfig = ( + { + sl_offstToCarrier = 0; + sl_subcarrierSpacing = 1;//0-15Khz, 1-30Khz + sl_carrierBandwidth = 106;//numPRBs +#NR bands for Sidelink n47, n38. N47 - 5855Mhz - 5925Mhz +#SL SSB chosen to be located from RB10 to RB21. points to the middle of the SSB block. +#SSB location should be within Sidelink BWP +#792000 + 10*12*2 + 66*2. channel raster is 15Khz for band47 + sl_absoluteFrequencySSB = 792372; + sl_absoluteFrequencyPointA = 792000; + } + ); + + sl_BWP = ( + { +#RB start 0, RB size = 106. occupies complete Bw. + sl_locationAndBandwidth = 28875; +#Num Symbols used for Sidelink in an uplink slot +#Value can be between 0 to 7 indicating 7 to 14 symbols. + sl_LengthSymbols = 4; +#Sidelink Starting symbol in a slot +#Value can be between symbols 0 to 7 + sl_StartSymbol = 0; + } + ); + + sl_syncCfg = ( + { +#NUM SL-SSB within 16 frames + sl_NumSSB_WithinPeriod_0 = 2; +#Slot Offset for the first txn in the 16 frame period + sl_TimeOffsetSSB_0 = 8; +#interval in slots for repetition of SL-SSB + sl_TimeInterval_0 = 120; + } + ); + + sl_TxResPools = ( + { +#Number of symbols which carry PSCCH. +#Possible values 0 means 2 symbols, 1 - means 3 symbols. + sl_TimeResourcePSCCH = 1; +#Number of RBS which carry PSCCH +#Possible values {n10,n12,n15,n20,n25} + sl_FreqResourcePSCCH = 4; //25RBs +#Size of subchannel in RBs +#Possible values - {n10,n12,n15,n20,n25,n50,n75,n100} + sl_SubchannelSize = 5;//50RBs +#start in RB of the lowest subchannel in a rpool + sl_StartRB_Subchannel = 0; +#number of PRBs in a rpool + sl_RB_Number = 50; + sl_NumSubchannel = 1; + } + ); + } +); From 238c2f5a35d82b43e1733f6873ad3f059b37feed Mon Sep 17 00:00:00 2001 From: Raghavendra Dinavahi Date: Wed, 19 Jul 2023 10:53:25 +0200 Subject: [PATCH 3/4] Changes to the SL-Preconfig preparation --- openair2/RRC/NR_UE/rrc_UE.c | 2 +- openair2/RRC/NR_UE/rrc_proto.h | 2 +- openair2/RRC/NR_UE/rrc_sl_preconfig.c | 462 ++++-------------- openair2/RRC/NR_UE/sl_preconfig_paramvalues.h | 13 +- 4 files changed, 91 insertions(+), 388 deletions(-) diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index 411d3cbcd2..1f3ade57b2 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -453,7 +453,7 @@ NR_UE_RRC_INST_t* openair_rrc_top_init_ue_nr(char* uecap_file, char* rrc_config_ } if (get_softmodem_params()->sl_mode) { - configure_NR_SL_Preconfig(); + configure_NR_SL_Preconfig(get_softmodem_params()->sync_ref); } } else{ diff --git a/openair2/RRC/NR_UE/rrc_proto.h b/openair2/RRC/NR_UE/rrc_proto.h index dca74bf481..d4bfe0e52d 100644 --- a/openair2/RRC/NR_UE/rrc_proto.h +++ b/openair2/RRC/NR_UE/rrc_proto.h @@ -173,7 +173,7 @@ void handle_rlf_sync(NR_UE_Timers_Constants_t *tac, void nr_rrc_handle_SetupRelease_RLF_TimersAndConstants(NR_UE_RRC_INST_t *rrc, struct NR_SetupRelease_RLF_TimersAndConstants *rlf_TimersAndConstants); -void configure_NR_SL_Preconfig(void); +int configure_NR_SL_Preconfig(int sync_source); /** @}*/ #endif diff --git a/openair2/RRC/NR_UE/rrc_sl_preconfig.c b/openair2/RRC/NR_UE/rrc_sl_preconfig.c index 147ee69f81..f1f831f75d 100644 --- a/openair2/RRC/NR_UE/rrc_sl_preconfig.c +++ b/openair2/RRC/NR_UE/rrc_sl_preconfig.c @@ -55,10 +55,6 @@ static void prepare_NR_SL_SyncConfig(NR_SL_SyncConfig_r16_t *sl_syncconfig) { sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_NumSSB_WithinPeriod_r16 = calloc(1, sizeof(long)); sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_TimeOffsetSSB_r16 = calloc(1, sizeof(long)); sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_TimeInterval_r16 = calloc(1, sizeof(long)); - *sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_NumSSB_WithinPeriod_r16 = NR_SL_SSB_TimeAllocation_r16__sl_NumSSB_WithinPeriod_r16_n2; - *sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_TimeOffsetSSB_r16 = 8; - *sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_TimeInterval_r16 = 120; - sl_syncconfig->sl_SSB_TimeAllocation2_r16 = NULL; sl_syncconfig->sl_SSB_TimeAllocation3_r16 = NULL; @@ -74,11 +70,20 @@ static void prepare_NR_SL_SyncConfig(NR_SL_SyncConfig_r16_t *sl_syncconfig) { // Syncconfig is used when UE is synced to GNSS if set, else if UE is synced to eNB/gNB sl_syncconfig->gnss_Sync_r16 = calloc(1, sizeof(long)); *sl_syncconfig->gnss_Sync_r16 = 0; // GNSS + + char aprefix[MAX_OPTNAME_SIZE*2 + 8]; + paramdef_t SL_SYNCCFGPARAMS[] = SL_SYNCPARAMS_DESC(sl_syncconfig); + paramlist_def_t SL_SYNCFGParamList = {SL_CONFIG_STRING_SL_SYNCCONFIG_LIST, NULL, 0}; + sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0); + config_getlist(&SL_SYNCFGParamList, NULL, 0, aprefix); + LOG_I(RRC, "NUM SL-SYNCCFG elem in cfg file:%d\n", SL_SYNCFGParamList.numelt); + sprintf(aprefix, "%s.[%i].%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0,SL_CONFIG_STRING_SL_SYNCCONFIG_LIST, 0); + config_get(SL_SYNCCFGPARAMS,sizeof(SL_SYNCCFGPARAMS)/sizeof(paramdef_t),aprefix); } static void prepare_NR_SL_ResourcePool(NR_SL_ResourcePool_r16_t *sl_res_pool, uint16_t is_txpool, - uint16_t is_sl_syncsource) { + uint16_t is_sl_syncsource) { LOG_I(MAC, "HERE5"); // PSCCH configuration sl_res_pool->sl_PSCCH_Config_r16 = calloc(1, sizeof(*sl_res_pool->sl_PSCCH_Config_r16)); @@ -86,11 +91,9 @@ static void prepare_NR_SL_ResourcePool(NR_SL_ResourcePool_r16_t *sl_res_pool, sl_res_pool->sl_PSCCH_Config_r16->choice.setup = calloc(1, sizeof(NR_SL_PSCCH_Config_r16_t)); // Indicates number of symbols for PSCCH in a resource pool sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_TimeResourcePSCCH_r16 = calloc(1, sizeof(long)); - *sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_TimeResourcePSCCH_r16 = NR_SL_PSCCH_Config_r16__sl_TimeResourcePSCCH_r16_n3; // Indicates number of PRBs for PSCCH in a resource pool sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_FreqResourcePSCCH_r16 = calloc(1, sizeof(long)); - *sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_FreqResourcePSCCH_r16 = NR_SL_PSCCH_Config_r16__sl_FreqResourcePSCCH_r16_n25; // Inititation during PSCCH DMRS Sequence generation sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_DMRS_ScrambleID_r16 = calloc(1, sizeof(long)); @@ -131,17 +134,14 @@ static void prepare_NR_SL_ResourcePool(NR_SL_ResourcePool_r16_t *sl_res_pool, //Min freq domain resources used for resource sensing. Size of Subchannels sl_res_pool->sl_SubchannelSize_r16 = calloc(1, sizeof(long)); - *sl_res_pool->sl_SubchannelSize_r16 = NR_SL_ResourcePool_r16__sl_SubchannelSize_r16_n50; sl_res_pool->dummy = NULL; // lowest RB index of lowest subch in this resource pool sl_res_pool->sl_StartRB_Subchannel_r16 = calloc(1, sizeof(long)); - *sl_res_pool->sl_StartRB_Subchannel_r16 = 0; // STARTs from RB0 //number of subchannels in this res pool. contiguous PRBs sl_res_pool->sl_NumSubchannel_r16 = calloc(1, sizeof(long)); - *sl_res_pool->sl_NumSubchannel_r16 = 1; // 64QAM table is default. in case other MCS tables needs tobe used. @@ -158,7 +158,6 @@ static void prepare_NR_SL_ResourcePool(NR_SL_ResourcePool_r16_t *sl_res_pool, //number of contiguous PRBS in this res pool. sl_res_pool->sl_RB_Number_r16 = calloc(1, sizeof(long)); - *sl_res_pool->sl_RB_Number_r16 = 50; sl_res_pool->sl_PreemptionEnable_r16 = NULL; sl_res_pool->sl_PriorityThreshold_UL_URLLC_r16 = NULL; @@ -187,6 +186,14 @@ static void prepare_NR_SL_ResourcePool(NR_SL_ResourcePool_r16_t *sl_res_pool, // mask out unused bits sl_res_pool->ext1->sl_TimeResource_r16->buf[sl_res_pool->ext1->sl_TimeResource_r16->size - 1] &= (0 - (1 << (sl_res_pool->ext1->sl_TimeResource_r16->bits_unused))); + char aprefix[MAX_OPTNAME_SIZE*2 + 8]; + paramdef_t SL_POOLPARAMS[] = SL_RESPOOLPARAMS_DESC(sl_res_pool); + if (is_txpool) + sprintf(aprefix, "%s.[%i].%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0,SL_CONFIG_STRING_SL_TX_RPOOL_LIST, 0); + else + sprintf(aprefix, "%s.[%i].%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0,SL_CONFIG_STRING_SL_RX_RPOOL_LIST, 0); + + config_get(SL_POOLPARAMS,sizeof(SL_POOLPARAMS)/sizeof(paramdef_t),aprefix); } static void prepare_NR_SL_BWPConfigCommon(NR_SL_BWP_ConfigCommon_r16_t *sl_bwp, @@ -199,17 +206,11 @@ static void prepare_NR_SL_BWPConfigCommon(NR_SL_BWP_ConfigCommon_r16_t *sl_bwp, // if Cyclicprefix is NULL, then default value Normal cyclic prefix is configured. else EXT CP. sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->cyclicPrefix = NULL; - //30Khz and 40Mhz - 106 RBs - sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->locationAndBandwidth = 28875; - sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->subcarrierSpacing = NR_SubcarrierSpacing_kHz30; - - sl_bwp->sl_BWP_Generic_r16->sl_LengthSymbols_r16 = calloc(1, sizeof(long)); // Value can be between symbols 7 to 14 - *sl_bwp->sl_BWP_Generic_r16->sl_LengthSymbols_r16 = NR_SL_BWP_Generic_r16__sl_LengthSymbols_r16_sym14; + sl_bwp->sl_BWP_Generic_r16->sl_LengthSymbols_r16 = calloc(1, sizeof(long)); - sl_bwp->sl_BWP_Generic_r16->sl_StartSymbol_r16 = calloc(1, sizeof(long)); // Value can be between symbols 0 to 7 - *sl_bwp->sl_BWP_Generic_r16->sl_StartSymbol_r16 = NR_SL_BWP_Generic_r16__sl_StartSymbol_r16_sym0; + sl_bwp->sl_BWP_Generic_r16->sl_StartSymbol_r16 = calloc(1, sizeof(long)); sl_bwp->sl_BWP_Generic_r16->sl_PSBCH_Config_r16 = calloc(1,sizeof(NR_SL_PSBCH_Config_r16_t)); // PSBCH CONFIG contains PO and alpha for PSBCH powercontrol. @@ -217,10 +218,24 @@ static void prepare_NR_SL_BWPConfigCommon(NR_SL_BWP_ConfigCommon_r16_t *sl_bwp, sl_bwp->sl_BWP_Generic_r16->sl_TxDirectCurrentLocation_r16 = NULL; + char aprefix[MAX_OPTNAME_SIZE*2 + 8]; + paramdef_t SL_BWPPARAMS[] = SL_BWPPARAMS_DESC(sl_bwp); + paramlist_def_t SL_BWPParamList = {SL_CONFIG_STRING_SL_BWP_LIST, NULL, 0}; + sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0); + config_getlist(&SL_BWPParamList, NULL, 0, aprefix); + LOG_I(RRC, "NUM SL-BWP elem in cfg file:%d\n", SL_BWPParamList.numelt); + sprintf(aprefix, "%s.[%i].%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0, SL_CONFIG_STRING_SL_BWP_LIST, 0); + config_get( SL_BWPPARAMS,sizeof(SL_BWPPARAMS)/sizeof(paramdef_t),aprefix); + sl_bwp->sl_BWP_PoolConfigCommon_r16 = calloc(1, sizeof(NR_SL_BWP_PoolConfigCommon_r16_t)); - if (num_rx_pools) { - AssertFatal(num_rx_pools >= 1, "Currently supports only 1 RX pool\n"); + paramlist_def_t SL_RxPoolParamList = {SL_CONFIG_STRING_SL_RX_RPOOL_LIST, NULL, 0}; + sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0); + config_getlist(&SL_RxPoolParamList, NULL, 0, aprefix); + LOG_I(RRC, "NUM Rx RPOOLs in cfg file:%d\n", SL_RxPoolParamList.numelt); + AssertFatal(SL_RxPoolParamList.numelt <= 1 && num_rx_pools <= 1, "Only Max 1 RX Respool Supported now\n"); + + if (num_rx_pools || SL_RxPoolParamList.numelt) { // Receiving resource pool. NR_SL_ResourcePool_r16_t *respool = calloc(1, sizeof(*respool)); sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16 = calloc(1, sizeof(*sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16)); @@ -230,16 +245,22 @@ static void prepare_NR_SL_BWPConfigCommon(NR_SL_BWP_ConfigCommon_r16_t *sl_bwp, } else sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16 = NULL; - if (num_tx_pools) { - AssertFatal(num_tx_pools >= 1, "Currently supports only 1 TX pool\n"); + paramlist_def_t SL_TxPoolParamList = {SL_CONFIG_STRING_SL_TX_RPOOL_LIST, NULL, 0}; + sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0); + config_getlist(&SL_TxPoolParamList, NULL, 0, aprefix); + LOG_I(RRC, "NUM Tx RPOOL in cfg file:%d\n", SL_TxPoolParamList.numelt); + AssertFatal(SL_TxPoolParamList.numelt <= 1 && num_tx_pools <= 1, "Only Max 1 TX Respool Supported now\n"); + + if (num_tx_pools || SL_TxPoolParamList.numelt) { //resource pool(s) to transmit NR SL NR_SL_ResourcePoolConfig_r16_t *respoolcfg = calloc(1, sizeof(*respoolcfg)); - sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16 = calloc(1, sizeof(*sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16)); + sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16 = + calloc(1, sizeof(*sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16)); ASN_SEQUENCE_ADD(&sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list, respoolcfg); - sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[0]->sl_ResourcePoolID_r16 = 1; + sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[0]->sl_ResourcePoolID_r16 = 0; sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[0]->sl_ResourcePool_r16 = calloc(1, sizeof(NR_SL_ResourcePool_r16_t)); // Fill tx resource pool - prepare_NR_SL_ResourcePool(sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[0]->sl_ResourcePool_r16, num_tx_pools, sl_syncsource); + prepare_NR_SL_ResourcePool(sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[0]->sl_ResourcePool_r16, 1, sl_syncsource); } else sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16 = NULL; @@ -254,19 +275,15 @@ static void prepare_NR_SL_FreqConfigCommon(NR_SL_FreqConfigCommon_r16_t *sl_fcfg // Sub carrier spacing used on this frequency configured. NR_SCS_SpecificCarrier_t *scs_specific = calloc(1, sizeof(*scs_specific)); ASN_SEQUENCE_ADD(&sl_fcfg->sl_SCS_SpecificCarrierList_r16.list, scs_specific); - sl_fcfg->sl_SCS_SpecificCarrierList_r16.list.array[0]->offsetToCarrier = 0; - sl_fcfg->sl_SCS_SpecificCarrierList_r16.list.array[0]->subcarrierSpacing = NR_SubcarrierSpacing_kHz30; - sl_fcfg->sl_SCS_SpecificCarrierList_r16.list.array[0]->carrierBandwidth = 106; //40Mhz // NR bands for Sidelink n47, n38. // N47band - 5855Mhz - 5925Mhz - sl_fcfg->sl_AbsoluteFrequencyPointA_r16 = 792000; //freq 5880Mhz + //sl_fcfg->sl_AbsoluteFrequencyPointA_r16 = 792000; //freq 5880Mhz //SL SSB chosen to be located from RB10 to RB21. points to the middle of the SSB block. //SSB location should be within Sidelink BWP //792000 + 10*12*2 + 66*2. channel raster is 15Khz for band47 sl_fcfg->sl_AbsoluteFrequencySSB_r16 = calloc(1, sizeof(NR_ARFCN_ValueNR_t)); - *sl_fcfg->sl_AbsoluteFrequencySSB_r16 = 792372; //NR SL transmission with a 7.5 Khz shift to the LTE raster. if absent, freq shift is disabled. //Required if carrier freq configured for NR SL shared by LTE SL @@ -275,6 +292,15 @@ static void prepare_NR_SL_FreqConfigCommon(NR_SL_FreqConfigCommon_r16_t *sl_fcfg //NR SL transmission with valueN*5Khz shift to LTE raster. sl_fcfg->valueN_r16 = 0; + char aprefix[MAX_OPTNAME_SIZE*2 + 8]; + paramdef_t SL_FCCPARAMS[] = SL_FCCPARAMS_DESC(sl_fcfg); + paramlist_def_t SL_FCCParamList = {SL_CONFIG_STRING_SL_FCC_LIST, NULL, 0}; + sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION,0); + config_getlist(&SL_FCCParamList, NULL, 0, aprefix); + LOG_I(RRC, "NUM SL-FCC elem in cfg file:%d\n", SL_FCCParamList.numelt); + sprintf(aprefix, "%s.[%i].%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION,0, SL_CONFIG_STRING_SL_FCC_LIST, 0); + config_get( SL_FCCPARAMS,sizeof(SL_FCCPARAMS)/sizeof(paramdef_t),aprefix); + // Sidelink BWP configuration. // In REL16, 17 SUPPORTS only 1 SIDELINK Bandwidth part NR_SL_BWP_ConfigCommon_r16_t *bwpcfgcommon = calloc(1, sizeof(*bwpcfgcommon)); @@ -347,14 +373,21 @@ NR_SL_PreconfigurationNR_r16_t *prepare_NR_SL_PRECONFIGURATION(uint16_t num_tx_p //For the UE with sync reference as another UE, TDD ULDL config is determined from SL-MIB sl_preconfig->sl_PreconfigGeneral_r16 = calloc(1, sizeof(NR_SL_PreconfigGeneral_r16_t)); sl_preconfig->sl_PreconfigGeneral_r16->sl_TDD_Configuration_r16 = calloc(1, sizeof(NR_TDD_UL_DL_ConfigCommon_t)); - NR_TDD_UL_DL_ConfigCommon_t *tdd_ul_dl_cfg = sl_preconfig->sl_PreconfigGeneral_r16->sl_TDD_Configuration_r16; - tdd_ul_dl_cfg->pattern1.dl_UL_TransmissionPeriodicity = NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms2p5; - tdd_ul_dl_cfg->pattern1.nrofDownlinkSlots = 7; - tdd_ul_dl_cfg->pattern1.nrofDownlinkSymbols = 10; - tdd_ul_dl_cfg->pattern1.nrofUplinkSlots = 2; - tdd_ul_dl_cfg->pattern1.nrofUplinkSymbols = 4; - tdd_ul_dl_cfg->pattern1.ext1 = NULL; - tdd_ul_dl_cfg->pattern2 = NULL; + NR_TDD_UL_DL_ConfigCommon_t *tdd_uldl_cfg = sl_preconfig->sl_PreconfigGeneral_r16->sl_TDD_Configuration_r16; + tdd_uldl_cfg->pattern1.ext1 = NULL; + tdd_uldl_cfg->pattern2 = NULL; + + char aprefix[MAX_OPTNAME_SIZE*2 + 8]; + sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION,0); + paramdef_t SLTDDCFG_PARAMS[] = SL_TDDCONFIGPARAMS_DESC(tdd_uldl_cfg); + config_get(SLTDDCFG_PARAMS,sizeof(SLTDDCFG_PARAMS)/sizeof(paramdef_t),aprefix); + + NR_SL_FreqConfigCommon_r16_t *fcc = sl_preconfig->sl_PreconfigFreqInfoList_r16->list.array[0]; + tdd_uldl_cfg->referenceSubcarrierSpacing = + fcc->sl_SCS_SpecificCarrierList_r16.list.array[0]->subcarrierSpacing; + NR_SL_BWP_ConfigCommon_r16_t *sl_bwp = fcc->sl_BWP_List_r16->list.array[0]; + sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->subcarrierSpacing = + fcc->sl_SCS_SpecificCarrierList_r16.list.array[0]->subcarrierSpacing; // Configurations used for UE autonomous resource selection sl_preconfig->sl_UE_SelectedPreConfig_r16 = NULL; @@ -372,354 +405,33 @@ NR_SL_PreconfigurationNR_r16_t *prepare_NR_SL_PRECONFIGURATION(uint16_t num_tx_p return sl_preconfiguration; } -static void get_NR_SL_Preconfig_params(NR_SL_PreconfigurationNR_r16_t *sl_preconfig) { - char aprefix[MAX_OPTNAME_SIZE*2 + 8]; +int configure_NR_SL_Preconfig(int sync_source) { - sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION,0); + NR_SL_PreconfigurationNR_r16_t *sl_preconfig = NULL; + int num_txpools = 0, num_rxpools = 0; - NR_TDD_UL_DL_ConfigCommon_t *sl_tdd_uldl_cfg = - sl_preconfig->sidelinkPreconfigNR_r16.sl_PreconfigGeneral_r16->sl_TDD_Configuration_r16; - paramdef_t SLTDDCFG_PARAMS[] = SL_TDDCONFIGPARAMS_DESC(sl_tdd_uldl_cfg); - config_get(SLTDDCFG_PARAMS,sizeof(SLTDDCFG_PARAMS)/sizeof(paramdef_t),aprefix); + if (sync_source) { + //SL-Preconfiguration with 1 txpool, 0 rxpool if UE is a syncsource + num_txpools = 1; + sl_preconfig = prepare_NR_SL_PRECONFIGURATION(num_txpools,num_rxpools,sync_source); - NR_SL_FreqConfigCommon_r16_t *sl_fcc = sl_preconfig->sidelinkPreconfigNR_r16.sl_PreconfigFreqInfoList_r16->list.array[0]; - paramdef_t SL_FCCPARAMS[] = SL_FCCPARAMS_DESC(sl_fcc); - paramlist_def_t SL_FCCParamList = {SL_CONFIG_STRING_SL_FCC_LIST, NULL, 0}; - sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION,0); - config_getlist(&SL_FCCParamList, NULL, 0, aprefix); - LOG_I(RRC, "NUM SL-FCC elem in cfg file:%d\n", SL_FCCParamList.numelt); - if (SL_FCCParamList.numelt > 0) { - sprintf(aprefix, "%s.[%i].%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION,0, SL_CONFIG_STRING_SL_FCC_LIST, 0); - config_get( SL_FCCPARAMS,sizeof(SL_FCCPARAMS)/sizeof(paramdef_t),aprefix); + if (LOG_DEBUGFLAG(DEBUG_ASN1)) { + xer_fprint(stdout, &asn_DEF_NR_SL_PreconfigurationNR_r16, sl_preconfig); } - - NR_SL_BWP_ConfigCommon_r16_t *sl_bwp = sl_fcc->sl_BWP_List_r16->list.array[0]; - paramdef_t SL_BWPPARAMS[] = SL_BWPPARAMS_DESC(sl_bwp); - paramlist_def_t SL_BWPParamList = {SL_CONFIG_STRING_SL_BWP_LIST, NULL, 0}; - sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0); - config_getlist(&SL_BWPParamList, NULL, 0, aprefix); - LOG_I(RRC, "NUM SL-BWP elem in cfg file:%d\n", SL_BWPParamList.numelt); - if (SL_BWPParamList.numelt > 0) { - sprintf(aprefix, "%s.[%i].%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0, SL_CONFIG_STRING_SL_BWP_LIST, 0); - config_get( SL_BWPPARAMS,sizeof(SL_BWPPARAMS)/sizeof(paramdef_t),aprefix); - } - - sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->subcarrierSpacing = - sl_fcc->sl_SCS_SpecificCarrierList_r16.list.array[0]->subcarrierSpacing; - sl_tdd_uldl_cfg->referenceSubcarrierSpacing = - sl_fcc->sl_SCS_SpecificCarrierList_r16.list.array[0]->subcarrierSpacing; - - NR_SL_SyncConfig_r16_t *sl_synccfg = sl_fcc->sl_SyncConfigList_r16->list.array[0]; - paramdef_t SL_SYNCCFGPARAMS[] = SL_SYNCPARAMS_DESC(sl_synccfg); - paramlist_def_t SL_SYNCFGParamList = {SL_CONFIG_STRING_SL_SYNCCONFIG_LIST, NULL, 0}; - sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0); - config_getlist(&SL_SYNCFGParamList, NULL, 0, aprefix); - LOG_I(RRC, "NUM SL-SYNCCFG elem in cfg file:%d\n", SL_SYNCFGParamList.numelt); - if (SL_SYNCFGParamList.numelt > 0) { - sprintf(aprefix, "%s.[%i].%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0,SL_CONFIG_STRING_SL_SYNCCONFIG_LIST, 0); - config_get(SL_SYNCCFGPARAMS,sizeof(SL_SYNCCFGPARAMS)/sizeof(paramdef_t),aprefix); - } - - paramlist_def_t SL_RxPoolParamList = {SL_CONFIG_STRING_SL_RX_RPOOL_LIST, NULL, 0}; - sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0); - config_getlist(&SL_RxPoolParamList, NULL, 0, aprefix); - LOG_I(RRC, "NUM Rx RPOOLs in cfg file:%d\n", SL_RxPoolParamList.numelt); - AssertFatal(SL_RxPoolParamList.numelt <= 1, "Only Max 1 RX Respool Supported now\n"); - - if (SL_RxPoolParamList.numelt > 0) { - - NR_SL_ResourcePool_r16_t *rxpool = NULL; - - if (sl_bwp->sl_BWP_PoolConfigCommon_r16 == NULL) - sl_bwp->sl_BWP_PoolConfigCommon_r16 = calloc(1, sizeof(*sl_bwp->sl_BWP_PoolConfigCommon_r16)); - if (sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16 == NULL) - sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16 = calloc(1, sizeof(*sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16)); - if (sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16->list.count == 0) { - rxpool = calloc(1, sizeof(NR_SL_ResourcePool_r16_t)); - sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16 = calloc(1, sizeof(*sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16)); - ASN_SEQUENCE_ADD(&sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16->list, rxpool); - // Fill RX resource pool - prepare_NR_SL_ResourcePool(sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16->list.array[0], 0, 0); - } - - rxpool = sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16->list.array[0]; - paramdef_t SL_RXPOOLPARAMS[] = SL_RESPOOLPARAMS_DESC(rxpool); - sprintf(aprefix, "%s.[%i].%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0,SL_CONFIG_STRING_SL_RX_RPOOL_LIST, 0); - config_get(SL_RXPOOLPARAMS,sizeof(SL_RXPOOLPARAMS)/sizeof(paramdef_t),aprefix); - - } else { - - if (sl_bwp->sl_BWP_PoolConfigCommon_r16) - ASN_STRUCT_FREE(asn_DEF_NR_SL_BWP_ConfigCommon_r16, sl_bwp->sl_BWP_PoolConfigCommon_r16); - } - - paramlist_def_t SL_TxPoolParamList = {SL_CONFIG_STRING_SL_TX_RPOOL_LIST, NULL, 0}; - sprintf(aprefix, "%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0); - config_getlist(&SL_TxPoolParamList, NULL, 0, aprefix); - LOG_I(RRC, "NUM Tx RPOOL in cfg file:%d\n", SL_TxPoolParamList.numelt); - AssertFatal(SL_TxPoolParamList.numelt <= 1, "Only Max 1 TX Respool Supported now\n"); - - if (SL_TxPoolParamList.numelt > 0) { - - NR_SL_ResourcePool_r16_t *txpool = NULL; - - if (sl_bwp->sl_BWP_PoolConfigCommon_r16 == NULL) - sl_bwp->sl_BWP_PoolConfigCommon_r16 = calloc(1, sizeof(*sl_bwp->sl_BWP_PoolConfigCommon_r16)); - if (sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16 == NULL) - sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16 = - calloc(1, sizeof(*sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16)); - if (sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.count == 0) { - NR_SL_ResourcePoolConfig_r16_t *respoolcfg = calloc(1, sizeof(*respoolcfg)); - respoolcfg->sl_ResourcePoolID_r16 = 0; - respoolcfg->sl_ResourcePool_r16 = calloc(1, sizeof(NR_SL_ResourcePool_r16_t)); - ASN_SEQUENCE_ADD(&sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list, respoolcfg); - // Fill TX resource pool - prepare_NR_SL_ResourcePool(sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[0]->sl_ResourcePool_r16, 1, 0); - } - - txpool = sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[0]->sl_ResourcePool_r16; - paramdef_t SL_TXPOOLPARAMS[] = SL_RESPOOLPARAMS_DESC(txpool); - sprintf(aprefix, "%s.[%i].%s.[%i]", SL_CONFIG_STRING_SL_PRECONFIGURATION, 0,SL_CONFIG_STRING_SL_TX_RPOOL_LIST, 0); - config_get(SL_TXPOOLPARAMS,sizeof(SL_TXPOOLPARAMS)/sizeof(paramdef_t),aprefix); - } else { - - if (sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16) { - ASN_STRUCT_FREE(asn_DEF_NR_SL_ResourcePoolConfig_r16, sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[0]); - free(sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16); - sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16 = NULL; - } - } - - return; -} - -static void dump_NR_SL_ResourcePoolParams(NR_SL_ResourcePool_r16_t *respool) { - - if (respool->sl_PSCCH_Config_r16 && - respool->sl_PSCCH_Config_r16->present == NR_SetupRelease_SL_PSCCH_Config_r16_PR_setup) { - - NR_SL_PSCCH_Config_r16_t *pscch_cfg = respool->sl_PSCCH_Config_r16->choice.setup; - LOG_I(NR_RRC,"PSCCH config: sl_TimeResourcePSCCH:%ld, sl_FreqResourcePSCCH:%ld, sl_DMRS_ScrambleID:%ld, sl_NumReservedBits:%ld\n", - (pscch_cfg->sl_TimeResourcePSCCH_r16)? *pscch_cfg->sl_TimeResourcePSCCH_r16 : 0, - (pscch_cfg->sl_FreqResourcePSCCH_r16)? *pscch_cfg->sl_FreqResourcePSCCH_r16 : 0, - (pscch_cfg->sl_DMRS_ScrambleID_r16)? *pscch_cfg->sl_DMRS_ScrambleID_r16 : 0, - (pscch_cfg->sl_NumReservedBits_r16)? *pscch_cfg->sl_NumReservedBits_r16 : 0); } else { - LOG_I(NR_RRC,"PSCCH CONFIG: not present\n"); - } + //SL-Preconfiguration with 0 txpool, 1 rxpool if UE is not a syncsource + num_rxpools = 1; + sl_preconfig = prepare_NR_SL_PRECONFIGURATION(num_txpools,num_rxpools,sync_source); - if (respool->sl_PSSCH_Config_r16 && - respool->sl_PSSCH_Config_r16->present == NR_SetupRelease_SL_PSSCH_Config_r16_PR_setup) { - - LOG_I(NR_RRC,"PSSCH config: present\n"); - } else { - LOG_I(NR_RRC,"PSSCH CONFIG: not present\n"); - } - if (respool->sl_PSFCH_Config_r16 && - respool->sl_PSFCH_Config_r16->present == NR_SetupRelease_SL_PSFCH_Config_r16_PR_setup) { - - LOG_I(NR_RRC,"PSFCH config: present\n"); - } else { - LOG_I(NR_RRC,"PSFCH CONFIG: not present\n"); - } - - LOG_I(NR_RRC,"Subchannels info: sl_SubchannelSize:%ld, sl_StartRB_Subchannel:%ld, sl_NumSubchannel:%ld, sl_RB_Number:%ld\n", - (respool->sl_SubchannelSize_r16)? *respool->sl_SubchannelSize_r16 : 0, - (respool->sl_StartRB_Subchannel_r16)? *respool->sl_StartRB_Subchannel_r16 : 0, - (respool->sl_NumSubchannel_r16)? *respool->sl_NumSubchannel_r16 : 0, - (respool->sl_RB_Number_r16)? *respool->sl_RB_Number_r16 : 0); - - if (respool->ext1 && - respool->ext1->sl_TimeResource_r16) { - int size = respool->ext1->sl_TimeResource_r16->size; - int unused = respool->ext1->sl_TimeResource_r16->bits_unused; - LOG_I(NR_RRC, "sl_TimeResource bitmap len:%d\n",size*8-unused); - for (int i=0;iext1->sl_TimeResource_r16->buf[i]); + if (LOG_DEBUGFLAG(DEBUG_ASN1)) { + xer_fprint(stdout, &asn_DEF_NR_SL_PreconfigurationNR_r16, sl_preconfig); } } -} - -static void dump_NR_SL_FreqConfigCommonParams(NR_SL_FreqConfigCommon_r16_t *sl_fcfg) { - - LOG_I(NR_RRC, "NR_SL_FreqConfigCommon_r16 IEs.............\n"); - - LOG_I(NR_RRC, "sl_AbsoluteFrequencyPointA:%ld \n", sl_fcfg->sl_AbsoluteFrequencyPointA_r16); - - if (sl_fcfg->sl_AbsoluteFrequencySSB_r16) { - LOG_I(NR_RRC, "*sl_AbsoluteFrequencySSB_r16:%ld \n", *sl_fcfg->sl_AbsoluteFrequencySSB_r16); - } - - int num = sl_fcfg->sl_SCS_SpecificCarrierList_r16.list.count; - for (int i = 0; i < num; i++) { - LOG_I(NR_RRC," SCS entry[%d]: offsetToCarrier:%ld, subcarrierSpacing:%ld, carrierBw:%ld \n", - i, sl_fcfg->sl_SCS_SpecificCarrierList_r16.list.array[i]->offsetToCarrier, - sl_fcfg->sl_SCS_SpecificCarrierList_r16.list.array[i]->subcarrierSpacing, - sl_fcfg->sl_SCS_SpecificCarrierList_r16.list.array[i]->carrierBandwidth); - } - - LOG_I(NR_RRC, "valueN_r16:%ld \n", sl_fcfg->valueN_r16); - - if (sl_fcfg->sl_BWP_List_r16) { - num = sl_fcfg->sl_BWP_List_r16->list.count; - LOG_I(NR_RRC, "Sidelink BWPs configured:%d\n", num); - for (int i = 0; i < num; i++) { - NR_SL_BWP_ConfigCommon_r16_t *sl_bwp = sl_fcfg->sl_BWP_List_r16->list.array[i]; - if (sl_bwp->sl_BWP_Generic_r16 && - sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16) { - LOG_I(NR_RRC," SL-BWP[%d]: CyclicPrefix:%s, scs:%ld, locandBw:%ld\n", - i, (sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->cyclicPrefix) ? "EXTENDED" : "NORMAL", - sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->subcarrierSpacing, - sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->locationAndBandwidth); - - LOG_I(NR_RRC," SL-BWP[%d]: sl_LengthSymbols:%ld, sl_StartSymbol:%ld\n", - i, *sl_bwp->sl_BWP_Generic_r16->sl_LengthSymbols_r16, - *sl_bwp->sl_BWP_Generic_r16->sl_StartSymbol_r16); - - - if (sl_bwp->sl_BWP_PoolConfigCommon_r16 && - sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16) { - - int num_rxpools = sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_RxPool_r16->list.count; - LOG_I(NR_RRC, "NUM RX RESOURCE POOLs:%d\n", num_rxpools); - for (int i=0; isl_BWP_PoolConfigCommon_r16->sl_RxPool_r16->list.array[i]); - } - } - if (sl_bwp->sl_BWP_PoolConfigCommon_r16 && - sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16) { - - int num_txpools = sl_bwp->sl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.count; - LOG_I(NR_RRC, "NUM TX RESOURCE POOLs:%d\n", num_txpools); - for (int i=0; isl_BWP_PoolConfigCommon_r16->sl_TxPoolSelectedNormal_r16->list.array[i]->sl_ResourcePool_r16); - } - } - } - } - } - - if (sl_fcfg->sl_SyncConfigList_r16) { - int num = sl_fcfg->sl_SyncConfigList_r16->list.count; - LOG_I(NR_RRC, "NUM SyncConfig entries:%d\n", num); - for (int i=0;isl_SyncConfigList_r16->list.array[i]; - if (synccfg->sl_SSB_TimeAllocation1_r16) { - NR_SL_SSB_TimeAllocation_r16_t *ssb_ta = synccfg->sl_SSB_TimeAllocation1_r16; - LOG_I(NR_RRC, "syncconfig[%d]: Timealloc1, sl_NumSSB_WithinPeriod:%ld, sl_TimeOffsetSSB:%ld,sl_TimeInterval:%ld\n", - i, (ssb_ta->sl_NumSSB_WithinPeriod_r16) ? *ssb_ta->sl_NumSSB_WithinPeriod_r16 : 0, - (ssb_ta->sl_TimeOffsetSSB_r16) ? *ssb_ta->sl_TimeOffsetSSB_r16 : 0, - (ssb_ta->sl_TimeInterval_r16) ? *ssb_ta->sl_TimeInterval_r16 : 0); - } else { - LOG_I(NR_RRC, "syncconfig[%d]: Timealloc1 not present\n",i); - } - if (synccfg->sl_SSB_TimeAllocation2_r16) { - NR_SL_SSB_TimeAllocation_r16_t *ssb_ta = synccfg->sl_SSB_TimeAllocation2_r16; - LOG_I(NR_RRC, "syncconfig[%d]: Timealloc2, sl_NumSSB_WithinPeriod:%ld, sl_TimeOffsetSSB:%ld,sl_TimeInterval:%ld\n", - i, (ssb_ta->sl_NumSSB_WithinPeriod_r16) ? *ssb_ta->sl_NumSSB_WithinPeriod_r16 : 0, - (ssb_ta->sl_TimeOffsetSSB_r16) ? *ssb_ta->sl_TimeOffsetSSB_r16 : 0, - (ssb_ta->sl_TimeInterval_r16) ? *ssb_ta->sl_TimeInterval_r16 : 0); - } else { - LOG_I(NR_RRC, "syncconfig[%d]: Timealloc2 not present\n",i); - } - if (synccfg->sl_SSB_TimeAllocation3_r16) { - NR_SL_SSB_TimeAllocation_r16_t *ssb_ta = synccfg->sl_SSB_TimeAllocation3_r16; - LOG_I(NR_RRC, "syncconfig[%d]: Timealloc3, sl_NumSSB_WithinPeriod:%ld, sl_TimeOffsetSSB:%ld,sl_TimeInterval:%ld\n", - i, (ssb_ta->sl_NumSSB_WithinPeriod_r16) ? *ssb_ta->sl_NumSSB_WithinPeriod_r16 : 0, - (ssb_ta->sl_TimeOffsetSSB_r16) ? *ssb_ta->sl_TimeOffsetSSB_r16 : 0, - (ssb_ta->sl_TimeInterval_r16) ? *ssb_ta->sl_TimeInterval_r16 : 0); - } else { - LOG_I(NR_RRC, "syncconfig[%d]: Timealloc3 not present\n",i); - } - } - } -} - - -void dump_NR_SL_Preconfiguration(NR_SL_PreconfigurationNR_r16_t *sl_preconfiguration) { - - NR_SidelinkPreconfigNR_r16_t *sl_preconfig = &sl_preconfiguration->sidelinkPreconfigNR_r16; - - AssertFatal(sl_preconfiguration || sl_preconfig ,"Sl_preconf cannot be NULL\n"); - - LOG_I(NR_RRC, "-------------START of NR_SL_Preconfiguration IEs............\n"); - - if (sl_preconfig->sl_PreconfigFreqInfoList_r16) { - int num = sl_preconfig->sl_PreconfigFreqInfoList_r16->list.count; - LOG_I(NR_RRC, "Number of Sidelink Frequencies configured:%d\n", num); - - for (int i=0;isl_PreconfigFreqInfoList_r16->list.array[0]); - } - } - - if (sl_preconfig->sl_PreconfigGeneral_r16 && - sl_preconfig->sl_PreconfigGeneral_r16->sl_TDD_Configuration_r16) { - - NR_TDD_UL_DL_ConfigCommon_t *tdd_ul_dl_cfg = sl_preconfig->sl_PreconfigGeneral_r16->sl_TDD_Configuration_r16; - LOG_I(NR_RRC,"SL-TDD ULDL config: Transmissionperiod:%ld,DL-Slots:%ld,Sym:%ld, UL-Slots:%ld,Symbols:%ld\n", - tdd_ul_dl_cfg->pattern1.dl_UL_TransmissionPeriodicity, - tdd_ul_dl_cfg->pattern1.nrofDownlinkSlots, tdd_ul_dl_cfg->pattern1.nrofDownlinkSymbols, - tdd_ul_dl_cfg->pattern1.nrofUplinkSlots, tdd_ul_dl_cfg->pattern1.nrofUplinkSymbols); - - if (tdd_ul_dl_cfg->pattern1.ext1 && - tdd_ul_dl_cfg->pattern1.ext1->dl_UL_TransmissionPeriodicity_v1530) { - LOG_I(NR_RRC, "SL-TDD ULDL config: Transmissionperiod_v1530:%ld\n", - *tdd_ul_dl_cfg->pattern1.ext1->dl_UL_TransmissionPeriodicity_v1530); - } - - AssertFatal(tdd_ul_dl_cfg->pattern2 == NULL ,"pattern2 not supported\n"); - } - - LOG_I(NR_RRC, "-------------END OF NR_SL_Preconfiguration IEs............\n\n"); -} - -int configure_NR_SL_Preconfig() { - - //Example configurations to check and test - //UE needs to be set with only 1 PREconfiguration. TBD.. Remove these later. - - //SL-Preconfiguration with 1 txpool, 1 rxpool and not syncsource - NR_SL_PreconfigurationNR_r16_t *sl_preconfig = prepare_NR_SL_PRECONFIGURATION(1,1,0); - dump_NR_SL_Preconfiguration(sl_preconfig); - - if (!CONFIG_ISFLAGSET(CONFIG_NOOOPT)) { - get_NR_SL_Preconfig_params(sl_preconfig); - dump_NR_SL_Preconfiguration(sl_preconfig); - } - ASN_STRUCT_FREE(asn_DEF_NR_SL_PreconfigurationNR_r16, sl_preconfig); sl_preconfig = NULL; //END....... - //SL-Preconfiguration with 1 txpool, 0 rxpool and UE is syncsource - sl_preconfig = prepare_NR_SL_PRECONFIGURATION(1,0,1); - dump_NR_SL_Preconfiguration(sl_preconfig); - - if (!CONFIG_ISFLAGSET(CONFIG_NOOOPT)) { - get_NR_SL_Preconfig_params(sl_preconfig); - dump_NR_SL_Preconfiguration(sl_preconfig); - } - - ASN_STRUCT_FREE(asn_DEF_NR_SL_PreconfigurationNR_r16, sl_preconfig); - sl_preconfig = NULL; - //END - - //SL-Preconfiguration with 0 txpool, 1 rxpool and UE is not a syncsource - sl_preconfig = prepare_NR_SL_PRECONFIGURATION(0,1,0); - dump_NR_SL_Preconfiguration(sl_preconfig); - - if (!CONFIG_ISFLAGSET(CONFIG_NOOOPT)) { - get_NR_SL_Preconfig_params(sl_preconfig); - dump_NR_SL_Preconfiguration(sl_preconfig); - } - - ASN_STRUCT_FREE(asn_DEF_NR_SL_PreconfigurationNR_r16, sl_preconfig); - sl_preconfig = NULL; - return 0; -} \ No newline at end of file +} diff --git a/openair2/RRC/NR_UE/sl_preconfig_paramvalues.h b/openair2/RRC/NR_UE/sl_preconfig_paramvalues.h index 026b486881..5d1c22b6e2 100644 --- a/openair2/RRC/NR_UE/sl_preconfig_paramvalues.h +++ b/openair2/RRC/NR_UE/sl_preconfig_paramvalues.h @@ -88,15 +88,6 @@ -/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ -/* Params to fill Sidelink PRECONFIG */ -/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ -#define SL_PRECONFIG_DESC(x,y) {\ -{SL_CONFIG_STRING_SL_BWP_NUM_RX_POOLS,NULL,0,.uptr=&x,.defintval=0,TYPE_UINT,0},\ -{SL_CONFIG_STRING_SL_BWP_NUM_RX_POOLS,NULL,0,.uptr=&y,.defintval=0,TYPE_UINT,0}} - - - /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Sidelink Frequency common Cell Config parameters */ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ @@ -123,7 +114,7 @@ /* Sidelink Sync config parameters */ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ #define SL_SYNCPARAMS_DESC(sl_syncconfig) { \ -{SL_CONFIG_STRING_SL_NUMSSB_WITHINPERIOD_0,NULL,0,.i64ptr=sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_NumSSB_WithinPeriod_r16,.defint64val=8,TYPE_INT64,0}, \ +{SL_CONFIG_STRING_SL_NUMSSB_WITHINPERIOD_0,NULL,0,.i64ptr=sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_NumSSB_WithinPeriod_r16,.defint64val=1,TYPE_INT64,0}, \ {SL_CONFIG_STRING_SL_TIMEOFFSET_SSB_0,NULL,0,.i64ptr=sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_TimeOffsetSSB_r16,.defint64val=8,TYPE_INT64,0},\ {SL_CONFIG_STRING_SL_TIMEINTERVAL_0,NULL,0,.i64ptr=sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_TimeInterval_r16,.defint64val=60,TYPE_INT64,0}} @@ -133,7 +124,7 @@ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ #define SL_BWPPARAMS_DESC(sl_bwp) { \ {SL_CONFIG_STRING_SL_BWP_START_AND_SIZE,NULL,0,.i64ptr=&sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->locationAndBandwidth,.defint64val=28875,TYPE_INT64,0}, \ -{SL_CONFIG_STRING_SL_BWP_NUM_SYMBOLS,NULL,0,.i64ptr=sl_bwp->sl_BWP_Generic_r16->sl_LengthSymbols_r16,.defint64val=14,TYPE_INT64,0}, \ +{SL_CONFIG_STRING_SL_BWP_NUM_SYMBOLS,NULL,0,.i64ptr=sl_bwp->sl_BWP_Generic_r16->sl_LengthSymbols_r16,.defint64val=7,TYPE_INT64,0}, \ {SL_CONFIG_STRING_SL_BWP_START_SYMBOL,NULL,0,.i64ptr=sl_bwp->sl_BWP_Generic_r16->sl_StartSymbol_r16,.defint64val=0,TYPE_INT64,0}} /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ From 1b9862875524dc7597b6eb44a138719d07ec1893 Mon Sep 17 00:00:00 2001 From: Raghavendra Dinavahi Date: Sun, 23 Jul 2023 10:36:16 +0200 Subject: [PATCH 4/4] Changes --- openair2/RRC/NR_UE/rrc_sl_preconfig.c | 29 ++++++-------- openair2/RRC/NR_UE/sl_preconfig_paramvalues.h | 38 +++++++++++++------ 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/openair2/RRC/NR_UE/rrc_sl_preconfig.c b/openair2/RRC/NR_UE/rrc_sl_preconfig.c index f1f831f75d..15b23a9956 100644 --- a/openair2/RRC/NR_UE/rrc_sl_preconfig.c +++ b/openair2/RRC/NR_UE/rrc_sl_preconfig.c @@ -19,17 +19,6 @@ * contact@openairinterface.org */ -/* \file rrc_sl_preconfig.c - * \brief Preparation of Sidelink-Preconfiguration message - * \author Raghavendra Dinavahi - * \date - * \version - * \company Fraunhofer IIS - * \email - * \note - * \warning - */ - #define RRC_SL_PRECONFIG #define RRC_SL_PRECONFIG_C @@ -39,7 +28,8 @@ #include "sl_preconfig_paramvalues.h" #include "common/config/config_userapi.h" -static void prepare_NR_SL_SyncConfig(NR_SL_SyncConfig_r16_t *sl_syncconfig) { +static void prepare_NR_SL_SyncConfig(NR_SL_SyncConfig_r16_t *sl_syncconfig) +{ // Hysteris when evaluating SyncRef UE sl_syncconfig->sl_SyncRefMinHyst_r16 = NULL; @@ -83,7 +73,8 @@ static void prepare_NR_SL_SyncConfig(NR_SL_SyncConfig_r16_t *sl_syncconfig) { static void prepare_NR_SL_ResourcePool(NR_SL_ResourcePool_r16_t *sl_res_pool, uint16_t is_txpool, - uint16_t is_sl_syncsource) { LOG_I(MAC, "HERE5"); + uint16_t is_sl_syncsource) +{ // PSCCH configuration sl_res_pool->sl_PSCCH_Config_r16 = calloc(1, sizeof(*sl_res_pool->sl_PSCCH_Config_r16)); @@ -199,7 +190,8 @@ static void prepare_NR_SL_ResourcePool(NR_SL_ResourcePool_r16_t *sl_res_pool, static void prepare_NR_SL_BWPConfigCommon(NR_SL_BWP_ConfigCommon_r16_t *sl_bwp, uint16_t num_tx_pools, uint16_t num_rx_pools, - uint16_t sl_syncsource) { + uint16_t sl_syncsource) +{ sl_bwp->sl_BWP_Generic_r16 = calloc(1, sizeof(NR_SL_BWP_Generic_r16_t)); sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16 = calloc(1, sizeof(NR_BWP_t)); @@ -270,7 +262,8 @@ static void prepare_NR_SL_BWPConfigCommon(NR_SL_BWP_ConfigCommon_r16_t *sl_bwp, static void prepare_NR_SL_FreqConfigCommon(NR_SL_FreqConfigCommon_r16_t *sl_fcfg, uint16_t num_tx_pools, uint16_t num_rx_pools, - uint16_t sl_syncsource) { + uint16_t sl_syncsource) +{ // Sub carrier spacing used on this frequency configured. NR_SCS_SpecificCarrier_t *scs_specific = calloc(1, sizeof(*scs_specific)); @@ -326,7 +319,8 @@ static void prepare_NR_SL_FreqConfigCommon(NR_SL_FreqConfigCommon_r16_t *sl_fcfg NR_SL_PreconfigurationNR_r16_t *prepare_NR_SL_PRECONFIGURATION(uint16_t num_tx_pools, uint16_t num_rx_pools, - uint16_t sl_syncsource) { + uint16_t sl_syncsource) +{ NR_SL_PreconfigurationNR_r16_t *sl_preconfiguration = CALLOC(1, sizeof(NR_SL_PreconfigurationNR_r16_t)); NR_SidelinkPreconfigNR_r16_t *sl_preconfig = &sl_preconfiguration->sidelinkPreconfigNR_r16; @@ -406,7 +400,8 @@ NR_SL_PreconfigurationNR_r16_t *prepare_NR_SL_PRECONFIGURATION(uint16_t num_tx_p } -int configure_NR_SL_Preconfig(int sync_source) { +int configure_NR_SL_Preconfig(int sync_source) +{ NR_SL_PreconfigurationNR_r16_t *sl_preconfig = NULL; int num_txpools = 0, num_rxpools = 0; diff --git a/openair2/RRC/NR_UE/sl_preconfig_paramvalues.h b/openair2/RRC/NR_UE/sl_preconfig_paramvalues.h index 5d1c22b6e2..a44c5e4d1f 100644 --- a/openair2/RRC/NR_UE/sl_preconfig_paramvalues.h +++ b/openair2/RRC/NR_UE/sl_preconfig_paramvalues.h @@ -19,17 +19,6 @@ * contact@openairinterface.org */ -/* \file sl_preconfig_paramvalues.h - * \brief - * \author Raghavendra Dinavahi - * \date - * \version 0.1 - * \company - * \email: - * \note - * \warning - */ - #ifndef __SL_PRECONFIG_PARAMSVALUES__H__ #define __SL_PRECONFIG_PARAMSVALUES__H__ @@ -91,6 +80,11 @@ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Sidelink Frequency common Cell Config parameters */ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + +/* Please refer to 3GPP SPEC 38.331 (RRC Specification) for details about these parameters + sl_AbsoluteFrequencyPointA_r16 - ARFCN of the lowest subcarrier for sidelink operation + sl_AbsoluteFrequencySSB_r16 - ARFCN of the center RE of sidelink SSB of length 11 RBs +*/ #define SL_FCCPARAMS_DESC(sl_fcc) { \ {SL_CONFIG_STRING_SLOFFSETTOCARRIER,NULL,0,.i64ptr=&sl_fcc->sl_SCS_SpecificCarrierList_r16.list.array[0]->offsetToCarrier,.defint64val=0,TYPE_INT64,0}, \ {SL_CONFIG_STRING_FCC_SUBCARRIERSPACING,NULL,0,.i64ptr=&sl_fcc->sl_SCS_SpecificCarrierList_r16.list.array[0]->subcarrierSpacing,.defint64val=NR_SubcarrierSpacing_kHz30,TYPE_INT64,0},\ @@ -102,6 +96,9 @@ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Sidelink TDD ULDL Config parameters */ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* Please refer to 3GPP SPEC 38.331 (RRC Specification) for details about these parameters + TDD ul dl configuration used for sidelink operation set in Sidelink Preconfiguration IE +*/ #define SL_TDDCONFIGPARAMS_DESC(sl_tdd_ul_dl_cfg) { \ {SL_CONFIG_STRING_DLULTRANSMISSIONPERIODICITY,NULL,0,.i64ptr=&sl_tdd_ul_dl_cfg->pattern1.dl_UL_TransmissionPeriodicity,.defint64val=6,TYPE_INT64,0}, \ {SL_CONFIG_STRING_NROFDOWNLINKSLOTS,NULL,0,.i64ptr=&sl_tdd_ul_dl_cfg->pattern1.nrofDownlinkSlots,.defint64val=7,TYPE_INT64,0},\ @@ -113,6 +110,12 @@ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Sidelink Sync config parameters */ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* Please refer to 3GPP SPEC 38.331 (RRC Specification) for details about these parameters + These parameters indicate the repetition of Sidelink SSB + sl_NumSSB_WithinPeriod_r16 - number of SSB transmissions within 16 frames + sl_TimeOffsetSSB_r16 - timeoffset in slots for the first SL-SSB transmission within 16 frames + sl_TimeInterval_r16 - interval in slots between SL-SSB transmissions +*/ #define SL_SYNCPARAMS_DESC(sl_syncconfig) { \ {SL_CONFIG_STRING_SL_NUMSSB_WITHINPERIOD_0,NULL,0,.i64ptr=sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_NumSSB_WithinPeriod_r16,.defint64val=1,TYPE_INT64,0}, \ {SL_CONFIG_STRING_SL_TIMEOFFSET_SSB_0,NULL,0,.i64ptr=sl_syncconfig->sl_SSB_TimeAllocation1_r16->sl_TimeOffsetSSB_r16,.defint64val=8,TYPE_INT64,0},\ @@ -122,6 +125,12 @@ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Sidelink BWP Config parameters */ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* Please refer to 3GPP SPEC 38.331 (RRC Specification) for details about these parameters + Sidelink BandWidthPart parameters + locationAndBandwidth - determines the start and size of Sidelink BWP + sl_LengthSymbols_r16 - number of symbols in a slot used for sidelink operation + sl_StartSymbol_r16 - start symbol for sidelink operation in a slot +*/ #define SL_BWPPARAMS_DESC(sl_bwp) { \ {SL_CONFIG_STRING_SL_BWP_START_AND_SIZE,NULL,0,.i64ptr=&sl_bwp->sl_BWP_Generic_r16->sl_BWP_r16->locationAndBandwidth,.defint64val=28875,TYPE_INT64,0}, \ {SL_CONFIG_STRING_SL_BWP_NUM_SYMBOLS,NULL,0,.i64ptr=sl_bwp->sl_BWP_Generic_r16->sl_LengthSymbols_r16,.defint64val=7,TYPE_INT64,0}, \ @@ -130,6 +139,13 @@ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Sidelink Resource pool parameters */ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* Please refer to 3GPP SPEC 38.331 (RRC Specification) for details about these parameters + Sidelink TX/RX resource pool parameters + sl_TimeResourcePSCCH_r16 - number of symbols used for PSCCH + sl_SubchannelSize_r16 - number of PRBs in every subchannel in a resource pool + sl_StartRB_Subchannel_r16 - lowest RB of a lowest subchannel in a resource pool + sl_RB_Number_r16 - number of RBs in a resource pool +*/ #define SL_RESPOOLPARAMS_DESC(sl_res_pool) { \ {SL_CONFIG_STRING_RESPOOL_PSCCH_NUMSYM,NULL,0,.i64ptr=sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_TimeResourcePSCCH_r16,.defint64val=1,TYPE_INT64,0}, \ {SL_CONFIG_STRING_RESPOOL_PSCCH_NUMRBS,NULL,0,.i64ptr=sl_res_pool->sl_PSCCH_Config_r16->choice.setup->sl_FreqResourcePSCCH_r16,.defint64val=4,TYPE_INT64,0}, \