/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.hardware.radio@1.0;

enum RadioConst : int32_t {
    CDMA_ALPHA_INFO_BUFFER_LENGTH = 64,
    CDMA_NUMBER_INFO_BUFFER_LENGTH = 81,
    MAX_RILDS = 3,
    MAX_SOCKET_NAME_LENGTH = 6,
    MAX_CLIENT_ID_LENGTH = 2,
    MAX_DEBUG_SOCKET_NAME_LENGTH = 12,
    MAX_QEMU_PIPE_NAME_LENGTH = 11,
    MAX_UUID_LENGTH = 64,
    CARD_MAX_APPS = 8,
    CDMA_MAX_NUMBER_OF_INFO_RECS = 10,
    SS_INFO_MAX = 4,
    NUM_SERVICE_CLASSES = 7,
    NUM_TX_POWER_LEVELS = 5,
};

enum RadioCdmaSmsConst : int32_t {
    ADDRESS_MAX = 36,
    SUBADDRESS_MAX = 36,
    BEARER_DATA_MAX = 255,
    UDH_MAX_SND_SIZE = 128,
    UDH_EO_DATA_SEGMENT_MAX = 131,
    MAX_UD_HEADERS = 7,
    USER_DATA_MAX = 229,
    UDH_LARGE_PIC_SIZE = 128,
    UDH_SMALL_PIC_SIZE = 32,
    UDH_VAR_PIC_SIZE = 134,
    UDH_ANIM_NUM_BITMAPS = 4,
    UDH_LARGE_BITMAP_SIZE = 32,
    UDH_SMALL_BITMAP_SIZE = 8,
    UDH_OTHER_SIZE = 226,
    IP_ADDRESS_SIZE = 4,
};

enum RadioError : int32_t {
    NONE = 0,                             // Success
    RADIO_NOT_AVAILABLE = 1,              // If radio did not start or is resetting
    GENERIC_FAILURE = 2,
    PASSWORD_INCORRECT = 3,               // for PIN/PIN2 methods only
    SIM_PIN2 = 4,                         // Operation requires SIM PIN2 to be entered
    SIM_PUK2 = 5,                         // Operation requires SIM PIN2 to be entered
    REQUEST_NOT_SUPPORTED = 6,
    CANCELLED = 7,
    OP_NOT_ALLOWED_DURING_VOICE_CALL = 8, // data ops are not allowed during voice
                                          // call on a Class C GPRS device
    OP_NOT_ALLOWED_BEFORE_REG_TO_NW = 9,  // data ops are not allowed before device
                                          // registers in network
    SMS_SEND_FAIL_RETRY = 10,             // fail to send sms and need retry
    SIM_ABSENT = 11,                      // fail to set the location where CDMA subscription
                                          // shall be retrieved because of SIM or RUIM
                                          // card absent
    SUBSCRIPTION_NOT_AVAILABLE = 12,      // fail to find CDMA subscription from specified
                                          // location
    MODE_NOT_SUPPORTED = 13,              // HW does not support preferred network type
    FDN_CHECK_FAILURE = 14,               // command failed because recipient is not on FDN list
    ILLEGAL_SIM_OR_ME = 15,               // network selection failed due to illegal SIM or ME
    MISSING_RESOURCE = 16,                // no logical channel available
    NO_SUCH_ELEMENT = 17,                 // application not found on SIM
    DIAL_MODIFIED_TO_USSD = 18,           // DIAL request modified to USSD
    DIAL_MODIFIED_TO_SS = 19,             // DIAL request modified to SS
    DIAL_MODIFIED_TO_DIAL = 20,           // DIAL request modified to DIAL with different data
    USSD_MODIFIED_TO_DIAL = 21,           // USSD request modified to DIAL
    USSD_MODIFIED_TO_SS = 22,             // USSD request modified to SS
    USSD_MODIFIED_TO_USSD = 23,           // USSD request modified to different USSD request
    SS_MODIFIED_TO_DIAL = 24,             // SS request modified to DIAL
    SS_MODIFIED_TO_USSD = 25,             // SS request modified to USSD
    SUBSCRIPTION_NOT_SUPPORTED = 26,      // Subscription not supported by RIL
    SS_MODIFIED_TO_SS = 27,               // SS request modified to different SS request
    LCE_NOT_SUPPORTED = 36,               // LCE service not supported(36 in RILConstants.java)
    NO_MEMORY = 37,                       // Not sufficient memory to process the request
    INTERNAL_ERR = 38,                    // Modem hit unexpected error scenario while handling
                                          // this request
    SYSTEM_ERR = 39,                      // Hit platform or system error
    MODEM_ERR = 40,                       // Vendor RIL got unexpected or incorrect response
                                          // from modem for this request
    INVALID_STATE = 41,                   // Unexpected request for the current state
    NO_RESOURCES = 42,                    // Not sufficient resource to process the request
    SIM_ERR = 43,                         // Received error from SIM card
    INVALID_ARGUMENTS = 44,               // Received invalid arguments in request
    INVALID_SIM_STATE = 45,               // Cannot process the request in current SIM state
    INVALID_MODEM_STATE = 46,             // Cannot process the request in current Modem state
    INVALID_CALL_ID = 47,                 // Received invalid call id in request
    NO_SMS_TO_ACK = 48,                   // ACK received when there is no SMS to ack
    NETWORK_ERR = 49,                     // Received error from network
    REQUEST_RATE_LIMITED = 50,            // Operation denied due to overly-frequent requests
    SIM_BUSY = 51,                        // SIM is busy
    SIM_FULL = 52,                        // The target EF is full
    NETWORK_REJECT = 53,                  // Request is rejected by network
    OPERATION_NOT_ALLOWED = 54,           // Not allowed the request now
    EMPTY_RECORD = 55,                    // The request record is empty
    INVALID_SMS_FORMAT = 56,              // Invalid sms format
    ENCODING_ERR = 57,                    // Message not encoded properly
    INVALID_SMSC_ADDRESS = 58,            // SMSC address specified is invalid
    NO_SUCH_ENTRY = 59,                   // No such entry present to perform the request
    NETWORK_NOT_READY = 60,               // Network is not ready to perform the request
    NOT_PROVISIONED = 61,                 // Device does not have this value provisioned
    NO_SUBSCRIPTION = 62,                 // Device does not have subscription
    NO_NETWORK_FOUND = 63,                // Network cannot be found
    DEVICE_IN_USE = 64,                   // Operation cannot be performed because the device
                                          // is currently in use
    ABORTED = 65,                         // Operation aborted
    INVALID_RESPONSE = 66,                // Response from vendor had invalid data

    OEM_ERROR_1 = 501,
    OEM_ERROR_2 = 502,
    OEM_ERROR_3 = 503,
    OEM_ERROR_4 = 504,
    OEM_ERROR_5 = 505,
    OEM_ERROR_6 = 506,
    OEM_ERROR_7 = 507,
    OEM_ERROR_8 = 508,
    OEM_ERROR_9 = 509,
    OEM_ERROR_10 = 510,
    OEM_ERROR_11 = 511,
    OEM_ERROR_12 = 512,
    OEM_ERROR_13 = 513,
    OEM_ERROR_14 = 514,
    OEM_ERROR_15 = 515,
    OEM_ERROR_16 = 516,
    OEM_ERROR_17 = 517,
    OEM_ERROR_18 = 518,
    OEM_ERROR_19 = 519,
    OEM_ERROR_20 = 520,
    OEM_ERROR_21 = 521,
    OEM_ERROR_22 = 522,
    OEM_ERROR_23 = 523,
    OEM_ERROR_24 = 524,
    OEM_ERROR_25 = 525,
};

enum RadioResponseType : int32_t {
    SOLICITED,
    SOLICITED_ACK,
    SOLICITED_ACK_EXP,
};

enum RadioIndicationType : int32_t {
    UNSOLICITED,
    UNSOLICITED_ACK_EXP,
};

enum RestrictedState : int32_t {
    NONE = 0x00,
    CS_EMERGENCY = 0x01,
    CS_NORMAL = 0x02,
    CS_ALL = 0x04,
    PS_ALL = 0x10,
};

enum CardState : int32_t {
    /* card is physically absent from device. (Some old modems use CardState.ABSENT when the SIM
       is powered off. This is no longer correct, however the platform will still support this
       legacy behavior.) */
    ABSENT,
    /* card is inserted in the device */
    PRESENT,
    ERROR,
    /* card is present but not usable due to carrier restrictions */
    RESTRICTED,
};

enum PinState : int32_t {
    UNKNOWN,
    ENABLED_NOT_VERIFIED,
    ENABLED_VERIFIED,
    DISABLED,
    ENABLED_BLOCKED,
    ENABLED_PERM_BLOCKED,
};

enum AppType : int32_t {
    UNKNOWN,
    SIM,
    USIM,
    RUIM,
    CSIM,
    ISIM,
};

enum AppState : int32_t {
    UNKNOWN,
    DETECTED,
    PIN,                                  // If PIN1 or UPin is required
    PUK,                                  // If PUK1 or Puk for UPin is required
    SUBSCRIPTION_PERSO,                   // perso_substate must be look at when app_state is
                                          // assigned to this value
    READY,
};

enum PersoSubstate : int32_t {
    UNKNOWN,                              // initial state
    IN_PROGRESS,                          // in between each lock transition
    READY,                                // when either SIM or RUIM Perso is finished since each
                                          // app must only have 1 active perso involved
    SIM_NETWORK,
    SIM_NETWORK_SUBSET,
    SIM_CORPORATE,
    SIM_SERVICE_PROVIDER,
    SIM_SIM,
    SIM_NETWORK_PUK,                      // The corresponding perso lock is blocked
    SIM_NETWORK_SUBSET_PUK,
    SIM_CORPORATE_PUK,
    SIM_SERVICE_PROVIDER_PUK,
    SIM_SIM_PUK,
    RUIM_NETWORK1,
    RUIM_NETWORK2,
    RUIM_HRPD,
    RUIM_CORPORATE,
    RUIM_SERVICE_PROVIDER,
    RUIM_RUIM,
    RUIM_NETWORK1_PUK,                    // The corresponding perso lock is blocked
    RUIM_NETWORK2_PUK,
    RUIM_HRPD_PUK,
    RUIM_CORPORATE_PUK,
    RUIM_SERVICE_PROVIDER_PUK,
    RUIM_RUIM_PUK,
};

enum RadioState : int32_t {
    OFF = 0,                              // Radio explicitly powered off (eg CFUN=0)
    UNAVAILABLE = 1,                      // Radio unavailable (eg, resetting or not booted)
    ON = 10,                              // Radio is ON
};

enum SapConnectRsp : int32_t {
    SUCCESS,
    CONNECT_FAILURE,
    MSG_SIZE_TOO_LARGE,
    MSG_SIZE_TOO_SMALL,
    CONNECT_OK_CALL_ONGOING,
};

enum SapDisconnectType : int32_t {
    GRACEFUL,
    IMMEDIATE,
};

enum SapApduType : int32_t {
    APDU,
    APDU7816,
};

enum SapResultCode : int32_t {
    SUCCESS,
    GENERIC_FAILURE,
    CARD_NOT_ACCESSSIBLE,
    CARD_ALREADY_POWERED_OFF,
    CARD_REMOVED,
    CARD_ALREADY_POWERED_ON,
    DATA_NOT_AVAILABLE,
    NOT_SUPPORTED,
};

enum SapStatus : int32_t {
    UNKNOWN_ERROR,
    CARD_RESET,
    CARD_NOT_ACCESSIBLE,
    CARD_REMOVED,
    CARD_INSERTED,
    RECOVERED,
};

