diff --git a/lib/include/srsran/asn1/rrc_nr_utils.h b/lib/include/srsran/asn1/rrc_nr_utils.h index 4f0223d5a..e4addbcc7 100644 --- a/lib/include/srsran/asn1/rrc_nr_utils.h +++ b/lib/include/srsran/asn1/rrc_nr_utils.h @@ -47,6 +47,7 @@ struct pucch_res_s; struct sched_request_res_cfg_s; struct pusch_cfg_s; struct pdsch_cfg_s; +struct dmrs_dl_cfg_s; struct dmrs_ul_cfg_s; struct beta_offsets_s; struct uci_on_pusch_s; @@ -93,8 +94,10 @@ bool make_phy_pusch_alloc_type(const asn1::rrc_nr::pusch_cfg_s& pusch_cfg, srsran_resource_alloc_t* in_srsran_resource_alloc); bool make_phy_pdsch_alloc_type(const asn1::rrc_nr::pdsch_cfg_s& pdsch_cfg, srsran_resource_alloc_t* in_srsran_resource_alloc); -bool make_phy_dmrs_additional_pos(const asn1::rrc_nr::dmrs_ul_cfg_s& dmrs_ul_cfg, - srsran_dmrs_sch_add_pos_t* srsran_dmrs_sch_add_pos); +bool make_phy_dmrs_dl_additional_pos(const asn1::rrc_nr::dmrs_dl_cfg_s& dmrs_dl_cfg, + srsran_dmrs_sch_add_pos_t* in_srsran_dmrs_sch_add_pos); +bool make_phy_dmrs_ul_additional_pos(const asn1::rrc_nr::dmrs_ul_cfg_s& dmrs_ul_cfg, + srsran_dmrs_sch_add_pos_t* srsran_dmrs_sch_add_pos); bool make_phy_beta_offsets(const asn1::rrc_nr::beta_offsets_s& beta_offsets, srsran_beta_offsets_t* srsran_beta_offsets); bool make_phy_pusch_scaling(const asn1::rrc_nr::uci_on_pusch_s& uci_on_pusch, float* scaling); diff --git a/lib/src/asn1/rrc_nr_utils.cc b/lib/src/asn1/rrc_nr_utils.cc index f22d5f45b..6a87bd1bf 100644 --- a/lib/src/asn1/rrc_nr_utils.cc +++ b/lib/src/asn1/rrc_nr_utils.cc @@ -829,8 +829,34 @@ bool make_phy_pdsch_alloc_type(const asn1::rrc_nr::pdsch_cfg_s& pdsch_cfg, return true; } -bool make_phy_dmrs_additional_pos(const dmrs_ul_cfg_s& dmrs_ul_cfg, - srsran_dmrs_sch_add_pos_t* in_srsran_dmrs_sch_add_pos) +bool make_phy_dmrs_dl_additional_pos(const dmrs_dl_cfg_s& dmrs_dl_cfg, + srsran_dmrs_sch_add_pos_t* in_srsran_dmrs_sch_add_pos) +{ + srsran_dmrs_sch_add_pos_t srsran_dmrs_sch_add_pos = {}; + if (not dmrs_dl_cfg.dmrs_add_position_present) { + asn1::log_warning("dmrs_add_position option not present"); + } + + switch (dmrs_dl_cfg.dmrs_add_position) { + case dmrs_dl_cfg_s::dmrs_add_position_opts::pos0: + srsran_dmrs_sch_add_pos = srsran_dmrs_sch_add_pos_0; + break; + case dmrs_dl_cfg_s::dmrs_add_position_opts::pos1: + srsran_dmrs_sch_add_pos = srsran_dmrs_sch_add_pos_1; + break; + case dmrs_dl_cfg_s::dmrs_add_position_opts::pos3: + srsran_dmrs_sch_add_pos = srsran_dmrs_sch_add_pos_3; + break; + default: + asn1::log_warning("Invalid option for dmrs_add_position %s", dmrs_dl_cfg.dmrs_add_position.to_string()); + return false; + } + *in_srsran_dmrs_sch_add_pos = srsran_dmrs_sch_add_pos; + return true; +} + +bool make_phy_dmrs_ul_additional_pos(const dmrs_ul_cfg_s& dmrs_ul_cfg, + srsran_dmrs_sch_add_pos_t* in_srsran_dmrs_sch_add_pos) { srsran_dmrs_sch_add_pos_t srsran_dmrs_sch_add_pos = {}; if (not dmrs_ul_cfg.dmrs_add_position_present) { diff --git a/lib/test/asn1/rrc_nr_utils_test.cc b/lib/test/asn1/rrc_nr_utils_test.cc index e5dfe181e..7bea15aff 100644 --- a/lib/test/asn1/rrc_nr_utils_test.cc +++ b/lib/test/asn1/rrc_nr_utils_test.cc @@ -486,7 +486,7 @@ int make_phy_dmrs_additional_pos_test() dmrs_ul_cfg.dmrs_add_position_present = true; dmrs_ul_cfg.dmrs_add_position = dmrs_ul_cfg_s::dmrs_add_position_opts::pos1; srsran_dmrs_sch_add_pos_t srsran_dmrs_sch_add_pos; - TESTASSERT(make_phy_dmrs_additional_pos(dmrs_ul_cfg, &srsran_dmrs_sch_add_pos) == true); + TESTASSERT(make_phy_dmrs_ul_additional_pos(dmrs_ul_cfg, &srsran_dmrs_sch_add_pos) == true); TESTASSERT(srsran_dmrs_sch_add_pos == srsran_dmrs_sch_add_pos_1); diff --git a/srsue/src/stack/rrc/rrc_nr.cc b/srsue/src/stack/rrc/rrc_nr.cc index f28f7fc89..cf8443c35 100644 --- a/srsue/src/stack/rrc/rrc_nr.cc +++ b/srsue/src/stack/rrc/rrc_nr.cc @@ -606,6 +606,26 @@ bool rrc_nr::apply_sp_cell_init_dl_pdcch(const asn1::rrc_nr::pdcch_cfg_s& pdcch_ bool rrc_nr::apply_sp_cell_init_dl_pdsch(const asn1::rrc_nr::pdsch_cfg_s& pdsch_cfg) { + if (pdsch_cfg.dmrs_dl_for_pdsch_map_type_a_present) { + if (pdsch_cfg.dmrs_dl_for_pdsch_map_type_a.type() == setup_release_c::types_opts::setup) { + srsran_dmrs_sch_add_pos_t srsran_dmrs_sch_add_pos; + if (make_phy_dmrs_dl_additional_pos(pdsch_cfg.dmrs_dl_for_pdsch_map_type_a.setup(), &srsran_dmrs_sch_add_pos) == + true) { + phy_cfg.pdsch.dmrs_typeA.additional_pos = srsran_dmrs_sch_add_pos; + phy_cfg.pdsch.dmrs_typeA.present = true; + } else { + logger.warning("Warning while build srsran_dmrs_sch_add_pos structure"); + return false; + } + } else { + logger.warning("Option dmrs_dl_for_pdsch_map_type_a not of type setup"); + return false; + } + } else { + logger.warning("Option dmrs_dl_for_pdsch_map_type_a not present"); + return false; + } + srsran_resource_alloc_t resource_alloc; if (make_phy_pdsch_alloc_type(pdsch_cfg, &resource_alloc) == true) { phy_cfg.pdsch.alloc = resource_alloc; @@ -1004,7 +1024,7 @@ bool rrc_nr::apply_sp_cell_ded_ul_pusch(const asn1::rrc_nr::pusch_cfg_s& pusch_c if (pusch_cfg.dmrs_ul_for_pusch_map_type_a_present) { if (pusch_cfg.dmrs_ul_for_pusch_map_type_a.type() == setup_release_c::types_opts::setup) { srsran_dmrs_sch_add_pos_t srsran_dmrs_sch_add_pos; - if (make_phy_dmrs_additional_pos(pusch_cfg.dmrs_ul_for_pusch_map_type_a.setup(), &srsran_dmrs_sch_add_pos) == + if (make_phy_dmrs_ul_additional_pos(pusch_cfg.dmrs_ul_for_pusch_map_type_a.setup(), &srsran_dmrs_sch_add_pos) == true) { phy_cfg.pusch.dmrs_typeA.additional_pos = srsran_dmrs_sch_add_pos; phy_cfg.pusch.dmrs_typeA.present = true;