From 201f29b4e51ef8e09a666babedc1605dfac258db Mon Sep 17 00:00:00 2001 From: Andre Puschmann Date: Wed, 1 Sep 2021 13:30:38 +0200 Subject: [PATCH] enb,rrc_nr: register DRB1 at RLC/PDCP when enabling NSA mode --- srsenb/hdr/stack/rrc/rrc_nr.h | 8 ++- srsenb/src/stack/rrc/rrc_nr.cc | 126 +++++++++++++++++++++++++-------- 2 files changed, 104 insertions(+), 30 deletions(-) diff --git a/srsenb/hdr/stack/rrc/rrc_nr.h b/srsenb/hdr/stack/rrc/rrc_nr.h index b5cb99443..e1b73269b 100644 --- a/srsenb/hdr/stack/rrc/rrc_nr.h +++ b/srsenb/hdr/stack/rrc/rrc_nr.h @@ -118,11 +118,17 @@ public: int pack_secondary_cell_group_config(asn1::dyn_octstring& packed_secondary_cell_config); int pack_nr_radio_bearer_config(asn1::dyn_octstring& packed_nr_bearer_config); + int add_drb(); + // state rrc_nr_state_t state = rrc_nr_state_t::RRC_IDLE; uint8_t transaction_id = 0; - uint32_t drb1_lcid = 4; + // RRC configs for UEs + asn1::rrc_nr::cell_group_cfg_s cell_group_cfg; + asn1::rrc_nr::radio_bearer_cfg_s radio_bearer_cfg; + + const uint32_t drb1_lcid = 4; }; private: diff --git a/srsenb/src/stack/rrc/rrc_nr.cc b/srsenb/src/stack/rrc/rrc_nr.cc index c75ebca49..b248f21f6 100644 --- a/srsenb/src/stack/rrc/rrc_nr.cc +++ b/srsenb/src/stack/rrc/rrc_nr.cc @@ -492,7 +492,7 @@ void rrc_nr::ue::send_dl_ccch(dl_ccch_msg_s* dl_ccch_msg) // Helper for the RRC Reconfiguration sender to pack hard-coded config int rrc_nr::ue::pack_secondary_cell_group_config(asn1::dyn_octstring& packed_secondary_cell_config) { - cell_group_cfg_s cell_group_cfg_pack; + auto& cell_group_cfg_pack = cell_group_cfg; // RLC for DRB1 (with fixed LCID) cell_group_cfg_pack.rlc_bearer_to_add_mod_list_present = true; @@ -1078,38 +1078,19 @@ int rrc_nr::ue::pack_rrc_reconfiguraiton(asn1::dyn_octstring& packed_rrc_reconfi // Packs a hard-coded NR radio bearer config with fixed params for RLC/PDCP (for now) int rrc_nr::ue::pack_nr_radio_bearer_config(asn1::dyn_octstring& packed_nr_bearer_config) { - radio_bearer_cfg_s radio_bearer_cfg; - radio_bearer_cfg.drb_to_add_mod_list_present = true; - radio_bearer_cfg.drb_to_add_mod_list.resize(1); - - // configure fixed DRB1 - auto& drb_item = radio_bearer_cfg.drb_to_add_mod_list[0]; - drb_item.drb_id = 1; - drb_item.cn_assoc_present = true; - drb_item.cn_assoc.set_eps_bearer_id() = 5; - drb_item.pdcp_cfg_present = true; - drb_item.pdcp_cfg.ciphering_disabled_present = true; - drb_item.pdcp_cfg.drb_present = true; - drb_item.pdcp_cfg.drb.pdcp_sn_size_dl_present = true; - drb_item.pdcp_cfg.drb.pdcp_sn_size_dl = asn1::rrc_nr::pdcp_cfg_s::drb_s_::pdcp_sn_size_dl_opts::len18bits; - drb_item.pdcp_cfg.drb.pdcp_sn_size_ul_present = true; - drb_item.pdcp_cfg.drb.pdcp_sn_size_ul = asn1::rrc_nr::pdcp_cfg_s::drb_s_::pdcp_sn_size_ul_opts::len18bits; - drb_item.pdcp_cfg.drb.discard_timer_present = true; - drb_item.pdcp_cfg.drb.discard_timer = asn1::rrc_nr::pdcp_cfg_s::drb_s_::discard_timer_opts::ms100; - drb_item.pdcp_cfg.drb.hdr_compress.set_not_used(); - drb_item.pdcp_cfg.t_reordering_present = true; - drb_item.pdcp_cfg.t_reordering = asn1::rrc_nr::pdcp_cfg_s::t_reordering_opts::ms0; - - radio_bearer_cfg.security_cfg_present = true; - radio_bearer_cfg.security_cfg.key_to_use_present = true; - radio_bearer_cfg.security_cfg.key_to_use = asn1::rrc_nr::security_cfg_s::key_to_use_opts::secondary; - radio_bearer_cfg.security_cfg.security_algorithm_cfg_present = true; - radio_bearer_cfg.security_cfg.security_algorithm_cfg.ciphering_algorithm = ciphering_algorithm_opts::nea2; + // set security config + auto& radio_bearer_cfg_pack = radio_bearer_cfg; + radio_bearer_cfg_pack.security_cfg_present = true; + auto& sec_cfg = radio_bearer_cfg_pack.security_cfg; + sec_cfg.key_to_use_present = true; + sec_cfg.key_to_use = asn1::rrc_nr::security_cfg_s::key_to_use_opts::secondary; + sec_cfg.security_algorithm_cfg_present = true; + sec_cfg.security_algorithm_cfg.ciphering_algorithm = ciphering_algorithm_opts::nea2; // pack it packed_nr_bearer_config.resize(128); asn1::bit_ref bref_pack(packed_nr_bearer_config.data(), packed_nr_bearer_config.size()); - if (radio_bearer_cfg.pack(bref_pack) != asn1::SRSASN_SUCCESS) { + if (radio_bearer_cfg_pack.pack(bref_pack) != asn1::SRSASN_SUCCESS) { parent->logger.error("Failed to pack NR radio bearer config"); return SRSRAN_ERROR; } @@ -1122,6 +1103,13 @@ int rrc_nr::ue::pack_nr_radio_bearer_config(asn1::dyn_octstring& packed_nr_beare int rrc_nr::ue::handle_sgnb_addition_request(uint16_t eutra_rnti) { + // Add DRB1 to RLC and PDCP + if (add_drb() != SRSRAN_SUCCESS) { + parent->logger.error("Failed to configure DRB"); + parent->rrc_eutra->sgnb_addition_reject(eutra_rnti); + return SRSRAN_ERROR; + } + // provide hard-coded NR configs asn1::dyn_octstring nr_secondary_cell_group_cfg; if (pack_rrc_reconfiguraiton(nr_secondary_cell_group_cfg) == SRSRAN_ERROR) { @@ -1143,4 +1131,84 @@ int rrc_nr::ue::handle_sgnb_addition_request(uint16_t eutra_rnti) return SRSRAN_SUCCESS; } +/** + * @brief Set DRB configuration + * + * The function sets and configures all relavant fields for the DRB configuration (MAC, RLC, PDCP) in the + * cellGroupConfig and also adds the bearer to the local RLC and PDCP entities. + * + * @return int SRSRAN_SUCCESS on success + */ +int rrc_nr::ue::add_drb() +{ + // RLC for DRB1 (with fixed LCID) inside cell_group_cfg + auto& cell_group_cfg_pack = cell_group_cfg; + + cell_group_cfg_pack.rlc_bearer_to_add_mod_list_present = true; + cell_group_cfg_pack.rlc_bearer_to_add_mod_list.resize(1); + auto& rlc = cell_group_cfg_pack.rlc_bearer_to_add_mod_list[0]; + rlc.lc_ch_id = drb1_lcid; + rlc.served_radio_bearer_present = true; + rlc.served_radio_bearer.set_drb_id(); + rlc.served_radio_bearer.drb_id() = 1; + rlc.rlc_cfg_present = true; + rlc.rlc_cfg.set_um_bi_dir(); + rlc.rlc_cfg.um_bi_dir().ul_um_rlc.sn_field_len_present = true; + rlc.rlc_cfg.um_bi_dir().ul_um_rlc.sn_field_len = sn_field_len_um_opts::size12; + rlc.rlc_cfg.um_bi_dir().dl_um_rlc.sn_field_len_present = true; + rlc.rlc_cfg.um_bi_dir().dl_um_rlc.sn_field_len = sn_field_len_um_opts::size12; + rlc.rlc_cfg.um_bi_dir().dl_um_rlc.t_reassembly = t_reassembly_opts::ms50; + + // add RLC bearer + srsran::rlc_config_t rlc_cfg; + if (srsran::make_rlc_config_t(cell_group_cfg.rlc_bearer_to_add_mod_list[0].rlc_cfg, &rlc_cfg) != SRSRAN_SUCCESS) { + parent->logger.error("Failed to build RLC config"); + return SRSRAN_ERROR; + } + parent->rlc->add_bearer(rnti, drb1_lcid, rlc_cfg); + + // MAC logical channel config + rlc.mac_lc_ch_cfg_present = true; + rlc.mac_lc_ch_cfg.ul_specific_params_present = true; + rlc.mac_lc_ch_cfg.ul_specific_params.prio = 11; + rlc.mac_lc_ch_cfg.ul_specific_params.prioritised_bit_rate = + asn1::rrc_nr::lc_ch_cfg_s::ul_specific_params_s_::prioritised_bit_rate_opts::kbps0; + rlc.mac_lc_ch_cfg.ul_specific_params.bucket_size_dur = + asn1::rrc_nr::lc_ch_cfg_s::ul_specific_params_s_::bucket_size_dur_opts::ms100; + rlc.mac_lc_ch_cfg.ul_specific_params.lc_ch_group_present = true; + rlc.mac_lc_ch_cfg.ul_specific_params.lc_ch_group = 6; + rlc.mac_lc_ch_cfg.ul_specific_params.sched_request_id_present = true; + rlc.mac_lc_ch_cfg.ul_specific_params.sched_request_id = 0; + // TODO: add LC config to MAC + + // PDCP config goes into radio_bearer_cfg + auto& radio_bearer_cfg_pack = radio_bearer_cfg; + radio_bearer_cfg_pack.drb_to_add_mod_list_present = true; + radio_bearer_cfg_pack.drb_to_add_mod_list.resize(1); + + // configure fixed DRB1 + auto& drb_item = radio_bearer_cfg_pack.drb_to_add_mod_list[0]; + drb_item.drb_id = 1; + drb_item.cn_assoc_present = true; + drb_item.cn_assoc.set_eps_bearer_id() = 5; + drb_item.pdcp_cfg_present = true; + drb_item.pdcp_cfg.ciphering_disabled_present = true; + drb_item.pdcp_cfg.drb_present = true; + drb_item.pdcp_cfg.drb.pdcp_sn_size_dl_present = true; + drb_item.pdcp_cfg.drb.pdcp_sn_size_dl = asn1::rrc_nr::pdcp_cfg_s::drb_s_::pdcp_sn_size_dl_opts::len18bits; + drb_item.pdcp_cfg.drb.pdcp_sn_size_ul_present = true; + drb_item.pdcp_cfg.drb.pdcp_sn_size_ul = asn1::rrc_nr::pdcp_cfg_s::drb_s_::pdcp_sn_size_ul_opts::len18bits; + drb_item.pdcp_cfg.drb.discard_timer_present = true; + drb_item.pdcp_cfg.drb.discard_timer = asn1::rrc_nr::pdcp_cfg_s::drb_s_::discard_timer_opts::ms100; + drb_item.pdcp_cfg.drb.hdr_compress.set_not_used(); + drb_item.pdcp_cfg.t_reordering_present = true; + drb_item.pdcp_cfg.t_reordering = asn1::rrc_nr::pdcp_cfg_s::t_reordering_opts::ms0; + + // Add DRB1 to PDCP + srsran::pdcp_config_t pdcp_cnfg = srsran::make_drb_pdcp_config_t(drb_item.drb_id, false, drb_item.pdcp_cfg); + parent->pdcp->add_bearer(rnti, rlc.lc_ch_id, pdcp_cnfg); + + return SRSRAN_SUCCESS; +} + } // namespace srsenb