diff --git a/lib/include/srsran/asn1/asn1_utils.h b/lib/include/srsran/asn1/asn1_utils.h index dbce0eb75..6d4966870 100644 --- a/lib/include/srsran/asn1/asn1_utils.h +++ b/lib/include/srsran/asn1/asn1_utils.h @@ -1445,6 +1445,82 @@ int test_pack_unpack_consistency(const Msg& msg) return SRSASN_SUCCESS; } +/************************ + General Layer Types +************************/ + +/// Enumerated used in RRC and RRC NR that distinguishes Release and Setup modes +struct setup_release_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"); + } +}; +using setup_release_e = enumerated; + +// Criticality ::= ENUMERATED +struct crit_opts { + enum options { reject, ignore, notify, nulltype } value; + const char* to_string() const + { + static const char* options[] = {"reject", "ignore", "notify"}; + return convert_enum_idx(options, 3, value, "crit_e"); + } +}; +typedef enumerated crit_e; + +// ProtocolIE-SingleContainer{LAYER-PROTOCOL-IES : IEsSetParam} ::= SEQUENCE{{LAYER-PROTOCOL-IES}} +template +struct protocol_ie_single_container_s { + using value_type = typename ies_set_paramT_::value_c; + value_type value; + + uint32_t id() const { return id_; } + crit_e crit() const { return ies_set_paramT_::get_crit(id_); } + value_type* operator->() { return &value; } + const value_type* operator->() const { return &value; } + value_type& operator*() { return value; } + const value_type& operator*() const { return value; } + + SRSASN_CODE pack(bit_ref& bref) const + { + HANDLE_CODE(pack_integer(bref, id_, (uint32_t)0u, (uint32_t)65535u, false, true)); + HANDLE_CODE(ies_set_paramT_::get_crit(id_).pack(bref)); + HANDLE_CODE(value.pack(bref)); + return SRSASN_SUCCESS; + } + SRSASN_CODE unpack(cbit_ref& bref) + { + HANDLE_CODE(unpack_integer(id_, bref, (uint32_t)0u, (uint32_t)65535u, false, true)); + HANDLE_CODE(crit().unpack(bref)); + value = ies_set_paramT_::get_value(id_); + HANDLE_CODE(value.unpack(bref)); + return SRSASN_SUCCESS; + } + void to_json(json_writer& j) const + { + j.start_obj(); + j.write_int("id", id_); + j.write_str("criticality", crit().to_string()); + j.end_obj(); + } + bool load_info_obj(const uint32_t& id_val) + { + if (not ies_set_paramT_::is_id_valid(id_val)) { + return false; + } + id_ = id_val; + value = ies_set_paramT_::get_value(id_); + return value.type().value != ies_set_paramT_::value_c::types_opts::nulltype; + } + +private: + uint32_t id_ = 0; +}; + } // namespace asn1 #endif // SRSASN_COMMON_UTILS_H diff --git a/lib/include/srsran/asn1/ngap.h b/lib/include/srsran/asn1/ngap.h index d3cd56432..a52ac7ce5 100644 --- a/lib/include/srsran/asn1/ngap.h +++ b/lib/include/srsran/asn1/ngap.h @@ -291,14 +291,6 @@ namespace ngap { * Struct Definitions ******************************************************************************/ -// Criticality ::= ENUMERATED -struct crit_opts { - enum options { reject, ignore, notify, nulltype } value; - - const char* to_string() const; -}; -typedef enumerated crit_e; - // Presence ::= ENUMERATED struct presence_opts { enum options { optional, conditional, mandatory, nulltype } value; @@ -360,19 +352,6 @@ struct protocol_ext_field_s { bool load_info_obj(const uint32_t& id_); }; -// ProtocolIE-SingleContainer{NGAP-PROTOCOL-IES : IEsSetParam} ::= SEQUENCE{{NGAP-PROTOCOL-IES}} -template -struct protocol_ie_single_container_s { - uint32_t id = 0; - crit_e crit; - typename ies_set_paramT_::value_c value; - - SRSASN_CODE pack(bit_ref& bref) const; - SRSASN_CODE unpack(cbit_ref& bref); - void to_json(json_writer& j) const; - bool load_info_obj(const uint32_t& id_); -}; - struct ngap_protocol_ext_empty_o { // Extension ::= OPEN TYPE struct ext_c { diff --git a/lib/include/srsran/asn1/s1ap.h b/lib/include/srsran/asn1/s1ap.h index 5c74f297c..a83f77594 100644 --- a/lib/include/srsran/asn1/s1ap.h +++ b/lib/include/srsran/asn1/s1ap.h @@ -428,14 +428,6 @@ namespace s1ap { * Struct Definitions ******************************************************************************/ -// Criticality ::= ENUMERATED -struct crit_opts { - enum options { reject, ignore, notify, nulltype } value; - - const char* to_string() const; -}; -typedef enumerated crit_e; - // Presence ::= ENUMERATED struct presence_opts { enum options { optional, conditional, mandatory, nulltype } value; @@ -530,19 +522,6 @@ struct protocol_ie_field_s { template using protocol_ie_container_l = dyn_seq_of, 0, 65535, true>; -// ProtocolIE-SingleContainer{S1AP-PROTOCOL-IES : IEsSetParam} ::= SEQUENCE{{S1AP-PROTOCOL-IES}} -template -struct protocol_ie_single_container_s { - uint32_t id = 0; - crit_e crit; - typename ies_set_paramT_::value_c value; - - SRSASN_CODE pack(bit_ref& bref) const; - SRSASN_CODE unpack(cbit_ref& bref); - void to_json(json_writer& j) const; - bool load_info_obj(const uint32_t& id_); -}; - // ProtocolIE-FieldPair{S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= SEQUENCE{{S1AP-PROTOCOL-IES-PAIR}} template struct protocol_ie_field_pair_s { @@ -18228,4 +18207,25 @@ struct targetenb_to_sourceenb_transparent_container_s { } // namespace s1ap } // namespace asn1 +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; +extern template struct asn1::protocol_ie_single_container_s; + #endif // SRSASN1_S1AP_H diff --git a/lib/include/srsran/asn1/s1ap_utils.h b/lib/include/srsran/asn1/s1ap_utils.h index 7aa982a5d..ba3c0d611 100644 --- a/lib/include/srsran/asn1/s1ap_utils.h +++ b/lib/include/srsran/asn1/s1ap_utils.h @@ -43,8 +43,6 @@ struct cause_c; struct erab_item_s; struct ue_aggregate_maximum_bitrate_s; -template -struct protocol_ie_single_container_s; using bearers_subject_to_status_transfer_list_l = dyn_array >; using rrc_establishment_cause_e = enumerated; diff --git a/lib/src/asn1/ngap.cc b/lib/src/asn1/ngap.cc index 0ba963df2..33a483cb9 100644 --- a/lib/src/asn1/ngap.cc +++ b/lib/src/asn1/ngap.cc @@ -20,13 +20,6 @@ using namespace asn1::ngap; * Struct Methods ******************************************************************************/ -// Criticality ::= ENUMERATED -const char* crit_opts::to_string() const -{ - static const char* options[] = {"reject", "ignore", "notify"}; - return convert_enum_idx(options, 3, value, "crit_e"); -} - // Presence ::= ENUMERATED const char* presence_opts::to_string() const { @@ -162,47 +155,6 @@ bool protocol_ext_field_s::load_info_obj(const uint32_t& id_) return ext_value.type().value != ext_set_paramT_::ext_c::types_opts::nulltype; } -// ProtocolIE-SingleContainer{NGAP-PROTOCOL-IES : IEsSetParam} ::= SEQUENCE{{NGAP-PROTOCOL-IES}} -template -SRSASN_CODE protocol_ie_single_container_s::pack(bit_ref& bref) const -{ - HANDLE_CODE(pack_integer(bref, id, (uint32_t)0u, (uint32_t)65535u, false, true)); - warn_assert(crit != ies_set_paramT_::get_crit(id), __func__, __LINE__); - HANDLE_CODE(crit.pack(bref)); - HANDLE_CODE(value.pack(bref)); - - return SRSASN_SUCCESS; -} -template -SRSASN_CODE protocol_ie_single_container_s::unpack(cbit_ref& bref) -{ - HANDLE_CODE(unpack_integer(id, bref, (uint32_t)0u, (uint32_t)65535u, false, true)); - HANDLE_CODE(crit.unpack(bref)); - value = ies_set_paramT_::get_value(id); - HANDLE_CODE(value.unpack(bref)); - - return SRSASN_SUCCESS; -} -template -void protocol_ie_single_container_s::to_json(json_writer& j) const -{ - j.start_obj(); - j.write_int("id", id); - j.write_str("criticality", crit.to_string()); - j.end_obj(); -} -template -bool protocol_ie_single_container_s::load_info_obj(const uint32_t& id_) -{ - if (not ies_set_paramT_::is_id_valid(id_)) { - return false; - } - id = id_; - crit = ies_set_paramT_::get_crit(id); - value = ies_set_paramT_::get_value(id); - return value.type().value != ies_set_paramT_::value_c::types_opts::nulltype; -} - uint32_t ngap_protocol_ext_empty_o::idx_to_id(uint32_t idx) { asn1::log_error("object set is empty\n"); diff --git a/lib/src/asn1/s1ap.cc b/lib/src/asn1/s1ap.cc index 02835d3d4..8f063325f 100644 --- a/lib/src/asn1/s1ap.cc +++ b/lib/src/asn1/s1ap.cc @@ -20,13 +20,6 @@ using namespace asn1::s1ap; * Struct Methods ******************************************************************************/ -// Criticality ::= ENUMERATED -const char* crit_opts::to_string() const -{ - static const char* options[] = {"reject", "ignore", "notify"}; - return convert_enum_idx(options, 3, value, "crit_e"); -} - // Presence ::= ENUMERATED const char* presence_opts::to_string() const { @@ -212,48 +205,6 @@ bool protocol_ie_field_s::load_info_obj(const uint32_t& id_) return value.type().value != ies_set_paramT_::value_c::types_opts::nulltype; } -// ProtocolIE-SingleContainer{S1AP-PROTOCOL-IES : IEsSetParam} ::= SEQUENCE{{S1AP-PROTOCOL-IES}} -template -SRSASN_CODE protocol_ie_single_container_s::pack(bit_ref& bref) const -{ - HANDLE_CODE(pack_integer(bref, id, (uint32_t)0u, (uint32_t)65535u, false, true)); - warn_assert(crit != ies_set_paramT_::get_crit(id), __func__, __LINE__); - HANDLE_CODE(crit.pack(bref)); - HANDLE_CODE(value.pack(bref)); - - return SRSASN_SUCCESS; -} -template -SRSASN_CODE protocol_ie_single_container_s::unpack(cbit_ref& bref) -{ - HANDLE_CODE(unpack_integer(id, bref, (uint32_t)0u, (uint32_t)65535u, false, true)); - HANDLE_CODE(crit.unpack(bref)); - value = ies_set_paramT_::get_value(id); - HANDLE_CODE(value.unpack(bref)); - - return SRSASN_SUCCESS; -} -template -void protocol_ie_single_container_s::to_json(json_writer& j) const -{ - j.start_obj(); - j.write_int("id", id); - j.write_str("criticality", crit.to_string()); - j.end_obj(); -} -template -bool protocol_ie_single_container_s::load_info_obj(const uint32_t& id_) -{ - if (not ies_set_paramT_::is_id_valid(id_)) { - return false; - } - id = id_; - crit = ies_set_paramT_::get_crit(id); - value = ies_set_paramT_::get_value(id); - return value.type().value != ies_set_paramT_::value_c::types_opts::nulltype; -} -template bool protocol_ie_single_container_s::load_info_obj(const uint32_t& id_); - // ProtocolIE-FieldPair{S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= SEQUENCE{{S1AP-PROTOCOL-IES-PAIR}} template SRSASN_CODE protocol_ie_field_pair_s::pack(bit_ref& bref) const @@ -1484,7 +1435,7 @@ const char* recommended_cell_item_ies_o::value_c::types_opts::to_string() const return convert_enum_idx(options, 1, value, "recommended_cell_item_ies_o::value_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // NextPagingAreaScope ::= ENUMERATED const char* next_paging_area_scope_opts::to_string() const @@ -2418,7 +2369,7 @@ const char* bearers_subject_to_status_transfer_item_ies_o::value_c::types_opts:: return convert_enum_idx(options, 1, value, "bearers_subject_to_status_transfer_item_ies_o::value_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // BluetoothMeasConfig ::= ENUMERATED const char* bluetooth_meas_cfg_opts::to_string() const @@ -11252,7 +11203,7 @@ const char* erab_info_list_ies_o::value_c::types_opts::to_string() const return convert_enum_idx(options, 1, value, "erab_info_list_ies_o::value_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // E-RABItem ::= SEQUENCE SRSASN_CODE erab_item_s::pack(bit_ref& bref) const @@ -11356,7 +11307,7 @@ const char* erab_item_ies_o::value_c::types_opts::to_string() const return convert_enum_idx(options, 1, value, "erab_item_ies_o::value_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // E-RABModifyItemBearerModConf ::= SEQUENCE SRSASN_CODE erab_modify_item_bearer_mod_conf_s::pack(bit_ref& bref) const @@ -11456,7 +11407,7 @@ const char* erab_modify_item_bearer_mod_conf_ies_o::value_c::types_opts::to_stri return convert_enum_idx(options, 1, value, "erab_modify_item_bearer_mod_conf_ies_o::value_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // E-RABModificationConfirmIEs ::= OBJECT SET OF S1AP-PROTOCOL-IES uint32_t erab_mod_confirm_ies_o::idx_to_id(uint32_t idx) @@ -12120,7 +12071,7 @@ const char* erabusage_report_item_ies_o::value_c::types_opts::to_string() const return convert_enum_idx(options, 1, value, "erabusage_report_item_ies_o::value_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // NR-CGI ::= SEQUENCE SRSASN_CODE nr_cgi_s::pack(bit_ref& bref) const @@ -12586,7 +12537,7 @@ const char* user_location_info_ext_ies_o::ext_c::types_opts::to_string() const return convert_enum_idx(options, 1, value, "user_location_info_ext_ies_o::ext_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // TunnelInformation ::= SEQUENCE SRSASN_CODE tunnel_info_s::pack(bit_ref& bref) const @@ -13382,7 +13333,7 @@ const char* erab_modify_item_bearer_mod_res_ies_o::value_c::types_opts::to_strin return convert_enum_idx(options, 1, value, "erab_modify_item_bearer_mod_res_ies_o::value_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // TransportInformation ::= SEQUENCE SRSASN_CODE transport_info_s::pack(bit_ref& bref) const @@ -13755,7 +13706,7 @@ const char* ue_aggregate_maximum_bitrates_ext_ies_o::ext_c::types_opts::to_strin return convert_enum_idx(options, 2, value, "ue_aggregate_maximum_bitrates_ext_ies_o::ext_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // SecondaryRATDataUsageRequest ::= ENUMERATED const char* secondary_rat_data_usage_request_opts::to_string() const @@ -14666,7 +14617,6 @@ const char* erab_modify_resp_ies_o::value_c::types_opts::to_string() const } template struct asn1::s1ap::protocol_ie_field_s; -template struct asn1::s1ap::protocol_ie_single_container_s; erab_modify_resp_ies_container::erab_modify_resp_ies_container() : mme_ue_s1ap_id(0, crit_e::ignore), @@ -15786,7 +15736,7 @@ const char* erab_release_item_bearer_rel_comp_ies_o::value_c::types_opts::to_str return convert_enum_idx(options, 1, value, "erab_release_item_bearer_rel_comp_ies_o::value_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // E-RABReleaseResponseIEs ::= OBJECT SET OF S1AP-PROTOCOL-IES uint32_t erab_release_resp_ies_o::idx_to_id(uint32_t idx) @@ -16557,9 +16507,9 @@ const char* erab_setup_item_ctxt_su_res_ies_o::value_c::types_opts::to_string() return convert_enum_idx(options, 1, value, "erab_setup_item_ctxt_su_res_ies_o::value_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // BearerType ::= ENUMERATED const char* bearer_type_opts::to_string() const @@ -16993,7 +16943,7 @@ const char* erab_to_be_setup_item_bearer_su_req_ies_o::value_c::types_opts::to_s return convert_enum_idx(options, 1, value, "erab_to_be_setup_item_bearer_su_req_ies_o::value_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // E-RABSetupRequestIEs ::= OBJECT SET OF S1AP-PROTOCOL-IES uint32_t erab_setup_request_ies_o::idx_to_id(uint32_t idx) @@ -18611,7 +18561,7 @@ const char* erab_to_be_setup_item_ho_req_ies_o::value_c::types_opts::to_string() return convert_enum_idx(options, 1, value, "erab_to_be_setup_item_ho_req_ies_o::value_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // E-RABToBeSwitchedDLItem ::= SEQUENCE SRSASN_CODE erab_to_be_switched_dl_item_s::pack(bit_ref& bref) const @@ -19872,7 +19822,7 @@ void en_dc_transfer_type_request_s::to_json(json_writer& j) const j.end_obj(); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // SONInformationReply ::= SEQUENCE SRSASN_CODE son_info_reply_s::pack(bit_ref& bref) const @@ -28615,7 +28565,7 @@ void logged_mdt_s::to_json(json_writer& j) const j.end_obj(); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // ServiceType ::= ENUMERATED const char* service_type_opts::to_string() const @@ -33669,7 +33619,7 @@ const char* recommended_enb_item_ies_o::value_c::types_opts::to_string() const return convert_enum_idx(options, 1, value, "recommended_enb_item_ies_o::value_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // RecommendedENBsForPaging ::= SEQUENCE SRSASN_CODE recommended_enbs_for_paging_s::pack(bit_ref& bref) const @@ -38373,7 +38323,7 @@ uint8_t ue_associated_lc_s1_conn_item_res_ack_o::value_c::types_opts::to_number( return map_enum_number(options, 1, value, "ue_associated_lc_s1_conn_item_res_ack_o::value_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // CNDomain ::= ENUMERATED const char* cn_domain_opts::to_string() const @@ -38710,7 +38660,7 @@ const char* srvcc_operation_not_possible_opts::to_string() const return convert_enum_idx(options, 1, value, "srvcc_operation_not_possible_e"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // UE-RetentionInformation ::= ENUMERATED const char* ue_retention_info_opts::to_string() const @@ -38850,7 +38800,7 @@ const char* ue_s1ap_ids_c::types_opts::to_string() const return convert_enum_idx(options, 2, value, "ue_s1ap_ids_c::types"); } -template struct asn1::s1ap::protocol_ie_single_container_s; +template struct asn1::protocol_ie_single_container_s; // UEPagingID ::= CHOICE void ue_paging_id_c::destroy_() diff --git a/lib/test/asn1/s1ap_test.cc b/lib/test/asn1/s1ap_test.cc index 933546831..2da841574 100644 --- a/lib/test/asn1/s1ap_test.cc +++ b/lib/test/asn1/s1ap_test.cc @@ -255,7 +255,7 @@ int test_load_info_obj() container.erab_failed_to_setup_list_ctxt_su_res.value.resize(1); container.erab_failed_to_setup_list_ctxt_su_res.value[0].load_info_obj(ASN1_S1AP_ID_ERAB_ITEM); - TESTASSERT(container.erab_failed_to_setup_list_ctxt_su_res.value[0].id == ASN1_S1AP_ID_ERAB_ITEM); + TESTASSERT_EQ(ASN1_S1AP_ID_ERAB_ITEM, container.erab_failed_to_setup_list_ctxt_su_res.value[0].id()); return SRSRAN_SUCCESS; } diff --git a/srsenb/src/stack/rrc/rrc_mobility.cc b/srsenb/src/stack/rrc/rrc_mobility.cc index cff4df91f..8f55fa20e 100644 --- a/srsenb/src/stack/rrc/rrc_mobility.cc +++ b/srsenb/src/stack/rrc/rrc_mobility.cc @@ -863,12 +863,12 @@ void rrc::ue::rrc_mobility::handle_ho_requested(idle_st& s, const ho_req_rx_ev& // Establish GTPU Forwarding Paths if (ho_req.transparent_container->erab_info_list_present) { const auto& lst = ho_req.transparent_container->erab_info_list; - const auto* it = std::find_if( - lst.begin(), - lst.end(), - [&erab](const asn1::s1ap::protocol_ie_single_container_s& fwd_erab) { - return fwd_erab.value.erab_info_list_item().erab_id == erab.second.id; - }); + const auto* it = + std::find_if(lst.begin(), + lst.end(), + [&erab](const asn1::protocol_ie_single_container_s& fwd_erab) { + return fwd_erab.value.erab_info_list_item().erab_id == erab.second.id; + }); if (it == lst.end()) { continue; } diff --git a/srsepc/src/mme/s1ap_ctx_mngmt_proc.cc b/srsepc/src/mme/s1ap_ctx_mngmt_proc.cc index f8099ac39..aaee7165e 100644 --- a/srsepc/src/mme/s1ap_ctx_mngmt_proc.cc +++ b/srsepc/src/mme/s1ap_ctx_mngmt_proc.cc @@ -186,7 +186,7 @@ bool s1ap_ctx_mngmt_proc::handle_initial_context_setup_response( srsran::console("Received Initial Context Setup Response\n"); // Setup E-RABs - for (const asn1::s1ap::protocol_ie_single_container_s& ie_container : + for (const asn1::protocol_ie_single_container_s& ie_container : in_ctxt_resp.protocol_ies.erab_setup_list_ctxt_su_res.value) { // Get E-RAB setup context item and E-RAB Id const asn1::s1ap::erab_setup_item_ctxt_su_res_s& erab_setup_item_ctxt =