//
// This file is a part of UERANSIM project.
// Copyright (c) 2023 ALİ GÜNGÖR.
//
// https://github.com/aligungr/UERANSIM/
// See README, LICENSE, and CONTRIBUTING files for licensing details.
//

#pragma once

#include <utils/json.hpp>

namespace nas
{

enum class EConfigurationProtocol
{
    PPP = 0b000
};

enum class EEpcNasSupported
{
    NOT_SUPPORTED = 0b0,
    SUPPORTED = 0b1
};

enum class EExtendedProtocolDiscriminator
{
    MOBILITY_MANAGEMENT_MESSAGES = 0b01111110,
    SESSION_MANAGEMENT_MESSAGES = 0b00101110,
};

enum class EFollowOnRequest
{
    NO_FOR_PENDING = 0b0,
    FOR_PENDING = 0b1,
};

enum class EHandoverAttachSupported
{
    NOT_SUPPORTED = 0b0,
    SUPPORTED = 0b1
};

enum class EIdentityType
{
    NO_IDENTITY = 0b000,
    SUCI = 0b001,
    GUTI = 0b010,
    IMEI = 0b011,
    TMSI = 0b100,
    IMEISV = 0b101,
};

enum class EKeyAmfChangeFlag
{
    CALCULATED = 0b0,
    NOT_CALCULATED = 0b1,
};

enum class ELtePositioningProtocolCapability
{
    NOT_SUPPORTED = 0b0,
    SUPPORTED = 0b1,
};

enum class EMessageType
{
    REGISTRATION_REQUEST = 0b01000001,
    REGISTRATION_ACCEPT = 0b01000010,
    REGISTRATION_COMPLETE = 0b01000011,
    REGISTRATION_REJECT = 0b01000100,
    DEREGISTRATION_REQUEST_UE_ORIGINATING = 0b01000101,
    DEREGISTRATION_ACCEPT_UE_ORIGINATING = 0b01000110,
    DEREGISTRATION_REQUEST_UE_TERMINATED = 0b01000111,
    DEREGISTRATION_ACCEPT_UE_TERMINATED = 0b01001000,

    SERVICE_REQUEST = 0b01001100,
    SERVICE_REJECT = 0b01001101,
    SERVICE_ACCEPT = 0b01001110,

    CONFIGURATION_UPDATE_COMMAND = 0b01010100,
    CONFIGURATION_UPDATE_COMPLETE = 0b01010101,
    AUTHENTICATION_REQUEST = 0b01010110,
    AUTHENTICATION_RESPONSE = 0b01010111,
    AUTHENTICATION_REJECT = 0b01011000,
    AUTHENTICATION_FAILURE = 0b01011001,
    AUTHENTICATION_RESULT = 0b01011010,
    IDENTITY_REQUEST = 0b01011011,
    IDENTITY_RESPONSE = 0b01011100,
    SECURITY_MODE_COMMAND = 0b01011101,
    SECURITY_MODE_COMPLETE = 0b01011110,
    SECURITY_MODE_REJECT = 0b01011111,

    FIVEG_MM_STATUS = 0b01100100,
    NOTIFICATION = 0b01100101,
    NOTIFICATION_RESPONSE = 0b01100110,
    UL_NAS_TRANSPORT = 0b01100111,
    DL_NAS_TRANSPORT = 0b01101000,

    PDU_SESSION_ESTABLISHMENT_REQUEST = 0b11000001,
    PDU_SESSION_ESTABLISHMENT_ACCEPT = 0b11000010,
    PDU_SESSION_ESTABLISHMENT_REJECT = 0b11000011,

    PDU_SESSION_AUTHENTICATION_COMMAND = 0b11000101,
    PDU_SESSION_AUTHENTICATION_COMPLETE = 0b11000110,
    PDU_SESSION_AUTHENTICATION_RESULT = 0b11000111,

    PDU_SESSION_MODIFICATION_REQUEST = 0b11001001,
    PDU_SESSION_MODIFICATION_REJECT = 0b11001010,
    PDU_SESSION_MODIFICATION_COMMAND = 0b11001011,
    PDU_SESSION_MODIFICATION_COMPLETE = 0b11001100,
    PDU_SESSION_MODIFICATION_COMMAND_REJECT = 0b11001101,