enum SapTransferProtocol : int32_t {
    T0,
    T1,
};

enum CallState : int32_t {
    ACTIVE,
    HOLDING,
    DIALING,                              // MO call only
    ALERTING,                             // MO call only
    INCOMING,                             // MT call only
    WAITING,                              // MT call only
};

/**
 * User-to-User signaling Info activation types derived from 3GPP 23.087 v8.0
 */
enum UusType : int32_t {
    TYPE1_IMPLICIT,
    TYPE1_REQUIRED,
    TYPE1_NOT_REQUIRED,
    TYPE2_REQUIRED,
    TYPE2_NOT_REQUIRED,
    TYPE3_REQUIRED,
    TYPE3_NOT_REQUIRED,
};

/**
 * User-to-User Signaling Information data coding schemes. Possible values for
 * Octet 3 (Protocol Discriminator field) in the UUIE. The values have been
 * specified in section 10.5.4.25 of 3GPP TS 24.008
 */
enum UusDcs : int32_t {
    USP,                                  // User specified protocol
    OSIHLP,                               // OSI higher layer protocol
    X244,                                 // X.244
    RMCF,                                 // Reserved for system management convergence function
    IA5C,                                 // IA5 characters
};

enum CallPresentation : int32_t {
    ALLOWED,
    RESTRICTED,
    UNKNOWN,
    PAYPHONE,
};

enum Clir : int32_t {
    DEFAULT,                              // "use subscription default value"
    INVOCATION,                           // restrict CLI presentation
    SUPPRESSION,                          // allow CLI presentation
};

enum LastCallFailCause : int32_t {
    UNOBTAINABLE_NUMBER = 1,
    NO_ROUTE_TO_DESTINATION = 3,
    CHANNEL_UNACCEPTABLE = 6,
    OPERATOR_DETERMINED_BARRING = 8,
    NORMAL = 16,
    BUSY = 17,
    NO_USER_RESPONDING = 18,
    NO_ANSWER_FROM_USER = 19,
    CALL_REJECTED = 21,
    NUMBER_CHANGED = 22,
    PREEMPTION = 25,
    DESTINATION_OUT_OF_ORDER = 27,
    INVALID_NUMBER_FORMAT = 28,
    FACILITY_REJECTED = 29,
    RESP_TO_STATUS_ENQUIRY = 30,
    NORMAL_UNSPECIFIED = 31,
    CONGESTION = 34,
    NETWORK_OUT_OF_ORDER = 38,
    TEMPORARY_FAILURE = 41,
    SWITCHING_EQUIPMENT_CONGESTION = 42,
    ACCESS_INFORMATION_DISCARDED = 43,
    REQUESTED_CIRCUIT_OR_CHANNEL_NOT_AVAILABLE = 44,
    RESOURCES_UNAVAILABLE_OR_UNSPECIFIED = 47,
    QOS_UNAVAILABLE = 49,
    REQUESTED_FACILITY_NOT_SUBSCRIBED = 50,
    INCOMING_CALLS_BARRED_WITHIN_CUG = 55,
    BEARER_CAPABILITY_NOT_AUTHORIZED = 57,
    BEARER_CAPABILITY_UNAVAILABLE = 58,
    SERVICE_OPTION_NOT_AVAILABLE = 63,
    BEARER_SERVICE_NOT_IMPLEMENTED = 65,
    ACM_LIMIT_EXCEEDED = 68,
    REQUESTED_FACILITY_NOT_IMPLEMENTED = 69,
    ONLY_DIGITAL_INFORMATION_BEARER_AVAILABLE = 70,
    SERVICE_OR_OPTION_NOT_IMPLEMENTED = 79,
    INVALID_TRANSACTION_IDENTIFIER = 81,
    USER_NOT_MEMBER_OF_CUG = 87,
    INCOMPATIBLE_DESTINATION = 88,
    INVALID_TRANSIT_NW_SELECTION = 91,
    SEMANTICALLY_INCORRECT_MESSAGE = 95,
    INVALID_MANDATORY_INFORMATION = 96,
    MESSAGE_TYPE_NON_IMPLEMENTED = 97,
    MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE = 98,
    INFORMATION_ELEMENT_NON_EXISTENT = 99,
    CONDITIONAL_IE_ERROR = 100,
    MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE = 101,
    RECOVERY_ON_TIMER_EXPIRED = 102,
    PROTOCOL_ERROR_UNSPECIFIED = 111,
    INTERWORKING_UNSPECIFIED = 127,
    CALL_BARRED = 240,
    FDN_BLOCKED = 241,
    IMSI_UNKNOWN_IN_VLR = 242,
    IMEI_NOT_ACCEPTED = 243,
    DIAL_MODIFIED_TO_USSD = 244,          // STK Call Control
    DIAL_MODIFIED_TO_SS = 245,
    DIAL_MODIFIED_TO_DIAL = 246,
    RADIO_OFF = 247,                      // Radio is OFF
    OUT_OF_SERVICE = 248,                 // No cellular coverage
    NO_VALID_SIM = 249,                   // No valid SIM is present
    RADIO_INTERNAL_ERROR = 250,           // Internal error at Modem
    NETWORK_RESP_TIMEOUT = 251,           // No response from network
    NETWORK_REJECT = 252,                 // Explicit network reject
    RADIO_ACCESS_FAILURE = 253,           // RRC connection failure. Eg.RACH
    RADIO_LINK_FAILURE = 254,             // Radio Link Failure
    RADIO_LINK_LOST = 255,                // Radio link lost due to poor coverage
    RADIO_UPLINK_FAILURE = 256,           // Radio uplink failure
    RADIO_SETUP_FAILURE = 257,            // RRC connection setup failure
    RADIO_RELEASE_NORMAL = 258,           // RRC connection release, normal
    RADIO_RELEASE_ABNORMAL = 259,         // RRC connection release, abnormal
    ACCESS_CLASS_BLOCKED = 260,           // Access class barring
    NETWORK_DETACH = 261,                 // Explicit network detach
    CDMA_LOCKED_UNTIL_POWER_CYCLE = 1000,
    CDMA_DROP = 1001,
    CDMA_INTERCEPT = 1002,
    CDMA_REORDER = 1003,
    CDMA_SO_REJECT = 1004,
    CDMA_RETRY_ORDER = 1005,
    CDMA_ACCESS_FAILURE = 1006,
    CDMA_PREEMPTED = 1007,
    CDMA_NOT_EMERGENCY = 1008,            // For non-emergency number dialed during emergency
                                          // callback mode
    CDMA_ACCESS_BLOCKED = 1009,

    /**
     * OEM specific error codes. Used to distinguish error from
     * CALL_FAIL_ERROR_UNSPECIFIED and help assist debugging */
    OEM_CAUSE_1 = 0xf001,
    OEM_CAUSE_2 = 0xf002,
    OEM_CAUSE_3 = 0xf003,
    OEM_CAUSE_4 = 0xf004,
    OEM_CAUSE_5 = 0xf005,
    OEM_CAUSE_6 = 0xf006,
    OEM_CAUSE_7 = 0xf007,
    OEM_CAUSE_8 = 0xf008,
    OEM_CAUSE_9 = 0xf009,
    OEM_CAUSE_10 = 0xf00a,
    OEM_CAUSE_11 = 0xf00b,
    OEM_CAUSE_12 = 0xf00c,
    OEM_CAUSE_13 = 0xf00d,
    OEM_CAUSE_14 = 0xf00e,
    OEM_CAUSE_15 = 0xf00f,

    ERROR_UNSPECIFIED = 0xffff,           // This error will be deprecated soon,
                                          // vendor code must make sure to map error
                                          // code to specific error
};

enum DataCallFailCause : int32_t {
    NONE = 0,                             // an integer cause code defined in TS 24.008
                                          // section 6.1.3.1.3 or TS 24.301 Release 8+ Annex B.
                                          // If the implementation does not have access to the exact
                                          // cause codes, then it must return one of the
                                          // following values, as the UI layer needs to distinguish
                                          // these cases for error notification and potential
                                          // retries.
    OPERATOR_BARRED = 0x08,               // no retry
    NAS_SIGNALLING = 0x0E,                // PDP_FAIL_LLC_SNDCP = 0x19,
    INSUFFICIENT_RESOURCES = 0x1A,
    MISSING_UKNOWN_APN = 0x1B,            // no retry
    UNKNOWN_PDP_ADDRESS_TYPE = 0x1C,      // no retry
    USER_AUTHENTICATION = 0x1D,           // no retry
    ACTIVATION_REJECT_GGSN = 0x1E,        // no retry
    ACTIVATION_REJECT_UNSPECIFIED = 0x1F,
    SERVICE_OPTION_NOT_SUPPORTED = 0x20,  // no retry
    SERVICE_OPTION_NOT_SUBSCRIBED = 0x21, // no retry
    SERVICE_OPTION_OUT_OF_ORDER = 0x22,
    NSAPI_IN_USE = 0x23,                  // no retry
    REGULAR_DEACTIVATION = 0x24,          // possibly restart radio,
                                          // based on framework config
    QOS_NOT_ACCEPTED = 0x25,
    NETWORK_FAILURE = 0x26,
    UMTS_REACTIVATION_REQ = 0x27,
    FEATURE_NOT_SUPP = 0x28,
    TFT_SEMANTIC_ERROR = 0x29,
    TFT_SYTAX_ERROR = 0x2A,
    UNKNOWN_PDP_CONTEXT = 0x2B,
    FILTER_SEMANTIC_ERROR = 0x2C,
    FILTER_SYTAX_ERROR = 0x2D,
    PDP_WITHOUT_ACTIVE_TFT = 0x2E,
    ONLY_IPV4_ALLOWED = 0x32,             // no retry
    ONLY_IPV6_ALLOWED = 0x33,             // no retry
    ONLY_SINGLE_BEARER_ALLOWED = 0x34,
    ESM_INFO_NOT_RECEIVED = 0x35,
    PDN_CONN_DOES_NOT_EXIST = 0x36,
    MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED = 0x37,
    MAX_ACTIVE_PDP_CONTEXT_REACHED = 0x41,
    UNSUPPORTED_APN_IN_CURRENT_PLMN = 0x42,
    INVALID_TRANSACTION_ID = 0x51,
    MESSAGE_INCORRECT_SEMANTIC = 0x5F,
    INVALID_MANDATORY_INFO = 0x60,
    MESSAGE_TYPE_UNSUPPORTED = 0x61,
    MSG_TYPE_NONCOMPATIBLE_STATE = 0x62,
    UNKNOWN_INFO_ELEMENT = 0x63,
    CONDITIONAL_IE_ERROR = 0x64,
    MSG_AND_PROTOCOL_STATE_UNCOMPATIBLE = 0x65,
    PROTOCOL_ERRORS = 0x6F,               // no retry
    APN_TYPE_CONFLICT = 0x70,
    INVALID_PCSCF_ADDR = 0x71,
    INTERNAL_CALL_PREEMPT_BY_HIGH_PRIO_APN = 0x72,
    EMM_ACCESS_BARRED = 0x73,
    EMERGENCY_IFACE_ONLY = 0x74,
    IFACE_MISMATCH = 0x75,
    COMPANION_IFACE_IN_USE = 0x76,
    IP_ADDRESS_MISMATCH = 0x77,
    IFACE_AND_POL_FAMILY_MISMATCH = 0x78,
    EMM_ACCESS_BARRED_INFINITE_RETRY = 0x79,
    AUTH_FAILURE_ON_EMERGENCY_CALL = 0x7A,
    OEM_DCFAILCAUSE_1 = 0x1001,

