mirror of https://github.com/pvnis/srsRAN_4G.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2579 lines
71 KiB
C++
2579 lines
71 KiB
C++
/**
|
|
*
|
|
* \section COPYRIGHT
|
|
*
|
|
* Copyright 2013-2021 Software Radio Systems Limited
|
|
*
|
|
* By using this file, you agree to the terms and conditions set
|
|
* forth in the LICENSE file which can be found at the top level of
|
|
* the distribution.
|
|
*
|
|
*/
|
|
#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 <array>
|
|
#include <stdint.h>
|
|
#include <vector>
|
|
|
|
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();
|
|
};
|
|
typedef nas_enumerated<registration_type_type_, 3> 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();
|
|
};
|
|
typedef nas_enumerated<follow_on_request_bit_type_, 1> 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();
|
|
};
|
|
typedef nas_enumerated<security_context_flag_type_, 1> security_context_flag_type;
|
|
|
|
struct nas_key_set_identifier_type_ {
|
|
enum options {
|
|
no_key_is_available_or_reserved = 0b111,
|
|
|
|
} value;
|
|
const char* to_string();
|
|
};
|
|
typedef nas_enumerated<nas_key_set_identifier_type_, 3> 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();
|
|
};
|
|
typedef nas_enumerated<identity_types_, 3> 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();
|
|
};
|
|
typedef nas_enumerated<supi_format_type_, 3> 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();
|
|
};
|
|
typedef nas_enumerated<protection_scheme_id_type_, 4> protection_scheme_id_type;
|
|
|
|
supi_format_type supi_format = supi_format_type_::options::imsi;
|
|
std::array<uint8_t, 3> mcc;
|
|
std::array<uint8_t, 3> mnc;
|
|
std::array<uint8_t, 4> 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<uint8_t> 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<uint8_t, 3> mcc;
|
|
std::array<uint8_t, 3> 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<uint8_t, 15> 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<uint8_t, 17> 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<uint8_t, 6> 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<uint8_t, 8> 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<suci_s>(&choice_container);
|
|
}
|
|
|
|
guti_5g_s& guti_5g()
|
|
{
|
|
asn1::assert_choice_type(identity_types::guti_5g, type_, "guti_5g");
|
|
return *srslog::detail::any_cast<guti_5g_s>(&choice_container);
|
|
}
|
|
|
|
imei_s& imei()
|
|
{
|
|
asn1::assert_choice_type(identity_types::imei, type_, "imei");
|
|
return *srslog::detail::any_cast<imei_s>(&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<s_tmsi_5g_s>(&choice_container);
|
|
}
|
|
|
|
imeisv_s& imeisv()
|
|
{
|
|
asn1::assert_choice_type(identity_types::imeisv, type_, "imeisv");
|
|
return *srslog::detail::any_cast<imeisv_s>(&choice_container);
|
|
}
|
|
|
|
mac_address_s& mac_address()
|
|
{
|
|
asn1::assert_choice_type(identity_types::mac_address, type_, "mac_address");
|
|
return *srslog::detail::any_cast<mac_address_s>(&choice_container);
|
|
}
|
|
|
|
eui_64_s& eui_64()
|
|
{
|
|
asn1::assert_choice_type(identity_types::eui_64, type_, "eui_64");
|
|
return *srslog::detail::any_cast<eui_64_s>(&choice_container);
|
|
}
|
|
|
|
suci_s& set_suci()
|
|
{
|
|
set(identity_types::suci);
|
|
choice_container = srslog::detail::any{suci_s()};
|
|
return *srslog::detail::any_cast<suci_s>(&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<guti_5g_s>(&choice_container);
|
|
}
|
|
|
|
imei_s& set_imei()
|
|
{
|
|
set(identity_types::imei);
|
|
choice_container = srslog::detail::any{imei_s()};
|
|
return *srslog::detail::any_cast<imei_s>(&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<s_tmsi_5g_s>(&choice_container);
|
|
}
|
|
|
|
imeisv_s& set_imeisv()
|
|
{
|
|
set(identity_types::imeisv);
|
|
choice_container = srslog::detail::any{imeisv_s()};
|
|
return *srslog::detail::any_cast<imeisv_s>(&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<mac_address_s>(&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<eui_64_s>(&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();
|
|
};
|
|
typedef nas_enumerated<SST_type_, 8> 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_t> 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<uint8_t, 3> mcc;
|
|
std::array<uint8_t, 3> 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();
|
|
};
|
|
typedef nas_enumerated<UE_usage_setting_type_, 1> 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();
|
|
};
|
|
typedef nas_enumerated<drx_value_type_, 4> 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<uint8_t> 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:
|
|
uint32_t length;
|
|
std::vector<uint8_t> 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<dnn_t> 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();
|
|
};
|
|
typedef nas_enumerated<Payload_container_type_type_, 4> 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<uint8_t> 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();
|
|
};
|
|
typedef nas_enumerated<SMS_requested_type_, 1> 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();
|
|
};
|
|
typedef nas_enumerated<NG_RAN_RCU_type_, 1> 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();
|
|
};
|
|
typedef nas_enumerated<PNB_5GS_CIoT_type_, 2> 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();
|
|
};
|
|
typedef nas_enumerated<PNB_EPS_CIoT_type_, 2> 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<uint8_t> 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();
|
|
};
|
|
typedef nas_enumerated<Paging_Time_Window_type_, 4> 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();
|
|
};
|
|
typedef nas_enumerated<eDRX_value_type_, 4> 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();
|
|
};
|
|
typedef nas_enumerated<Unit_type_, 3> 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<uint8_t> 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();
|
|
};
|
|
typedef nas_enumerated<nb_n1_mode_drx_value_type_, 4> 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();
|
|
};
|
|
typedef nas_enumerated<Emergency_registered_type_, 1> 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();
|
|
};
|
|
typedef nas_enumerated<NSSAA_to_be_performed_type_, 1> 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();
|
|
};
|
|
typedef nas_enumerated<SMS_allowed_type_, 1> 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();
|
|
};
|
|
typedef nas_enumerated<registration_result_type_, 3> 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();
|
|
};
|
|
typedef nas_enumerated<type_of_list_type_, 2> 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<uint8_t> 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();
|
|
};
|
|
typedef nas_enumerated<NSSAI_inclusion_mode_type_, 2> 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();
|
|
};
|
|
typedef nas_enumerated<Deletion_request_type_, 3> 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();
|
|
};
|
|
typedef nas_enumerated<cause_5gmm_type_, 8> 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();
|
|
};
|
|
typedef nas_enumerated<switch_off_type_, 1> switch_off_type;
|
|
|
|
struct re_registration_required_type_ {
|
|
enum options {
|
|
re_registration_not_required = 0b0,
|
|
re_registration_required = 0b1,
|
|
|
|
} value;
|
|
const char* to_string();
|
|
};
|
|
typedef nas_enumerated<re_registration_required_type_, 1> 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();
|
|
};
|
|
typedef nas_enumerated<access_type_type_, 2> 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();
|
|
};
|
|
typedef nas_enumerated<Service_type_value_type_, 4> 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();
|
|
};
|
|
typedef nas_enumerated<control_plane_service_type_value_type_, 3> 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();
|
|
};
|
|
typedef nas_enumerated<value_type_, 3> 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();
|
|
};
|
|
typedef nas_enumerated<SCMR_type_, 1> 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<uint8_t> 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<uint8_t, 16> 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<uint8_t> 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<uint8_t> 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<uint8_t> 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();
|
|
};
|
|
typedef nas_enumerated<identity_types_, 3> 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();
|
|
};
|
|
typedef nas_enumerated<integrity_protection_algorithm_type_, 4> 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();
|
|
};
|
|
typedef nas_enumerated<ciphering_algorithm_type_, 4> 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();
|
|
};
|
|
typedef nas_enumerated<imeisv_request_type_, 3> 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();
|
|
};
|
|
typedef nas_enumerated<integrity_protection_algorithm_type_, 3> 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();
|
|
};
|
|
typedef nas_enumerated<ciphering_algorithm_type_, 3> 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();
|
|
};
|
|
typedef nas_enumerated<Access_type_value_type_, 2> 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();
|
|
};
|
|
typedef nas_enumerated<Request_type_value_type_, 3> 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<uint8_t> 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();
|
|
};
|
|
typedef nas_enumerated<MA_PDU_session_information_value_type_, 4> 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();
|
|
};
|
|
typedef nas_enumerated<Downlink_data_expected_type_, 2> 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();
|
|
};
|
|
typedef nas_enumerated<max_data_rate_UPIP_uplink_type_, 8> 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();
|
|
};
|
|
typedef nas_enumerated<max_data_rate_UPIP_downlink_type_, 8> 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();
|
|
};
|
|
typedef nas_enumerated<PDU_session_type_value_type_, 3> 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();
|
|
};
|
|
typedef nas_enumerated<SSC_mode_value_type_, 3> 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<uint8_t> 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<uint8_t, 6> 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<uint8_t, 8> 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<uint8_t> 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();
|
|
};
|
|
typedef nas_enumerated<CID_Length_type_, 2> 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();
|
|
};
|
|
typedef nas_enumerated<PDU_session_type_value_type_, 3> 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<uint8_t, 4> ipv4;
|
|
std::array<uint8_t, 8> ipv6;
|
|
std::array<uint8_t, 8> 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_rule_t> 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();
|
|
};
|
|
typedef nas_enumerated<unit_session_AMBR_type_, 8> 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();
|
|
};
|
|
typedef nas_enumerated<cause_value_type_, 8> 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();
|
|
};
|
|
typedef nas_enumerated<Unit_type_, 3> 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();
|
|
};
|
|
typedef nas_enumerated<EPT_S1_type_, 1> 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<uint8_t> 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();
|
|
};
|
|
typedef nas_enumerated<abo_type_, 1> 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
|