    PDU_SESSION_RELEASE_REQUEST = 0b11010001,
    PDU_SESSION_RELEASE_REJECT = 0b11010010,
    PDU_SESSION_RELEASE_COMMAND = 0b11010011,
    PDU_SESSION_RELEASE_COMPLETE = 0b11010100,

    FIVEG_SM_STATUS = 0b11010110,
};

enum class EMmCause
{
    ILLEGAL_UE = 0b00000011,
    PEI_NOT_ACCEPTED = 0b00000101,
    ILLEGAL_ME = 0b00000110,
    FIVEG_SERVICES_NOT_ALLOWED = 0b00000111,
    UE_IDENTITY_CANNOT_BE_DERIVED_FROM_NETWORK = 0b00001001,
    IMPLICITY_DEREGISTERED = 0b00001010,
    PLMN_NOT_ALLOWED = 0b00001011,
    TA_NOT_ALLOWED = 0b00001100,
    ROAMING_NOT_ALLOWED_IN_TA = 0b00001101,
    NO_SUITIBLE_CELLS_IN_TA = 0b00001111,
    MAC_FAILURE = 0b00010100,
    SYNCH_FAILURE = 0b00010101,
    CONGESTION = 0b00010110,
    UE_SECURITY_CAP_MISMATCH = 0b00010111,
    SEC_MODE_REJECTED_UNSPECIFIED = 0b00011000,
    NON_5G_AUTHENTICATION_UNACCEPTABLE = 0b00011010,
    N1_MODE_NOT_ALLOWED = 0b00011011,
    RESTRICTED_SERVICE_AREA = 0b00011100,
    LADN_NOT_AVAILABLE = 0b00101011,
    MAX_PDU_SESSIONS_REACHED = 0b01000001,
    INSUFFICIENT_RESOURCES_FOR_SLICE_AND_DNN = 0b01000011,
    INSUFFICIENT_RESOURCES_FOR_SLICE = 0b01000101,
    NGKSI_ALREADY_IN_USE = 0b01000111,
    NON_3GPP_ACCESS_TO_CN_NOT_ALLOWED = 0b01001000,
    SERVING_NETWORK_NOT_AUTHORIZED = 0b01001001,
    PAYLOAD_NOT_FORWARDED = 0b01011010,
    DNN_NOT_SUPPORTED_OR_NOT_SUBSCRIBED = 0b01011011,
    INSUFFICIENT_USER_PLANE_RESOURCES = 0b01011100,
    SEMANTICALLY_INCORRECT_MESSAGE = 0b01011111,
    INVALID_MANDATORY_INFORMATION = 0b01100000,
    MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED = 0b01100001,
    MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE = 0b01100010,
    INFORMATION_ELEMENT_NON_EXISTENT_OR_NOT_IMPLEMENTED = 0b01100011,
    CONDITIONAL_IE_ERROR = 0b01100100,
    MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE = 0b01100101,
    UNSPECIFIED_PROTOCOL_ERROR = 0b01101111,
};

enum class EPduSessionIdentity
{
    NO_VAL = 0b00000000,
    VAL_1 = 0b00000001,
    VAL_2 = 0b00000010,
    VAL_3 = 0b00000011,
    VAL_4 = 0b00000100,
    VAL_5 = 0b00000101,
    VAL_6 = 0b00000110,
    VAL_7 = 0b00000111,
    VAL_8 = 0b00001000,
    VAL_9 = 0b00001001,
    VAL_10 = 0b00001010,
    VAL_11 = 0b00001011,
    VAL_12 = 0b00001100,
    VAL_13 = 0b00001101,
    VAL_14 = 0b00001110,
    VAL_15 = 0b00001111,
};

enum class EPduSessionType
{
    IPV4 = 0b001,
    IPV6 = 0b010,
    IPV4V6 = 0b011,
    UNSTRUCTURED = 0b100,
    ETHERNET = 0b101,
};

enum class ERegistrationType
{
    INITIAL_REGISTRATION = 0b001,
    MOBILITY_REGISTRATION_UPDATING = 0b010,
    PERIODIC_REGISTRATION_UPDATING = 0b011,
    EMERGENCY_REGISTRATION = 0b100,
};

enum class ESecurityHeaderType
{
    NOT_PROTECTED = 0b0000,
    INTEGRITY_PROTECTED = 0b0001,
    INTEGRITY_PROTECTED_AND_CIPHERED = 0b0010,
    INTEGRITY_PROTECTED_WITH_NEW_SECURITY_CONTEXT = 0b0011,
    INTEGRITY_PROTECTED_AND_CIPHERED_WITH_NEW_SECURITY_CONTEXT = 0b0100,
};

enum class ESmCause
{
    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_TEMPORARILY_OUT_OF_ORDER = 0b00100010,
    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_FILTERS = 0b00101100,
    SYNTACTICAL_ERROR_IN_PACKET_FILTERS = 0b00101101,
    OUT_OF_LADN_SERVICE_AREA = 0b00101110,
    PTI_MISMATCH = 0b00101111,
    PDU_SESSION_TYPE_IPV4_ONLY_ALLOWED = 0b00110010,
    PDU_SESSION_TYPE_IPV6_ONLY_ALLOWED = 0b00110011,
    PDU_SESSION_DOES_NOT_EXIST = 0b00110110,
    PDU_SESSION_TYPE_IPV4V6_ONLY_ALLOWED = 0b00111001,
    PDU_SESSION_TYPE_UNSTRUCTURED_ONLY_ALLOWED = 0b00111010,
    UNSUPPORTED_5QI_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_QOS_OPERATION = 0b01010011,
    SYNTACTICAL_ERROR_IN_THE_QOS_OPERATION = 0b01010100,
    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,
};

enum class ESupiFormat
{
    IMSI = 0b000,
    NETWORK_SPECIFIC_IDENTIFIER = 0b001,
};

enum class ETypeOfCipheringAlgorithm
{
    EA0 = 0b0000,
    EA1_128 = 0b0001,
    EA2_128 = 0b0010,
    EA3_128 = 0b0011,
    EA4 = 0b0100,
    EA5 = 0b0101,
    EA6 = 0b0110,
    EA7 = 0b0111,
};

enum class ETypeOfIntegrityProtectionAlgorithm
{
    IA0 = 0b0000,
    IA1_128 = 0b0001,
    IA2_128 = 0b0010,
    IA3_128 = 0b0011,
    IA4 = 0b0100,
    IA5 = 0b0101,
    IA6 = 0b0110,
    IA7 = 0b0111,
};

enum class ETypeOfSecurityContext
{
    NATIVE_SECURITY_CONTEXT = 0b0,
    MAPPED_SECURITY_CONTEXT = 0b1,
};

enum class EDrxValue
{
    NOT_SPECIFIED = 0b0000,
    T32 = 0b0001,
    T64 = 0b0010,
    T128 = 0b0011,
    T256 = 0b0100,
};

enum class EMultiHomedIPv6PduSession
{
    NOT_SUPPORTED = 0b0,
    SUPPORTED = 0b1,
};

enum class EReflectiveQoS
{
    NOT_SUPPORTED = 0b0,
    SUPPORTED = 0b1,
};

enum class EEmergencyServiceFallback3gppIndicator
{
    NOT_SUPPORTED = 0b00,
    SUPPORTED_IN_NR_CONNECTED_TO_5GCN_ONLY = 0b01,
    SUPPORTED_IN_EUTRA_CONNTECTED_TO_5GCN_ONLY = 0b10,
    SUPPORTED_IN_NR_CONNTECTED_TO_5GCN_AND_EUTRA_CONNECTED_TO_5GCN = 0b11,
};

enum class EEmergencyServiceSupport3gppIndicator
{
    NOT_SUPPORTED = 0b00,
    SUPPORTED_IN_NR_CONNECTED_TO_5GCN_ONLY = 0b01,
    SUPPORTED_IN_EUTRA_CONNTECTED_TO_5GCN_ONLY = 0b10,
    SUPPORTED_IN_NR_CONNTECTED_TO_5GCN_AND_EUTRA_CONNECTED_TO_5GCN = 0b11,
};

enum class EEmergencyServiceSupportNon3gppIndicator
{
    NOT_SUPPORTED = 0b0,
    SUPPORTED = 0b1,
};

enum class EInterworkingWithoutN26InterfaceIndicator
{
    NOT_SUPPORTED = 0b0,
    SUPPORTED = 0b1,
};

enum class EMpsIndicator
{
    NOT_SUPPORTED = 0b0,
    SUPPORTED = 0b1,
};

enum class EImsVoPs3gpp
{
    NOT_SUPPORTED = 0b0,
    SUPPORTED = 0b1,
};

enum class EImsVoPsN3gpp
{
    NOT_SUPPORTED = 0b0,
    SUPPORTED = 0b1,
};

enum class EMcsIndicator
{
    NOT_VALID = 0b0,
    VALID = 0b1,
};

enum class ESmsOverNasTransportAllowed
{
    NOT_ALLOWED = 0b0,
    ALLOWED = 0b1,
};

enum class E5gsRegistrationResult
{
    THREEGPP_ACCESS = 0b001,
    NON_THREEGPP_ACCESS = 0b010,
    THREEGPP_ACCESS_AND_NON_THREEGPP_ACCESS = 0b011,
};

enum class ENgRanRadioCapabilityUpdate
{
    NOT_NEEDED = 0b0,
    NEEDED = 0b1,
};

enum class ESmsRequested
{
    NOT_SUPPORTED = 0b0,
    SUPPORTED = 0b1,
};

enum class EAccessType
{
    THREEGPP_ACCESS = 0b01,
    NON_THREEGPP_ACCESS = 0b10,
};

enum class ERetransmissionOfInitialNasMessageRequest
{
    NOT_REQUESTED = 0b0,
    REQUESTED = 0b1,
};

enum class EHorizontalDerivationParameter
{
    NOT_REQUIRED = 0b0,
    REQUIRED = 0b1,
};

enum class ESsc1
{
    NOT_ALLOWED = 0b0,
    ALLOWED = 0b1,
};

enum class ESsc2
{
    NOT_ALLOWED = 0b0,
    ALLOWED = 0b1,
};

enum class ESsc3
{
    NOT_ALLOWED = 0b0,
    ALLOWED = 0b1,
};

enum class EAlwaysOnPduSessionIndication
{
    NOT_ALLOWED = 0b0,
    REQUIRED = 0b1,
};

enum class EAlwaysOnPduSessionRequested
{
    NOT_REQUESTED = 0b0,
    REQUESTED = 0b1,
};

enum class ERegistrationRequested
{
    NOT_REQUESTED = 0b0,
    REQUESTED = 0b1,
};

enum class EDaylightSavingTime
{
    NO_ADJUSTMENT = 0b00,
    PLUS_ONE = 0b01,
    PLUS_TWO = 0b10,
};

enum class ESwitchOff
{
    NORMAL_DE_REGISTRATION = 0b0,
    SWITCH_OFF = 0b1,
};

enum class EDeRegistrationAccessType
{
    THREEGPP_ACCESS = 0b01,
    NON_THREEGPP_ACCESS = 0b10,
    THREEGPP_ACCESS_AND_NON_THREEGPP_ACCESS = 0b11,
};

enum class EReRegistrationRequired
{
    NOT_REQUIRED = 0b0,
    REQUIRED = 0b1,
};

enum class EEpsTypeOfCipheringAlgorithm
{
    EEA0 = 0b000,
    EEA1_128 = 0b001,
    EEA2_128 = 0b010,
    EEA3_128 = 0b011,
    EEA4 = 0b100,
    EEA5 = 0b101,
    EEA6 = 0b110,
    EEA7 = 0b111,
};

enum class EEpsTypeOfIntegrityProtectionAlgorithm
{
    EIA0 = 0b000,
    EIA1_128 = 0b001,
    EIA2_128 = 0b010,
    EIA3_128 = 0b011,
    EIA4 = 0b100,
    EIA5 = 0b101,
    EIA6 = 0b110,
    EIA7 = 0b111,
};

enum class EGprsTimerValueUnit
{
    MULTIPLES_OF_2_SECONDS = 0b000,
    MULTIPLES_OF_1_MINUTE = 0b001,
    MULTIPLES_OF_DECIHOURS = 0b010,
    TIMER_IS_DEACTIVATED = 0b111,
};

enum class EGprsTimerValueUnit3
{
    MULTIPLES_OF_10MIN = 0b000,
    MULTIPLES_OF_1HOUR = 0b001,
    MULTIPLES_OF_10HOUR = 0b010,
    MULTIPLES_OF_2SEC = 0b011,
    MULTIPLES_OF_30SEC = 0b100,
    MULTIPLES_OF_1MIN = 0b101,
    MULTIPLES_OF_320HOUR = 0b110,
    DEACTIVATED = 0b111,
};

enum class EImeiSvRequest
{
    NOT_REQUESTED = 0b000,
    REQUESTED = 0b001,
};

enum class EProtectionSchemeIdentifier
{
    NULL_SCHEME = 0b0000,
    ECIES_SCHEME_PROFILE_A = 0b0001,
    ECIES_SCHEME_PROFILE_B = 0b0010,