    OEM_DCFAILCAUSE_2 = 0x1002,
    OEM_DCFAILCAUSE_3 = 0x1003,
    OEM_DCFAILCAUSE_4 = 0x1004,
    OEM_DCFAILCAUSE_5 = 0x1005,
    OEM_DCFAILCAUSE_6 = 0x1006,
    OEM_DCFAILCAUSE_7 = 0x1007,
    OEM_DCFAILCAUSE_8 = 0x1008,
    OEM_DCFAILCAUSE_9 = 0x1009,
    OEM_DCFAILCAUSE_10 = 0x100A,
    OEM_DCFAILCAUSE_11 = 0x100B,
    OEM_DCFAILCAUSE_12 = 0x100C,
    OEM_DCFAILCAUSE_13 = 0x100D,
    OEM_DCFAILCAUSE_14 = 0x100E,
    OEM_DCFAILCAUSE_15 = 0x100F,

    // Not mentioned in the specification
    VOICE_REGISTRATION_FAIL = -1,
    DATA_REGISTRATION_FAIL = -2,

    // reasons for data call drop - network/modem disconnect
    SIGNAL_LOST = -3,
    PREF_RADIO_TECH_CHANGED = -4,         // preferred technology has changed, must retry
                                          // with parameters appropriate for new technology
    RADIO_POWER_OFF = -5,                 // data call was disconnected because radio was resetting,
                                          // powered off - no retry
    TETHERED_CALL_ACTIVE = -6,            // data call was disconnected by modem because tethered
                                          // mode was up on same APN/data profile - no retry until
                                          // tethered call is off
    ERROR_UNSPECIFIED = 0xffff,
};

/**
 * Please note that registration state UNKNOWN is
 * treated as "out of service" in the Android telephony.
 * Registration state REG_DENIED must be returned if Location Update
 * Reject (with cause 17 - Network Failure) is received
 * repeatedly from the network, to facilitate
 * "managed roaming"
 */
enum RegState : int32_t {
    NOT_REG_MT_NOT_SEARCHING_OP = 0,      // Not registered, MT is not currently searching
                                          // a new operator to register
    REG_HOME = 1,                         // Registered, home network
    NOT_REG_MT_SEARCHING_OP = 2,          // Not registered, but MT is currently searching
                                          // a new operator to register
    REG_DENIED = 3,                       // Registration denied
    UNKNOWN = 4,                          // Unknown
    REG_ROAMING = 5,                      // Registered, roaming
    NOT_REG_MT_NOT_SEARCHING_OP_EM = 10,  // Same as NOT_REG_MT_NOT_SEARCHING_OP but indicates that
                                          // emergency calls are enabled.
    NOT_REG_MT_SEARCHING_OP_EM = 12,      // Same as NOT_REG_MT_SEARCHING_OP but indicates that
                                          // emergency calls are enabled.
    REG_DENIED_EM = 13,                   // Same as REG_DENIED but indicates that
                                          // emergency calls are enabled.
    UNKNOWN_EM = 14,                      // Same as UNKNOWN but indicates that
                                          // emergency calls are enabled.
};

enum RadioTechnology : int32_t {
    UNKNOWN = 0,
    GPRS = 1,
    EDGE = 2,
    UMTS = 3,
    IS95A = 4,
    IS95B = 5,
    ONE_X_RTT = 6,
    EVDO_0 = 7,
    EVDO_A = 8,
    HSDPA = 9,
    HSUPA = 10,
    HSPA = 11,
    EVDO_B = 12,
    EHRPD = 13,
    LTE = 14,
    HSPAP = 15,                           // HSPA+
    GSM = 16,                             // Only supports voice
    TD_SCDMA = 17,
    IWLAN = 18,
    LTE_CA = 19,
};

enum DataProfileId : int32_t {
    DEFAULT = 0,
    TETHERED = 1,
    IMS = 2,
    FOTA = 3,
    CBS = 4,
    OEM_BASE = 1000,                      // Start of OEM-specific profiles
    INVALID = 0xFFFFFFFF,
};

enum SmsAcknowledgeFailCause : int32_t {
    MEMORY_CAPACITY_EXCEEDED = 0xD3,
    UNSPECIFIED_ERROR = 0XFF,
};

enum CallForwardInfoStatus : int32_t {
    DISABLE,
    ENABLE,
    INTERROGATE,
    REGISTRATION,
    ERASURE,
};

enum ClipStatus : int32_t {
    CLIP_PROVISIONED,                     // CLIP provisioned
    CLIP_UNPROVISIONED,                   // CLIP not provisioned
    UNKNOWN,                              // unknown, e.g. no network etc
};

enum SmsWriteArgsStatus : int32_t {
    REC_UNREAD,
    REC_READ,
    STO_UNSENT,
    STO_SENT,
};

enum RadioBandMode : int32_t  {
    BAND_MODE_UNSPECIFIED,                // "unspecified" (selected by baseband automatically)
    BAND_MODE_EURO,                       // "EURO band" (GSM-900 / DCS-1800 / WCDMA-IMT-2000)
    BAND_MODE_USA,                        // "US band"
                                          // (GSM-850 / PCS-1900 / WCDMA-850 / WCDMA-PCS-1900)
    BAND_MODE_JPN,                        // "JPN band" (WCDMA-800 / WCDMA-IMT-2000)
    BAND_MODE_AUS,                        // "AUS band"
                                          // (GSM-900 / DCS-1800 / WCDMA-850 / WCDMA-IMT-2000)
    BAND_MODE_AUS_2,                      // "AUS band 2" (GSM-900 / DCS-1800 / WCDMA-850)
    BAND_MODE_CELL_800,                   // "Cellular" (800-MHz Band)
    BAND_MODE_PCS,                        // "PCS" (1900-MHz Band)
    BAND_MODE_JTACS,                      // "Band Class 3" (JTACS Band)
    BAND_MODE_KOREA_PCS,                  // "Band Class 4" (Korean PCS Band)
    BAND_MODE_5_450M,                     // "Band Class 5" (450-MHz Band)
    BAND_MODE_IMT2000,                    // "Band Class 6" (2-GMHz IMT2000 Band)
    BAND_MODE_7_700M_2,                   // "Band Class 7" (Upper 700-MHz Band)
    BAND_MODE_8_1800M,                    // "Band Class 8" (1800-MHz Band)
    BAND_MODE_9_900M,                     // "Band Class 9" (900-MHz Band)
    BAND_MODE_10_800M_2,                  // "Band Class 10" (Secondary 800-MHz Band)
    BAND_MODE_EURO_PAMR_400M,             // "Band Class 11" (400-MHz European PAMR Band)
    BAND_MODE_AWS,                        // "Band Class 15" (AWS Band)
    BAND_MODE_USA_2500M,                  // "Band Class 16" (US 2.5-GHz Band)
};

enum OperatorStatus : int32_t {
    UNKNOWN,
    AVAILABLE,
    CURRENT,
    FORBIDDEN,
};

enum PreferredNetworkType : int32_t {
    GSM_WCDMA,                            // GSM/WCDMA (WCDMA preferred)
    GSM_ONLY,                             // GSM only
    WCDMA,                                // WCDMA
    GSM_WCDMA_AUTO,                       // GSM/WCDMA (auto mode, according to PRL)
    CDMA_EVDO_AUTO,                       // CDMA and EvDo (auto mode, according to PRL)
    CDMA_ONLY,                            // CDMA only
    EVDO_ONLY,                            // EvDo only
    GSM_WCDMA_CDMA_EVDO_AUTO,             // GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL)
    LTE_CDMA_EVDO,                        // LTE, CDMA and EvDo
    LTE_GSM_WCDMA,                        // LTE, GSM/WCDMA
    LTE_CMDA_EVDO_GSM_WCDMA,              // LTE, CDMA, EvDo, GSM/WCDMA
    LTE_ONLY,                             // LTE only
    LTE_WCDMA,                            // LTE/WCDMA
    TD_SCDMA_ONLY,                        // TD-SCDMA only
    TD_SCDMA_WCDMA,                       // TD-SCDMA and WCDMA
    TD_SCDMA_LTE,                         // TD-SCDMA and LTE
    TD_SCDMA_GSM,                         // TD-SCDMA and GSM
    TD_SCDMA_GSM_LTE,                     // TD-SCDMA,GSM and LTE
    TD_SCDMA_GSM_WCDMA,                   // TD-SCDMA, GSM/WCDMA
    TD_SCDMA_WCDMA_LTE,                   // TD-SCDMA, WCDMA and LTE
    TD_SCDMA_GSM_WCDMA_LTE,               // TD-SCDMA, GSM/WCDMA and LTE
    TD_SCDMA_GSM_WCDMA_CDMA_EVDO_AUTO,    // TD-SCDMA, GSM/WCDMA, CDMA and EvDo
    TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA,     // TD-SCDMA, LTE, CDMA, EvDo GSM/WCDMA
};

enum CdmaSubscriptionSource : int32_t {
    RUIM_SIM,
    NV,
};

enum CdmaRoamingType : int32_t {
    HOME_NETWORK,
    AFFILIATED_ROAM,
    ANY_ROAM,
};

enum TtyMode : int32_t {
    OFF,
    FULL,
    HCO,                                  // Hearing carryover
    VCO,                                  // Voice carryover
};

enum NvItem : int32_t {
    // CDMA radio and account information (items 1-10)
    CDMA_MEID = 1,                        // CDMA MEID (hex)
    CDMA_MIN = 2,                         // CDMA MIN (MSID)
    CDMA_MDN = 3,                         // CDMA MDN
    CDMA_ACCOLC = 4,                      // CDMA access overload control

    // Carrier device provisioning (items 11-30)
    DEVICE_MSL = 11,                      // device MSL
    RTN_RECONDITIONED_STATUS = 12,        // RTN reconditioned status
    RTN_ACTIVATION_DATE = 13,             // RTN activation date
    RTN_LIFE_TIMER = 14,                  // RTN life timer
    RTN_LIFE_CALLS = 15,                  // RTN life calls
    RTN_LIFE_DATA_TX = 16,                // RTN life data TX
    RTN_LIFE_DATA_RX = 17,                // RTN life data RX
    OMADM_HFA_LEVEL = 18,                 // HFA in progress

    // Mobile IP profile information (items 31-50)
    MIP_PROFILE_NAI = 31,                 // NAI realm
    MIP_PROFILE_HOME_ADDRESS = 32,        // MIP home address
    MIP_PROFILE_AAA_AUTH = 33,            // AAA auth
    MIP_PROFILE_HA_AUTH = 34,             // HA auth
    MIP_PROFILE_PRI_HA_ADDR = 35,         // primary HA address
    MIP_PROFILE_SEC_HA_ADDR = 36,         // secondary HA address
    MIP_PROFILE_REV_TUN_PREF = 37,        // reverse TUN preference
    MIP_PROFILE_HA_SPI = 38,              // HA SPI
    MIP_PROFILE_AAA_SPI = 39,             // AAA SPI
    MIP_PROFILE_MN_HA_SS = 40,            // HA shared secret
    MIP_PROFILE_MN_AAA_SS = 41,           // AAA shared secret

