diff --git a/lib/test/asn1/srsran_asn1_rrc_meas_test.cc b/lib/test/asn1/srsran_asn1_rrc_meas_test.cc index 898d714fc..faab3b8dc 100644 --- a/lib/test/asn1/srsran_asn1_rrc_meas_test.cc +++ b/lib/test/asn1/srsran_asn1_rrc_meas_test.cc @@ -10,19 +10,15 @@ * */ +#include "srsran/asn1/rrc/dl_dcch_msg.h" #include "srsran/asn1/rrc/ul_dcch_msg.h" #include "srsran/asn1/rrc_utils.h" #include "srsran/common/bcd_helpers.h" +#include "srsran/common/test_common.h" #include "srsran/interfaces/rrc_interface_types.h" #include -#define TESTASSERT(cond) \ - { \ - if (!(cond)) { \ - std::cout << "[" << __FUNCTION__ << "][Line " << __LINE__ << "]: FAIL at " << (#cond) << std::endl; \ - return -1; \ - } \ - } +#define JSON_OUTPUT 0 using namespace asn1; using namespace asn1::rrc; @@ -83,6 +79,136 @@ int meas_obj_test() return 0; } +int test_meas_config() +{ + // RRC reconfig with NR meas config + uint8_t tv[] = {0x20, 0x10, 0x15, 0xc0, 0x40, 0x00, 0x00, 0x96, 0x32, 0x18, 0x10, 0xa8, 0x04, 0xd6, 0xa0, + 0x10, 0x02, 0x01, 0x02, 0x18, 0x9a, 0x00, 0x03, 0x41, 0x81, 0x0e, 0x00, 0x01, 0x38, 0x00, + 0xc0, 0x40, 0x61, 0xc0, 0x00, 0x83, 0x00, 0x31, 0x02, 0x90, 0x60, 0x88, 0x00}; + + asn1::SRSASN_CODE err; + + cbit_ref bref(tv, sizeof(tv)); + + dl_dcch_msg_s recfg_msg_unpacked; + + TESTASSERT(recfg_msg_unpacked.unpack(bref) == SRSASN_SUCCESS); + + TESTASSERT(test_pack_unpack_consistency(recfg_msg_unpacked) == SRSASN_SUCCESS); + +#if JSON_OUTPUT + int unpacked_len = bref.distance_bytes(); + asn1::json_writer json_writer1; + recfg_msg_unpacked.to_json(json_writer1); + srslog::fetch_basic_logger("ASN1").info( + tv, sizeof(tv), "RRC config unpacked (%d B): \n %s", unpacked_len, json_writer1.to_string().c_str()); +#endif + + dl_dcch_msg_s recfg_msg_packed; + + recfg_msg_packed.msg.set_c1(); + recfg_msg_packed.msg.c1().set_rrc_conn_recfg(); // = dl_dcch_msg_type_c::c1_c_::types::rrc_conn_recfg; + recfg_msg_packed.msg.c1().rrc_conn_recfg().crit_exts.set_c1(); + recfg_msg_packed.msg.c1().rrc_conn_recfg().crit_exts.c1().set_rrc_conn_recfg_r8(); + recfg_msg_packed.msg.c1().rrc_conn_recfg().crit_exts.c1().rrc_conn_recfg_r8().meas_cfg_present = true; + + meas_cfg_s& meas_cfg = recfg_msg_packed.msg.c1().rrc_conn_recfg().crit_exts.c1().rrc_conn_recfg_r8().meas_cfg; + + meas_cfg.meas_obj_to_add_mod_list_present = true; + meas_cfg.meas_obj_to_add_mod_list.resize(2); + + auto& meas_obj = meas_cfg.meas_obj_to_add_mod_list[0]; + meas_obj.meas_obj_id = 1; + meas_obj.meas_obj.set_meas_obj_eutra(); + meas_obj.meas_obj.meas_obj_eutra().carrier_freq = 300; + meas_obj.meas_obj.meas_obj_eutra().allowed_meas_bw = allowed_meas_bw_opts::mbw50; + meas_obj.meas_obj.meas_obj_eutra().presence_ant_port1 = false; + meas_obj.meas_obj.meas_obj_eutra().neigh_cell_cfg.from_number(0b01); + + auto& meas_obj2 = meas_cfg.meas_obj_to_add_mod_list[1]; + meas_obj2.meas_obj_id = 2; + meas_obj2.meas_obj.set_meas_obj_nr_r15(); + meas_obj2.meas_obj.meas_obj_nr_r15().carrier_freq_r15 = 634176; + meas_obj2.meas_obj.meas_obj_nr_r15().rs_cfg_ssb_r15.meas_timing_cfg_r15.periodicity_and_offset_r15.set_sf20_r15(); + meas_obj2.meas_obj.meas_obj_nr_r15().rs_cfg_ssb_r15.meas_timing_cfg_r15.ssb_dur_r15 = + asn1::rrc::mtc_ssb_nr_r15_s::ssb_dur_r15_opts::sf1; + meas_obj2.meas_obj.meas_obj_nr_r15().rs_cfg_ssb_r15.subcarrier_spacing_ssb_r15 = + asn1::rrc::rs_cfg_ssb_nr_r15_s::subcarrier_spacing_ssb_r15_opts::khz30; + meas_obj2.meas_obj.meas_obj_nr_r15().ext = true; + meas_obj2.meas_obj.meas_obj_nr_r15().band_nr_r15.set_present(true); + meas_obj2.meas_obj.meas_obj_nr_r15().band_nr_r15.get()->set_setup() = 78; + + // report config + meas_cfg.report_cfg_to_add_mod_list_present = true; + meas_cfg.report_cfg_to_add_mod_list.resize(1); + auto& report_cfg = meas_cfg.report_cfg_to_add_mod_list[0]; + + report_cfg.report_cfg_id = 1; + report_cfg.report_cfg.set_report_cfg_inter_rat(); + report_cfg.report_cfg.report_cfg_inter_rat().trigger_type.set_event(); + report_cfg.report_cfg.report_cfg_inter_rat().trigger_type.event().event_id.set_event_b1_nr_r15(); + report_cfg.report_cfg.report_cfg_inter_rat() + .trigger_type.event() + .event_id.event_b1_nr_r15() + .b1_thres_nr_r15.set_nr_rsrp_r15(); + report_cfg.report_cfg.report_cfg_inter_rat() + .trigger_type.event() + .event_id.event_b1_nr_r15() + .b1_thres_nr_r15.nr_rsrp_r15() = 56; + report_cfg.report_cfg.report_cfg_inter_rat().trigger_type.event().event_id.event_b1_nr_r15().report_on_leave_r15 = + false; + report_cfg.report_cfg.report_cfg_inter_rat().trigger_type.event().hysteresis = 0; + report_cfg.report_cfg.report_cfg_inter_rat().trigger_type.event().time_to_trigger = time_to_trigger_opts::ms100; + + report_cfg.report_cfg.report_cfg_inter_rat().max_report_cells = 8; + report_cfg.report_cfg.report_cfg_inter_rat().report_interv = report_interv_opts::ms120; + report_cfg.report_cfg.report_cfg_inter_rat().report_amount = report_cfg_inter_rat_s::report_amount_opts::r1; + report_cfg.report_cfg.report_cfg_inter_rat().ext = true; + report_cfg.report_cfg.report_cfg_inter_rat().report_quant_cell_nr_r15.set_present(true); + report_cfg.report_cfg.report_cfg_inter_rat().report_quant_cell_nr_r15.get()->ss_rsrp = true; + report_cfg.report_cfg.report_cfg_inter_rat().report_quant_cell_nr_r15.get()->ss_rsrq = true; + report_cfg.report_cfg.report_cfg_inter_rat().report_quant_cell_nr_r15.get()->ss_sinr = true; + + // measIdToAddModList + meas_cfg.meas_id_to_add_mod_list_present = true; + meas_cfg.meas_id_to_add_mod_list.resize(1); + auto& meas_id = meas_cfg.meas_id_to_add_mod_list[0]; + meas_id.meas_id = 1; + meas_id.meas_obj_id = 2; + meas_id.report_cfg_id = 1; + + // quantityConfig + meas_cfg.quant_cfg_present = true; + meas_cfg.quant_cfg.quant_cfg_eutra_present = true; + meas_cfg.quant_cfg.ext = true; + meas_cfg.quant_cfg.quant_cfg_nr_list_r15.set_present(true); + meas_cfg.quant_cfg.quant_cfg_nr_list_r15.get()->resize(1); + auto& meas_quant = meas_cfg.quant_cfg.quant_cfg_nr_list_r15.get()[0]; + meas_quant[0].meas_quant_cell_nr_r15.filt_coeff_rsrp_r15_present = true; + meas_quant[0].meas_quant_cell_nr_r15.filt_coeff_rsrp_r15 = filt_coef_opts::fc3; + + // measGapConfig + meas_cfg.meas_gap_cfg_present = true; + meas_cfg.meas_gap_cfg.set_setup(); + meas_cfg.meas_gap_cfg.setup().gap_offset.set_gp0() = 16; + + uint8_t pack_buffer[1024]; + bit_ref bref2(pack_buffer, sizeof(pack_buffer)); + recfg_msg_packed.pack(bref2); + int packed_len = bref2.distance_bytes(); + TESTASSERT(sizeof(tv) == packed_len); + TESTASSERT(memcmp(pack_buffer, tv, packed_len) == 0); + +#if JSON_OUTPUT + asn1::json_writer json_writer2; + recfg_msg_packed.to_json(json_writer2); + srslog::fetch_basic_logger("ASN1").info( + pack_buffer, packed_len, "RRC config packed (%d B): \n %s", packed_len, json_writer2.to_string().c_str()); +#endif + + return SRSRAN_SUCCESS; +} + int main(int argc, char** argv) { auto& asn1_logger = srslog::fetch_basic_logger("ASN1", false); @@ -91,7 +217,8 @@ int main(int argc, char** argv) srslog::init(); - TESTASSERT(meas_obj_test() == 0); + TESTASSERT(meas_obj_test() == SRSRAN_SUCCESS); + TESTASSERT(test_meas_config() == SRSRAN_SUCCESS); return 0; }