    OPERATOR_SPECIFIC1 = 0b1100,
    OPERATOR_SPECIFIC2 = 0b1101,
    OPERATOR_SPECIFIC3 = 0b1110,
    OPERATOR_SPECIFIC4 = 0b1111,
};

enum class EMaximumDataRatePerUeForUserPlaneIntegrityProtectionForDownlink
{
    SIXTY_FOUR_KBPS = 0b00000000,
    FULL_DATA_RATE = 0b11111111,
};

enum class EMaximumDataRatePerUeForUserPlaneIntegrityProtectionForUplink
{
    SIXTY_FOUR_KBPS = 0b00000000,
    FULL_DATA_RATE = 0b11111111,
};

enum class EEpsBearerIdentity
{
    NO_VALUE = 0b0000,
    VAL_1 = 0b0001,
    VAL_2 = 0b0010,
    VAL_3 = 0b0011,
    VAL_4 = 0b0100,
    VAL_5 = 0b0101,
    VAL_6 = 0b0110,
    VAL_7 = 0b0111,
    VAL_8 = 0b1000,
    VAL_9 = 0b1001,
    VAL_10 = 0b1010,
    VAL_11 = 0b1011,
    VAL_12 = 0b1100,
    VAL_13 = 0b1101,
    VAL_14 = 0b1110,
    VAL_15 = 0b1111,
};

enum class EOperationCode
{
    CREATE_NEW_EPS_BEARER = 0b01,
    DELETE_EXISTING_EPS_BEARER = 0b10,
    MODIFY_EXISTING_EPS_BEARER = 0b11,
};

enum class EEbit
{
    NOT_INCLUDED_OR_EXTENSION = 0b0,
    INCLUDED_OR_REPLACEMENT = 0b1,
};

enum class ERegistrationAreaAllocationIndication
{
    NOT_ALLOCATED = 0b0,
    ALLOCATED = 0b1,
};

enum class EAddCountryInitials
{
    SHOULD_NOT_ADD = 0b0,
    SHOULD_ADD = 0b1,
};

enum class ECodingScheme
{
    DEFAULT = 0b000,
    UCS2 = 0b001,
};

enum class ENetworkSlicingSubscriptionChangeIndication
{
    NOT_CHANGED = 0b0,
    CHANGED = 0b1,
};

enum class EDefaultConfiguredNssaiIndication
{
    NOT_CREATED_FROM_DEFAULT_CONFIGURED_NSSAI = 0b0,
    CREATED_FROM_DEFAULT_CONFIGURED_NSSAI = 0b1,
};

enum class ENssaiInclusionMode
{
    A = 0b00,
    B = 0b01,
    C = 0b10,
    D = 0b11,
};

enum class EPresenceOfStandardizedAccessCategory
{
    NOT_INCLUDED = 0b0,
    INCLUDED = 0b1,
};

enum class EPayloadContainerType
{
    N1_SM_INFORMATION = 0b0001,
    SMS = 0b0010,
    LPP_MESSAGE = 0b0011,
    SOR_TRANSPARENT_CONTAINER = 0b0100,
    UE_POLICY_CONTAINER = 0b0101,
    UE_PARAMETERS_UPDATE_TRANSPARENT_CONTAINER = 0b0110,
    MULTIPLE_PAYLOADS = 0b1111,
};

enum class ERejectedSNssaiCause
{
    NA_IN_PLMN = 0b0,
    NA_IN_RA = 0b1,
};

enum class ERequestType
{
    INITIAL_REQUEST = 0b001,
    EXISTING_PDU_SESSION = 0b010,
    INITIAL_EMERGENCY_REQUEST = 0b011,
    EXISTING_EMERGENCY_PDU_SESSION = 0b100,
    MODIFICATION_REQUEST = 0b101,
};

enum class EAllowedType
{
    IN_THE_ALLOWED_AREA = 0b0,
    IN_THE_NON_ALLOWED_AREA = 0b1,
};

enum class EServiceType
{
    SIGNALLING = 0b0000,
    DATA = 0b0001,
    MOBILE_TERMINATED_SERVICES = 0b0010,
    EMERGENCY_SERVICES = 0b0011,
    EMERGENCY_SERVICES_FALLBACK = 0b0100,
    HIGH_PRIORITY_ACCESS = 0b0101,
    ELEVATED_SIGNALLING = 0b0110,
    UNUSED_SIGNALLING_1 = 0b0110,
    UNUSED_SIGNALLING_2 = 0b0111,
    UNUSED_SIGNALLING_3 = 0b1000,
    UNUSED_DATA_1 = 0b1001,
    UNUSED_DATA_2 = 0b1010,
    UNUSED_DATA_3 = 0b1011,
};

enum class EUnitForSessionAmbr
{
    VALUE_NOT_USED = 0b00000000,
    MULT_1Kbps = 0b00000001,
    MULT_4Kbps = 0b00000010,
    MULT_16Kbps = 0b00000011,
    MULT_64Kbps = 0b00000100,
    MULT_256kbps = 0b00000101,
    MULT_1Mbps = 0b00000110,
    MULT_4Mbps = 0b00000111,
    MULT_16Mbps = 0b00001000,
    MULT_64Mbps = 0b00001001,
    MULT_256Mbps = 0b00001010,
    MULT_1Gbps = 0b00001011,
    MULT_4Gbps = 0b00001100,
    MULT_16Gbps = 0b00001101,
    MULT_64Gbps = 0b00001110,
    MULT_256Gbps = 0b00001111,
    MULT_1Tbps = 0b00010000,
    MULT_4Tbps = 0b00010001,
    MULT_16Tbps = 0b00010010,
    MULT_64Tbps = 0b00010011,
    MULT_256Tbps = 0b00010100,
    MULT_1Pbps = 0b00010101,
    MULT_4Pbps = 0b00010110,
    MULT_16Pbps = 0b00010111,
    MULT_64Pbps = 0b00011000,
    MULT_256Pbps = 0b00011001,
};

enum class ESmsAvailabilityIndication
{
    NOT_AVAILABLE = 0b0,
    AVAILABLE = 0b1,
};

enum class ESorDataType
{
    STEERING_OF_ROAMING_INFORMATION = 0b0,
    ACKNOWLEDGEMENT = 0b1,
};

enum class ESorListIndication
{
    NOT_PROVIDED = 0b0,
    PROVIDED = 0b1,
};

enum class ESorListType
{
    SECURED_PACKET = 0b0,
    PLMN_ID_AND_ACCESS_TECH = 0b1,
};

enum class EAcknowledgement
{
    NOT_REQUESTED = 0b0,
    REQUESTED = 0b1,
};

enum class ESscMode
{
    SSC_MODE_1 = 0b001,
    SSC_MODE_2 = 0b010,
    SSC_MODE_3 = 0b011,
    UNUSED_1 = 0b100,
    UNUSED_2 = 0b101,
    UNUSED_3 = 0b110,
};

enum class E5gMmRegistrationStatus
{
    NOT_REGISTERED = 0b0,
    REGISTERED = 0b1,
};

enum class EEmmRegistrationStatus
{
    NOT_REGISTERED = 0b0,
    REGISTERED = 0b1,
};

enum class EUesUsageSetting
{
    VOICE_CENTRIC = 0b0,
    DATA_CENTRIC = 0b1,
};

enum class EQoSOperationCode
{
    CREATE_NEW = 0b001,
    DELETE_EXISTING = 0b010,
    MODIFY_EXISTING = 0b011,
};

Json ToJson(const EPduSessionType &v);

} // namespace nas