    // CDMA network and band config (items 51-70)
    CDMA_PRL_VERSION = 51,                // CDMA PRL version
    CDMA_BC10 = 52,                       // CDMA band class 10
    CDMA_BC14 = 53,                       // CDMA band class 14
    CDMA_SO68 = 54,                       // CDMA SO68
    CDMA_SO73_COP0 = 55,                  // CDMA SO73 COP0
    CDMA_SO73_COP1TO7 = 56,               // CDMA SO73 COP1-7
    CDMA_1X_ADVANCED_ENABLED = 57,        // CDMA 1X Advanced enabled
    CDMA_EHRPD_ENABLED = 58,              // CDMA eHRPD enabled
    CDMA_EHRPD_FORCED = 59,               // CDMA eHRPD forced

    // LTE network and band config (items 71-90)
    LTE_BAND_ENABLE_25 = 71,              // LTE band 25 enable
    LTE_BAND_ENABLE_26 = 72,              // LTE band 26 enable
    LTE_BAND_ENABLE_41 = 73,              // LTE band 41 enable

    LTE_SCAN_PRIORITY_25 = 74,            // LTE band 25 scan priority
    LTE_SCAN_PRIORITY_26 = 75,            // LTE band 26 scan priority
    LTE_SCAN_PRIORITY_41 = 76,            // LTE band 41 scan priority

    LTE_HIDDEN_BAND_PRIORITY_25 = 77,     // LTE hidden band 25 priority
    LTE_HIDDEN_BAND_PRIORITY_26 = 78,     // LTE hidden band 26 priority
    LTE_HIDDEN_BAND_PRIORITY_41 = 79,     // LTE hidden band 41 priority
};

enum ResetNvType : int32_t {
    RELOAD,                               // reload all NV items
    ERASE,                                // erase NV reset (SCRTN)
    FACTORY_RESET,                        // factory reset (RTN)
};

enum HardwareConfigType : int32_t {
    MODEM,
    SIM,
};

enum HardwareConfigState : int32_t {
    ENABLED,
    STANDBY,
    DISABLED,
};

enum LceStatus : int32_t {
    NOT_SUPPORTED,
    STOPPED,
    ACTIVE
};

enum CarrierMatchType : int32_t {
    ALL = 0,                              // Apply to all carriers with the same mcc/mnc
    SPN = 1,                              // Use SPN and mcc/mnc to identify the carrier
    IMSI_PREFIX = 2,                      // Use IMSI prefix and mcc/mnc to identify the carrier
    GID1 = 3,                             // Use GID1 and mcc/mnc to identify the carrier
    GID2 = 4,                             // Use GID2 and mcc/mnc to identify the carrier
};

struct NeighboringCell {
    string cid;                           // Combination of LAC and Cell Id in 32 bits in GSM.
                                          // Upper 16 bits is LAC and lower 16 bits
                                          // is CID (as described in TS 27.005)
                                          // Primary Scrambling Code (as described in TS 25.331)
                                          // in 9 bits in UMTS
                                          // Valid values are hexadecimal 0x0000 - 0xffffffff.
    int32_t rssi;                         // Received RSSI in GSM,
                                          // Level index of CPICH Received Signal Code Power in UMTS
};

enum CdmaSmsDigitMode : int32_t {
    FOUR_BIT,                             // DTMF digits
    EIGHT_BIT,
};

enum CdmaSmsNumberMode : int32_t {
    NOT_DATA_NETWORK,
    DATA_NETWORK,
};

enum CdmaSmsNumberType : int32_t {
    UNKNOWN,
    INTERNATIONAL_OR_DATA_IP,             // INTERNATIONAL is used when number mode is not data
                                          // network
                                          // address. DATA_IP is used when the number mode is data
                                          // network address
    NATIONAL_OR_INTERNET_MAIL,            // NATIONAL is used when the number mode is not data
                                          // network address. INTERNET_MAIL is used when the number
                                          // mode is data network address. For INTERNET_MAIL, in
                                          // the address data "digits", each byte contains an ASCII
                                          // character.
                                          // Examples are "x@y.com,a@b.com - ref
                                          // TIA/EIA-637A 3.4.3.3
    NETWORK,
    SUBSCRIBER,
    ALPHANUMERIC,                         // GSM SMS: address value is GSM 7-bit chars
    ABBREVIATED,
    RESERVED_7,
};

enum CdmaSmsNumberPlan : int32_t {
    UNKNOWN,
    TELEPHONY,                            // CCITT E.164 and E.163, including ISDN plan
    RESERVED_2,
    DATA,                                 // CCITT X.121
    TELEX,                                // CCITT F.69
    RESERVED_5,
    RESERVED_6,
    RESERVED_7,
    RESERVED_8,
    PRIVATE,
    RESERVED_10,
    RESERVED_11,
    RESERVED_12,
    RESERVED_13,
    RESERVED_14,
    RESERVED_15,
};

enum CdmaSmsSubaddressType : int32_t {
    NSAP,                                 // CCITT X.213 or ISO 8348 AD2
    USER_SPECIFIED,                       // e.g. X.25
};

enum CdmaSmsErrorClass : int32_t {
    NO_ERROR,
    ERROR,
};

enum CdmaSmsWriteArgsStatus : int32_t {
    REC_UNREAD,
    REC_READ,
    STO_UNSENT,
    STO_SENT
};

enum CellInfoType : int32_t {
    NONE = 0,
    GSM = 1,
    CDMA = 2,
    LTE = 3,
    WCDMA = 4,
    TD_SCDMA = 5
};

enum TimeStampType : int32_t {
    UNKNOWN,
    ANTENNA,
    MODEM,
    OEM_RIL,
    JAVA_RIL,
};

enum ApnAuthType : int32_t {
    NO_PAP_NO_CHAP,                       // PAP and CHAP is never performed.
    PAP_NO_CHAP,                          // PAP may be performed; CHAP is never performed.
    NO_PAP_CHAP,                          // CHAP may be performed; PAP is never performed.
    PAP_CHAP                              // PAP / CHAP may be performed - baseband dependent.
};

enum RadioTechnologyFamily : int32_t {
    THREE_GPP,                            // 3GPP Technologies - GSM, WCDMA
    THREE_GPP2                            // 3GPP2 Technologies - CDMA
};

enum RadioCapabilityPhase : int32_t {
    CONFIGURED = 0,                       // Logical Modem's (LM)  initial value
                                          // and value after FINISH completes
    START      = 1,                       // START is sent before APPLY and indicates that an
                                          // APPLY is forthcoming with these same parameters
    APPLY      = 2,                       // APPLY is sent after all LM's receive START and returned
                                          // RadioCapability.status = 0. If any START's fail, hal
                                          // implementation must not send APPLY.
    UNSOL_RSP  = 3,                       // UNSOL_RSP is sent with unsolicited radioCapability()
    FINISH     = 4                        // FINISH is sent after all commands have completed. If an
                                          // error occurs in any previous command, the
                                          // RadioAccessesFamily and logicalModemUuid fields must be
                                          // the prior configuration thus restoring the
                                          // configuration to the previous value. An error returned
                                          // by FINISH will generally be ignored or may cause that
                                          // logical modem to be removed from service.
};

enum RadioCapabilityStatus : int32_t {
    NONE       = 0,                       // This parameter has no meaning with
                                          // RadioCapabilityPhase:START, RadioCapabilityPhase:APPLY
    SUCCESS    = 1,                       // Tell modem the action transaction of set radio
                                          // capability was success with RadioCapabilityPhase:FINISH
    FAIL       = 2,                       // Tell modem the action transaction of set radio
                                          // capability is fail with RadioCapabilityPhase:FINISH.
};

enum RadioAccessFamily : int32_t {
    UNKNOWN = 1 << RadioTechnology:UNKNOWN,
    GPRS = 1 << RadioTechnology:GPRS,
    EDGE = 1 << RadioTechnology:EDGE,
    UMTS = 1 << RadioTechnology:UMTS,
    IS95A = 1 << RadioTechnology:IS95A,
    IS95B = 1 << RadioTechnology:IS95B,
    ONE_X_RTT = 1 << RadioTechnology:ONE_X_RTT,
    EVDO_0 = 1 << RadioTechnology:EVDO_0,
    EVDO_A = 1 << RadioTechnology:EVDO_A,
    HSDPA = 1 << RadioTechnology:HSDPA,
    HSUPA = 1 << RadioTechnology:HSUPA,
    HSPA = 1 << RadioTechnology:HSPA,
    EVDO_B = 1 << RadioTechnology:EVDO_B,
    EHRPD = 1 << RadioTechnology:EHRPD,
    LTE = 1 << RadioTechnology:LTE,
    HSPAP = 1 << RadioTechnology:HSPAP,
    GSM = 1 << RadioTechnology:GSM,
    TD_SCDMA = 1 << RadioTechnology:TD_SCDMA,
    LTE_CA = 1 << RadioTechnology:LTE_CA
};

enum UssdModeType : int32_t {
    NOTIFY,                               // USSD-Notify
    REQUEST,                              // USSD-Request
    NW_RELEASE,                           // Session terminated by network
    LOCAL_CLIENT,                         // other local client (eg, SIM Toolkit) has responded
    NOT_SUPPORTED,                        // Operation not supported
    NW_TIMEOUT,                           // Network timeout
};

enum SimRefreshType : int32_t {
    SIM_FILE_UPDATE = 0,                  // A file on SIM has been updated.
    SIM_INIT = 1,                         // SIM initialized. All files should be re-read.
    SIM_RESET = 2                         // SIM reset. SIM power required, SIM may be locked a
                                          // nd all files must be re-read.
};

enum SrvccState :int32_t {
    HANDOVER_STARTED = 0,
    HANDOVER_COMPLETED = 1,
    HANDOVER_FAILED = 2,
    HANDOVER_CANCELED = 3
};

enum UiccSubActStatus : int32_t {
    DEACTIVATE,
    ACTIVATE
};

enum SubscriptionType : int32_t {
    SUBSCRIPTION_1,
    SUBSCRIPTION_2,
    SUBSCRIPTION_3
};

enum DataProfileInfoType : int32_t {
    COMMON,
    THREE_GPP,
    THREE_GPP2
};

enum PhoneRestrictedState : int32_t {
    NONE = 0x00,                          // No restriction at all including voice/SMS/USSD/SS/AV64
                                          // and packet data
    CS_EMERGENCY = 0x01,                  // Block emergency call due to restriction. But allow all
                                          // normal voice/SMS/USSD/SS/AV64.
    CS_NORMAL = 0x02,                     // Block all normal voice/SMS/USSD/SS/AV64 due to
                                          // restriction. Only Emergency call allowed.
    CS_ALL = 0x04,                        // Block all voice/SMS/USSD/SS/AV64 including emergency
                                          // call due to restriction.
    PS_ALL = 0x10                         // Block packet data access due to restriction.
};

enum CdmaCallWaitingNumberPresentation : int32_t {
    ALLOWED = 0,
    RESTRICTED = 1,
    UNKNOWN = 2,
};

enum CdmaCallWaitingNumberType : int32_t {
    UNKNOWN = 0,
    INTERNATIONAL = 1,
    NATIONAL = 2,
    NETWORK_SPECIFIC = 3,
    SUBSCRIBER = 4
};

enum CdmaCallWaitingNumberPlan : int32_t {
    UNKNOWN = 0,
    ISDN = 1,
    DATA = 3,
    TELEX = 4,
    NATIONAL = 8,
    PRIVATE = 9
};

enum CdmaOtaProvisionStatus : int32_t {
    SPL_UNLOCKED,
    SPC_RETRIES_EXCEEDED,
    A_KEY_EXCHANGED,
    SSD_UPDATED,
    NAM_DOWNLOADED,
    MDN_DOWNLOADED,
    IMSI_DOWNLOADED,
    PRL_DOWNLOADED,
    COMMITTED,
    OTAPA_STARTED,
    OTAPA_STOPPED,
    OTAPA_ABORTED
};

