/** * Copyright 2013-2021 Software Radio Systems Limited * * This file is part of srsRAN. * * srsRAN is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * srsRAN is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * A copy of the GNU Affero General Public License can be found in * the LICENSE file in the top-level directory of this distribution * and at http://www.gnu.org/licenses/. * */ #ifndef SRSRAN_NAS_5G_IES_H #define SRSRAN_NAS_5G_IES_H #include "nas_5g_utils.h" #include "srsran/asn1/asn1_utils.h" #include "srsran/common/buffer_pool.h" #include "srsran/common/common.h" #include "srsran/config.h" #include #include #include namespace srsran { namespace nas_5g { // IEs // IE: 5GS registration type // Reference: 9.11.3.7 class registration_type_5gs_t { public: struct registration_type_type_ { enum options { initial_registration = 0b001, mobility_registration_updating = 0b010, periodic_registration_updating = 0b011, emergency_registration = 0b100, reserved = 0b111, } value; const char* to_string() const; }; typedef nas_enumerated registration_type_type; struct follow_on_request_bit_type_ { enum options { no_follow_on_request_pending = 0b0, follow_on_request_pending = 0b1, } value; const char* to_string() const; }; typedef nas_enumerated follow_on_request_bit_type; follow_on_request_bit_type follow_on_request_bit = follow_on_request_bit_type_::options::no_follow_on_request_pending; registration_type_type registration_type = registration_type_type_::options::initial_registration; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // registration_type_5gs_t // IE: key set identifier // Reference: 9.11.3.32 class key_set_identifier_t { public: struct security_context_flag_type_ { enum options { native_security_context = 0b0, mapped_security_context = 0b1, } value; const char* to_string() const; }; typedef nas_enumerated security_context_flag_type; struct nas_key_set_identifier_type_ { enum options { no_key_is_available_or_reserved = 0b111, } value; const char* to_string() const; }; typedef nas_enumerated nas_key_set_identifier_type; security_context_flag_type security_context_flag = security_context_flag_type_::options::native_security_context; nas_key_set_identifier_type nas_key_set_identifier = nas_key_set_identifier_type_::options::no_key_is_available_or_reserved; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // key_set_identifier_t // IE: 5GS mobile identity // Reference: 9.11.3.4 class mobile_identity_5gs_t { public: struct identity_types_ { enum options { no_identity = 0b000, suci = 0b001, guti_5g = 0b010, imei = 0b011, s_tmsi_5g = 0b100, imeisv = 0b101, mac_address = 0b110, eui_64 = 0b111, } value; const char* to_string() const; }; typedef nas_enumerated identity_types; void set(identity_types::options e = identity_types::no_identity) { type_ = e; }; identity_types type() const { return type_; } class suci_s { public: struct supi_format_type_ { enum options { imsi = 0b000, network_specific_identifier = 0b010, gci = 0b011, gli = 0b100, } value; const char* to_string() const; }; typedef nas_enumerated supi_format_type; struct protection_scheme_id_type_ { enum options { null_scheme = 0b0000, ecies_scheme_profile_a = 0b0001, ecies_scheme_profile_b = 0b0010, } value; const char* to_string() const; }; typedef nas_enumerated protection_scheme_id_type; supi_format_type supi_format = supi_format_type_::options::imsi; std::array mcc; std::array mnc; std::array routing_indicator; protection_scheme_id_type protection_scheme_id = protection_scheme_id_type_::options::null_scheme; uint8_t home_network_public_key_identifier; std::vector scheme_output; SRSASN_CODE pack(asn1::bit_ref& bref, asn1::bit_ref& bref_tmp); SRSASN_CODE unpack(asn1::cbit_ref& bref, uint8_t tmp, uint32_t length); }; // suci class guti_5g_s { public: std::array mcc; std::array mnc; uint8_t amf_region_id; uint16_t amf_set_id; uint8_t amf_pointer; uint32_t tmsi_5g; SRSASN_CODE pack(asn1::bit_ref& bref, asn1::bit_ref& bref_tmp); SRSASN_CODE unpack(asn1::cbit_ref& bref, uint8_t tmp, uint32_t length); }; // guti_5g class imei_s { public: bool odd_even_indicator; std::array imei; SRSASN_CODE pack(asn1::bit_ref& bref, asn1::bit_ref& bref_tmp); SRSASN_CODE unpack(asn1::cbit_ref& bref, uint8_t tmp, uint32_t length); }; // imei class s_tmsi_5g_s { public: uint16_t amf_set_id; uint8_t amf_pointer; uint32_t tmsi_5g; SRSASN_CODE pack(asn1::bit_ref& bref, asn1::bit_ref& bref_tmp); SRSASN_CODE unpack(asn1::cbit_ref& bref, uint8_t tmp, uint32_t length); }; // s_tmsi_5g class imeisv_s { public: bool odd_even_indicator; std::array imeisv; SRSASN_CODE pack(asn1::bit_ref& bref, asn1::bit_ref& bref_tmp); SRSASN_CODE unpack(asn1::cbit_ref& bref, uint8_t tmp, uint32_t length); }; // imeisv class mac_address_s { public: std::array mac_address; SRSASN_CODE pack(asn1::bit_ref& bref, asn1::bit_ref& bref_tmp); SRSASN_CODE unpack(asn1::cbit_ref& bref, uint8_t tmp, uint32_t length); }; // mac_address class eui_64_s { public: std::array eui_64; SRSASN_CODE pack(asn1::bit_ref& bref, asn1::bit_ref& bref_tmp); SRSASN_CODE unpack(asn1::cbit_ref& bref, uint8_t tmp, uint32_t length); }; // eui_64 // Getters suci_s& suci() { asn1::assert_choice_type(identity_types::suci, type_, "suci"); return *srslog::detail::any_cast(&choice_container); } guti_5g_s& guti_5g() { asn1::assert_choice_type(identity_types::guti_5g, type_, "guti_5g"); return *srslog::detail::any_cast(&choice_container); } imei_s& imei() { asn1::assert_choice_type(identity_types::imei, type_, "imei"); return *srslog::detail::any_cast(&choice_container); } s_tmsi_5g_s& s_tmsi_5g() { asn1::assert_choice_type(identity_types::s_tmsi_5g, type_, "s_tmsi_5g"); return *srslog::detail::any_cast(&choice_container); } imeisv_s& imeisv() { asn1::assert_choice_type(identity_types::imeisv, type_, "imeisv"); return *srslog::detail::any_cast(&choice_container); } mac_address_s& mac_address() { asn1::assert_choice_type(identity_types::mac_address, type_, "mac_address"); return *srslog::detail::any_cast(&choice_container); } eui_64_s& eui_64() { asn1::assert_choice_type(identity_types::eui_64, type_, "eui_64"); return *srslog::detail::any_cast(&choice_container); } suci_s& set_suci() { set(identity_types::suci); choice_container = srslog::detail::any{suci_s()}; return *srslog::detail::any_cast(&choice_container); } guti_5g_s& set_guti_5g() { set(identity_types::guti_5g); choice_container = srslog::detail::any{guti_5g_s()}; return *srslog::detail::any_cast(&choice_container); } imei_s& set_imei() { set(identity_types::imei); choice_container = srslog::detail::any{imei_s()}; return *srslog::detail::any_cast(&choice_container); } s_tmsi_5g_s& set_s_tmsi_5g() { set(identity_types::s_tmsi_5g); choice_container = srslog::detail::any{s_tmsi_5g_s()}; return *srslog::detail::any_cast(&choice_container); } imeisv_s& set_imeisv() { set(identity_types::imeisv); choice_container = srslog::detail::any{imeisv_s()}; return *srslog::detail::any_cast(&choice_container); } mac_address_s& set_mac_address() { set(identity_types::mac_address); choice_container = srslog::detail::any{mac_address_s()}; return *srslog::detail::any_cast(&choice_container); } eui_64_s& set_eui_64() { set(identity_types::eui_64); choice_container = srslog::detail::any{eui_64_s()}; return *srslog::detail::any_cast(&choice_container); } SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); private: identity_types type_ = identity_types_::options::no_identity; srslog::detail::any choice_container; }; // mobile_identity_5gs_t // IE: 5GMM capability // Reference: 9.11.3.1 class capability_5gmm_t { public: bool sgc = false; bool iphc_cp_c_io_t_5g = false; bool n3_data = false; bool cp_c_io_t_5g = false; bool restrict_ec = false; bool lpp = false; bool ho_attach = false; bool s1_mode = false; bool racs = false; bool nssaa = false; bool lcs_5g = false; bool v2_xcnpc5 = false; bool v2_xcepc5 = false; bool v2_x = false; bool up_c_io_t_5g = false; bool srvcc_5g = false; bool ehc_cp_c_io_t_5g = false; bool multiple_up = false; bool wusa = false; bool cag = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // capability_5gmm_t // IE: UE security capability // Reference: 9.11.3.54 class ue_security_capability_t { public: bool ea0_5g_supported = false; bool ea1_128_5g_supported = false; bool ea2_128_5g_supported = false; bool ea3_128_5g_supported = false; bool ea4_5g_supported = false; bool ea5_5g_supported = false; bool ea6_5g_supported = false; bool ea7_5g_supported = false; bool ia0_5g_supported = false; bool ia1_128_5g_supported = false; bool ia2_128_5g_supported = false; bool ia3_128_5g_supported = false; bool ia4_5g_supported = false; bool ia5_5g_supported = false; bool ia6_5g_supported = false; bool ia7_5g_supported = false; bool eps_caps_present = false; bool eea0_supported = false; bool eea1_128_supported = false; bool eea2_128_supported = false; bool eea3_128_supported = false; bool eea4_supported = false; bool eea5_supported = false; bool eea6_supported = false; bool eea7_supported = false; bool eia0_supported = false; bool eia1_128_supported = false; bool eia2_128_supported = false; bool eia3_128_supported = false; bool eia4_supported = false; bool eia5_supported = false; bool eia6_supported = false; bool eia7_supported = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // ue_security_capability_t // IE: S-NSSAI // Reference: 9.11.2.8 // IE: S-NSSAI // Reference: 9.11.2.8 class s_nssai_t { public: struct SST_type_ { enum options { sst = 0b00000001, sst_and_mapped_hplmn_sst = 0b00000010, sst_and_sd = 0b00000100, sst_sd_and_mapped_hplmn_sst = 0b00000101, sst_sd_mapped_hplmn_sst_and_mapped_hplmn_sd = 0b00001000, } value; const char* to_string() const; }; typedef nas_enumerated SST_type; SST_type type; uint8_t sst; uint32_t sd; uint8_t mapped_hplmn_sst; uint32_t mapped_hplmn_sd; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // s_nssai_t // IE: NSSAI // Reference: 9.11.3.37 class nssai_t { public: std::vector s_nssai_list; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // nssai_t // IE: 5GS tracking area identity // Reference: 9.11.3.8 class tracking_area_identity_5gs_t { public: std::array mcc; std::array mnc; uint32_t tac; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // tracking_area_identity_5gs_t // IE: S1 UE network capability // Reference: 9.11.3.48 class s1_ue_network_capability_t { public: bool eea0_supported = false; bool eea1_128_supported = false; bool eea2_128_supported = false; bool eea3_128_supported = false; bool eea4_supported = false; bool eea5_supported = false; bool eea6_supported = false; bool eea7_supported = false; bool eia0_supported = false; bool eia1_128_supported = false; bool eia2_128_supported = false; bool eia3_128_supported = false; bool eia4_supported = false; bool eia5_supported = false; bool eia6_supported = false; bool eia7_supported = false; bool uea0_supported = false; bool uea1_128_supported = false; bool uea2_128_supported = false; bool uea3_128_supported = false; bool uea4_supported = false; bool uea5_supported = false; bool uea6_supported = false; bool uea7_supported = false; bool ucs2_support = false; bool uia1_128_supported = false; bool uia2_128_supported = false; bool uia3_128_supported = false; bool uia4_supported = false; bool uia5_supported = false; bool uia6_supported = false; bool uia7_supported = false; bool pro_se_dd_supported = false; bool pro_se_supported = false; bool h245_ash_supported = false; bool acc_csfb_supported = false; bool llp_supported = false; bool lcs_supported = false; bool srvcc_capability_supported = false; bool nf_capability_supported = false; bool e_pco_supported = false; bool hc_cp_c_io_t_supported = false; bool e_rw_o_pdn_supported = false; bool s1_u_data_supported = false; bool up_c_io_t_supported = false; bool cp_c_io_t_supported = false; bool pro_se_relay_supported = false; bool pro_se_dc_supported = false; bool max_15_eps_bearer_supported = false; bool sgc_supported = false; bool n1mode_supported = false; bool dcnr_supported = false; bool cp_backoff_supported = false; bool restrict_ec_supported = false; bool v2_x_pc5_supported = false; bool multiple_drb_supported = false; bool nr_pc5_supported = false; bool up_mt_edt_supported = false; bool cp_mt_edt_supported = false; bool wus_supported = false; bool racs_supported = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // s1_ue_network_capability_t // IE: Uplink data status // Reference: 9.11.3.57 class uplink_data_status_t { public: bool psi_7 = false; bool psi_6 = false; bool psi_5 = false; bool psi_4 = false; bool psi_3 = false; bool psi_2 = false; bool psi_1 = false; bool psi_0 = false; bool psi_15 = false; bool psi_14 = false; bool psi_13 = false; bool psi_12 = false; bool psi_11 = false; bool psi_10 = false; bool psi_9 = false; bool psi_8 = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // uplink_data_status_t // IE: PDU session status // Reference: 9.11.3.44 class pdu_session_status_t { public: bool psi_7 = false; bool psi_6 = false; bool psi_5 = false; bool psi_4 = false; bool psi_3 = false; bool psi_2 = false; bool psi_1 = false; bool psi_0 = false; bool psi_15 = false; bool psi_14 = false; bool psi_13 = false; bool psi_12 = false; bool psi_11 = false; bool psi_10 = false; bool psi_9 = false; bool psi_8 = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // pdu_session_status_t // IE: MICO indication // Reference: 9.11.3.31 class mico_indication_t { public: bool sprti = false; bool aai = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // mico_indication_t // IE: UE status // Reference: 9.11.3.56 class ue_status_t { public: bool n1_mode_reg = false; bool s1_mode_reg = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // ue_status_t // IE: Allowed PDU session status // Reference: 9.11.3.13 class allowed_pdu_session_status_t { public: bool psi_7 = false; bool psi_6 = false; bool psi_5 = false; bool psi_4 = false; bool psi_3 = false; bool psi_2 = false; bool psi_1 = false; bool psi_0 = false; bool psi_15 = false; bool psi_14 = false; bool psi_13 = false; bool psi_12 = false; bool psi_11 = false; bool psi_10 = false; bool psi_9 = false; bool psi_8 = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // allowed_pdu_session_status_t // IE: UE usage setting // Reference: 9.11.3.55 class ue_usage_setting_t { public: struct UE_usage_setting_type_ { enum options { voice_centric = 0b0, data_centric = 0b1, } value; const char* to_string() const; }; typedef nas_enumerated UE_usage_setting_type; UE_usage_setting_type ue_usage_setting = UE_usage_setting_type_::options::voice_centric; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // ue_usage_setting_t // IE: 5GS DRX parameters // Reference: 9.11.3.2A class drx_parameters_5gs_t { public: struct drx_value_type_ { enum options { drx_value_not_specified = 0b0000, drx_cycle_parameter_t_32 = 0b0001, drx_cycle_parameter_t_64 = 0b0010, drx_cycle_parameter_t_128 = 0b0011, drx_cycle_parameter_t_256 = 0b0100, } value; const char* to_string() const; }; typedef nas_enumerated drx_value_type; drx_value_type drx_value = drx_value_type_::options::drx_value_not_specified; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // drx_parameters_5gs_t // IE: EPS NAS message container // Reference: 9.11.3.24 class eps_nas_message_container_t { public: std::vector eps_nas_message_container; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // eps_nas_message_container_t // IE: DNN // Reference: 9.11.2.1B class dnn_t { public: std::vector dnn_value; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // dnn_t // IE: LADN indication // Reference: 9.11.3.29 class ladn_indication_t { public: std::vector ladn_dnn_values; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // ladn_indication_t // IE: Payload container type // Reference: 9.11.3.40 class payload_container_type_t { public: struct Payload_container_type_type_ { enum options { n1_sm_information = 0b0001, sms = 0b0010, lte_positioning_protocol_lpp_message_container = 0b0011, sor_transparent_container = 0b0100, ue_policy_container = 0b0101, ue_parameters_update_transparent_container = 0b0110, location_services_message_container = 0b0111, c_io_t_user_data_container = 0b1000, multiple_payloads = 0b1111, } value; const char* to_string() const; }; typedef nas_enumerated Payload_container_type_type; Payload_container_type_type payload_container_type = Payload_container_type_type_::options::n1_sm_information; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // payload_container_type_t // IE: Payload container // Reference: 9.11.3.39 class payload_container_t { public: std::vector payload_container_contents; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // payload_container_t // IE: Network slicing indication // Reference: 9.11.3.36 class network_slicing_indication_t { public: bool nssci = false; bool dcni = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // network_slicing_indication_t // IE: 5GS update type // Reference: 9.11.3.9A class update_type_5gs_t { public: struct SMS_requested_type_ { enum options { sms_over_nas_not_supported = 0b0, sms_over_nas_supported = 0b1, } value; const char* to_string() const; }; typedef nas_enumerated SMS_requested_type; struct NG_RAN_RCU_type_ { enum options { ue_radio_capability_update_not_needed = 0b0, ue_radio_capability_update_needed = 0b1, } value; const char* to_string() const; }; typedef nas_enumerated NG_RAN_RCU_type; struct PNB_5GS_CIoT_type_ { enum options { no_additional_information = 0b00, control_plane_c_io_t_5gs_optimization = 0b01, user_plane_c_io_t_5gs_optimization = 0b10, reserved = 0b11, } value; const char* to_string() const; }; typedef nas_enumerated PNB_5GS_CIoT_type; struct PNB_EPS_CIoT_type_ { enum options { no_additional_information = 0b00, control_plane_c_io_t_eps_optimization = 0b01, user_plane_c_io_t_eps_optimization = 0b10, reserved = 0b11, } value; const char* to_string() const; }; typedef nas_enumerated PNB_EPS_CIoT_type; PNB_EPS_CIoT_type pnb_eps_c_io_t = PNB_EPS_CIoT_type_::options::no_additional_information; PNB_5GS_CIoT_type pnb_5gs_c_io_t = PNB_5GS_CIoT_type_::options::no_additional_information; NG_RAN_RCU_type ng_ran_rcu = NG_RAN_RCU_type_::options::ue_radio_capability_update_not_needed; SMS_requested_type sms_requested = SMS_requested_type_::options::sms_over_nas_not_supported; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // update_type_5gs_t // IE: Mobile station classmark 2 // Reference: 9.11.3.31C class mobile_station_classmark_2_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // mobile_station_classmark_2_t // IE: Supported codec list // Reference: 9.11.3.51A class supported_codec_list_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // supported_codec_list_t // IE: message container // Reference: 9.11.3.33 class message_container_t { public: std::vector nas_message_container; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // message_container_t // IE: EPS bearer context status // Reference: 9.11.3.23A class eps_bearer_context_status_t { public: bool ebi_7 = false; bool ebi_6 = false; bool ebi_5 = false; bool ebi_4 = false; bool ebi_3 = false; bool ebi_2 = false; bool ebi_1 = false; bool ebi_0 = false; bool ebi_15 = false; bool ebi_14 = false; bool ebi_13 = false; bool ebi_12 = false; bool ebi_11 = false; bool ebi_10 = false; bool ebi_9 = false; bool ebi_8 = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // eps_bearer_context_status_t // IE: Extended DRX parameters // Reference: 9.11.3.26A class extended_drx_parameters_t { public: struct Paging_Time_Window_type_ { enum options { seconds_0 = 0b0000, second_1 = 0b0001, seconds_2 = 0b0010, seconds_3 = 0b0011, seconds_4 = 0b0100, seconds_5 = 0b0101, seconds_6 = 0b0110, seconds_7 = 0b0111, seconds_8 = 0b1000, seconds_9 = 0b1001, seconds_10 = 0b1010, seconds_12 = 0b1011, seconds_14 = 0b1100, seconds_16 = 0b1101, seconds_18 = 0b1110, seconds_20 = 0b1111, } value; const char* to_string() const; }; typedef nas_enumerated Paging_Time_Window_type; struct eDRX_value_type_ { enum options { second_1_28 = 0b0000, second_2_56 = 0b0001, second_3_84 = 0b0010, second_5_12 = 0b0011, second_6_4 = 0b0100, second_7_68 = 0b0101, second_8_96 = 0b0110, second_10_24 = 0b0111, second_11_52 = 0b1000, second_12_8 = 0b1001, second_14_08 = 0b1010, second_15_36 = 0b1011, second_16_64 = 0b1100, second_17_92 = 0b1101, second_19_20 = 0b1110, second_20_48 = 0b1111, } value; const char* to_string() const; }; typedef nas_enumerated eDRX_value_type; Paging_Time_Window_type paging__time__window; eDRX_value_type e_drx_value; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // extended_drx_parameters_t // IE: GPRS timer 3 // Reference: 9.11.2.5 class gprs_timer_3_t { public: struct Unit_type_ { enum options { value_is_incremented_in_multiples_of_10_minutes = 0b000, value_is_incremented_in_multiples_of_1_hour = 0b001, value_is_incremented_in_multiples_of_10_hours = 0b010, value_is_incremented_in_multiples_of_2_seconds = 0b011, value_is_incremented_in_multiples_of_30_seconds = 0b100, value_is_incremented_in_multiples_of_1_minute = 0b101, value_is_incremented_in_multiples_of_320_hours = 0b110, value_indicates_that_the_timer_is_deactivated = 0b111, } value; const char* to_string() const; }; typedef nas_enumerated Unit_type; Unit_type unit; uint8_t timer_value; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // gprs_timer_3_t // IE: UE radio capability ID // Reference: 9.11.3.68 class ue_radio_capability_id_t { public: std::vector ue_radio_capability_id; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // ue_radio_capability_id_t // IE: Mapped NSSAI // Reference: 9.11.3.31B class mapped_nssai_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // mapped_nssai_t // IE: Additional information requested // Reference: 9.11.3.12A class additional_information_requested_t { public: bool cipher_key = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // additional_information_requested_t // IE: WUS assistance information // Reference: 9.11.3.71 class wus_assistance_information_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // wus_assistance_information_t // IE: N5GC indication // Reference: 9.11.3.72 class n5gc_indication_t { public: bool n5gcreg = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // n5gc_indication_t // IE: NB-N1 mode DRX parameters // Reference: 9.11.3.73 class nb_n1_mode_drx_parameters_t { public: struct nb_n1_mode_drx_value_type_ { enum options { drx_value_not_specified = 0b0000, drx_cycle_parameter_t_32 = 0b0001, drx_cycle_parameter_t_64 = 0b0010, drx_cycle_parameter_t_128 = 0b0011, drx_cycle_parameter_t_256 = 0b0100, drx_cycle_parameter_t_512 = 0b0101, drx_cycle_parameter_t_1024 = 0b0111, } value; const char* to_string() const; }; typedef nas_enumerated nb_n1_mode_drx_value_type; nb_n1_mode_drx_value_type nb_n1_mode_drx_value = nb_n1_mode_drx_value_type_::options::drx_value_not_specified; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // nb_n1_mode_drx_parameters_t // IE: 5GS registration result // Reference: 9.11.3.6 class registration_result_5gs_t { public: struct Emergency_registered_type_ { enum options { not_registered_for_emergency_services = 0b0, registered_for_emergency_services = 0b1, } value; const char* to_string() const; }; typedef nas_enumerated Emergency_registered_type; struct NSSAA_to_be_performed_type_ { enum options { nssaa_is_not_to_be_performed = 0b0, nssaa_is_to_be_performed = 0b1, } value; const char* to_string() const; }; typedef nas_enumerated NSSAA_to_be_performed_type; struct SMS_allowed_type_ { enum options { sms_over_nas_not_allowed = 0b0, sms_over_nas_allowed = 0b1, } value; const char* to_string() const; }; typedef nas_enumerated SMS_allowed_type; struct registration_result_type_ { enum options { access_3_gpp = 0b001, non_3_gpp_access = 0b010, access_3_gpp_and_non_3_gpp_access = 0b011, reserved = 0b111, } value; const char* to_string() const; }; typedef nas_enumerated registration_result_type; Emergency_registered_type emergency_registered = Emergency_registered_type_::options::not_registered_for_emergency_services; NSSAA_to_be_performed_type nssaa_to_be_performed = NSSAA_to_be_performed_type_::options::nssaa_is_to_be_performed; SMS_allowed_type sms_allowed = SMS_allowed_type_::options::sms_over_nas_not_allowed; registration_result_type registration_result = registration_result_type_::options::access_3_gpp; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // registration_result_5gs_t // IE: PLMN list // Reference: 9.11.3.45 class plmn_list_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // plmn_list_t // IE: 5GS tracking area identity list // Reference: 9.11.3.9 class tracking_area_identity_list_5gs_t { public: struct type_of_list_type_ { enum options { list_of_ta_cs_belonging_to_one_plmn_or_snpn_with_non_consecutive_tac_values = 0b00, list_of_ta_cs_belonging_to_one_plmn_or_snpn_with_consecutive_tac_values = 0b01, list_of_ta_is_belonging_to_different_plm_ns = 0b10, reserved = 0b11, } value; const char* to_string() const; }; typedef nas_enumerated type_of_list_type; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // tracking_area_identity_list_5gs_t // IE: Rejected NSSAI // Reference: 9.11.3.46 class rejected_nssai_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // rejected_nssai_t // IE: 5GS network feature support // Reference: 9.11.3.5 class network_feature_support_5gs_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // network_feature_support_5gs_t // IE: PDU session reactivation result // Reference: 9.11.3.42 class pdu_session_reactivation_result_t { public: bool psi_7 = false; bool psi_6 = false; bool psi_5 = false; bool psi_4 = false; bool psi_3 = false; bool psi_2 = false; bool psi_1 = false; bool psi_0 = false; bool psi_15 = false; bool psi_14 = false; bool psi_13 = false; bool psi_12 = false; bool psi_11 = false; bool psi_10 = false; bool psi_9 = false; bool psi_8 = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // pdu_session_reactivation_result_t // IE: PDU session reactivation result error cause // Reference: 9.11.3.43 class pdu_session_reactivation_result_error_cause_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // pdu_session_reactivation_result_error_cause_t // IE: LADN information // Reference: 9.11.3.30 class ladn_information_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // ladn_information_t // IE: Service area list // Reference: 9.11.3.49 class service_area_list_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // service_area_list_t // IE: GPRS timer 2 // Reference: 9.11.2.4 class gprs_timer_2_t { public: uint8_t timer_value; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // gprs_timer_2_t // IE: Emergency number list // Reference: 9.11.3.23 class emergency_number_list_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // emergency_number_list_t // IE: Extended emergency number list // Reference: 9.11.3.26 class extended_emergency_number_list_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // extended_emergency_number_list_t // IE: SOR transparent container // Reference: 9.11.3.51 class sor_transparent_container_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // sor_transparent_container_t // IE: EAP message // Reference: 9.11.2.2 class eap_message_t { public: std::vector eap_message; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // eap_message_t // IE: NSSAI inclusion mode // Reference: 9.11.3.37A class nssai_inclusion_mode_t { public: struct NSSAI_inclusion_mode_type_ { enum options { nssai_inclusion_mode_a = 0b00, nssai_inclusion_mode_b = 0b01, nssai_inclusion_mode_c = 0b10, nssai_inclusion_mode_d = 0b11, } value; const char* to_string() const; }; typedef nas_enumerated NSSAI_inclusion_mode_type; NSSAI_inclusion_mode_type nssai_inclusion_mode = NSSAI_inclusion_mode_type_::options::nssai_inclusion_mode_a; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // nssai_inclusion_mode_t // IE: Operator-defined access category definitions // Reference: 9.11.3.38 class operator_defined_access_category_definitions_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // operator_defined_access_category_definitions_t // IE: Non-3GPP NW provided policies // Reference: 9.11.3.36A class non_3_gpp_nw_provided_policies_t { public: bool n3_en = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // non_3_gpp_nw_provided_policies_t // IE: UE radio capability ID deletion indication // Reference: 9.11.3.69 class ue_radio_capability_id_deletion_indication_t { public: struct Deletion_request_type_ { enum options { ue_radio_capability_id_deletion_not_requested = 0b000, network_assigned_ue_radio_capability_i_ds_deletion_requested = 0b001, } value; const char* to_string() const; }; typedef nas_enumerated Deletion_request_type; Deletion_request_type deletion_request = Deletion_request_type_::options::ue_radio_capability_id_deletion_not_requested; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // ue_radio_capability_id_deletion_indication_t // IE: Ciphering key data // Reference: 9.11.3.18C class ciphering_key_data_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // ciphering_key_data_t // IE: CAG information list // Reference: 9.11.3.18A class cag_information_list_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // cag_information_list_t // IE: Truncated 5G-S-TMSI configuration // Reference: 9.11.3.70 class truncated_5g_s_tmsi_configuration_t { public: uint8_t truncated_amf__set_id_value; uint8_t truncated_amf__pointer_value; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // truncated_5g_s_tmsi_configuration_t // IE: 5GMM cause // Reference: 9.11.3.2 class cause_5gmm_t { public: struct cause_5gmm_type_ { enum options { illegal_ue = 0b00000011, pei_not_accepted = 0b00000101, illegal_me = 0b00000110, services_not_allowed_5gs = 0b00000111, ue_identity_cannot_be_derived_by_the_network = 0b00001001, implicitly_de_registered = 0b00001010, plmn_not_allowed = 0b00001011, tracking_area_not_allowed = 0b00001100, roaming_not_allowed_in_this_tracking_area = 0b00001101, no_suitable_cells_in_tracking_area = 0b00001111, mac_failure = 0b00010100, synch_failure = 0b00010101, congestion = 0b00010110, ue_security_capabilities_mismatch = 0b00010111, security_mode_rejected_unspecified = 0b00011000, non_5g_authentication_unacceptable = 0b00011010, n1_mode_not_allowed = 0b00011011, restricted_service_area = 0b00011100, redirection_to_epc_required = 0b00011111, ladn_not_available = 0b00101011, no_network_slices_available = 0b00111110, maximum_number_of_pdu_sessions_reached_ = 0b01000001, insufficient_resources_for_specific_slice_and_dnn = 0b01000011, insufficient_resources_for_specific_slice = 0b01000101, ng_ksi_already_in_use = 0b01000111, non_3_gpp_access_to_5gcn_not_allowed = 0b01001000, serving_network_not_authorized = 0b01001001, temporarily_not_authorized_for_this_snpn = 0b01001010, permanently_not_authorized_for_this_snpn = 0b01001011, not_authorized_for_this_cag_or_authorized_for_cag_cells_only = 0b01001100, wireline_access_area_not_allowed = 0b01001101, payload_was_not_forwarded = 0b01011010, dnn_not_supported_or_not_subscribed_in_the_slice = 0b01011011, insufficient_user_plane_resources_for_the_pdu_session = 0b01011100, semantically_incorrect_message = 0b01011111, invalid_mandatory_information = 0b01100000, message_type_non_existent_or_not_implemented = 0b01100001, message_type_not_compatible_with_the_protocol_state = 0b01100010, information_element_non_existent_or_not_implemented = 0b01100011, conditional_ie_error = 0b01100100, message_not_compatible_with_the_protocol_state = 0b01100101, protocol_error_unspecified = 0b01101111, } value; const char* to_string() const; }; typedef nas_enumerated cause_5gmm_type; cause_5gmm_type cause_5gmm = cause_5gmm_type_::options::illegal_ue; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // cause_5gmm_t // IE: De-registration type // Reference: 9.11.3.20 class de_registration_type_t { public: struct switch_off_type_ { enum options { normal_de_registration = 0b0, switch_off = 0b1, } value; const char* to_string() const; }; typedef nas_enumerated switch_off_type; struct re_registration_required_type_ { enum options { re_registration_not_required = 0b0, re_registration_required = 0b1, } value; const char* to_string() const; }; typedef nas_enumerated re_registration_required_type; struct access_type_type_ { enum options { access_3_gpp = 0b01, non_3_gpp_access = 0b10, access_3_gpp_and_non_3_gpp_access = 0b11, } value; const char* to_string() const; }; typedef nas_enumerated access_type_type; switch_off_type switch_off = switch_off_type_::options::normal_de_registration; re_registration_required_type re_registration_required = re_registration_required_type_::options::re_registration_not_required; access_type_type access_type = access_type_type_::options::access_3_gpp; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // de_registration_type_t // IE: Spare half octet // Reference: 9.5 class spare_half_octet_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // spare_half_octet_t // IE: Service type // Reference: 9.11.3.50 class service_type_t { public: struct Service_type_value_type_ { enum options { signalling = 0b0000, data = 0b0001, mobile_terminated_services = 0b0010, emergency_services = 0b0011, emergency_services_fallback = 0b0100, high_priority_access = 0b0101, elevated_signalling = 0b0110, unused_shall_be_interpreted_as_signalling = 0b0111, unused_shall_be_interpreted_as_signalling_1 = 0b1000, unused_shall_be_interpreted_as_data = 0b1001, unused_shall_be_interpreted_as_data_1 = 0b1010, unused_shall_be_interpreted_as_data_2 = 0b1011, } value; const char* to_string() const; }; typedef nas_enumerated Service_type_value_type; Service_type_value_type service_type_value = Service_type_value_type_::options::signalling; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // service_type_t // IE: Configuration update indication // Reference: 9.11.3.18 class configuration_update_indication_t { public: struct control_plane_service_type_value_type_ { enum options { mobile_originating_request = 0b000, mobile_terminating_request = 0b001, emergency_services = 0b010, emergency_services_fallback = 0b100, } value; const char* to_string() const; }; typedef nas_enumerated control_plane_service_type_value_type; control_plane_service_type_value_type control_plane_service_type_value = control_plane_service_type_value_type_::options::mobile_originating_request; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // configuration_update_indication_t // IE: Network name // Reference: 9.11.3.35 class network_name_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // network_name_t // IE: Time zone // Reference: 9.11.3.52 class time_zone_t { public: uint8_t time_zone; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // time_zone_t // IE: Time zone and time // Reference: 9.11.3.53 class time_zone_and_time_t { public: uint8_t year; uint8_t month; uint8_t day; uint8_t hour; uint8_t minute; uint8_t second; uint8_t time_zone; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // time_zone_and_time_t // IE: Daylight saving time // Reference: 9.11.3.19 class daylight_saving_time_t { public: struct value_type_ { enum options { no_adjustment_for_daylight_saving_time = 0b00, hour_1_adjustment_for_daylight_saving_time = 0b01, hours_2_adjustment_for_daylight_saving_time = 0b10, reserved = 0b11, } value; const char* to_string() const; }; typedef nas_enumerated value_type; value_type value = value_type_::options::no_adjustment_for_daylight_saving_time; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // daylight_saving_time_t // IE: SMS indication // Reference: 9.11.3.50A class sms_indication_t { public: bool sms_availability_indication = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // sms_indication_t // IE: Additional configuration indication // Reference: 9.11.3.74 class additional_configuration_indication_t { public: struct SCMR_type_ { enum options { no_additional_information = 0b0, release_of_n1_nas_signalling_connection_not_required = 0b1, } value; const char* to_string() const; }; typedef nas_enumerated SCMR_type; SCMR_type scmr = SCMR_type_::options::no_additional_information; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // additional_configuration_indication_t // IE: ABBA // Reference: 9.11.3.10 class abba_t { public: std::vector abba_contents; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // abba_t // IE: Authentication parameter RAND // Reference: 9.11.3.16 class authentication_parameter_rand_t { public: std::array rand; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // authentication_parameter_rand_t // IE: Authentication parameter AUTN // Reference: 9.11.3.15 class authentication_parameter_autn_t { public: std::vector autn; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // authentication_parameter_autn_t // IE: Authentication response parameter // Reference: 9.11.3.17 class authentication_response_parameter_t { public: std::vector res; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // authentication_response_parameter_t // IE: Authentication failure parameter // Reference: 9.11.3.14 class authentication_failure_parameter_t { public: std::vector auth_failure; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // authentication_failure_parameter_t // IE: 5GS identity type // Reference: 9.11.3.3 class identity_type_5gs_t { public: struct identity_types_ { enum options { suci = 0b001, guti_5g = 0b010, imei = 0b011, s_tmsi_5g = 0b100, imeisv = 0b101, mac_address = 0b110, eui_64 = 0b111, } value; const char* to_string() const; }; typedef nas_enumerated identity_types; identity_types type_of_identity = identity_types_::options::suci; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // identity_type_5gs_t // IE: security algorithms // Reference: 9.11.3.34 class security_algorithms_t { public: struct integrity_protection_algorithm_type_ { enum options { ia0_5g = 0b0000, ia1_128_5g = 0b0001, ia2_128_5g = 0b0010, ia3_128_5g = 0b0011, ia4_5g = 0b0100, ia5_5g = 0b0101, ia6_5g = 0b0110, ia7_5g = 0b0111, } value; const char* to_string() const; }; typedef nas_enumerated integrity_protection_algorithm_type; struct ciphering_algorithm_type_ { enum options { ea0_5g = 0b0000, ea1_128_5g = 0b0001, ea2_128_5g = 0b0010, ea3_128_5g = 0b0011, ea4_5g = 0b0100, ea5_5g = 0b0101, ea6_5g = 0b0110, ea7_5g = 0b0111, } value; const char* to_string() const; }; typedef nas_enumerated ciphering_algorithm_type; ciphering_algorithm_type ciphering_algorithm = ciphering_algorithm_type_::options::ea0_5g; integrity_protection_algorithm_type integrity_protection_algorithm = integrity_protection_algorithm_type_::options::ia0_5g; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // security_algorithms_t // IE: IMEISV request // Reference: 9.11.3.28 class imeisv_request_t { public: struct imeisv_request_type_ { enum options { imeisv_not_requested = 0b000, imeisv_requested = 0b001, } value; const char* to_string() const; }; typedef nas_enumerated imeisv_request_type; imeisv_request_type imeisv_request = imeisv_request_type_::options::imeisv_not_requested; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // imeisv_request_t // IE: EPS NAS security algorithms // Reference: 9.11.3.25 class eps_nas_security_algorithms_t { public: struct integrity_protection_algorithm_type_ { enum options { eia0 = 0b000, eia1_128 = 0b001, eia2_128 = 0b010, eia3_128 = 0b011, eia4 = 0b100, eia5 = 0b101, eia6 = 0b110, eia7 = 0b111, } value; const char* to_string() const; }; typedef nas_enumerated integrity_protection_algorithm_type; struct ciphering_algorithm_type_ { enum options { eea0 = 0b000, eea1_128 = 0b001, eea2_128 = 0b010, eea3_128 = 0b011, eea4 = 0b100, eea5 = 0b101, eea6 = 0b110, eea7 = 0b111, } value; const char* to_string() const; }; typedef nas_enumerated ciphering_algorithm_type; ciphering_algorithm_type ciphering_algorithm = ciphering_algorithm_type_::options::eea0; integrity_protection_algorithm_type integrity_protection_algorithm = integrity_protection_algorithm_type_::options::eia0; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // eps_nas_security_algorithms_t // IE: Additional 5G security information // Reference: 9.11.3.12 class additional_5g_security_information_t { public: bool rinmr = false; bool hdp = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // additional_5g_security_information_t // IE: S1 UE security capability // Reference: 9.11.3.48A class s1_ue_security_capability_t { public: bool eea0 = false; bool eea1_128 = false; bool eea2_128 = false; bool eea3_128 = false; bool eea4 = false; bool eea5 = false; bool eea6 = false; bool eea7 = false; bool eia0 = false; bool eia1_128 = false; bool eia2_128 = false; bool eia3_128 = false; bool eia4 = false; bool eia5 = false; bool eia6 = false; bool eia7 = false; bool uea0 = false; bool uea1 = false; bool uea2 = false; bool uea3 = false; bool uea4 = false; bool uea5 = false; bool uea6 = false; bool uea7 = false; bool uia1 = false; bool uia2 = false; bool uia3 = false; bool uia4 = false; bool uia5 = false; bool uia6 = false; bool uia7 = false; bool gea1 = false; bool gea2 = false; bool gea3 = false; bool gea4 = false; bool gea5 = false; bool gea6 = false; bool gea7 = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // s1_ue_security_capability_t // IE: Access type // Reference: 9.11.2.1A class access_type_t { public: struct Access_type_value_type_ { enum options { access_3_gpp = 0b01, non_3_gpp_access = 0b10, } value; const char* to_string() const; }; typedef nas_enumerated Access_type_value_type; Access_type_value_type access_type_value = Access_type_value_type_::options::access_3_gpp; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // access_type_t // IE: PDU session identity 2 // Reference: 9.11.3.41 class pdu_session_identity_2_t { public: uint8_t pdu_session_identity_2_value; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // pdu_session_identity_2_t // IE: Request type // Reference: 9.11.3.47 class request_type_t { public: struct Request_type_value_type_ { enum options { initial_request = 0b001, existing_pdu_session = 0b010, initial_emergency_request = 0b011, existing_emergency_pdu_session = 0b100, modification_request = 0b101, ma_pdu_request = 0b110, reserved = 0b111, } value; const char* to_string() const; }; typedef nas_enumerated Request_type_value_type; Request_type_value_type request_type_value = request_type_t::Request_type_value_type_::options::initial_request; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // request_type_t // IE: Additional information // Reference: 9.11.2.1 class additional_information_t { public: std::vector additional_information_value; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // additional_information_t // IE: MA PDU session information // Reference: 9.11.3.31A class ma_pdu_session_information_t { public: struct MA_PDU_session_information_value_type_ { enum options { ma_pdu_session_network_upgrade_is_allowed = 0b0001, } value; const char* to_string() const; }; typedef nas_enumerated MA_PDU_session_information_value_type; MA_PDU_session_information_value_type ma_pdu_session_information_value = MA_PDU_session_information_value_type_::options::ma_pdu_session_network_upgrade_is_allowed; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // ma_pdu_session_information_t // IE: Release assistance indication // Reference: 9.11.3.46A class release_assistance_indication_t { public: struct Downlink_data_expected_type_ { enum options { no_information_regarding_ddx_is_conveyed = 0b00, no_further_uplink_and_no_further_downlink_data = 0b01, only_a_single_downlink_data_transmission = 0b10, reserved = 0b11, } value; const char* to_string() const; }; typedef nas_enumerated Downlink_data_expected_type; Downlink_data_expected_type downlink_data_expected = Downlink_data_expected_type_::options::no_information_regarding_ddx_is_conveyed; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // release_assistance_indication_t // IE: Integrity protection maximum data rate // Reference: 9.11.4.7 class integrity_protection_maximum_data_rate_t { public: struct max_data_rate_UPIP_uplink_type_ { enum options { kbps_64 = 0b00000000, null = 0b00000001, full_data_rate = 0b11111111, } value; const char* to_string() const; }; typedef nas_enumerated max_data_rate_UPIP_uplink_type; struct max_data_rate_UPIP_downlink_type_ { enum options { kbps_64 = 0b00000000, null = 0b00000001, full_data_rate = 0b11111111, } value; const char* to_string() const; }; typedef nas_enumerated max_data_rate_UPIP_downlink_type; max_data_rate_UPIP_uplink_type max_data_rate_upip_uplink = max_data_rate_UPIP_uplink_type_::options::kbps_64; max_data_rate_UPIP_downlink_type max_data_rate_upip_downlink = max_data_rate_UPIP_downlink_type_::options::kbps_64; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // integrity_protection_maximum_data_rate_t // IE: PDU session type // Reference: 9.11.4.11 class pdu_session_type_t { public: struct PDU_session_type_value_type_ { enum options { ipv4 = 0b001, ipv6 = 0b010, ipv4v6 = 0b011, unstructured = 0b100, ethernet = 0b101, reserved = 0b111, } value; const char* to_string() const; }; typedef nas_enumerated PDU_session_type_value_type; PDU_session_type_value_type pdu_session_type_value = PDU_session_type_value_type_::options::ipv4; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // pdu_session_type_t // IE: SSC mode // Reference: 9.11.4.16 class ssc_mode_t { public: struct SSC_mode_value_type_ { enum options { ssc_mode_1 = 0b001, ssc_mode_2 = 0b010, ssc_mode_3 = 0b011, unused_or_ssc_mode_1 = 0b100, unused_or_ssc_mode_2 = 0b101, unused_or_ssc_mode_3 = 0b110, reserved = 0b111, } value; const char* to_string() const; }; typedef nas_enumerated SSC_mode_value_type; SSC_mode_value_type ssc_mode_value = ssc_mode_t::SSC_mode_value_type_::options::ssc_mode_1; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // ssc_mode_t // IE: 5GSM capability // Reference: 9.11.4.1 class capability_5gsm_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // capability_5gsm_t // IE: Maximum number of supported packet filters // Reference: 9.11.4.9 class maximum_number_of_supported_packet_filters_t { public: uint16_t maximum_number_of_supported_packet_filters; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // maximum_number_of_supported_packet_filters_t // IE: Always-on PDU session requested // Reference: 9.11.4.4 class always_on_pdu_session_requested_t { public: bool apsi = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // always_on_pdu_session_requested_t // IE: SM PDU DN request container // Reference: 9.11.4.15 class sm_pdu_dn_request_container_t { public: std::vector dn_specific_identity; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // sm_pdu_dn_request_container_t // IE: Extended protocol configuration options // Reference: 9.11.4.6 class extended_protocol_configuration_options_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // extended_protocol_configuration_options_t // IE: IP header compression configuration // Reference: 9.11.4.24 class ip_header_compression_configuration_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // ip_header_compression_configuration_t // IE: DS-TT Ethernet port MAC address // Reference: 9.11.4.25 class ds_tt__ethernet_port_mac_address_t { public: std::array ds_tt__ethernet_port_mac_address_contents; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // ds_tt__ethernet_port_mac_address_t // IE: UE-DS-TT residence time // Reference: 9.11.4.26 class ue_ds_tt_residence_time_t { public: std::array ue_ds_tt_residence_time_contents; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // ue_ds_tt_residence_time_t // IE: Port management information container // Reference: 9.11.4.27 class port_management_information_container_t { public: std::vector port_management_information_container; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // port_management_information_container_t // IE: Ethernet header compression configuration // Reference: 9.11.4.28 class ethernet_header_compression_configuration_t { public: struct CID_Length_type_ { enum options { ethernet_header_compression_not_used = 0b00, bits_7 = 0b01, bits_15 = 0b10, } value; const char* to_string() const; }; typedef nas_enumerated CID_Length_type; CID_Length_type cid__length = CID_Length_type_::options::ethernet_header_compression_not_used; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // ethernet_header_compression_configuration_t // IE: PDU address // Reference: 9.11.4.10 class pdu_address_t { public: struct PDU_session_type_value_type_ { enum options { ipv4 = 0b001, ipv6 = 0b010, ipv4v6 = 0b011, } value; const char* to_string() const; }; typedef nas_enumerated PDU_session_type_value_type; bool si6_lla = false; PDU_session_type_value_type pdu_session_type_value = PDU_session_type_value_type_::options::ipv4; std::array ipv4; std::array ipv6; std::array smf_i_pv6_link_local_address; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // pdu_address_t // IE: QoS rules // Reference: 9.11.4.13 class qo_s_rules_t { public: struct qos_rule_t {}; std::vector qos_rules; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // qo_s_rules_t // IE: Session-AMBR // Reference: 9.11.4.14 class session_ambr_t { public: struct unit_session_AMBR_type_ { enum options { not_used = 0b00000000, inc_by_1_kbps = 0b00000001, inc_by_4_kbps = 0b00000010, inc_by_16_kbps = 0b00000011, inc_by_64_kbps = 0b00000100, inc_by_256_kbps = 0b00000101, inc_by_1_mbps = 0b00000110, inc_by_4_mbps = 0b00000111, inc_by_16_mbps = 0b00001000, inc_by_64_mbps = 0b00001001, inc_by_256_mbps = 0b00001010, inc_by_1_gbps = 0b00001011, inc_by_4_gbps = 0b00001100, inc_by_16_gbps = 0b00001101, inc_by_64_gbps = 0b00001110, inc_by_256_gbps = 0b00001111, inc_by_1_tbps = 0b00010000, inc_by_4_tbps = 0b00010001, inc_by_16_tbps = 0b00010010, inc_by_64_tbps = 0b00010011, inc_by_256_tbps = 0b00010100, inc_by_1_pbps = 0b00010101, inc_by_4_pbps = 0b00010110, inc_by_16_pbps = 0b00010111, inc_by_64_pbps = 0b00011000, inc_by_256_pbps = 0b00011001, } value; const char* to_string() const; }; typedef nas_enumerated unit_session_AMBR_type; unit_session_AMBR_type unit_session_ambr_for_downlink = unit_session_AMBR_type_::options::not_used; uint16_t session_ambr_for_downlink; unit_session_AMBR_type unit_session_ambr_for_uplink = unit_session_AMBR_type_::options::not_used; uint16_t session_ambr_for_uplink; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // session_ambr_t // IE: 5GSM cause // Reference: 9.11.4.2 class cause_5gsm_t { public: struct cause_value_type_ { enum options { operator_determined_barring = 0b00001000, insufficient_resources = 0b00011010, missing_or_unknown_dnn = 0b00011011, unknown_pdu_session_type = 0b00011100, user_authentication_or_authorization_failed = 0b00011101, request_rejected_unspecified = 0b00011111, service_option_not_supported = 0b00100000, requested_service_option_not_subscribed = 0b00100001, pti_already_in_use = 0b00100011, regular_deactivation = 0b00100100, network_failure = 0b00100110, reactivation_requested = 0b00100111, semantic_error_in_the_tft_operation = 0b00101001, syntactical_error_in_the_tft_operation = 0b00101010, invalid_pdu_session_identity = 0b00101011, semantic_errors_in_packet_filter = 0b00101100, syntactical_error_in_packet_filter = 0b00101101, out_of_ladn_service_area = 0b00101110, pti_mismatch = 0b00101111, pdu_session_type_i_pv4_only_allowed = 0b00110010, pdu_session_type_i_pv6_only_allowed = 0b00110011, pdu_session_does_not_exist = 0b00110110, pdu_session_type_i_pv4v6_only_allowed = 0b00111001, pdu_session_type_unstructured_only_allowed = 0b00111010, unsupported_5_qi_value = 0b00111011, pdu_session_type_ethernet_only_allowed = 0b00111101, insufficient_resources_for_specific_slice_and_dnn = 0b01000011, not_supported_ssc_mode = 0b01000100, insufficient_resources_for_specific_slice = 0b01000101, missing_or_unknown_dnn_in_a_slice = 0b01000110, invalid_pti_value = 0b01010001, maximum_data_rate_per_ue_for_user_plane_integrity_protection_is_too_low = 0b01010010, semantic_error_in_the_qo_s_operation = 0b01010011, syntactical_error_in_the_qo_s_operation = 0b01010100, invalid_mapped_eps_bearer_identity = 0b01010101, semantically_incorrect_message = 0b01011111, invalid_mandatory_information = 0b01100000, message_type_non_existent_or_not_implemented = 0b01100001, message_type_not_compatible_with_the_protocol_state = 0b01100010, information_element_non_existent_or_not_implemented = 0b01100011, conditional_ie_error = 0b01100100, message_not_compatible_with_the_protocol_state = 0b01100101, protocol_error_unspecified = 0b01101111, } value; const char* to_string() const; }; typedef nas_enumerated cause_value_type; cause_value_type cause_value = cause_value_type_::options::operator_determined_barring; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // cause_5gsm_t // IE: GPRS timer // Reference: 9.11.2.3 class gprs_timer_t { public: struct Unit_type_ { enum options { value_is_incremented_in_multiples_of_2_seconds = 0b000, value_is_incremented_in_multiples_of_1_minute = 0b001, value_is_incremented_in_multiples_of_decihours = 0b010, value_indicates_that_the_timer_is_deactivated = 0b111, } value; const char* to_string() const; }; typedef nas_enumerated Unit_type; Unit_type unit; uint8_t timer_value; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // gprs_timer_t // IE: Always-on PDU session indication // Reference: 9.11.4.3 class always_on_pdu_session_indication_t { public: bool apsr = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // always_on_pdu_session_indication_t // IE: Mapped EPS bearer contexts // Reference: 9.11.4.8 class mapped_eps_bearer_contexts_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // mapped_eps_bearer_contexts_t // IE: QoS flow descriptions // Reference: 9.11.4.12 class qo_s_flow_descriptions_t { public: SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // qo_s_flow_descriptions_t // IE: 5GSM network feature support // Reference: 9.11.4.18 class network_feature_support_5gsm_t { public: struct EPT_S1_type_ { enum options { ethernet_pdn_type_in_s1_mode_not_supported = 0b0, ethernet_pdn_type_in_s1_mode_supported = 0b1, } value; const char* to_string() const; }; typedef nas_enumerated EPT_S1_type; EPT_S1_type ept_s1 = EPT_S1_type_::options::ethernet_pdn_type_in_s1_mode_not_supported; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // network_feature_support_5gsm_t // IE: Serving PLMN rate control // Reference: 9.11.4.20 class serving_plmn_rate_control_t { public: uint16_t serving_plmn_rate_control_value; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // serving_plmn_rate_control_t // IE: ATSSS container // Reference: 9.11.4.22 class atsss_container_t { public: std::vector nas_message_container; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // atsss_container_t // IE: Control plane only indication // Reference: 9.11.4.23 class control_plane_only_indication_t { public: bool cpoi = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // control_plane_only_indication_t // IE: Allowed SSC mode // Reference: 9.11.4.5 class allowed_ssc_mode_t { public: bool ssc3 = false; bool ssc2 = false; bool ssc1 = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // allowed_ssc_mode_t // IE: 5GSM congestion re-attempt indicator // Reference: 9.11.4.21 class congestion_re_attempt_indicator_5gsm_t { public: struct abo_type_ { enum options { the_back_off_timer_is_applied_in_the_registered_plmn = 0b0, the_back_off_timer_is_applied_in_all_plm_ns = 0b1, } value; const char* to_string() const; }; typedef nas_enumerated abo_type; abo_type abo = congestion_re_attempt_indicator_5gsm_t::abo_type_::options::the_back_off_timer_is_applied_in_the_registered_plmn; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // congestion_re_attempt_indicator_5gsm_t // IE: Re-attempt indicator // Reference: 9.11.4.17 class re_attempt_indicator_t { public: bool eplmnc = false; bool ratc = false; SRSASN_CODE pack(asn1::bit_ref& bref); SRSASN_CODE unpack(asn1::cbit_ref& bref); }; // re_attempt_indicator_t } // namespace nas_5g } // namespace srsran #endif