asn1: move setup_release_c from rrc_nr_asn1 to asn1_utils and improved interface

This commit is contained in:
Francisco Paisana 2022-01-08 13:11:38 +01:00
parent e2b8a80f87
commit 61e225d762
5 changed files with 89 additions and 112 deletions

View File

@ -1458,6 +1458,86 @@ struct setup_release_opts {
};
using setup_release_e = enumerated<setup_release_opts>;
// SetupRelease{ElementTypeParam} ::= CHOICE
template <class T>
struct setup_release_c {
using types_opts = setup_release_opts;
using types = setup_release_e;
// choice methods
setup_release_c() = default;
void set(typename types::options e = types::nulltype) { type_ = e; }
types type() const { return type_; }
SRSASN_CODE pack(bit_ref& bref) const
{
type_.pack(bref);
switch (type_) {
case types::release:
break;
case types::setup:
HANDLE_CODE(c.pack(bref));
break;
default:
log_invalid_choice_id(type_, "setup_release_c");
return SRSASN_ERROR_ENCODE_FAIL;
}
return SRSASN_SUCCESS;
}
SRSASN_CODE unpack(cbit_ref& bref)
{
types e;
e.unpack(bref);
set(e);
switch (type_) {
case types::release:
break;
case types::setup:
HANDLE_CODE(c.unpack(bref));
break;
default:
log_invalid_choice_id(type_, "setup_release_c");
return SRSASN_ERROR_DECODE_FAIL;
}
return SRSASN_SUCCESS;
}
void to_json(json_writer& j) const
{
j.start_obj();
switch (type_) {
case types::release:
break;
case types::setup:
asn1::to_json(j, setup());
break;
default:
log_invalid_choice_id(type_, "setup_release_c");
}
j.end_obj();
}
// getters
bool is_setup() const { return type_.value == setup_release_opts::setup; }
T& setup()
{
assert_choice_type(types::setup, type_, "SetupRelease");
return c;
}
const T& setup() const
{
assert_choice_type(types::setup, type_, "SetupRelease");
return c;
}
void set_release() { set(types::release); }
T& set_setup()
{
set(types::setup);
return c;
}
private:
types type_;
T c;
};
// Criticality ::= ENUMERATED
struct crit_opts {
enum options { reject, ignore, notify, nulltype } value;

View File

@ -2238,101 +2238,6 @@ struct sib_type_info_s {
void to_json(json_writer& j) const;
};
// SetupRelease{ElementTypeParam} ::= CHOICE
template <class elem_type_paramT_>
struct setup_release_c {
struct types_opts {
enum options { release, setup, nulltype } value;
const char* to_string() const
{
static const char* options[] = {"release", "setup"};
return convert_enum_idx(options, 2, value, "setup_release_c::types");
}
};
typedef enumerated<types_opts> types;
// choice methods
setup_release_c() = default;
types type() const { return type_; }
// getters
elem_type_paramT_& setup()
{
assert_choice_type(types::setup, type_, "SetupRelease");
return c;
}
const elem_type_paramT_& setup() const
{
assert_choice_type(types::setup, type_, "SetupRelease");
return c;
}
void set_release() { set(types::release); }
void set(typename types::options e) { type_ = e; }
void to_json(json_writer& j) const
{
j.start_obj();
switch (type_) {
case types::release:
j.write_null("release");
break;
case types::setup:
j.write_fieldname("setup");
asn1::to_json(j, setup());
break;
default:
log_invalid_choice_id(type_, "setup_release_c");
}
j.end_obj();
}
SRSASN_CODE pack(bit_ref& bref) const
{
type_.pack(bref);
switch (type_) {
case types::release:
break;
case types::setup:
HANDLE_CODE(c.pack(bref));
break;
default:
log_invalid_choice_id(type_, "setup_release_c");
return SRSASN_ERROR_ENCODE_FAIL;
}
return SRSASN_SUCCESS;
}
SRSASN_CODE unpack(cbit_ref& bref)
{
types e;
e.unpack(bref);
set(e);
switch (type_) {
case types::release:
break;
case types::setup:
HANDLE_CODE(c.unpack(bref));
break;
default:
log_invalid_choice_id(type_, "setup_release_c");
return SRSASN_ERROR_DECODE_FAIL;
}
return SRSASN_SUCCESS;
}
elem_type_paramT_& set_setup()
{
set(types::setup);
return c;
}
private:
types type_;
elem_type_paramT_ c;
};
// UAC-BarringPerCat ::= SEQUENCE
struct uac_barr_per_cat_s {
uint8_t access_category = 1;

View File

@ -1530,9 +1530,7 @@ bool make_phy_mib(const asn1::rrc_nr::mib_s& mib_cfg, srsran_mib_nr_t* mib)
bool make_pdsch_cfg_from_serv_cell(const asn1::rrc_nr::serving_cell_cfg_s& serv_cell, srsran_sch_hl_cfg_nr_t* sch_hl)
{
if (serv_cell.csi_meas_cfg_present and
serv_cell.csi_meas_cfg.type().value ==
setup_release_c< ::asn1::rrc_nr::csi_meas_cfg_s>::types_opts::options::setup) {
if (serv_cell.csi_meas_cfg_present and serv_cell.csi_meas_cfg.is_setup()) {
auto& setup = serv_cell.csi_meas_cfg.setup();
// Configure NZP-CSI
@ -1552,8 +1550,7 @@ bool make_pdsch_cfg_from_serv_cell(const asn1::rrc_nr::serving_cell_cfg_s& serv_
}
}
if (serv_cell.init_dl_bwp.pdsch_cfg_present and
serv_cell.init_dl_bwp.pdsch_cfg.type() == setup_release_c<pdsch_cfg_s>::types_opts::setup) {
if (serv_cell.init_dl_bwp.pdsch_cfg_present and serv_cell.init_dl_bwp.pdsch_cfg.is_setup()) {
const auto& setup = serv_cell.init_dl_bwp.pdsch_cfg.setup();
if (setup.p_zp_csi_rs_res_set_present) {
auto& setup_set = setup.p_zp_csi_rs_res_set.setup();
@ -1573,9 +1570,7 @@ bool make_pdsch_cfg_from_serv_cell(const asn1::rrc_nr::serving_cell_cfg_s& serv_
bool make_csi_cfg_from_serv_cell(const asn1::rrc_nr::serving_cell_cfg_s& serv_cell, srsran_csi_hl_cfg_t* csi_hl)
{
if (serv_cell.csi_meas_cfg_present and
serv_cell.csi_meas_cfg.type().value ==
setup_release_c< ::asn1::rrc_nr::csi_meas_cfg_s>::types_opts::options::setup) {
if (serv_cell.csi_meas_cfg_present and serv_cell.csi_meas_cfg.is_setup()) {
auto& setup = serv_cell.csi_meas_cfg.setup();
// Configure CSI-Report

View File

@ -362,9 +362,8 @@ int test_cell_group_config_tdd()
cell_group_cfg.sp_cell_cfg.recfg_with_sync.sp_cell_cfg_common.ul_cfg_common.init_ul_bwp.rach_cfg_common_present ==
true);
TESTASSERT(
cell_group_cfg.sp_cell_cfg.recfg_with_sync.sp_cell_cfg_common.ul_cfg_common.init_ul_bwp.rach_cfg_common.type() ==
asn1::rrc_nr::setup_release_c<rach_cfg_common_s>::types_opts::setup);
TESTASSERT(cell_group_cfg.sp_cell_cfg.recfg_with_sync.sp_cell_cfg_common.ul_cfg_common.init_ul_bwp.rach_cfg_common
.is_setup());
asn1::rrc_nr::rach_cfg_common_s& rach_cfg_common =
cell_group_cfg.sp_cell_cfg.recfg_with_sync.sp_cell_cfg_common.ul_cfg_common.init_ul_bwp.rach_cfg_common.setup();
@ -980,9 +979,8 @@ int test_cell_group_config_fdd()
cell_group_cfg.sp_cell_cfg.recfg_with_sync.sp_cell_cfg_common.ul_cfg_common.init_ul_bwp.rach_cfg_common_present ==
true);
TESTASSERT(
cell_group_cfg.sp_cell_cfg.recfg_with_sync.sp_cell_cfg_common.ul_cfg_common.init_ul_bwp.rach_cfg_common.type() ==
asn1::rrc_nr::setup_release_c<rach_cfg_common_s>::types_opts::setup);
TESTASSERT(cell_group_cfg.sp_cell_cfg.recfg_with_sync.sp_cell_cfg_common.ul_cfg_common.init_ul_bwp.rach_cfg_common
.is_setup());
asn1::rrc_nr::rach_cfg_common_s& rach_cfg_common =
cell_group_cfg.sp_cell_cfg.recfg_with_sync.sp_cell_cfg_common.ul_cfg_common.init_ul_bwp.rach_cfg_common.setup();

View File

@ -974,7 +974,7 @@ bool rrc_nr::apply_mac_cell_group(const mac_cell_group_cfg_s& mac_cell_group_cfg
}
if (mac_cell_group_cfg.phr_cfg_present) {
if (mac_cell_group_cfg.phr_cfg.type() == setup_release_c<asn1::rrc_nr::phr_cfg_s>::types_opts::setup) {
if (mac_cell_group_cfg.phr_cfg.is_setup()) {
phr_cfg_nr_t phr_cfg_nr;
if (make_mac_phr_cfg_t(mac_cell_group_cfg.phr_cfg.setup(), &phr_cfg_nr) != true) {
logger.warning("Unable to build PHR config");
@ -1196,8 +1196,7 @@ bool rrc_nr::apply_dl_common_cfg(const asn1::rrc_nr::dl_cfg_common_s& dl_cfg_com
}
if (dl_cfg_common.init_dl_bwp_present) {
if (dl_cfg_common.init_dl_bwp.pdsch_cfg_common_present) {
if (dl_cfg_common.init_dl_bwp.pdsch_cfg_common.type() ==
asn1::rrc_nr::setup_release_c<asn1::rrc_nr::pdsch_cfg_common_s>::types_opts::setup) {
if (dl_cfg_common.init_dl_bwp.pdsch_cfg_common.is_setup()) {
const pdcch_cfg_common_s& pdcch_cfg_common = dl_cfg_common.init_dl_bwp.pdcch_cfg_common.setup();
// Load CORESET Zero