/** Names of the CDMA info records (C.S0005 section 3.7.5) */
enum CdmaInfoRecName : int32_t {
    DISPLAY,
    CALLED_PARTY_NUMBER,
    CALLING_PARTY_NUMBER,
    CONNECTED_NUMBER,
    SIGNAL,
    REDIRECTING_NUMBER,
    LINE_CONTROL,
    EXTENDED_DISPLAY,
    T53_CLIR,
    T53_RELEASE,
    T53_AUDIO_CONTROL
};

/** Redirecting Number Information Record as defined in C.S0005 section 3.7.5.11 */
enum CdmaRedirectingReason : int32_t {
    UNKNOWN = 0,
    CALL_FORWARDING_BUSY = 1,
    CALL_FORWARDING_NO_REPLY = 2,
    CALLED_DTE_OUT_OF_ORDER = 9,
    CALL_FORWARDING_BY_THE_CALLED_DTE = 10,
    CALL_FORWARDING_UNCONDITIONAL = 15,
    RESERVED
};

enum SsServiceType : int32_t {
    CFU,
    CF_BUSY,
    CF_NO_REPLY,
    CF_NOT_REACHABLE,
    CF_ALL,
    CF_ALL_CONDITIONAL,
    CLIP,
    CLIR,
    COLP,
    COLR,
    WAIT,
    BAOC,
    BAOIC,
    BAOIC_EXC_HOME,
    BAIC,
    BAIC_ROAMING,
    ALL_BARRING,
    OUTGOING_BARRING,
    INCOMING_BARRING
};

enum SsRequestType : int32_t {
    ACTIVATION,
    DEACTIVATION,
    INTERROGATION,
    REGISTRATION,
    ERASURE
};

enum SsTeleserviceType : int32_t {
    ALL_TELE_AND_BEARER_SERVICES,
    ALL_TELESEVICES,
    TELEPHONY,
    ALL_DATA_TELESERVICES,
    SMS_SERVICES,
    ALL_TELESERVICES_EXCEPT_SMS
};

enum SuppServiceClass : int32_t {
    NONE = 0,
    VOICE = 1 << 0,
    DATA = 1 << 1,
    FAX = 1 << 2,
    SMS = 1 << 3,
    DATA_SYNC = 1 << 4,
    DATA_ASYNC = 1 << 5,
    PACKET = 1 << 6,
    PAD = 1 << 7,
    MAX = 1 << 7
};

enum ApnTypes : int32_t {
    NONE = 0,                             // None
    DEFAULT = 1 << 0,                     // APN type for default data traffic
    MMS = 1 << 1,                         // APN type for MMS traffic
    SUPL = 1 << 2,                        // APN type for SUPL assisted GPS
    DUN = 1 << 3,                         // APN type for DUN traffic
    HIPRI = 1 << 4,                       // APN type for HiPri traffic
    FOTA = 1 << 5,                        // APN type for FOTA
    IMS = 1 << 6,                         // APN type for IMS
    CBS = 1 << 7,                         // APN type for CBS
    IA = 1 << 8,                          // APN type for IA Initial Attach APN
    EMERGENCY = 1 << 9,                   // APN type for Emergency PDN. This is not an IA apn,
                                          // but is used for access to carrier services in an
                                          // emergency call situation.
    ALL = DEFAULT | MMS | SUPL | DUN | HIPRI | FOTA | IMS | CBS | IA | EMERGENCY,
};

enum IndicationFilter : int32_t {
    NONE = 0,
    SIGNAL_STRENGTH = 1 << 0,             // When this bit is set, modem should always send the
                                          // signal strength update through
                                          // IRadioIndication.currentSignalStrength(),
                                          // otherwise suppress it.
    FULL_NETWORK_STATE = 1 << 1,          // When this bit is set, modem should always invoke
                                          // IRadioIndication.networkStateChanged() when any field
                                          // in VoiceRegStateResult or DataRegStateResult changes.
                                          // When this bit is not set, modem should suppress
                                          // IRadioIndication.networkStateChanged() when there are
                                          // only changes from those insignificant fields
                                          // (e.g. cell info). Modem should continue invoking
                                          // IRadioIndication.networkStateChanged()
                                          // when significant fields are updated even when this bit
                                          // is not set. The following fields are considered
                                          // significant, registration state and radio technology.
    DATA_CALL_DORMANCY_CHANGED = 1 << 2,  // When this bit is set, modem should send the data call
                                          // list changed indication
                                          // IRadioIndication.dataCallListChanged() whenever any
                                          // field in ITypes.SetupDataCallResult changes. Otherwise
                                          // modem should suppress the indication when the only
                                          // changed field is 'active' (for data dormancy).
                                          // For all other fields change, modem should continue
                                          // sending IRadioIndication.dataCallListChanged()
                                          // regardless this bit is set or not.
    ALL = SIGNAL_STRENGTH | FULL_NETWORK_STATE | DATA_CALL_DORMANCY_CHANGED,
};

enum MvnoType : int32_t {
    NONE,                                 // None
    IMSI,                                 // The matching data is based on IMSI.
    GID,                                  // The matching data is based on group id.
    SPN,                                  // The matching data is based service provider name.
};

enum DeviceStateType : int32_t {
    POWER_SAVE_MODE,                      // Device power save mode (provided by PowerManager)
                                          // True indicates the device is in power save mode.
    CHARGING_STATE,                       // Device charging state (provided by BatteryManager)
                                          // True indicates the device is charging.
    LOW_DATA_EXPECTED                     // Low data expected mode. True indicates low data traffic
                                          // is expected, for example, when the device is idle
                                          // (e.g. not doing tethering in the background). Note
                                          // this doesn't mean no data is expected.
};

enum P2Constant : int32_t {
    NO_P2 = -1,                           // No P2 value is provided
};

struct RadioResponseInfo {
    RadioResponseType type;               // Response type
    int32_t serial;                       // Serial number of the request
    RadioError error;                     // Response error
};

struct AppStatus {
    AppType appType;
    AppState appState;
    PersoSubstate persoSubstate;          // applicable only if app_state == SUBSCRIPTION_PERSO
    string aidPtr;                        // e.g., from 0xA0, 0x00 -> 0x41,
                                          // 0x30, 0x30, 0x30
    string appLabelPtr;
    int32_t pin1Replaced;                 // applicable to USIM, CSIM and ISIM
    PinState pin1;
    PinState pin2;
};

struct CardStatus {
    CardState cardState;
    PinState universalPinState;           // applicable to USIM and CSIM
    int32_t gsmUmtsSubscriptionAppIndex;  // value < RadioConst:CARD_MAX_APPS, -1 if none
    int32_t cdmaSubscriptionAppIndex;     // value < RadioConst:CARD_MAX_APPS, -1 if none
    int32_t imsSubscriptionAppIndex;      // value < RadioConst:CARD_MAX_APPS, -1 if none
    vec<AppStatus> applications;          // size <= RadioConst:CARD_MAX_APPS
};

/**
 * User-to-User Signaling Information defined in 3GPP 23.087 v8.0
 */
struct UusInfo {
    UusType uusType;                      // UUS Type
    UusDcs uusDcs;                        // UUS Data Coding Scheme
    string uusData;                       // UUS data
};

struct Call {
    CallState state;
    int32_t index;                        // Connection Index for use with, eg, AT+CHLD
    int32_t toa;                          // type of address, eg 145 = intl
    bool isMpty;                          // true if is mpty call
    bool isMT;                            // true if call is mobile terminated
    uint8_t als;                          // ALS line indicator if available (0 = line 1)
    bool isVoice;                         // true if this is is a voice call
    bool isVoicePrivacy;                  // true if CDMA voice privacy mode is active
    string number;                        // Remote party number
    CallPresentation numberPresentation;
    string name;                          // Remote party name
    CallPresentation namePresentation;
    vec<UusInfo> uusInfo;                 // Vector of User-User Signaling Information
};

struct Dial {
    string address;
    Clir clir;
    vec<UusInfo> uusInfo;                 // Vector of User-User Signaling Information
};

struct LastCallFailCauseInfo {
    LastCallFailCause causeCode;
    string vendorCause;
};

struct GsmSignalStrength {
    uint32_t signalStrength;              // Valid values are (0-61, 99) as defined in
                                          // TS 27.007 8.69; INT_MAX means invalid/unreported.
    uint32_t bitErrorRate;                // bit error rate (0-7, 99) as defined in TS 27.007 8.5;
                                          // INT_MAX means invalid/unreported.
    int32_t timingAdvance;                // Timing Advance in bit periods. 1 bit period = 48/13 us.
                                          // INT_MAX means invalid/unreported.
};

struct WcdmaSignalStrength{
    int32_t signalStrength;               // Valid values are (0-31, 99) as defined in
                                          // TS 27.007 8.5; INT_MAX means unreported.
    int32_t bitErrorRate;                 // bit error rate (0-7, 99) as defined in TS 27.007 8.5;
                                          // INT_MAX means invalid/unreported.
};

struct CdmaSignalStrength {
    uint32_t dbm;                         // This value is the actual RSSI
                                          // value multiplied by -1. Example: If the
                                          // actual RSSI is -75, then this response value will
                                          // be 75. INT_MAX means invalid/unreported.
    uint32_t ecio;                        // This value is the actual
                                          // Ec/Io multiplied by -10. Example: If the
                                          // actual Ec/Io is -12.5 dB, then this response value
                                          // will be 125. INT_MAX means invalid/unreported.
};

struct EvdoSignalStrength {
    uint32_t dbm;                         // This value is the actual
                                          // RSSI value multiplied by -1.
                                          // Example: If the actual RSSI is -75,
                                          // then this response value will be 75; INT_MAX means
                                          // invalid/unreported.
    uint32_t ecio;                        // This value is the actual
                                          // Ec/Io multiplied by -10. Example: If the
                                          // actual Ec/Io is -12.5 dB, then this response value
                                          // will be 125; INT_MAX means invalid/unreported.
    uint32_t signalNoiseRatio;            // Valid values are 0-8. 8 is the highest signal to
                                          // noise ratio; INT_MAX means invalid/unreported.
};

struct LteSignalStrength {
    uint32_t signalStrength;              // Valid values are (0-31, 99) as defined in
                                          // TS 27.007 8.5; INT_MAX means invalid/unreported.
    uint32_t rsrp;                        // The current Reference Signal Receive Power in dBm
                                          // multipled by -1.
                                          // Range: 44 to 140 dBm;
                                          // INT_MAX: 0x7FFFFFFF denotes invalid/unreported value.
                                          // Reference: 3GPP TS 36.133 9.1.4
    uint32_t rsrq;                        // The current Reference Signal Receive Quality in dB
                                          // multiplied by -1.
                                          // Range: 20 to 3 dB;
                                          // INT_MAX: 0x7FFFFFFF denotes invalid/unreported value.
                                          // Reference: 3GPP TS 36.133 9.1.7
    int32_t rssnr;                        // The current reference signal signal-to-noise ratio in
                                          // 0.1 dB units.
                                          // Range: -200 to +300 (-200 = -20.0 dB, +300 = 30dB).
                                          // INT_MAX: 0x7FFFFFFF denotes invalid/unreported value.
                                          // Reference: 3GPP TS 36.101 8.1.1
    uint32_t cqi;                         // The current Channel Quality Indicator.
                                          // Range: 0 to 15.
                                          // INT_MAX: 0x7FFFFFFF denotes invalid/unreported value.
                                          // Reference: 3GPP TS 36.101 9.2, 9.3, A.4
    uint32_t timingAdvance;               // timing advance in micro seconds for a one way trip
                                          // from cell to device.
                                          // Approximate distance is calculated using
                                          // 300m/us * timingAdvance.
                                          // Range: 0 to 1282 inclusive.
                                          // INT_MAX: 0x7FFFFFFF denotes invalid/unreported value.
                                          // Reference: 3GPP 36.213 section 4.2.3
};

