From 784a33583b2a2f773756ddc752228a7144554c6e Mon Sep 17 00:00:00 2001 From: Xavier Arteaga Date: Fri, 12 Feb 2021 17:33:43 +0100 Subject: [PATCH] SRSUE: Initial NR MAC-PHY interfaces SRSUE Fix compilation SRSUE: temporary fixes LTE/NR PHY/Stack interface problem fix fix --- lib/include/srslte/interfaces/ue_interfaces.h | 8 - .../srslte/interfaces/ue_nr_interfaces.h | 28 +- lib/include/srslte/phy/common/phy_common_nr.h | 3 +- lib/include/srslte/phy/ue/ue_dl_nr.h | 2 + lib/src/phy/phch/ra_ul_nr.c | 4 +- lib/src/phy/ue/ue_dl_nr.c | 18 +- lib/test/phy/phy_dl_nr_test.c | 2 +- srsue/hdr/phy/nr/sf_worker.h | 1 + srsue/hdr/phy/nr/state.h | 559 +----------------- srsue/hdr/phy/nr/worker_pool.h | 3 + srsue/hdr/phy/phy.h | 14 +- .../{ue_phy_nr_base.h => ue_nr_phy_base.h} | 15 +- srsue/hdr/phy/vnf_phy_nr.h | 7 +- srsue/src/phy/nr/cc_worker.cc | 75 +-- srsue/src/phy/nr/sf_worker.cc | 4 + srsue/src/phy/nr/worker_pool.cc | 35 +- srsue/src/phy/phy.cc | 25 + srsue/src/phy/vnf_phy_nr.cc | 4 + srsue/src/stack/ue_stack_lte.cc | 14 +- srsue/src/ue.cc | 2 +- 20 files changed, 181 insertions(+), 642 deletions(-) rename srsue/hdr/phy/{ue_phy_nr_base.h => ue_nr_phy_base.h} (63%) diff --git a/lib/include/srslte/interfaces/ue_interfaces.h b/lib/include/srslte/interfaces/ue_interfaces.h index 3d561e5fa..fe34989d4 100644 --- a/lib/include/srslte/interfaces/ue_interfaces.h +++ b/lib/include/srslte/interfaces/ue_interfaces.h @@ -589,14 +589,6 @@ typedef struct { srslte::vnf_args_t vnf_args; } phy_args_t; -typedef struct { - uint32_t nof_prb; - uint32_t nof_carriers; - uint32_t nof_phy_threads; - uint32_t worker_cpu_mask; - srslte::phy_log_args_t log; -} phy_args_nr_t; - /* RAT agnostic Interface MAC -> PHY */ class phy_interface_mac_common { diff --git a/lib/include/srslte/interfaces/ue_nr_interfaces.h b/lib/include/srslte/interfaces/ue_nr_interfaces.h index da22c45ee..a784f749d 100644 --- a/lib/include/srslte/interfaces/ue_nr_interfaces.h +++ b/lib/include/srslte/interfaces/ue_nr_interfaces.h @@ -15,6 +15,7 @@ #include "srslte/common/interfaces_common.h" #include "srslte/interfaces/mac_interface_types.h" +#include "srslte/interfaces/rrc_nr_interface_types.h" #include #include @@ -83,6 +84,28 @@ public: virtual bool set_crnti(const uint16_t crnti) = 0; }; +struct phy_args_nr_t { + uint32_t nof_carriers; + uint32_t nof_prb; + uint32_t nof_phy_threads; + uint32_t worker_cpu_mask; + srslte::phy_log_args_t log; + srslte_ue_dl_nr_args_t dl; + srslte_ue_ul_nr_args_t ul; + + phy_args_nr_t() + { + dl.nof_rx_antennas = 1; + dl.nof_max_prb = 100; + dl.pdsch.measure_evm = true; + dl.pdsch.measure_time = true; + dl.pdsch.sch.disable_simd = false; + ul.nof_max_prb = 100; + ul.pusch.measure_time = true; + ul.pusch.sch.disable_simd = false; + } +}; + class phy_interface_mac_nr { public: @@ -103,7 +126,10 @@ public: }; class phy_interface_rrc_nr -{}; +{ +public: + virtual bool set_config(const srslte::phy_cfg_nr_t& cfg) = 0; +}; // Combined interface for PHY to access stack (MAC and RRC) class stack_interface_phy_nr : public mac_interface_phy_nr, diff --git a/lib/include/srslte/phy/common/phy_common_nr.h b/lib/include/srslte/phy/common/phy_common_nr.h index 01fda2042..04f74f9e7 100644 --- a/lib/include/srslte/phy/common/phy_common_nr.h +++ b/lib/include/srslte/phy/common/phy_common_nr.h @@ -147,8 +147,7 @@ typedef enum SRSLTE_API { srslte_search_space_type_common_1, ///< configured by ra-SearchSpace in PDCCH-ConfigCommon srslte_search_space_type_common_2, ///< configured by pagingSearchSpace in PDCCH-ConfigCommon srslte_search_space_type_common_3, ///< configured by SearchSpace in PDCCH-Config with searchSpaceType = common - srslte_search_space_type_ue, ///< configured by SearchSpace in PDCCH-Config with searchSpaceType = ue-Specific - srslte_search_space_rar ///< No search space associated, used for grants given by Random Access Response (RAR) + srslte_search_space_type_ue ///< configured by SearchSpace in PDCCH-Config with searchSpaceType = ue-Specific } srslte_search_space_type_t; /** diff --git a/lib/include/srslte/phy/ue/ue_dl_nr.h b/lib/include/srslte/phy/ue/ue_dl_nr.h index 218a4487e..3409236e4 100644 --- a/lib/include/srslte/phy/ue/ue_dl_nr.h +++ b/lib/include/srslte/phy/ue/ue_dl_nr.h @@ -140,12 +140,14 @@ SRSLTE_API void srslte_ue_dl_nr_estimate_fft(srslte_ue_dl_nr_t* q, const srslte_ SRSLTE_API int srslte_ue_dl_nr_find_dl_dci(srslte_ue_dl_nr_t* q, const srslte_slot_cfg_t* slot_cfg, uint16_t rnti, + srslte_rnti_type_t rnti_type, srslte_dci_dl_nr_t* dci_dl_list, uint32_t nof_dci_msg); SRSLTE_API int srslte_ue_dl_nr_find_ul_dci(srslte_ue_dl_nr_t* q, const srslte_slot_cfg_t* slot_cfg, uint16_t rnti, + srslte_rnti_type_t rnti_type, srslte_dci_ul_nr_t* dci_ul_list, uint32_t nof_dci_msg); diff --git a/lib/src/phy/phch/ra_ul_nr.c b/lib/src/phy/phch/ra_ul_nr.c index fad5f0272..47e8537df 100644 --- a/lib/src/phy/phch/ra_ul_nr.c +++ b/lib/src/phy/phch/ra_ul_nr.c @@ -137,7 +137,7 @@ int srslte_ra_ul_nr_time(const srslte_sch_hl_cfg_nr_t* cfg, } // Determine which PUSCH Time domain RA configuration to apply (TS 38.214 Table 6.1.2.1.1-1:) - if (ss_type == srslte_search_space_rar) { + if (rnti_type == srslte_rnti_type_ra) { // Row 1 if (cfg->nof_common_time_ra == 0) { srslte_ra_ul_nr_pdsch_time_resource_default_A(cfg->scs_cfg, m, grant); @@ -172,7 +172,7 @@ int srslte_ra_ul_nr_time(const srslte_sch_hl_cfg_nr_t* cfg, // Table 6.1.2.1.1-5 defines the additional subcarrier spacing specific slot delay value for the first transmission of // PUSCH scheduled by the RAR. When the UE transmits a PUSCH scheduled by RAR, the Δ value specific to the PUSCH // subcarrier spacing μ PUSCH is applied in addition to the K 2 value. - if (ss_type == srslte_search_space_rar) { + if (rnti_type == srslte_rnti_type_ra) { uint32_t delta[4] = {2, 3, 4, 6}; if (cfg->scs_cfg >= 4) { ERROR("Invalid numerology"); diff --git a/lib/src/phy/ue/ue_dl_nr.c b/lib/src/phy/ue/ue_dl_nr.c index fa1d38177..6367d5be3 100644 --- a/lib/src/phy/ue/ue_dl_nr.c +++ b/lib/src/phy/ue/ue_dl_nr.c @@ -388,6 +388,7 @@ static int ue_dl_nr_find_dl_dci_ss(srslte_ue_dl_nr_t* q, int srslte_ue_dl_nr_find_dl_dci(srslte_ue_dl_nr_t* q, const srslte_slot_cfg_t* slot_cfg, uint16_t rnti, + srslte_rnti_type_t rnti_type, srslte_dci_dl_nr_t* dci_dl_list, uint32_t nof_dci_msg) { @@ -403,10 +404,9 @@ int srslte_ue_dl_nr_find_dl_dci(srslte_ue_dl_nr_t* q, nof_dci_msg = SRSLTE_MIN(nof_dci_msg, SRSLTE_MAX_DCI_MSG_NR); // If the UE looks for a RAR and RA search space is provided, search for it - if (q->cfg.ra_search_space_present && rnti == q->cfg.ra_rnti) { + if (q->cfg.ra_search_space_present && rnti_type == srslte_rnti_type_ra) { // Find DCIs in the RA search space - int ret = ue_dl_nr_find_dl_dci_ss( - q, slot_cfg, &q->cfg.ra_search_space, rnti, srslte_rnti_type_ra, &dci_msg_list[count], nof_dci_msg - count); + int ret = ue_dl_nr_find_dl_dci_ss(q, slot_cfg, &q->cfg.ra_search_space, rnti, rnti_type, dci_msg_list, nof_dci_msg); if (ret < SRSLTE_SUCCESS) { ERROR("Error searching RAR DCI"); return SRSLTE_ERROR; @@ -415,7 +415,7 @@ int srslte_ue_dl_nr_find_dl_dci(srslte_ue_dl_nr_t* q, // Count the found DCIs count += ret; } else { - // Iterate all possible search spaces + // Iterate all possible common and UE search spaces for (uint32_t i = 0; i < SRSLTE_UE_DL_NR_MAX_NOF_SEARCH_SPACE && count < nof_dci_msg; i++) { // Skip search space if not present if (!q->cfg.search_space_present[i]) { @@ -424,7 +424,7 @@ int srslte_ue_dl_nr_find_dl_dci(srslte_ue_dl_nr_t* q, // Find DCIs in the selected search space int ret = ue_dl_nr_find_dl_dci_ss( - q, slot_cfg, &q->cfg.search_space[i], rnti, srslte_rnti_type_c, &dci_msg_list[count], nof_dci_msg - count); + q, slot_cfg, &q->cfg.search_space[i], rnti, rnti_type, &dci_msg_list[count], nof_dci_msg - count); if (ret < SRSLTE_SUCCESS) { ERROR("Error searching DCI"); return SRSLTE_ERROR; @@ -447,6 +447,7 @@ int srslte_ue_dl_nr_find_dl_dci(srslte_ue_dl_nr_t* q, int srslte_ue_dl_nr_find_ul_dci(srslte_ue_dl_nr_t* q, const srslte_slot_cfg_t* slot_cfg, uint16_t rnti, + srslte_rnti_type_t rnti_type, srslte_dci_ul_nr_t* dci_ul_list, uint32_t nof_dci_msg) { @@ -459,7 +460,12 @@ int srslte_ue_dl_nr_find_ul_dci(srslte_ue_dl_nr_t* q, // Get DCI messages from the pending list for (uint32_t i = 0; i < q->pending_ul_dci_count && count < nof_dci_msg; i++) { - srslte_dci_msg_nr_t* dci_msg = &q->pending_ul_dci_msg[i]; + srslte_dci_msg_nr_t* dci_msg = &q->pending_ul_dci_msg[i]; + + if (dci_msg->rnti_type != rnti_type || dci_msg->rnti != rnti) { + continue; + } + const srslte_coreset_t* coreset = &q->cfg.coreset[dci_msg->coreset_id]; if (srslte_dci_nr_format_0_0_unpack(&q->carrier, coreset, dci_msg, &dci_ul_list[count]) < SRSLTE_SUCCESS) { ERROR("Unpacking DCI 0_0"); diff --git a/lib/test/phy/phy_dl_nr_test.c b/lib/test/phy/phy_dl_nr_test.c index 4e0553754..f4e8cef58 100644 --- a/lib/test/phy/phy_dl_nr_test.c +++ b/lib/test/phy/phy_dl_nr_test.c @@ -125,7 +125,7 @@ static int work_ue_dl(srslte_ue_dl_nr_t* ue_dl, srslte_slot_cfg_t* slot, srslte_ srslte_ue_dl_nr_estimate_fft(ue_dl, slot); srslte_dci_dl_nr_t dci_dl_rx = {}; - int nof_found_dci = srslte_ue_dl_nr_find_dl_dci(ue_dl, slot, rnti, &dci_dl_rx, 1); + int nof_found_dci = srslte_ue_dl_nr_find_dl_dci(ue_dl, slot, rnti, srslte_rnti_type_c, &dci_dl_rx, 1); if (nof_found_dci < SRSLTE_SUCCESS) { ERROR("Error decoding"); return SRSLTE_ERROR; diff --git a/srsue/hdr/phy/nr/sf_worker.h b/srsue/hdr/phy/nr/sf_worker.h index 67a524ca6..e49768756 100644 --- a/srsue/hdr/phy/nr/sf_worker.h +++ b/srsue/hdr/phy/nr/sf_worker.h @@ -55,6 +55,7 @@ private: state* phy_state = nullptr; srslog::basic_logger& logger; + uint32_t tti_rx = 0; cf_t* prach_ptr = nullptr; float prach_power = 0; }; diff --git a/srsue/hdr/phy/nr/state.h b/srsue/hdr/phy/nr/state.h index 4d051796c..e2d1260d7 100644 --- a/srsue/hdr/phy/nr/state.h +++ b/srsue/hdr/phy/nr/state.h @@ -24,21 +24,6 @@ namespace srsue { namespace nr { -typedef struct { - uint32_t nof_carriers; - srslte_ue_dl_nr_args_t dl; - srslte_ue_ul_nr_args_t ul; -} phy_nr_args_t; - -typedef struct { - srslte_sch_hl_cfg_nr_t pdsch; - srslte_sch_hl_cfg_nr_t pusch; - srslte_pucch_nr_hl_cfg_t pucch; - srslte_prach_cfg_t prach; - srslte_ue_dl_nr_pdcch_cfg_t pdcch; - srslte_ue_dl_nr_harq_ack_cfg_t harq_ack; -} phy_nr_cfg_t; - class state { private: @@ -63,549 +48,19 @@ private: mutable std::mutex pending_ack_mutex; public: - mac_interface_phy_nr* stack = nullptr; - srslte_carrier_nr_t carrier = {}; - phy_nr_args_t args = {}; - phy_nr_cfg_t cfg = {}; - int32_t test_rnti = 0x1234; // Fix PDSCH RNTI for testing + mac_interface_phy_nr* stack = nullptr; + srslte_carrier_nr_t carrier = {}; + srslte::phy_cfg_nr_t cfg; + phy_args_nr_t args; + + uint16_t ra_rnti = 0; + uint32_t rar_grant_tti = 0; state() { carrier.id = 500; carrier.nof_prb = 100; carrier.max_mimo_layers = 1; - - // Default arguments - args.nof_carriers = 1; - args.dl.nof_rx_antennas = 1; - args.dl.nof_max_prb = 100; - args.dl.pdsch.measure_evm = true; - args.dl.pdsch.measure_time = true; - args.dl.pdsch.sch.disable_simd = false; - args.ul.nof_max_prb = 100; - args.ul.pusch.measure_time = true; - args.ul.pusch.sch.disable_simd = false; - - // Default PDSCH configuration - cfg.pdsch.sch_cfg.mcs_table = srslte_mcs_table_256qam; - - // Default PRACH configuration - cfg.prach.is_nr = true; - cfg.prach.config_idx = 16; - cfg.prach.root_seq_idx = 1; - cfg.prach.freq_offset = 0; - cfg.prach.zero_corr_zone = 0; - cfg.prach.num_ra_preambles = 64; - cfg.prach.hs_flag = false; - - // physicalCellGroupConfig - // pdsch-HARQ-ACK-Codebook: dynamic (1) - cfg.harq_ack.pdsch_harq_ack_codebook = srslte_pdsch_harq_ack_codebook_dynamic; - - // commonControlResourceSet - // controlResourceSetId: 1 - // frequencyDomainResources: ff0000000000 - // duration: 1 - // cce-REG-MappingType: nonInterleaved (1) - // nonInterleaved: NULL - // precoderGranularity: sameAsREG-bundle (0) - cfg.pdcch.coreset[1].coreset_id = 1; - cfg.pdcch.coreset[1].precoder_granularity = srslte_coreset_precoder_granularity_reg_bundle; - cfg.pdcch.coreset[1].duration = 1; - cfg.pdcch.coreset[1].mapping_type = srslte_coreset_mapping_type_non_interleaved; - for (uint32_t i = 0; i < SRSLTE_CORESET_FREQ_DOMAIN_RES_SIZE; i++) { - cfg.pdcch.coreset[1].freq_resources[i] = (i < 8); - } - cfg.pdcch.coreset_present[1] = true; - - // SearchSpace - // searchSpaceId: 1 - // controlResourceSetId: 1 - // monitoringSlotPeriodicityAndOffset: sl1 (0) - // sl1: NULL - // monitoringSymbolsWithinSlot: 8000 [bit length 14, 2 LSB pad bits, 1000 0000 0000 00.. decimal value 8192] - // nrofCandidates - // aggregationLevel1: n0 (0) - // aggregationLevel2: n0 (0) - // aggregationLevel4: n1 (1) - // aggregationLevel8: n0 (0) - // aggregationLevel16: n0 (0) - // searchSpaceType: common (0) - // common - // dci-Format0-0-AndFormat1-0 - srslte_search_space_t search_space1 = {}; - search_space1.id = 1; - search_space1.coreset_id = 1; - search_space1.nof_candidates[0] = 0; - search_space1.nof_candidates[1] = 0; - search_space1.nof_candidates[2] = 1; - search_space1.nof_candidates[3] = 0; - search_space1.nof_candidates[4] = 0; - search_space1.type = srslte_search_space_type_common_3; - cfg.pdcch.search_space[1] = search_space1; - cfg.pdcch.search_space_present[1] = true; - - // ra-SearchSpace: 1 - cfg.pdcch.ra_rnti = 0x16; //< Supposed to be deduced from PRACH configuration - cfg.pdcch.ra_search_space = search_space1; - cfg.pdcch.ra_search_space.type = srslte_search_space_type_common_1; - cfg.pdcch.ra_search_space_present = true; - - // pdsch-ConfigCommon: setup (1) - // setup - // pdsch-TimeDomainAllocationList: 2 items - // Item 0 - // PDSCH-TimeDomainResourceAllocation - // mappingType: typeA (0) - // startSymbolAndLength: 40 - // Item 1 - // PDSCH-TimeDomainResourceAllocation - // mappingType: typeA (0) - // startSymbolAndLength: 57 - cfg.pdsch.common_time_ra[0].mapping_type = srslte_sch_mapping_type_A; - cfg.pdsch.common_time_ra[0].sliv = 40; - cfg.pdsch.common_time_ra[0].k = 0; - cfg.pdsch.common_time_ra[1].mapping_type = srslte_sch_mapping_type_A; - cfg.pdsch.common_time_ra[1].sliv = 57; - cfg.pdsch.common_time_ra[1].k = 0; - cfg.pdsch.nof_common_time_ra = 2; - - // pusch-ConfigCommon: setup (1) - // setup - // pusch-TimeDomainAllocationList: 2 items - // Item 0 - // PUSCH-TimeDomainResourceAllocation - // k2: 4 - // mappingType: typeA (0) - // startSymbolAndLength: 27 - // Item 1 - // PUSCH-TimeDomainResourceAllocation - // k2: 5 - // mappingType: typeA (0) - // startSymbolAndLength: 27 - // p0-NominalWithGrant: -90dBm - cfg.pusch.common_time_ra[0].mapping_type = srslte_sch_mapping_type_A; - cfg.pusch.common_time_ra[0].sliv = 27; - cfg.pusch.common_time_ra[0].k = 4; - cfg.pusch.common_time_ra[1].mapping_type = srslte_sch_mapping_type_A; - cfg.pusch.common_time_ra[1].sliv = 27; - cfg.pusch.common_time_ra[1].k = 5; - cfg.pusch.nof_common_time_ra = 2; - - // pusch-Config: setup (1) - // setup - // dmrs-UplinkForPUSCH-MappingTypeA: setup (1) - // setup - // dmrs-AdditionalPosition: pos1 (1) - // transformPrecodingDisabled - cfg.pusch.dmrs_typeA.additional_pos = srslte_dmrs_sch_add_pos_1; - cfg.pusch.dmrs_typeA.present = true; - // pusch-PowerControl - // msg3-Alpha: alpha1 (7) - // p0-NominalWithoutGrant: -90dBm - // p0-AlphaSets: 1 item - // Item 0 - // P0-PUSCH-AlphaSet - // p0-PUSCH-AlphaSetId: 0 - // p0: 0dB - // alpha: alpha1 (7) - // pathlossReferenceRSToAddModList: 1 item - // Item 0 - // PUSCH-PathlossReferenceRS - // pusch-PathlossReferenceRS-Id: 0 - // referenceSignal: ssb-Index (0) - // ssb-Index: 0 - // sri-PUSCH-MappingToAddModList: 1 item - // Item 0 - // SRI-PUSCH-PowerControl - // sri-PUSCH-PowerControlId: 0 - // sri-PUSCH-PathlossReferenceRS-Id: 0 - // sri-P0-PUSCH-AlphaSetId: 0 - // sri-PUSCH-ClosedLoopIndex: i0 (0) - // resourceAllocation: resourceAllocationType1 (1) - // uci-OnPUSCH: setup (1) - // setup - // betaOffsets: semiStatic (1) - // semiStatic - // betaOffsetACK-Index1: 9 - // betaOffsetACK-Index2: 9 - // betaOffsetACK-Index3: 9 - // betaOffsetCSI-Part1-Index1: 6 - // betaOffsetCSI-Part1-Index2: 6 - // betaOffsetCSI-Part2-Index1: 6 - // betaOffsetCSI-Part2-Index2: 6 - // scaling: f1 (3) - - // pucch-Config: setup (1) - // setup - // resourceSetToAddModList: 2 items - cfg.pucch.enabled = true; - // Item 0 - // PUCCH-ResourceSet - // pucch-ResourceSetId: 0 - // resourceList: 8 items - // Item 0 - // PUCCH-ResourceId: 0 - // Item 1 - // PUCCH-ResourceId: 1 - // Item 2 - // PUCCH-ResourceId: 2 - // Item 3 - // PUCCH-ResourceId: 3 - // Item 4 - // PUCCH-ResourceId: 4 - // Item 5 - // PUCCH-ResourceId: 5 - // Item 6 - // PUCCH-ResourceId: 6 - // Item 7 - // PUCCH-ResourceId: 7 - cfg.pucch.sets[0].nof_resources = 8; - - // Item 1 - // PUCCH-ResourceSet - // pucch-ResourceSetId: 1 - // resourceList: 8 items - // Item 0 - // PUCCH-ResourceId: 8 - // Item 1 - // PUCCH-ResourceId: 9 - // Item 2 - // PUCCH-ResourceId: 10 - // Item 3 - // PUCCH-ResourceId: 11 - // Item 4 - // PUCCH-ResourceId: 12 - // Item 5 - // PUCCH-ResourceId: 13 - // Item 6 - // PUCCH-ResourceId: 14 - // Item 7 - // PUCCH-ResourceId: 15 - cfg.pucch.sets[1].nof_resources = 8; - - // resourceToAddModList: 18 items - // Item 0 - // PUCCH-Resource - // pucch-ResourceId: 0 - // startingPRB: 0 - // format: format1 (1) - // format1 - // initialCyclicShift: 0 - // nrofSymbols: 14 - // startingSymbolIndex: 0 - // timeDomainOCC: 0 - cfg.pucch.sets[0].resources[0].format = SRSLTE_PUCCH_NR_FORMAT_1; - cfg.pucch.sets[0].resources[0].starting_prb = 0; - cfg.pucch.sets[0].resources[0].initial_cyclic_shift = 0; - cfg.pucch.sets[0].resources[0].nof_symbols = 14; - cfg.pucch.sets[0].resources[0].start_symbol_idx = 0; - cfg.pucch.sets[0].resources[0].time_domain_occ = 0; - - // Item 1 - // PUCCH-Resource - // pucch-ResourceId: 1 - // startingPRB: 0 - // format: format1 (1) - // format1 - // initialCyclicShift: 4 - // nrofSymbols: 14 - // startingSymbolIndex: 0 - // timeDomainOCC: 0 - cfg.pucch.sets[0].resources[1].format = SRSLTE_PUCCH_NR_FORMAT_1; - cfg.pucch.sets[0].resources[1].starting_prb = 0; - cfg.pucch.sets[0].resources[1].initial_cyclic_shift = 4; - cfg.pucch.sets[0].resources[1].nof_symbols = 14; - cfg.pucch.sets[0].resources[1].start_symbol_idx = 0; - cfg.pucch.sets[0].resources[1].time_domain_occ = 0; - - // Item 2 - // PUCCH-Resource - // pucch-ResourceId: 2 - // startingPRB: 0 - // format: format1 (1) - // format1 - // initialCyclicShift: 8 - // nrofSymbols: 14 - // startingSymbolIndex: 0 - // timeDomainOCC: 0 - cfg.pucch.sets[0].resources[2].format = SRSLTE_PUCCH_NR_FORMAT_1; - cfg.pucch.sets[0].resources[2].starting_prb = 0; - cfg.pucch.sets[0].resources[2].initial_cyclic_shift = 8; - cfg.pucch.sets[0].resources[2].nof_symbols = 14; - cfg.pucch.sets[0].resources[2].start_symbol_idx = 0; - cfg.pucch.sets[0].resources[2].time_domain_occ = 0; - - // Item 3 - // PUCCH-Resource - // pucch-ResourceId: 3 - // startingPRB: 0 - // format: format1 (1) - // format1 - // initialCyclicShift: 0 - // nrofSymbols: 14 - // startingSymbolIndex: 0 - // timeDomainOCC: 1 - cfg.pucch.sets[0].resources[3].format = SRSLTE_PUCCH_NR_FORMAT_1; - cfg.pucch.sets[0].resources[3].starting_prb = 0; - cfg.pucch.sets[0].resources[3].initial_cyclic_shift = 0; - cfg.pucch.sets[0].resources[3].nof_symbols = 14; - cfg.pucch.sets[0].resources[3].start_symbol_idx = 0; - cfg.pucch.sets[0].resources[3].time_domain_occ = 1; - - // Item 4 - // PUCCH-Resource - // pucch-ResourceId: 4 - // startingPRB: 0 - // format: format1 (1) - // format1 - // initialCyclicShift: 4 - // nrofSymbols: 14 - // startingSymbolIndex: 0 - // timeDomainOCC: 1 - cfg.pucch.sets[0].resources[4].format = SRSLTE_PUCCH_NR_FORMAT_1; - cfg.pucch.sets[0].resources[4].starting_prb = 0; - cfg.pucch.sets[0].resources[4].initial_cyclic_shift = 4; - cfg.pucch.sets[0].resources[4].nof_symbols = 14; - cfg.pucch.sets[0].resources[4].start_symbol_idx = 0; - cfg.pucch.sets[0].resources[4].time_domain_occ = 1; - - // Item 5 - // PUCCH-Resource - // pucch-ResourceId: 5 - // startingPRB: 0 - // format: format1 (1) - // format1 - // initialCyclicShift: 8 - // nrofSymbols: 14 - // startingSymbolIndex: 0 - // timeDomainOCC: 1 - cfg.pucch.sets[0].resources[5].format = SRSLTE_PUCCH_NR_FORMAT_1; - cfg.pucch.sets[0].resources[5].starting_prb = 0; - cfg.pucch.sets[0].resources[5].initial_cyclic_shift = 8; - cfg.pucch.sets[0].resources[5].nof_symbols = 14; - cfg.pucch.sets[0].resources[5].start_symbol_idx = 0; - cfg.pucch.sets[0].resources[5].time_domain_occ = 1; - - // Item 6 - // PUCCH-Resource - // pucch-ResourceId: 6 - // startingPRB: 0 - // format: format1 (1) - // format1 - // initialCyclicShift: 0 - // nrofSymbols: 14 - // startingSymbolIndex: 0 - // timeDomainOCC: 2 - cfg.pucch.sets[0].resources[6].format = SRSLTE_PUCCH_NR_FORMAT_1; - cfg.pucch.sets[0].resources[6].starting_prb = 0; - cfg.pucch.sets[0].resources[6].initial_cyclic_shift = 0; - cfg.pucch.sets[0].resources[6].nof_symbols = 14; - cfg.pucch.sets[0].resources[6].start_symbol_idx = 0; - cfg.pucch.sets[0].resources[6].time_domain_occ = 2; - - // Item 7 - // PUCCH-Resource - // pucch-ResourceId: 7 - // startingPRB: 0 - // format: format1 (1) - // format1 - // initialCyclicShift: 4 - // nrofSymbols: 14 - // startingSymbolIndex: 0 - // timeDomainOCC: 2 - cfg.pucch.sets[0].resources[7].format = SRSLTE_PUCCH_NR_FORMAT_1; - cfg.pucch.sets[0].resources[7].starting_prb = 0; - cfg.pucch.sets[0].resources[7].initial_cyclic_shift = 0; - cfg.pucch.sets[0].resources[7].nof_symbols = 14; - cfg.pucch.sets[0].resources[7].start_symbol_idx = 0; - cfg.pucch.sets[0].resources[7].time_domain_occ = 2; - - // Item 8 - // PUCCH-Resource - // pucch-ResourceId: 8 - // startingPRB: 51 - // format: format2 (2) - // format2 - // nrofPRBs: 1 - // nrofSymbols: 2 - // startingSymbolIndex: 0 - cfg.pucch.sets[1].resources[0].format = SRSLTE_PUCCH_NR_FORMAT_2; - cfg.pucch.sets[1].resources[0].starting_prb = 51; - cfg.pucch.sets[1].resources[0].nof_prb = 1; - cfg.pucch.sets[1].resources[0].nof_symbols = 2; - cfg.pucch.sets[1].resources[0].start_symbol_idx = 0; - - // Item 9 - // PUCCH-Resource - // pucch-ResourceId: 9 - // startingPRB: 51 - // format: format2 (2) - // format2 - // nrofPRBs: 1 - // nrofSymbols: 2 - // startingSymbolIndex: 2 - cfg.pucch.sets[1].resources[1].format = SRSLTE_PUCCH_NR_FORMAT_2; - cfg.pucch.sets[1].resources[1].starting_prb = 51; - cfg.pucch.sets[1].resources[1].nof_prb = 1; - cfg.pucch.sets[1].resources[1].nof_symbols = 2; - cfg.pucch.sets[1].resources[1].start_symbol_idx = 2; - - // Item 10 - // PUCCH-Resource - // pucch-ResourceId: 10 - // startingPRB: 51 - // format: format2 (2) - // format2 - // nrofPRBs: 1 - // nrofSymbols: 2 - // startingSymbolIndex: 4 - cfg.pucch.sets[1].resources[2].format = SRSLTE_PUCCH_NR_FORMAT_2; - cfg.pucch.sets[1].resources[2].starting_prb = 51; - cfg.pucch.sets[1].resources[2].nof_prb = 1; - cfg.pucch.sets[1].resources[2].nof_symbols = 2; - cfg.pucch.sets[1].resources[2].start_symbol_idx = 4; - - // Item 11 - // PUCCH-Resource - // pucch-ResourceId: 11 - // startingPRB: 51 - // format: format2 (2) - // format2 - // nrofPRBs: 1 - // nrofSymbols: 2 - // startingSymbolIndex: 6 - cfg.pucch.sets[1].resources[3].format = SRSLTE_PUCCH_NR_FORMAT_2; - cfg.pucch.sets[1].resources[3].starting_prb = 51; - cfg.pucch.sets[1].resources[3].nof_prb = 1; - cfg.pucch.sets[1].resources[3].nof_symbols = 2; - cfg.pucch.sets[1].resources[3].start_symbol_idx = 6; - - // Item 12 - // PUCCH-Resource - // pucch-ResourceId: 12 - // startingPRB: 51 - // format: format2 (2) - // format2 - // nrofPRBs: 1 - // nrofSymbols: 2 - // startingSymbolIndex: 8 - cfg.pucch.sets[1].resources[4].format = SRSLTE_PUCCH_NR_FORMAT_2; - cfg.pucch.sets[1].resources[4].starting_prb = 51; - cfg.pucch.sets[1].resources[4].nof_prb = 1; - cfg.pucch.sets[1].resources[4].nof_symbols = 2; - cfg.pucch.sets[1].resources[4].start_symbol_idx = 8; - - // Item 13 - // PUCCH-Resource - // pucch-ResourceId: 13 - // startingPRB: 51 - // format: format2 (2) - // format2 - // nrofPRBs: 1 - // nrofSymbols: 2 - // startingSymbolIndex: 10 - cfg.pucch.sets[1].resources[5].format = SRSLTE_PUCCH_NR_FORMAT_2; - cfg.pucch.sets[1].resources[5].starting_prb = 51; - cfg.pucch.sets[1].resources[5].nof_prb = 1; - cfg.pucch.sets[1].resources[5].nof_symbols = 2; - cfg.pucch.sets[1].resources[5].start_symbol_idx = 10; - - // Item 14 - // PUCCH-Resource - // pucch-ResourceId: 14 - // startingPRB: 51 - // format: format2 (2) - // format2 - // nrofPRBs: 1 - // nrofSymbols: 2 - // startingSymbolIndex: 12 - cfg.pucch.sets[1].resources[6].format = SRSLTE_PUCCH_NR_FORMAT_2; - cfg.pucch.sets[1].resources[6].starting_prb = 51; - cfg.pucch.sets[1].resources[6].nof_prb = 1; - cfg.pucch.sets[1].resources[6].nof_symbols = 2; - cfg.pucch.sets[1].resources[6].start_symbol_idx = 12; - - // Item 15 - // PUCCH-Resource - // pucch-ResourceId: 15 - // startingPRB: 1 - // format: format2 (2) - // format2 - // nrofPRBs: 1 - // nrofSymbols: 2 - // startingSymbolIndex: 0 - cfg.pucch.sets[1].resources[7].format = SRSLTE_PUCCH_NR_FORMAT_2; - cfg.pucch.sets[1].resources[7].starting_prb = 51; - cfg.pucch.sets[1].resources[7].nof_prb = 1; - cfg.pucch.sets[1].resources[7].nof_symbols = 2; - cfg.pucch.sets[1].resources[7].start_symbol_idx = 2; - - // Item 16 - // PUCCH-Resource - // pucch-ResourceId: 16 - // startingPRB: 0 - // format: format1 (1) - // format1 - // initialCyclicShift: 8 - // nrofSymbols: 14 - // startingSymbolIndex: 0 - // timeDomainOCC: 2 - // Item 17 - // PUCCH-Resource - // pucch-ResourceId: 17 - // startingPRB: 1 - // format: format2 (2) - // format2 - // nrofPRBs: 1 - // nrofSymbols: 2 - // startingSymbolIndex: 2 - // format1: setup (1) - // setup - // format2: setup (1) - // setup - // maxCodeRate: zeroDot25 (2) - for (uint32_t i = 0; i < SRSLTE_PUCCH_NR_MAX_NOF_SETS; i++) { - srslte_pucch_nr_resource_set_t* set = &cfg.pucch.sets[i]; - for (uint32_t j = 0; j < set->nof_resources; j++) { - if (set->resources[j].format == SRSLTE_PUCCH_NR_FORMAT_2) { - set->resources[j].max_code_rate = 2; // 0.25 - } - } - } - - // schedulingRequestResourceToAddModList: 1 item - // Item 0 - // SchedulingRequestResourceConfig - // schedulingRequestResourceId: 1 - // schedulingRequestID: 0 - // periodicityAndOffset: sl40 (10) - // sl40: 8 - // resource: 16 - - // dl-DataToUL-ACK: 7 items - // Item 0 - // dl-DataToUL-ACK item: 8 - // Item 1 - // dl-DataToUL-ACK item: 7 - // Item 2 - // dl-DataToUL-ACK item: 6 - // Item 3 - // dl-DataToUL-ACK item: 5 - // Item 4 - // dl-DataToUL-ACK item: 4 - // Item 5 - // dl-DataToUL-ACK item: 12 - // Item 6 - // dl-DataToUL-ACK item: 11 - cfg.harq_ack.dl_data_to_ul_ack[0] = 8; - cfg.harq_ack.dl_data_to_ul_ack[1] = 7; - cfg.harq_ack.dl_data_to_ul_ack[2] = 6; - cfg.harq_ack.dl_data_to_ul_ack[3] = 5; - cfg.harq_ack.dl_data_to_ul_ack[4] = 4; - cfg.harq_ack.dl_data_to_ul_ack[5] = 12; - cfg.harq_ack.dl_data_to_ul_ack[6] = 11; - cfg.harq_ack.nof_dl_data_to_ul_ack = 7; } /** diff --git a/srsue/hdr/phy/nr/worker_pool.h b/srsue/hdr/phy/nr/worker_pool.h index 21735b99e..9e4aa258f 100644 --- a/srsue/hdr/phy/nr/worker_pool.h +++ b/srsue/hdr/phy/nr/worker_pool.h @@ -40,6 +40,9 @@ public: sf_worker* wait_worker(uint32_t tti); void start_worker(sf_worker* w); void stop(); + void send_prach(uint32_t prach_occasion, uint32_t preamble_index, int preamble_received_target_power); + int set_ul_grant(std::array array); + bool set_config(const srslte::phy_cfg_nr_t& cfg); }; } // namespace nr diff --git a/srsue/hdr/phy/phy.h b/srsue/hdr/phy/phy.h index d5a7b7a57..f78f1f804 100644 --- a/srsue/hdr/phy/phy.h +++ b/srsue/hdr/phy/phy.h @@ -28,6 +28,7 @@ #include "srsue/hdr/phy/lte/worker_pool.h" #include "srsue/hdr/phy/nr/worker_pool.h" #include "srsue/hdr/phy/ue_lte_phy_base.h" +#include "srsue/hdr/phy/ue_nr_phy_base.h" #include "sync.h" namespace srsue { @@ -65,7 +66,7 @@ private: srslte::block_queue > cmd_queue; }; -class phy final : public ue_lte_phy_base, public srslte::thread +class phy final : public ue_lte_phy_base, public ue_nr_phy_base, public srslte::thread { public: explicit phy(srslog::sink& log_sink) : @@ -77,7 +78,10 @@ public: common(logger_phy), sfsync(logger_phy, logger_phy_lib), prach_buffer(logger_phy), - thread("PHY"){}; + thread("PHY") + {} + bool set_config(const srslte::phy_cfg_nr_t& cfg) final; + ~phy() final { stop(); } // Init defined in base class @@ -86,7 +90,7 @@ public: // Init for LTE PHYs int init(const phy_args_t& args_, stack_interface_phy_lte* stack_, srslte::radio_interface_phy* radio_) final; - int init(const phy_args_nr_t& args_, stack_interface_phy_nr* stack_, srslte::radio_interface_phy* radio_); + int init(const phy_args_nr_t& args_, stack_interface_phy_nr* stack_, srslte::radio_interface_phy* radio_) final; void stop() final; @@ -169,6 +173,10 @@ public: const static int DEFAULT_WORKERS = 4; std::string get_type() final { return "lte_soft"; } + int set_ul_grant(std::array array) final; + void send_prach(uint32_t prach_occasion, uint32_t preamble_index, int preamble_received_target_power) final; + int tx_request(const tx_request_t& request) final; + void set_earfcn(std::vector earfcns) final; private: void run_thread() final; diff --git a/srsue/hdr/phy/ue_phy_nr_base.h b/srsue/hdr/phy/ue_nr_phy_base.h similarity index 63% rename from srsue/hdr/phy/ue_phy_nr_base.h rename to srsue/hdr/phy/ue_nr_phy_base.h index 8d7880b9a..fa5253dda 100644 --- a/srsue/hdr/phy/ue_phy_nr_base.h +++ b/srsue/hdr/phy/ue_nr_phy_base.h @@ -25,23 +25,20 @@ namespace srsue { -class ue_phy_nr_base : public ue_phy_base, public phy_interface_stack_nr, public srslte::phy_interface_radio +class ue_nr_phy_base : public phy_interface_stack_nr { public: - ue_phy_nr_base(){}; - virtual ~ue_phy_nr_base() {} + ue_nr_phy_base(){}; + virtual ~ue_nr_phy_base() {} virtual std::string get_type() = 0; - virtual int init(const phy_args_t& args_) = 0; - virtual int init(const phy_args_t& args_, stack_interface_phy_lte* stack_, srslte::radio_interface_phy* radio_) = 0; - virtual void stop() = 0; + virtual int init(const phy_args_t& args_) = 0; + virtual int init(const phy_args_nr_t& args_, stack_interface_phy_nr* stack_, srslte::radio_interface_phy* radio_) = 0; + virtual void stop() = 0; virtual void set_earfcn(std::vector earfcns) = 0; - virtual void wait_initialize() = 0; - virtual void start_plot() = 0; - virtual void get_metrics(phy_metrics_t* m) = 0; }; diff --git a/srsue/hdr/phy/vnf_phy_nr.h b/srsue/hdr/phy/vnf_phy_nr.h index 6da63b849..4fd488505 100644 --- a/srsue/hdr/phy/vnf_phy_nr.h +++ b/srsue/hdr/phy/vnf_phy_nr.h @@ -21,7 +21,7 @@ #include "srslte/interfaces/radio_interfaces.h" #include "srslte/interfaces/ue_interfaces.h" #include "srslte/interfaces/ue_nr_interfaces.h" -#include "srsue/hdr/phy/ue_phy_nr_base.h" +#include "srsue/hdr/phy/ue_nr_phy_base.h" namespace srsue { @@ -46,6 +46,9 @@ public: void start_plot(); + // RRC interface + bool set_config(const srslte::phy_cfg_nr_t& cfg) override; + // MAC interface int tx_request(const tx_request_t& request); int set_ul_grant(std::array) { return SRSLTE_SUCCESS; }; @@ -61,4 +64,4 @@ private: } // namespace srsue -#endif // SRSUE_VNF_PHY_NR_H \ No newline at end of file +#endif // SRSUE_VNF_PHY_NR_H diff --git a/srsue/src/phy/nr/cc_worker.cc b/srsue/src/phy/nr/cc_worker.cc index 9c194a152..27730264b 100644 --- a/srsue/src/phy/nr/cc_worker.cc +++ b/srsue/src/phy/nr/cc_worker.cc @@ -128,37 +128,19 @@ uint32_t cc_worker::get_buffer_len() void cc_worker::decode_pdcch_dl() { - std::array dci_rx = {}; - uint32_t nof_found_dci = 0; - - // Search for test RNTI - if (phy->test_rnti > 0) { - // Search for test DL grants - int n_dl = srslte_ue_dl_nr_find_dl_dci(&ue_dl, - &dl_slot_cfg, - (uint16_t)phy->test_rnti, - &dci_rx[nof_found_dci], - (uint32_t)dci_rx.size() - nof_found_dci); - if (n_dl < SRSLTE_SUCCESS) { - logger.error("Error decoding DL NR-PDCCH for test RNTI"); - return; - } - nof_found_dci += n_dl; - } - - // Search for RA DCI - if (phy->cfg.pdcch.ra_search_space_present) { - int n_ra = srslte_ue_dl_nr_find_dl_dci( - &ue_dl, &dl_slot_cfg, phy->cfg.pdcch.ra_rnti, &dci_rx[nof_found_dci], (uint32_t)dci_rx.size() - nof_found_dci); - if (n_ra < SRSLTE_SUCCESS) { - logger.error("Error decoding DL NR-PDCCH for RA-RNTI"); - return; - } - nof_found_dci += n_ra; + std::array dci_rx = {}; + uint16_t rnti = phy->stack->get_dl_sched_rnti(dl_slot_cfg.idx); + + // Search for grants + int n_dl = srslte_ue_dl_nr_find_dl_dci( + &ue_dl, &dl_slot_cfg, rnti, srslte_rnti_type_c, dci_rx.data(), (uint32_t)dci_rx.size()); + if (n_dl < SRSLTE_SUCCESS) { + logger.error("Error decoding DL NR-PDCCH"); + return; } - // Iterate over all DL received grants - for (uint32_t i = 0; i < nof_found_dci; i++) { + // Iterate over all received grants + for (int i = 0; i < n_dl; i++) { // Log found DCI if (logger.info.enabled()) { std::array str; @@ -173,26 +155,19 @@ void cc_worker::decode_pdcch_dl() void cc_worker::decode_pdcch_ul() { - std::array dci_rx = {}; - uint32_t nof_found_dci = 0; - - // Search for test RNTI - if (phy->test_rnti > 0) { - // Search for test DL grants - int n_dl = srslte_ue_dl_nr_find_ul_dci(&ue_dl, - &dl_slot_cfg, - (uint16_t)phy->test_rnti, - &dci_rx[nof_found_dci], - (uint32_t)dci_rx.size() - nof_found_dci); - if (n_dl < SRSLTE_SUCCESS) { - logger.error("Error decoding DL NR-PDCCH for test RNTI"); - return; - } - nof_found_dci += n_dl; + std::array dci_rx = {}; + uint16_t rnti = phy->stack->get_ul_sched_rnti(ul_slot_cfg.idx); + + // Search for grants + int n_dl = srslte_ue_dl_nr_find_ul_dci( + &ue_dl, &dl_slot_cfg, rnti, srslte_rnti_type_c, dci_rx.data(), (uint32_t)dci_rx.size()); + if (n_dl < SRSLTE_SUCCESS) { + logger.error("Error decoding UL NR-PDCCH"); + return; } - // Iterate over all UL received grants - for (uint32_t i = 0; i < nof_found_dci; i++) { + // Iterate over all received grants + for (int i = 0; i < n_dl; i++) { // Log found DCI if (logger.info.enabled()) { std::array str; @@ -247,8 +222,10 @@ bool cc_worker::work_dl() logger.info(pdsch_res[0].payload, pdsch_cfg.grant.tb[0].tbs / 8, "PDSCH: cc=%d, %s", cc_idx, str.data()); } - // Enqueue PDSCH ACK information - phy->set_pending_ack(dl_slot_cfg.idx, ack_resource, pdsch_res[0].crc); + // Enqueue PDSCH ACK information only if the RNTI is type C + if (pdsch_cfg.grant.rnti_type == srslte_rnti_type_c) { + phy->set_pending_ack(dl_slot_cfg.idx, ack_resource, pdsch_res[0].crc); + } // Notify MAC about PDSCH decoding result if (pdsch_res[0].crc) { diff --git a/srsue/src/phy/nr/sf_worker.cc b/srsue/src/phy/nr/sf_worker.cc index bcc961bd4..a17216eec 100644 --- a/srsue/src/phy/nr/sf_worker.cc +++ b/srsue/src/phy/nr/sf_worker.cc @@ -60,6 +60,7 @@ uint32_t sf_worker::get_buffer_len() void sf_worker::set_tti(uint32_t tti) { + tti_rx = tti; logger.set_context(tti); for (auto& w : cc_workers) { w->set_tti(tti); @@ -81,6 +82,9 @@ void sf_worker::work_imp() // PRACH is available, set buffer, transmit and return tx_buffer.set(0, prach_ptr); + // Notify MAC about PRACH transmission + phy_state->stack->prach_sent(tti_rx, 7, 1, 0, 0); + // Transmit NR PRACH phy->worker_end(this, false, tx_buffer, dummy_ts, true); diff --git a/srsue/src/phy/nr/worker_pool.cc b/srsue/src/phy/nr/worker_pool.cc index 8c8753094..4e4cbbc5f 100644 --- a/srsue/src/phy/nr/worker_pool.cc +++ b/srsue/src/phy/nr/worker_pool.cc @@ -23,6 +23,7 @@ bool worker_pool::init(const phy_args_nr_t& args, int prio) { phy_state.stack = stack_; + phy_state.args = args; // Set carrier attributes phy_state.carrier.id = 500; @@ -79,9 +80,6 @@ sf_worker* worker_pool::wait_worker(uint32_t tti) { sf_worker* worker = (sf_worker*)pool.wait_worker(tti); - // Prepare PRACH, send always sequence 0 - prach_buffer->prepare_to_send(0); - // Generate PRACH if ready if (prach_buffer->is_ready_to_send(tti, phy_state.carrier.id)) { uint32_t nof_prach_sf = 0; @@ -98,5 +96,36 @@ void worker_pool::stop() pool.stop(); } +void worker_pool::send_prach(uint32_t prach_occasion, uint32_t preamble_index, int preamble_received_target_power) +{ + prach_buffer->prepare_to_send(preamble_index); +} + +int worker_pool::set_ul_grant(std::array array) +{ + // Copy DCI bits and setup DCI context + srslte_dci_msg_nr_t dci_msg = {}; + dci_msg.format = srslte_dci_format_nr_rar; + dci_msg.rnti_type = srslte_rnti_type_ra; + dci_msg.rnti = phy_state.ra_rnti; + dci_msg.nof_bits = SRSLTE_RAR_UL_GRANT_NBITS; + srslte_vec_u8_copy(dci_msg.payload, array.data(), SRSLTE_RAR_UL_GRANT_NBITS); + + srslte_dci_ul_nr_t dci_ul = {}; + + if (srslte_dci_nr_format_0_0_unpack(&phy_state.carrier, &phy_state.cfg.pdcch.coreset[1], &dci_msg, &dci_ul) < + SRSLTE_SUCCESS) { + return SRSLTE_ERROR; + } + + phy_state.set_ul_pending_grant(phy_state.rar_grant_tti, dci_ul); + + return SRSLTE_SUCCESS; +} +bool worker_pool::set_config(const srslte::phy_cfg_nr_t& cfg) +{ + phy_state.cfg = cfg; + return true; +} } // namespace nr } // namespace srsue \ No newline at end of file diff --git a/srsue/src/phy/phy.cc b/srsue/src/phy/phy.cc index 037e0df9a..94f316c5a 100644 --- a/srsue/src/phy/phy.cc +++ b/srsue/src/phy/phy.cc @@ -614,4 +614,29 @@ void phy::set_mch_period_stop(uint32_t stop) common.set_mch_period_stop(stop); } +int phy::set_ul_grant(std::array array) +{ + return nr_workers.set_ul_grant(array); +} + +void phy::send_prach(uint32_t prach_occasion, uint32_t preamble_index, int preamble_received_target_power) +{ + nr_workers.send_prach(prach_occasion, preamble_index, preamble_received_target_power); +} + +int phy::tx_request(const phy_interface_mac_nr::tx_request_t& request) +{ + return 0; +} + +void phy::set_earfcn(std::vector earfcns) +{ + // Do nothing +} + +bool phy::set_config(const srslte::phy_cfg_nr_t& cfg) +{ + return nr_workers.set_config(cfg); +} + } // namespace srsue diff --git a/srsue/src/phy/vnf_phy_nr.cc b/srsue/src/phy/vnf_phy_nr.cc index 4b274f9e5..3e37a0126 100644 --- a/srsue/src/phy/vnf_phy_nr.cc +++ b/srsue/src/phy/vnf_phy_nr.cc @@ -69,5 +69,9 @@ int vnf_phy_nr::tx_request(const tx_request_t& request) // send Tx request over basic API return vnf->tx_request(request); } +bool vnf_phy_nr::set_config(const srslte::phy_cfg_nr_t& cfg) +{ + return false; +} } // namespace srsue \ No newline at end of file diff --git a/srsue/src/stack/ue_stack_lte.cc b/srsue/src/stack/ue_stack_lte.cc index 1f44f42f0..e44be258f 100644 --- a/srsue/src/stack/ue_stack_lte.cc +++ b/srsue/src/stack/ue_stack_lte.cc @@ -144,9 +144,17 @@ int ue_stack_lte::init(const stack_args_t& args_, srslte::logger* logger_) nas.init(usim.get(), &rrc, gw, args.nas); #ifdef HAVE_5GNR mac_nr_args_t mac_nr_args = {}; - mac_nr.init(mac_nr_args, nullptr, &rlc); - rrc_nr.init( - nullptr, &mac_nr, &rlc, &pdcp, gw, &rrc, usim.get(), task_sched.get_timer_handler(), nullptr, args.rrc_nr); + mac_nr.init(mac_nr_args, (phy_interface_mac_nr*)phy, &rlc); + rrc_nr.init((phy_interface_rrc_nr*)phy, + &mac_nr, + &rlc, + &pdcp, + gw, + &rrc, + usim.get(), + task_sched.get_timer_handler(), + nullptr, + args.rrc_nr); rrc.init(phy, &mac, &rlc, &pdcp, &nas, usim.get(), gw, &rrc_nr, args.rrc); #else rrc.init(phy, &mac, &rlc, &pdcp, &nas, usim.get(), gw, args.rrc); diff --git a/srsue/src/ue.cc b/srsue/src/ue.cc index d277ee6e4..4d1f732d1 100644 --- a/srsue/src/ue.cc +++ b/srsue/src/ue.cc @@ -97,7 +97,7 @@ int ue::init(const all_args_t& args_, srslte::logger* logger_) } #ifdef HAVE_5GNR - srsue::phy_args_nr_t phy_args_nr = {}; + srsue::phy_args_nr_t phy_args_nr; phy_args_nr.nof_prb = args.phy.nr_nof_prb; phy_args_nr.nof_carriers = args.phy.nof_nr_carriers; phy_args_nr.nof_phy_threads = args.phy.nof_phy_threads;