From a725cb043695907db4b598d682661faf007853f0 Mon Sep 17 00:00:00 2001 From: Pedro Alvarez Date: Fri, 25 Feb 2022 18:13:30 +0000 Subject: [PATCH] gnb,config: Added RLC-NR UM and AM configuration parsing --- srsenb/src/enb_cfg_parser.cc | 97 +++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) diff --git a/srsenb/src/enb_cfg_parser.cc b/srsenb/src/enb_cfg_parser.cc index 55c64582f..0edf9a6b4 100644 --- a/srsenb/src/enb_cfg_parser.cc +++ b/srsenb/src/enb_cfg_parser.cc @@ -710,9 +710,104 @@ int field_five_qi::parse(libconfig::Setting& root) pdcp_cfg->t_reordering_present = true; } + // Parse RLC section + if (!q.exists("rlc_config")) { + fprintf(stderr, "Error section rlc_config not found for 5qi=%d\n", five_qi); + return SRSRAN_ERROR; + } + libconfig::Setting& rlc = q["rlc_config"]; + asn1::rrc_nr::rlc_cfg_c* rlc_cfg = &five_qi_cfg.rlc_cfg; + if (rlc.exists("um_uni_dir_ul") || rlc.exists("um_uni_dir_dl")) { + // Sanity check: RLC UM uni-directional is not supported. + fprintf(stderr, "Error uni-directional UM not supported. 5QI=%d\n", five_qi); + return SRSRAN_ERROR; + } + + if (rlc.exists("am")) { + rlc_cfg->set_am(); + } else if (rlc.exists("um_bi_dir")) { + rlc_cfg->set_um_bi_dir(); + } else { + fprintf(stderr, "Invalid combination of UL/DL UM/AM for 5QI=%d\n", five_qi); + return SRSRAN_ERROR; + } + + // Parse RLC-AM section + if (rlc_cfg->type() == asn1::rrc_nr::rlc_cfg_c::types::am) { + libconfig::Setting& rlc_am = rlc["am"]; + libconfig::Setting& rlc_am_ul = rlc_am["ul_am"]; + libconfig::Setting& rlc_am_dl = rlc_am["dl_am"]; + asn1::rrc_nr::ul_am_rlc_s& ul_am_cfg = rlc_cfg->am().ul_am_rlc; + asn1::rrc_nr::dl_am_rlc_s& dl_am_cfg = rlc_cfg->am().dl_am_rlc; + + // RLC AM UL + // SN length + field_asn1_enum_number rlc_sn_size_ul("sn_field_len", &ul_am_cfg.sn_field_len); + if (rlc_sn_size_ul.parse(rlc_am_ul) == SRSRAN_ERROR) { + ul_am_cfg.sn_field_len_present = false; + } else { + ul_am_cfg.sn_field_len_present = true; + } + // t-PollRetx + field_asn1_enum_number rlc_t_poll_retx("t_poll_retx", &ul_am_cfg.t_poll_retx); + rlc_t_poll_retx.parse(rlc_am_ul); + // pollPDU + field_asn1_enum_number rlc_poll_pdu("poll_pdu", &ul_am_cfg.poll_pdu); + rlc_poll_pdu.parse(rlc_am_ul); + // pollBYTE + field_asn1_enum_number rlc_poll_bytes("poll_byte", &ul_am_cfg.poll_byte); + rlc_poll_bytes.parse(rlc_am_ul); + // maxRetxThreshold + field_asn1_enum_number rlc_max_retx_thres( + "max_retx_thres", &ul_am_cfg.max_retx_thres); + rlc_max_retx_thres.parse(rlc_am_ul); + + // RLC AM DL + // SN length + field_asn1_enum_number rlc_sn_size_dl("sn_field_len", &dl_am_cfg.sn_field_len); + if (rlc_sn_size_dl.parse(rlc_am_dl) == SRSRAN_ERROR) { + dl_am_cfg.sn_field_len_present = false; + } else { + dl_am_cfg.sn_field_len_present = true; + } + // t-reassembly + field_asn1_enum_number rlc_t_reassembly("t_reassembly", &dl_am_cfg.t_reassembly); + rlc_t_reassembly.parse(rlc_am_dl); + // t-statusProhibit + field_asn1_enum_number rlc_status_prohibit("t_status_prohibit", + &dl_am_cfg.t_status_prohibit); + rlc_status_prohibit.parse(rlc_am_dl); + } else if (rlc_cfg->type() == asn1::rrc_nr::rlc_cfg_c::types::um_bi_dir) { + libconfig::Setting& rlc_um = rlc["um_bi_dir"]; + libconfig::Setting& rlc_um_ul = rlc_um["ul_um"]; + libconfig::Setting& rlc_um_dl = rlc_um["dl_um"]; + asn1::rrc_nr::ul_um_rlc_s& ul_um_cfg = rlc_cfg->um_bi_dir().ul_um_rlc; + asn1::rrc_nr::dl_um_rlc_s& dl_um_cfg = rlc_cfg->um_bi_dir().dl_um_rlc; + + // RLC UM UL + // SN field length + field_asn1_enum_number rlc_sn_size_ul("sn_field_len", &ul_um_cfg.sn_field_len); + if (rlc_sn_size_ul.parse(rlc_um_ul) == SRSRAN_ERROR) { + ul_um_cfg.sn_field_len_present = false; + } else { + ul_um_cfg.sn_field_len_present = true; + } + + // RLC UM DL + // SN field length + field_asn1_enum_number rlc_sn_size_dl("sn_field_len", &dl_um_cfg.sn_field_len); + if (rlc_sn_size_dl.parse(rlc_um_dl) == SRSRAN_ERROR) { + dl_um_cfg.sn_field_len_present = false; + } else { + dl_um_cfg.sn_field_len_present = true; + } + // t-reassembly + field_asn1_enum_number rlc_t_reassembly_dl("t_reassembly", &dl_um_cfg.t_reassembly); + rlc_t_reassembly_dl.parse(rlc_um_dl); + } + cfg.insert(std::make_pair(five_qi, five_qi_cfg)); } - return 0; } namespace rr_sections {