struct TdScdmaSignalStrength {
    uint32_t rscp;                        // The Received Signal Code Power in dBm multiplied by -1.
                                          // Range : 25 to 120
                                          // INT_MAX: 0x7FFFFFFF denotes invalid/unreported value.
                                          // Reference: 3GPP TS 25.123, section 9.1.1.1
};

struct SignalStrength {
    /**
     * If GSM measurements are provided, this structure must contain valid measurements; otherwise
     * all fields should be set to INT_MAX to mark them as invalid.
     */
    GsmSignalStrength gw;
    /**
     * If CDMA measurements are provided, this structure must contain valid measurements; otherwise
     * all fields should be set to INT_MAX to mark them as invalid.
     */
    CdmaSignalStrength cdma;
    /**
     * If EvDO measurements are provided, this structure must contain valid measurements; otherwise
     * all fields should be set to INT_MAX to mark them as invalid.
     */
    EvdoSignalStrength evdo;
    /**
     * If LTE measurements are provided, this structure must contain valid measurements; otherwise
     * all fields should be set to INT_MAX to mark them as invalid.
     */
    LteSignalStrength lte;
    /**
     * If TD-SCDMA measurements are provided, this structure must contain valid measurements;
     * otherwise all fields should be set to INT_MAX to mark them as invalid.
     */
    TdScdmaSignalStrength tdScdma;
};

struct SendSmsResult {
    int32_t messageRef;                   // TP-Message-Reference for GSM, and BearerData MessageId
                                          // for CDMA (See 3GPP2 C.S0015-B, v2.0, table 4.5-1)
    string ackPDU;                        // or empty string if n/a
    int32_t errorCode;                    // See 3GPP 27.005, 3.2.5 for GSM/UMTS,
                                          // 3GPP2 N.S0005 (IS-41C) Table 171 for CDMA,
                                          // -1 if unknown or not applicable
};

struct SetupDataCallResult {
    DataCallFailCause status;             // Data call fail cause. DataCallFailCause.NONE if no
                                          // error.
    int32_t suggestedRetryTime;           // If status != DataCallFailCause.NONE, this field
                                          // indicates the suggested retry back-off timer value RIL
                                          // wants to override the one pre-configured in FW.
                                          // The unit is milliseconds.
                                          // The value < 0 means no value is suggested.
                                          // The value 0 means retry must be done ASAP.
                                          // The value of INT_MAX(0x7fffffff) means no retry.
    int32_t cid;                          // Context ID, uniquely identifies this call
    int32_t active;                       // 0=inactive, 1=active/physical link down,
                                          // 2=active/physical link up */
    string type;                          // One of the PDP_type values in TS 27.007 section 10.1.1.
                                          // For example, "IP", "IPV6", "IPV4V6", or "PPP". If
                                          // status is
                                          // DataCallFailCause.ONLY_SINGLE_BEARER_ALLOWED, this
                                          // is the type supported such as "IP" or "IPV6".
    string ifname;                        // The network interface name
    string addresses;                     // A space-delimited list of addresses with optional "/"
                                          // prefix length, e.g., "192.0.1.3" or
                                          // "192.0.1.11/16 2001:db8::1/64".
                                          // Typically 1 IPv4 or 1 IPv6 or
                                          // one of each. If the prefix length is absent the
                                          // addresses are assumed to be point to point with IPv4
                                          // having a prefix length of 32 and IPv6 128.
    string dnses;                         // A space-delimited list of DNS server addresses,
                                          // e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1".
                                          // Empty if no dns server addresses returned.
    string gateways;                      // A space-delimited list of default gateway addresses,
                                          // e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1".
                                          // When empty, the addresses represent
                                          // point to point connections.
    string pcscf;                         // the Proxy Call State Control Function address
                                          // via PCO(Protocol Configuration Option) for IMS client.
    int32_t mtu;                          // MTU received from network
                                          // Value <= 0 means network has either not sent a
                                          // value or sent an invalid value
};

struct IccIo {
    int32_t command;                      // one of the commands listed for TS 27.007 +CRSM
    int32_t fileId;                       // EF id
    string path;                          // "pathid" from TS 27.007 +CRSM command.
                                          // Path is in hex ascii format eg "7f205f70"
                                          // Path must always be provided.
    int32_t p1;                           // Values of p1, p2 and p3 defined as per 3GPP TS 51.011
    int32_t p2;
    int32_t p3;
    string data;                          // information to be written to the SIM
    string pin2;
    string aid;                           // AID value, See ETSI 102.221 8.1 and 101.220 4, empty
                                          // string if no value.
};

struct IccIoResult {
    int32_t sw1;
    int32_t sw2;
    string simResponse;                   // In hex string format ([a-fA-F0-9]*), except for
                                          // SIM_AUTHENTICATION response for which it is in
                                          // Base64 format, see 3GPP TS 31.102 7.1.2
};

// See also com.android.internal.telephony.gsm.CallForwardInfo
struct CallForwardInfo {
    CallForwardInfoStatus status;         // For queryCallForwardStatus()
                                          // status is DISABLE (Not used by vendor code currently)
                                          // For setCallForward():
                                          // status must be
                                          // DISABLE, ENABLE, INTERROGATE, REGISTRATION, ERASURE
    int32_t reason;                       // from TS 27.007 7.11 "reason"
    int32_t serviceClass;                 // From 27.007 +CCFC/+CLCK "class"
                                          // See table for Android mapping from
                                          // MMI service code
                                          // 0 means user doesn't input class
    int32_t toa;                          // "type" from TS 27.007 7.11
    string number;                        // "number" from TS 27.007 7.11.
    int32_t timeSeconds;
};

// Response struct used in responseQueryAvailableNetworks
struct OperatorInfo {
    string alphaLong;                     // long alpha ONS or EONS
    string alphaShort;                    // short alpha ONS or EONS
    string operatorNumeric;               // 5 or 6 digit numeric code (MCC + MNC)
    OperatorStatus status;
};

struct SmsWriteArgs {
    SmsWriteArgsStatus status;            // Status of message. See TS 27.005 3.1
    string pdu;                           // PDU of message to write, as an ASCII hex string less
                                          // the SMSC address, the TP-layer length is strlen(pdu)/2.
    string smsc;                          // SMSC address in GSM BCD format prefixed by a length
                                          // byte (as expected by TS 27.005) or NULL for default
                                          // SMSC
};

struct CdmaSmsAddress {
    CdmaSmsDigitMode digitMode;           // CdmaSmsDigitMode is of two types : 4 bit and 8 bit.
                                          // For 4-bit type, only "digits" field defined below in
                                          // this struct is used.
    CdmaSmsNumberMode numberMode;         // Used only when digitMode is 8-bit
    CdmaSmsNumberType numberType;         // Used only when digitMode is 8-bit.
                                          // To specify an international address, use the following:
                                          // digitMode = CdmaSmsDigitMode:EIGHT_BIT:
                                          // numberMode = CdmaSmsNumberMode:NOT_DATA_NETWORK
                                          // numberType = CdmaSmsNumberType:INTERNATIONAL_OR_DATA_IP
                                          // numberPlan = CdmaSmsNumberPlan:TELEPHONY
                                          // numberOfDigits = number of digits
                                          // digits = ASCII digits, e.g. '1', '2', '3', '4', and '5'
    CdmaSmsNumberPlan numberPlan;         // Used only when digitMode is 8-bit
    vec<uint8_t> digits;                  // Each byte in this array represents a 4 bit or 8-bit
                                          // digit of address data
};

struct CdmaSmsSubaddress {
    CdmaSmsSubaddressType subaddressType;
    bool odd;                             // true means the last byte's lower 4 bits must be ignored
    vec<uint8_t> digits;                  // Each byte represents an 8-bit digit of subaddress data
};

struct CdmaSmsMessage {
    int32_t teleserviceId;
    bool isServicePresent;
    int32_t serviceCategory;
    CdmaSmsAddress address;
    CdmaSmsSubaddress subAddress;
    vec<uint8_t> bearerData;              // 3GPP2 C.S0015-B, v2.0,
};

struct CdmaSmsAck {
    CdmaSmsErrorClass errorClass;
    int32_t smsCauseCode;                 // As defined in N.S00005, 6.5.2.125.
                                          // Currently, only 35 (resource shortage) and
                                          // 39 (other terminal problem) are reported.
};

struct CdmaBroadcastSmsConfigInfo {
    int32_t serviceCategory;              // serviceCategory defines a Broadcast message identifier
                                          // whose value is 0x0000 - 0xFFFF as defined in
                                          // C.R1001G 9.3.1 and 9.3.2.
    int32_t language;                     // language code of Broadcast Message
                                          // whose value is 0x00 - 0x07 as defined in C.R1001G 9.2.
    bool selected;                        // selected false means message types specified in
                                          // serviceCategory are not accepted, while true means
                                          // accepted.
};

struct CdmaSmsWriteArgs {
    CdmaSmsWriteArgsStatus status;        // Status of message. See TS 27.005 3.1
    CdmaSmsMessage message;
};


/**
 * Which types of Cell Broadcast Message (CBM) are to be received by the ME
 *
 * fromServiceID - uToServiceID defines a range of CBM message identifiers
 * whose value is 0x0000 - 0xFFFF as defined in TS 23.041 9.4.1.2.2 for GMS
 * and 9.4.4.2.2 for UMTS. All other values must be treated as empty
 * CBM message ID.
 *
 * fromCodeScheme - uToCodeScheme defines a range of CBM data coding schemes
 * whose value is 0x00 - 0xFF as defined in TS 23.041 9.4.1.2.3 for GMS
 * and 9.4.4.2.3 for UMTS.
 * All other values must be treated as empty CBM data coding scheme.
 *
 * selected false means message types specified in <fromServiceId, toServiceId>
 * and <fromCodeScheme, toCodeScheme>are not accepted, while true means accepted.
 */
struct GsmBroadcastSmsConfigInfo {
    int32_t fromServiceId;
    int32_t toServiceId;
    int32_t fromCodeScheme;
    int32_t toCodeScheme;
    bool selected;
};

struct CellIdentityGsm {
    string mcc;                           // 3-digit Mobile Country Code, 0..999, empty string if
                                          // unknown
    string mnc;                           // 2 or 3-digit Mobile Network Code, 0..999, empty string
                                          // if unknown
    int32_t lac;                          // 16-bit Location Area Code, 0..65535, INT_MAX if unknown
    int32_t cid;                          // 16-bit GSM Cell Identity described in
                                          // TS 27.007, 0..65535, INT_MAX if unknown
    int32_t arfcn;                        // 16-bit GSM Absolute RF channel number; this value must
                                          // be valid
    uint8_t bsic;                         // 6-bit Base Station Identity Code, 0xFF if unknown
};

struct CellIdentityWcdma {
    string mcc;                           // 3-digit Mobile Country Code, 0..999, empty string if
                                          // unknown
    string mnc;                           // 2 or 3-digit Mobile Network Code, 0..999, empty string
                                          // if unknown
    int32_t lac;                          // 16-bit Location Area Code, 0..65535, INT_MAX if unknown
    int32_t cid;                          // 28-bit UMTS Cell Identity described in
                                          // TS 25.331, 0..268435455, INT_MAX if unknown
    int32_t psc;                          // 9-bit UMTS Primary Scrambling Code described in
                                          // TS 25.331, 0..511; this value must be valid
    int32_t uarfcn;                       // 16-bit UMTS Absolute RF Channel Number; this value must
                                          // be valid
};

struct CellIdentityCdma {
    int32_t networkId;                    // Network Id 0..65535, INT_MAX if unknown
    int32_t systemId;                     // CDMA System Id 0..32767, INT_MAX if unknown
    int32_t baseStationId;                // Base Station Id 0..65535, INT_MAX if unknown
    int32_t longitude;                    // Longitude is a decimal number as specified in
                                          // 3GPP2 C.S0005-A v6.0. It is represented in units of
                                          // 0.25 seconds and ranges from -2592000 to 2592000,
                                          // both values inclusive (corresponding to a range of -180
                                          // to +180 degrees). INT_MAX if unknown
    int32_t latitude;                     // Latitude is a decimal number as specified in
                                          // 3GPP2 C.S0005-A v6.0. It is represented in units of
                                          // 0.25 seconds and ranges from -1296000 to 1296000,
                                          // both values inclusive (corresponding to a range of -90
                                          // to +90 degrees). INT_MAX if unknown
};

struct CellIdentityLte {
    string mcc;                           // 3-digit Mobile Country Code, 0..999, empty string if
                                          // unknown
    string mnc;                           // 2 or 3-digit Mobile Network Code, 0..999, empty string
                                          // if unknown
    int32_t ci;                           // 28-bit Cell Identity described in TS TS 27.007, INT_MAX
                                          // if unknown
    int32_t pci;                          // physical cell id 0..503; this value must be valid
    int32_t tac;                          // 16-bit tracking area code, INT_MAX if unknown
    int32_t earfcn;                       // 18-bit LTE Absolute RF Channel Number; this value must
                                          // be valid
};

struct CellIdentityTdscdma {
    string mcc;                           // 3-digit Mobile Country Code, 0..999, empty string if
                                          // unknown
    string mnc;                           // 2 or 3-digit Mobile Network Code, 0..999, empty string
                                          // if unknown
    int32_t lac;                          // 16-bit Location Area Code, 0..65535, INT_MAX if
                                          // unknown
    int32_t cid;                          // 28-bit UMTS Cell Identity described in
                                          // TS 25.331, 0..268435455, INT_MAX if unknown
    int32_t cpid;                         // 8-bit Cell Parameters ID described in
                                          // TS 25.331, 0..127, INT_MAX if unknown
};

struct CellInfoGsm {
    CellIdentityGsm cellIdentityGsm;
    GsmSignalStrength signalStrengthGsm;
};

struct CellInfoWcdma {
    CellIdentityWcdma cellIdentityWcdma;
    WcdmaSignalStrength signalStrengthWcdma;
};

struct CellInfoCdma {
    CellIdentityCdma cellIdentityCdma;
    CdmaSignalStrength signalStrengthCdma;
    EvdoSignalStrength signalStrengthEvdo;
};

struct CellInfoLte {
    CellIdentityLte cellIdentityLte;
    LteSignalStrength signalStrengthLte;
};

struct CellInfoTdscdma {
    CellIdentityTdscdma cellIdentityTdscdma;
    TdScdmaSignalStrength signalStrengthTdscdma;
};

struct CellInfo {
    CellInfoType cellInfoType;            // cell type for selecting from union CellInfo
    bool registered;                      // true if this cell is registered false if not registered
    TimeStampType timeStampType;          // type of time stamp represented by timeStamp
    uint64_t timeStamp;                   // Time in nanos as returned by ril_nano_time
    // Only one of the below vectors must be of size 1 based on the CellInfoType and others must be
    // of size 0
    vec<CellInfoGsm> gsm;                 // Valid only if type = gsm and size = 1 else must be
                                          // empty
    vec<CellInfoCdma> cdma;               // Valid only if type = cdma and size = 1 else must be
                                          // empty
    vec<CellInfoLte> lte;                 // Valid only if type = lte and size = 1 else must be
                                          // empty
    vec<CellInfoWcdma> wcdma;             // Valid only if type = wcdma and size = 1 else must be
                                          // empty
    vec<CellInfoTdscdma> tdscdma;         // Valid only if type = tdscdma and size = 1 else must be
                                          // empty
};

struct CellIdentity {
    CellInfoType cellInfoType;            // cell type for selecting from union CellInfo
    // Only one of the below vectors must be of size 1, based on a valid CellInfoType and
    // others must be of size 0. If cell info type is NONE, then all the vectors
    // must be of size 0.
    vec<CellIdentityGsm> cellIdentityGsm;
    vec<CellIdentityWcdma> cellIdentityWcdma;
    vec<CellIdentityCdma> cellIdentityCdma;
    vec<CellIdentityLte> cellIdentityLte;
    vec<CellIdentityTdscdma> cellIdentityTdscdma;
};

struct VoiceRegStateResult {
    RegState regState;                    // Valid reg states are NOT_REG_MT_NOT_SEARCHING_OP,
                                          // REG_HOME, NOT_REG_MT_SEARCHING_OP, REG_DENIED,
                                          // UNKNOWN, REG_ROAMING defined in RegState
    int32_t rat;                          // indicates the available voice radio technology,
                                          // valid values as defined by RadioTechnology.
    bool cssSupported;                    // concurrent services support indicator. if
                                          // registered on a CDMA system.
                                          // false - Concurrent services not supported,
                                          // true - Concurrent services supported
    int32_t roamingIndicator;             // TSB-58 Roaming Indicator if registered
                                          // on a CDMA or EVDO system or -1 if not.
                                          // Valid values are 0-255.
    int32_t systemIsInPrl;                // indicates whether the current system is in the
                                          // PRL if registered on a CDMA or EVDO system or -1 if
                                          // not. 0=not in the PRL, 1=in the PRL
    int32_t defaultRoamingIndicator;      // default Roaming Indicator from the PRL,
                                          // if registered on a CDMA or EVDO system or -1 if not.
                                          // Valid values are 0-255.
    int32_t reasonForDenial;              // reasonForDenial if registration state is 3
                                          // (Registration denied) this is an enumerated reason why
                                          // registration was denied. See 3GPP TS 24.008,
                                          // 10.5.3.6 and Annex G.
                                          // 0 - General
                                          // 1 - Authentication Failure
                                          // 2 - IMSI unknown in HLR
                                          // 3 - Illegal MS
                                          // 4 - Illegal ME
                                          // 5 - PLMN not allowed
                                          // 6 - Location area not allowed
                                          // 7 - Roaming not allowed
                                          // 8 - No Suitable Cells in this Location Area
                                          // 9 - Network failure
                                          // 10 - Persistent location update reject
                                          // 11 - PLMN not allowed
                                          // 12 - Location area not allowed
                                          // 13 - Roaming not allowed in this Location Area
                                          // 15 - No Suitable Cells in this Location Area
                                          // 17 - Network Failure
                                          // 20 - MAC Failure
                                          // 21 - Sync Failure
                                          // 22 - Congestion
                                          // 23 - GSM Authentication unacceptable
                                          // 25 - Not Authorized for this CSG
                                          // 32 - Service option not supported
                                          // 33 - Requested service option not subscribed
                                          // 34 - Service option temporarily out of order
                                          // 38 - Call cannot be identified
                                          // 48-63 - Retry upon entry into a new cell
                                          // 95 - Semantically incorrect message
                                          // 96 - Invalid mandatory information
                                          // 97 - Message type non-existent or not implemented
                                          // 98 - Message type not compatible with protocol state
                                          // 99 - Information element non-existent or not implemented
                                          // 100 - Conditional IE error
                                          // 101 - Message not compatible with protocol state
                                          // 111 - Protocol error, unspecified
    CellIdentity cellIdentity;
};

struct DataRegStateResult {
    RegState regState;                    // Valid reg states are NOT_REG_MT_NOT_SEARCHING_OP,
                                          // REG_HOME, NOT_REG_MT_SEARCHING_OP, REG_DENIED,
                                          // UNKNOWN, REG_ROAMING defined in RegState
    int32_t rat;                          // indicates the available data radio technology,
                                          // valid values as defined by RadioTechnology.
    int32_t reasonDataDenied;             // if registration state is 3 (Registration
                                          // denied) this is an enumerated reason why
                                          // registration was denied. See 3GPP TS 24.008,
                                          // Annex G.6 "Additional cause codes for GMM".
                                          // 7 == GPRS services not allowed
                                          // 8 == GPRS services and non-GPRS services not allowed
                                          // 9 == MS identity cannot be derived by the network
                                          // 10 == Implicitly detached
                                          // 14 == GPRS services not allowed in this PLMN
                                          // 16 == MSC temporarily not reachable
                                          // 40 == No PDP context activated
    int32_t maxDataCalls;                 // The maximum number of simultaneous Data Calls that
                                          // must be established using setupDataCall().
    CellIdentity cellIdentity;
};

struct GsmSmsMessage {
    string smscPdu;                       // SMSC address in GSM BCD format prefixed by a length
                                          // byte (as expected by TS 27.005) or empty string for
                                          // default SMSC
    string pdu;                           // SMS in PDU format as an ASCII hex string less the
                                          // SMSC address. TP-Layer-Length is be "strlen(pdu)/2
};

struct ImsSmsMessage {
    RadioTechnologyFamily tech;
    bool retry;                           // false == not retry, true == retry */
    int32_t messageRef;                   // Valid field if retry is set to true.
                                          // Contains messageRef from SendSmsResult struct
                                          // corresponding to failed MO SMS.
    // Only one of the below vectors must be of size 1 based on the RadioTechnologyFamily and others
    // must be of size 0
    vec<CdmaSmsMessage> cdmaMessage;      // Valid field if tech is 3GPP2 and size = 1 else must be
                                          // empty
    vec<GsmSmsMessage> gsmMessage;        // Valid field if tech is 3GPP and size = 1 else must be
                                          // empty
};

struct SimApdu {
    int32_t sessionId;                    // "sessionid" from TS 27.007 +CGLA command. Must be
                                          // ignored for +CSIM command.
    // Following fields are used to derive the APDU ("command" and "length"
    // values in TS 27.007 +CSIM and +CGLA commands).
    int32_t cla;
    int32_t instruction;
    int32_t p1;
    int32_t p2;
    int32_t p3;                           // A negative P3 implies a 4 byte APDU.
    string data;                          // In hex string format ([a-fA-F0-9]*).
};

struct NvWriteItem {
    NvItem itemId;
    string value;
};

struct SelectUiccSub {
    int32_t slot;
    int32_t appIndex;                     // array subscriptor from
                                          // applications[RadioConst:CARD_MAX_APPS] in
                                          // getIccCardStatus()
    SubscriptionType subType;
    UiccSubActStatus actStatus;
};

struct HardwareConfigModem {
    int32_t rilModel;
    uint32_t rat;                         // bitset - ref. RadioTechnology.
    int32_t maxVoice;
    int32_t maxData;
    int32_t maxStandby;
};

struct HardwareConfigSim {
    string modemUuid;                     // RadioConst:MAX_UUID_LENGTH is max length of the string
};

struct HardwareConfig {
    HardwareConfigType type;
    string uuid;                          // RadioConst:MAX_UUID_LENGTH is max length of the string
    HardwareConfigState state;

    // Only one of the below vectors must have size = 1 based on the HardwareConfigType and other
    // must have size = 0.
    vec<HardwareConfigModem> modem;       // Valid only if type is Modem and size = 1 else must be
                                          // empty
    vec<HardwareConfigSim> sim;           // Valid only if type is SIM or else empty and size = 1
                                          // else must be empty
};

struct DataProfileInfo {
    DataProfileId profileId;              // id of the data profile
    string apn;                           // The APN to connect to
    string protocol;                      // One of the PDP_type values in TS 27.007 section 10.1.1.
                                          // For example, "IP", "IPV6", "IPV4V6", or "PPP".
    string roamingProtocol;               // one of the PDP_type values in TS 27.007 section 10.1.1
                                          // used on roaming network. For example, "IP", "IPV6",
                                          // "IPV4V6", or "PPP".
    ApnAuthType authType;                 // APN authentication type
    string user;                          // The username for APN, or empty string
    string password;                      // The password for APN, or empty string
    DataProfileInfoType type;             // Data profile technology type
    int32_t maxConnsTime;                 // The period in seconds to limit the maximum connections
    int32_t maxConns;                     // The maximum connections during maxConnsTime
    int32_t waitTime;                     // The required wait time in seconds after a successful UE
                                          // initiated disconnect of a given PDN connection before
                                          // the device can send a new PDN connection request for
                                          // that given PDN
    bool enabled;                         // True to enable the profile, false to disable
    bitfield<ApnTypes> supportedApnTypesBitmap; // Supported APN types bitmap. See ApnTypes for the
                                          // value of each bit.
    bitfield<RadioAccessFamily> bearerBitmap; // The bearer bitmap. See RadioAccessFamily for the
                                          // value of each bit.
    int32_t mtu;                          // Maximum transmission unit (MTU) size in bytes
    MvnoType mvnoType;                    // The MVNO matching data type
    string mvnoMatchData;                 // MVNO matching data. This is defined by the carrier.
                                          // For example,
                                          //      SPN like: "A MOBILE", "BEN NL", etc...
                                          //      IMSI like: "302720x94", "2060188", etc...
                                          //      GID like: "4E", "33", etc...
};

struct RadioCapability {
    int32_t session;                      // Unique session value defined by framework returned in
                                          // all "responses/unsol"
    RadioCapabilityPhase phase;
    bitfield<RadioAccessFamily> raf;      // 32-bit bitmap of RadioAccessFamily
    string logicalModemUuid;              // A UUID typically "com.xxxx.lmX where X is the logical
                                          // modem. RadioConst:MAX_UUID_LENGTH is the max
                                          // length
    RadioCapabilityStatus status;
};

struct LceStatusInfo {
    LceStatus lceStatus;
    uint8_t actualIntervalMs;             // actual LCE reporting interval,
                                          // meaningful only if LceStatus = ACTIVE.
};

struct LceDataInfo {
    uint32_t lastHopCapacityKbps;         // last-hop cellular capacity: kilobits/second.
    uint8_t confidenceLevel;              // capacity estimate confidence: 0-100
    bool lceSuspended;                    // LCE report going to be suspended? (e.g., radio
                                          // moves to inactive state or network type change)
                                          // true = suspended;
                                          // false = not suspended.
};

struct ActivityStatsInfo {
    uint32_t sleepModeTimeMs;             // total time (in ms) when modem is in a low power or
                                          // sleep state
    uint32_t idleModeTimeMs;              // total time (in ms) when modem is awake but neither
                                          // the transmitter nor receiver are active/awake
    uint32_t[RadioConst:NUM_TX_POWER_LEVELS] txmModetimeMs;
                                          // Each index represent total time (in ms) during which
                                          // the transmitter is active/awake for a particular
                                          // power range as shown below.
                                          // index 0 = tx_power < 0dBm
                                          // index 1 = 0dBm < tx_power < 5dBm
                                          // index 2 = 5dBm < tx_power < 15dBm
                                          // index 3 = 15dBm < tx_power < 20dBm
                                          // index 4 = tx_power > 20dBm
    uint32_t rxModeTimeMs;                // total time (in ms) for which receiver is
                                          // active/awake and the transmitter is inactive
};

struct Carrier {
    string mcc;
    string mnc;
    CarrierMatchType matchType;           // Specify match type for the carrier.
                                          // If it’s ALL, matchData is empty string;
                                          // otherwise, matchData is the value for the match type.
    string matchData;
};

struct CarrierRestrictions {
    vec<Carrier> allowedCarriers;         // Allowed carriers
    vec<Carrier> excludedCarriers;        // Explicitly excluded carriers
                                          // which match allowed_carriers. Eg. allowedCarriers
                                          // match mcc/mnc, excludedCarriers has same mcc/mnc and
                                          // gid1 is ABCD. It means except the carrier whose gid1
                                          // is ABCD, all carriers with the same mcc/mnc are
                                          // allowed.
};

struct SuppSvcNotification {
    bool isMT;                            // notification type
                                          // false = MO intermediate result code
                                          // true = MT unsolicited result code
    int32_t code;                         // result code. See 27.007 7.17.
    int32_t index;                        // CUG index. See 27.007 7.17.
    int32_t type;                         // "type" from 27.007 7.17 (MT only).
    string number;                        // "number" from 27.007 7.17
                                          // (MT only, may be empty string).
};

struct SimRefreshResult {
    SimRefreshType type;
    int32_t efId;                         // is the EFID of the updated file if the result is
                                          // SIM_FILE_UPDATE or 0 for any other result.
    string aid;                           // is AID(application ID) of the card application
                                          // See ETSI 102.221 8.1 and 101.220 4
                                          // For SIM_FILE_UPDATE result it must be set to AID of
                                          // application in which updated EF resides or it must be
                                          // empty string if EF is outside of an application.
                                          // For SIM_INIT result this field is set to AID of
                                          // application that caused REFRESH
                                          // For SIM_RESET result it is empty string.
};

/** CDMA Signal Information Record as defined in C.S0005 section 3.7.5.5 */
struct CdmaSignalInfoRecord {
    bool isPresent;                       // true if signal information record is present
    int8_t signalType;                    // as defined 3.7.5.5-1
    int8_t alertPitch;                    // as defined 3.7.5.5-2
    int8_t signal;                        // as defined 3.7.5.5-3, 3.7.5.5-4 or 3.7.5.5-5
};

struct CdmaCallWaiting {
    string number;                        // Remote party number
    CdmaCallWaitingNumberPresentation numberPresentation;
    string name;                          // Remote party name
    CdmaSignalInfoRecord signalInfoRecord;
    // Number type/Number plan required to support International Call Waiting
    CdmaCallWaitingNumberType numberType;
    CdmaCallWaitingNumberPlan numberPlan;
};

/**
 * Display Info Rec as defined in C.S0005 section 3.7.5.1
 * Extended Display Info Rec as defined in C.S0005 section 3.7.5.16
 * Note: the Extended Display info rec contains multiple records of the
 * form: display_tag, display_len, and display_len occurrences of the
 * char field if the display_tag is not 10000000 or 10000001.
 * To save space, the records are stored consecutively in a byte buffer.
 * The display_tag, display_len and chari fields are all 1 byte.
 */
struct CdmaDisplayInfoRecord {
    string alphaBuf;                      // Max length = RadioConst:CDMA_ALPHA_INFO_BUFFER_LENGTH
};

/**
 * Called Party Number Info Rec as defined in C.S0005 section 3.7.5.2
 * Calling Party Number Info Rec as defined in C.S0005 section 3.7.5.3
 * Connected Number Info Rec as defined in C.S0005 section 3.7.5.4
 */
struct CdmaNumberInfoRecord {
    string number;                        // Max length = RADIP_CDMA_NUMBER_INFO_BUFFER_LENGTH
    uint8_t numberType;
    uint8_t numberPlan;
    uint8_t pi;
    uint8_t si;
};

struct  CdmaRedirectingNumberInfoRecord{
    CdmaNumberInfoRecord redirectingNumber;
    CdmaRedirectingReason redirectingReason; // redirectingReason is set to UNKNOWN if not included
};

/** Line Control Information Record as defined in C.S0005 section 3.7.5.15 */
struct CdmaLineControlInfoRecord {
    uint8_t lineCtrlPolarityIncluded;
    uint8_t lineCtrlToggle;
    uint8_t lineCtrlReverse;
    uint8_t lineCtrlPowerDenial;
};

/** T53 CLIR Information Record */
struct CdmaT53ClirInfoRecord {
    uint8_t cause;
};

/** T53 Audio Control Information Record */
struct CdmaT53AudioControlInfoRecord {
    uint8_t upLink;
    uint8_t downLink;
};

struct CdmaInformationRecord {
    CdmaInfoRecName name;
    // Only one of the below vectors must have size = 1 based on the
    // CdmaInfoRecName. All other vectors must have size 0.
    vec<CdmaDisplayInfoRecord> display;   // Display and Extended Display Info Rec
    vec<CdmaNumberInfoRecord> number;     // Called Party Number, Calling Party Number, Connected
                                          // number Info Rec
    vec<CdmaSignalInfoRecord> signal;     // Signal Info Rec
    vec<CdmaRedirectingNumberInfoRecord> redir; // Redirecting Number Info Rec
    vec<CdmaLineControlInfoRecord> lineCtrl;    // Line Control Info Rec
    vec<CdmaT53ClirInfoRecord> clir;      // T53 CLIR Info Rec
    vec<CdmaT53AudioControlInfoRecord> audioCtrl; // T53 Audio Control Info Rec
};

struct CdmaInformationRecords {
    vec<CdmaInformationRecord> infoRec;   // Max length = RadioConst:CDMA_MAX_NUMBER_OF_INFO_RECS
};

struct CfData {
    vec<CallForwardInfo> cfInfo;          // This is the response data
                                          // for SS request to query call
                                          // forward status. see getCallForwardStatus()
                                          // Max size = RadioConst:NUM_SERVICE_CLASSES
};

struct SsInfoData {
    vec<int32_t> ssInfo;                  // This is the response data for all of the SS GET/SET
                                          // Radio requests. E.g. IRadio.getClir() returns
                                          // two ints, so first two values of ssInfo[] will be
                                          // used for response if serviceType is SS_CLIR and
                                          // requestType is SS_INTERROGATION
                                          // Max size = RadioConst:SS_INFO_MAX
};

struct StkCcUnsolSsResult {
    SsServiceType serviceType;
    SsRequestType requestType;
    SsTeleserviceType teleserviceType;
    bitfield<SuppServiceClass> serviceClass;
    RadioError result;
    // Only one of the below vectors may contain values and other must be empty
    vec<SsInfoData> ssInfo;               // Valid only for all SsServiceType except
                                          // SsServiceType:CF_* else empty.
    vec<CfData> cfData;                   // Valid for SsServiceType:CF_* else empty
};

struct PcoDataInfo {
    int32_t cid;                          // Context ID, uniquely identifies this call
    string bearerProto;                   // One of the PDP_type values in TS 27.007 section 10.1.1.
                                          // For example, "IP", "IPV6", "IPV4V6"
    int32_t pcoId;                        // The protocol ID for this box. Note that only IDs from
                                          // FF00H - FFFFH are accepted. If more than one is
                                          // included from the network, multiple calls must be made
                                          // to send all of them.
    vec<uint8_t> contents;                // Carrier-defined content. It is binary, opaque and
                                          // loosely defined in LTE Layer 3 spec 24.008
};
