//
// 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.
//

syntax = "proto2";

package clearcut.connectivity;

option java_package = "com.android.internal.telephony";
option java_outer_classname = "TelephonyProto";

// The information about Telephony events.
message TelephonyLog {

  // Events logged by telephony services
  repeated TelephonyEvent events = 1;

  // Voice/Video call sessions
  repeated TelephonyCallSession call_sessions = 2;

  // Send/Receive SMS sessions
  repeated SmsSession sms_sessions = 3;

  // Telephony Histograms
  repeated TelephonyHistogram histograms = 4;

  // Indicating some telephony events are dropped
  optional bool events_dropped = 5;

  // The start time of this log
  optional Time start_time = 6;

  // The end time of this log
  optional Time end_time = 7;

  // Modem power stats
  optional ModemPowerStats modem_power_stats = 8;
}

// The time information
message Time {
  // The system time in milli seconds. This represents the actual
  // time of the events.
  optional int64 system_timestamp_millis = 1;

  // The time since boot in milli seconds.
  // This is used for calculating the time interval between events. Different
  // from the system time, this won't be affected by time changed by the network or users.
  optional int64 elapsed_timestamp_millis = 2;
}

// Telephony Histogram
message TelephonyHistogram {

  // Type of histogram
  optional int32 category = 1;

  // Unique Id identifying a sample within
  // particular category of the histogram.
  optional int32 id = 2;

  // Min time taken in millis.
  optional int32 min_time_millis = 3;

  // Max time taken in millis.
  optional int32 max_time_millis = 4;

  // Average time taken in millis.
  optional int32 avg_time_millis = 5;

  // Total count of histogram samples.
  optional int32 count = 6;

  // Total number of time ranges expected
  // (must be greater than 1).
  optional int32 bucket_count = 7;

  // Array storing endpoints of range buckets.
  repeated int32 bucket_end_points = 8;

  // Array storing counts for each time range
  // starting from smallest value range.
  repeated int32 bucket_counters = 9;
}

// Telephony related user settings
message TelephonySettings {

  // NETWORK_MODE_* See ril.h PREF_NET_TYPE_XXXX
  enum RilNetworkMode {

    // Mode is unknown.
    NETWORK_MODE_UNKNOWN = 0;

    // GSM/WCDMA (WCDMA preferred). Note the following values are all off by 1.
    NETWORK_MODE_WCDMA_PREF = 1;

    // GSM only
    NETWORK_MODE_GSM_ONLY = 2;

    // WCDMA only
    NETWORK_MODE_WCDMA_ONLY = 3;

    // GSM/WCDMA (auto mode, according to PRL)
    NETWORK_MODE_GSM_UMTS = 4;

    // CDMA and EvDo (auto mode, according to PRL)
    NETWORK_MODE_CDMA = 5;

    // CDMA only
    NETWORK_MODE_CDMA_NO_EVDO = 6;

    // EvDo only
    NETWORK_MODE_EVDO_NO_CDMA = 7;

    // GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL)
    NETWORK_MODE_GLOBAL = 8;

    // LTE, CDMA and EvDo
    NETWORK_MODE_LTE_CDMA_EVDO = 9;

    // LTE, GSM/WCDMA
    NETWORK_MODE_LTE_GSM_WCDMA = 10;

    // LTE, CDMA, EvDo, GSM/WCDMA
    NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA = 11;

    // LTE Only mode
    NETWORK_MODE_LTE_ONLY = 12;

    // LTE/WCDMA
    NETWORK_MODE_LTE_WCDMA = 13;

    // TD-SCDMA only
    NETWORK_MODE_TDSCDMA_ONLY = 14;

    // TD-SCDMA and WCDMA
    NETWORK_MODE_TDSCDMA_WCDMA = 15;

    // TD-SCDMA and LTE
    NETWORK_MODE_LTE_TDSCDMA = 16;

    // TD-SCDMA and GSM
    NETWORK_MODE_TDSCDMA_GSM = 17;

    // TD-SCDMA,GSM and LTE
    NETWORK_MODE_LTE_TDSCDMA_GSM = 18;

    // TD-SCDMA, GSM/WCDMA
    NETWORK_MODE_TDSCDMA_GSM_WCDMA = 19;

    // TD-SCDMA, WCDMA and LTE
    NETWORK_MODE_LTE_TDSCDMA_WCDMA = 20;

    // TD-SCDMA, GSM/WCDMA and LTE
    NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA = 21;

    // TD-SCDMA,EvDo,CDMA,GSM/WCDMA
    NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 22;

    // TD-SCDMA/LTE/GSM/WCDMA, CDMA, and EvDo
    NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 23;
  }

  // Constants for WiFi Calling mode
  enum WiFiCallingMode {

    // Calling mode is unknown.
    WFC_MODE_UNKNOWN = 0;

    WFC_MODE_WIFI_ONLY = 1;

    WFC_MODE_CELLULAR_PREFERRED = 2;

    WFC_MODE_WIFI_PREFERRED = 3;
  }

  // If the device is in airplane mode.
  optional bool is_airplane_mode = 1;

  // If cell-data has been enabled.
  optional bool is_cellular_data_enabled = 2;

  // If cell-roaming has been enabled.
  optional bool is_data_roaming_enabled = 3;

  // Preferred network mode.
  optional RilNetworkMode preferred_network_mode = 4;

  // If enhanced mode enabled.
  optional bool is_enhanced_4g_lte_mode_enabled = 5;

  // If wifi has been enabled.
  optional bool is_wifi_enabled = 6;

  // If wifi-calling has been enabled.
  optional bool is_wifi_calling_enabled = 7;

  // Wifi-calling Mode.
  optional WiFiCallingMode wifi_calling_mode = 8;

  // If video over LTE enabled.
  optional bool is_vt_over_lte_enabled = 9;

  // If video over wifi enabled.
  optional bool is_vt_over_wifi_enabled = 10;
}

// Contains phone state and service related information.
message TelephonyServiceState {

  // The information about cellular network operator
  message TelephonyOperator {

    // Name in long alphanumeric format
    optional string alpha_long = 1;

    // Name in short alphanumeric format
    optional string alpha_short = 2;

    // Numeric id.
    // In GSM/UMTS, numeric format is 3 digit country code plus 2 or 3 digit
    // network code. Same as MCC/MNC.
    optional string numeric = 3;
  }

  // Roaming type
  enum RoamingType {

    // Unknown. The default value. Different from ROAMING_TYPE_UNKNOWN.
    UNKNOWN = -1;

    // In home network
    ROAMING_TYPE_NOT_ROAMING = 0;

    // In a roaming network, but we can not tell
    // if it's domestic or international
    ROAMING_TYPE_UNKNOWN = 1;

    // In domestic roaming network
    ROAMING_TYPE_DOMESTIC = 2;

    // In international roaming network
    ROAMING_TYPE_INTERNATIONAL = 3;
  }

  // Current registered operator
  optional TelephonyOperator voice_operator = 1;

  // Current registered data network operator
  optional TelephonyOperator data_operator = 2;

  // Current voice network roaming type
  optional RoamingType voice_roaming_type = 3 [default = UNKNOWN];

  // Current data network roaming type
  optional RoamingType data_roaming_type = 4 [default = UNKNOWN];

  // Current voice radio technology
  optional RadioAccessTechnology voice_rat = 5 [default = UNKNOWN];

  // Current data radio technology
  optional RadioAccessTechnology data_rat = 6 [default = UNKNOWN];
}

// Radio access families
enum RadioAccessTechnology {

  // This is the default value. Different from RAT_UNKNOWN.
  UNKNOWN = -1;

  // Airplane mode, out of service, or when the modem cannot determine
  // the RAT.
  RAT_UNKNOWN = 0;

  RAT_GPRS = 1;

  RAT_EDGE = 2;

  RAT_UMTS = 3;

  RAT_IS95A = 4;

  RAT_IS95B = 5;

  RAT_1XRTT = 6;

  RAT_EVDO_0 = 7;

  RAT_EVDO_A = 8;

  RAT_HSDPA = 9;

  RAT_HSUPA = 10;

  RAT_HSPA = 11;

  RAT_EVDO_B = 12;

  RAT_EHRPD = 13;

  RAT_LTE = 14;

  RAT_HSPAP = 15;

  RAT_GSM = 16;

  RAT_TD_SCDMA = 17;

  RAT_IWLAN = 18;

  RAT_LTE_CA = 19;
}

// The information about IMS errors
// https://cs.corp.google.com/#android/frameworks/base/telephony/java/com/android/ims/ImsReasonInfo.java
message ImsReasonInfo {

  // Main reason code.
  optional int32 reason_code = 1;

  // Extra code value; it depends on the code value.
  optional int32 extra_code = 2;

  // Additional message of the reason info. We get this from the modem.
  optional string extra_message = 3;
}

// The information about state connection between IMS service and IMS server
message ImsConnectionState {

  // Current state
  optional State state = 1;

  // If DISCONNECTED then this field may have additional information about
  // connection problem.
  optional ImsReasonInfo reason_info = 2;

  // Posible states
  enum State {

    // State is unknown.
    STATE_UNKNOWN = 0;

    CONNECTED = 1;

    PROGRESSING = 2;

    DISCONNECTED = 3;

    RESUMED = 4;

    SUSPENDED = 5;
  }
}

// The information about current capabilities of IMS service
message ImsCapabilities {

  optional bool voice_over_lte = 1;

  optional bool voice_over_wifi = 2;

  optional bool video_over_lte = 3;

  optional bool video_over_wifi = 4;

  optional bool ut_over_lte = 5;

  optional bool ut_over_wifi = 6;
}

// Errors returned by RIL
enum RilErrno {

  // type is unknown.
  RIL_E_UNKNOWN = 0;

  // Note the following values are all off by 1.
  RIL_E_SUCCESS = 1;

  // If radio did not start or is resetting
  RIL_E_RADIO_NOT_AVAILABLE = 2;

  RIL_E_GENERIC_FAILURE = 3;

  // for PIN/PIN2 methods only!
  RIL_E_PASSWORD_INCORRECT = 4;

  // Operation requires SIM PIN2 to be entered
  RIL_E_SIM_PIN2 = 5;

  // Operation requires SIM PIN2 to be entered
  RIL_E_SIM_PUK2 = 6;

  RIL_E_REQUEST_NOT_SUPPORTED = 7;

  RIL_E_CANCELLED = 8;

  // data ops are not allowed during voice call on a Class C GPRS device
  RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL = 9;

  // data ops are not allowed before device registers in network
  RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW = 10;

  // fail to send sms and need retry
  RIL_E_SMS_SEND_FAIL_RETRY = 11;

  // fail to set the location where CDMA subscription shall be retrieved
  // because of SIM or RUIM card absent
  RIL_E_SIM_ABSENT = 12;

  // fail to find CDMA subscription from specified location
  RIL_E_SUBSCRIPTION_NOT_AVAILABLE = 13;

  // HW does not support preferred network type
  RIL_E_MODE_NOT_SUPPORTED = 14;

  // command failed because recipient is not on FDN list
  RIL_E_FDN_CHECK_FAILURE = 15;

  // network selection failed due to illegal SIM or ME
  RIL_E_ILLEGAL_SIM_OR_ME = 16;

  // no logical channel available
  RIL_E_MISSING_RESOURCE = 17;

  // application not found on SIM
  RIL_E_NO_SUCH_ELEMENT = 18;

  // DIAL request modified to USSD
  RIL_E_DIAL_MODIFIED_TO_USSD = 19;

  // DIAL request modified to SS
  RIL_E_DIAL_MODIFIED_TO_SS = 20;

  // DIAL request modified to DIAL with different data
  RIL_E_DIAL_MODIFIED_TO_DIAL = 21;

  // USSD request modified to DIAL
  RIL_E_USSD_MODIFIED_TO_DIAL = 22;

  // USSD request modified to SS
  RIL_E_USSD_MODIFIED_TO_SS = 23;

  // USSD request modified to different USSD request
  RIL_E_USSD_MODIFIED_TO_USSD = 24;

  // SS request modified to DIAL
  RIL_E_SS_MODIFIED_TO_DIAL = 25;

  // SS request modified to USSD
  RIL_E_SS_MODIFIED_TO_USSD = 26;

  // Subscription not supported by RIL
  RIL_E_SUBSCRIPTION_NOT_SUPPORTED = 27;

  // SS request modified to different SS request
  RIL_E_SS_MODIFIED_TO_SS = 28;

  // LCE service not supported(36 in RILConstants.java. This is a mistake.
  // The value should be off by 1 ideally.)
  RIL_E_LCE_NOT_SUPPORTED = 36 [deprecated=true];

  // LCE service not supported
  RIL_E_LCE_NOT_SUPPORTED_NEW = 37;

  // Not sufficient memory to process the request
  RIL_E_NO_MEMORY = 38;

  // Modem hit unexpected error scenario while handling this request
  RIL_E_INTERNAL_ERR = 39;

  // Hit platform or system error
  RIL_E_SYSTEM_ERR = 40;

  // Vendor RIL got unexpected or incorrect response from modem for this request
  RIL_E_MODEM_ERR = 41;

  // Unexpected request for the current state
  RIL_E_INVALID_STATE = 42;

  // Not sufficient resource to process the request
  RIL_E_NO_RESOURCES = 43;

  // Received error from SIM card
  RIL_E_SIM_ERR = 44;

  // Received invalid arguments in request
  RIL_E_INVALID_ARGUMENTS = 45;

  // Cannot process the request in current SIM state
  RIL_E_INVALID_SIM_STATE = 46;

  // Cannot process the request in current Modem state
  RIL_E_INVALID_MODEM_STATE = 47;

  // Received invalid call id in request
  RIL_E_INVALID_CALL_ID = 48;

  // ACK received when there is no SMS to ack
  RIL_E_NO_SMS_TO_ACK = 49;

  // Received error from network
  RIL_E_NETWORK_ERR = 50;

  // Operation denied due to overly-frequent requests
  RIL_E_REQUEST_RATE_LIMITED = 51;

  // SIM is busy
  RIL_E_SIM_BUSY = 52;

  // The target EF is full
  RIL_E_SIM_FULL = 53;

  // Request is rejected by network
  RIL_E_NETWORK_REJECT = 54;

  // Not allowed the request now
  RIL_E_OPERATION_NOT_ALLOWED = 55;

  // The request record is empty
  RIL_E_EMPTY_RECORD = 56;

  // Invalid sms format
  RIL_E_INVALID_SMS_FORMAT = 57;

  // Message not encoded properly
  RIL_E_ENCODING_ERR = 58;

  // SMSC address specified is invalid
  RIL_E_INVALID_SMSC_ADDRESS = 59;

  // No such entry present to perform the request
  RIL_E_NO_SUCH_ENTRY = 60;

  // Network is not ready to perform the request
  RIL_E_NETWORK_NOT_READY = 61;

  // Device does not have this value provisioned
  RIL_E_NOT_PROVISIONED = 62;

  // Device does not have subscription
  RIL_E_NO_SUBSCRIPTION = 63;

  // Network cannot be found
  RIL_E_NO_NETWORK_FOUND = 64;

  // Operation cannot be performed because the device is currently in use
  RIL_E_DEVICE_IN_USE = 65;

  // Operation aborted
  RIL_E_ABORTED = 66;

  // Invalid response sent by vendor code
  RIL_E_INVALID_RESPONSE = 67;
}

// Errors returned by ImsService
enum ImsServiceErrno {

  // The operation error is unknown
  IMS_E_UNKNOWN = 0;
  // The operation has succeeded
  IMS_E_SUCCESS = 1;
  // Sending an SMS over IMS has failed. Do not retry over IMS again or fallback to CS.
  IMS_E_SMS_SEND_STATUS_ERROR = 2;
  // Sending an SMS over IMS has failed. Retry over IMS again.
  IMS_E_SMS_SEND_STATUS_ERROR_RETRY = 3;
  // Sending an SMS over IMS has failed. Fallback to sending the SMS over CS.
  IMS_E_SMS_SEND_STATUS_ERROR_FALLBACK = 4;
}

// PDP_type values in TS 27.007 section 10.1.1.
enum PdpType {

  // type is unknown.
  PDP_UNKNOWN = 0;

  PDP_TYPE_IP = 1;

  PDP_TYPE_IPV6 = 2;

  PDP_TYPE_IPV4V6 = 3;

  PDP_TYPE_PPP = 4;
}

// The information about packet data connection
message RilDataCall {

  // Context ID, uniquely identifies this call
  optional int32 cid = 1;

  // One of the PDP_type values in TS 27.007 section 10.1.1
  optional PdpType type = 2;

  // The network interface name e.g. wlan0, rmnet_data0.
  optional string iframe = 3;
}

message TelephonyEvent {

  enum Type {

    // Unknown event
    UNKNOWN = 0;

    // Telephony related user settings changed
    SETTINGS_CHANGED = 1;

    // Phone state changed
    RIL_SERVICE_STATE_CHANGED = 2;

    // IMS connected/disconnected
    IMS_CONNECTION_STATE_CHANGED = 3;

    // IMS Voice, Video and Ut capabilities changed
    IMS_CAPABILITIES_CHANGED = 4;

    // Setup a packet data connection
    DATA_CALL_SETUP = 5;

    // RIL request result
    DATA_CALL_SETUP_RESPONSE = 6;

    // Notification that new data call has appeared in the list
    // or old data call has removed.
    DATA_CALL_LIST_CHANGED = 7;

    // Deactivate packet data connection
    DATA_CALL_DEACTIVATE = 8;

    // RIL request result
    DATA_CALL_DEACTIVATE_RESPONSE = 9;

    // Logging a data stall + its action
    DATA_STALL_ACTION = 10;

    // Modem Restarted. Logging a baseband version and reason for restart
    // along with the event if it is available
    MODEM_RESTART = 11;

    // System time overwritten by NITZ (Network time)
    NITZ_TIME = 12;

    // Carrier Identification Matching Event
    CARRIER_ID_MATCHING = 13;

    // Carrier Key Change event.
    CARRIER_KEY_CHANGED = 14;
  }

  // Setup a packet data connection
  message RilSetupDataCall {

    // See ril.h RIL_REQUEST_SETUP_DATA_CALL
    enum RilDataProfile {

      // type is unknown.
      RIL_DATA_UNKNOWN = 0;

      RIL_DATA_PROFILE_DEFAULT = 1;

      RIL_DATA_PROFILE_TETHERED = 2;

      RIL_DATA_PROFILE_IMS = 3;

      RIL_DATA_PROFILE_FOTA = 4;

      RIL_DATA_PROFILE_CBS = 5;

      RIL_DATA_PROFILE_OEM_BASE = 6;

      RIL_DATA_PROFILE_INVALID = 7;
    }

    // Radio technology to use
    optional RadioAccessTechnology rat = 1 [default = UNKNOWN];

    // optional RIL_DataProfile
    optional RilDataProfile data_profile = 2;

    // APN to connect to if radio technology is GSM/UMTS
    optional string apn = 3;

    // the connection type to request
    optional PdpType type = 4;
  }

  // RIL response to RilSetupDataCall
  message RilSetupDataCallResponse {

    // Copy of enum RIL_DataCallFailCause defined at ril.h
    enum RilDataCallFailCause {

      // Failure reason is unknown.
      PDP_FAIL_UNKNOWN = 0;

      // No error, connection ok
      PDP_FAIL_NONE = 1;

      PDP_FAIL_OPERATOR_BARRED = 8;

      PDP_FAIL_NAS_SIGNALLING = 14;

      PDP_FAIL_LLC_SNDCP = 25;

      PDP_FAIL_INSUFFICIENT_RESOURCES = 26;

      PDP_FAIL_MISSING_UKNOWN_APN = 27;

      PDP_FAIL_UNKNOWN_PDP_ADDRESS_TYPE = 28;

      PDP_FAIL_USER_AUTHENTICATION = 29;

      PDP_FAIL_ACTIVATION_REJECT_GGSN = 30;

      PDP_FAIL_ACTIVATION_REJECT_UNSPECIFIED = 31;

      PDP_FAIL_SERVICE_OPTION_NOT_SUPPORTED = 32;

      PDP_FAIL_SERVICE_OPTION_NOT_SUBSCRIBED = 33;

      PDP_FAIL_SERVICE_OPTION_OUT_OF_ORDER = 34;

      PDP_FAIL_NSAPI_IN_USE = 35;

      // Possibly restart radio, based on framework config
      PDP_FAIL_REGULAR_DEACTIVATION = 36;

      PDP_FAIL_QOS_NOT_ACCEPTED = 37;

      PDP_FAIL_NETWORK_FAILURE = 38;

      PDP_FAIL_UMTS_REACTIVATION_REQ = 39;

      PDP_FAIL_FEATURE_NOT_SUPP = 40;

      PDP_FAIL_TFT_SEMANTIC_ERROR = 41;

      PDP_FAIL_TFT_SYTAX_ERROR = 42;

      PDP_FAIL_UNKNOWN_PDP_CONTEXT = 43;

      PDP_FAIL_FILTER_SEMANTIC_ERROR = 44;

      PDP_FAIL_FILTER_SYTAX_ERROR = 45;

      PDP_FAIL_PDP_WITHOUT_ACTIVE_TFT = 46;

      PDP_FAIL_ONLY_IPV4_ALLOWED = 50;

      PDP_FAIL_ONLY_IPV6_ALLOWED = 51;

      PDP_FAIL_ONLY_SINGLE_BEARER_ALLOWED = 52;

      PDP_FAIL_ESM_INFO_NOT_RECEIVED = 53;

      PDP_FAIL_PDN_CONN_DOES_NOT_EXIST = 54;

      PDP_FAIL_MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED = 55;

      PDP_FAIL_MAX_ACTIVE_PDP_CONTEXT_REACHED = 65;

      PDP_FAIL_UNSUPPORTED_APN_IN_CURRENT_PLMN = 66;

      PDP_FAIL_INVALID_TRANSACTION_ID = 81;

      PDP_FAIL_MESSAGE_INCORRECT_SEMANTIC = 95;

      PDP_FAIL_INVALID_MANDATORY_INFO = 96;

      PDP_FAIL_MESSAGE_TYPE_UNSUPPORTED = 97;

      PDP_FAIL_MSG_TYPE_NONCOMPATIBLE_STATE = 98;

      PDP_FAIL_UNKNOWN_INFO_ELEMENT = 99;

      PDP_FAIL_CONDITIONAL_IE_ERROR = 100;

      PDP_FAIL_MSG_AND_PROTOCOL_STATE_UNCOMPATIBLE = 101;

      PDP_FAIL_PROTOCOL_ERRORS   = 111;

      PDP_FAIL_APN_TYPE_CONFLICT = 112;

      PDP_FAIL_INVALID_PCSCF_ADDR = 113;

      PDP_FAIL_INTERNAL_CALL_PREEMPT_BY_HIGH_PRIO_APN = 114;

      PDP_FAIL_EMM_ACCESS_BARRED = 115;

      PDP_FAIL_EMERGENCY_IFACE_ONLY = 116;

      PDP_FAIL_IFACE_MISMATCH = 117;

      PDP_FAIL_COMPANION_IFACE_IN_USE = 118;

      PDP_FAIL_IP_ADDRESS_MISMATCH = 119;

      PDP_FAIL_IFACE_AND_POL_FAMILY_MISMATCH = 120;

      PDP_FAIL_EMM_ACCESS_BARRED_INFINITE_RETRY = 121;

      PDP_FAIL_AUTH_FAILURE_ON_EMERGENCY_CALL = 122;

      // Not mentioned in the specification
      PDP_FAIL_VOICE_REGISTRATION_FAIL = -1;

      PDP_FAIL_DATA_REGISTRATION_FAIL = -2;

      // Reasons for data call drop - network/modem disconnect
      PDP_FAIL_SIGNAL_LOST = -3;

      // Preferred technology has changed, should retry with parameters
      // appropriate for new technology
      PDP_FAIL_PREF_RADIO_TECH_CHANGED = -4;

      // Data call was disconnected because radio was resetting,
      // powered off - no retry
      PDP_FAIL_RADIO_POWER_OFF = -5;

      // Data call was disconnected by modem because tethered mode was up
      // on same APN/data profile - no retry until tethered call is off
      PDP_FAIL_TETHERED_CALL_ACTIVE = -6;

      // retry silently
      PDP_FAIL_ERROR_UNSPECIFIED = 65535;
    }

    // A RIL_DataCallFailCause, 0 which is PDP_FAIL_NONE if no error
    optional RilDataCallFailCause status = 1;

    // If status != 0, this fields indicates the suggested retry back-off timer
    // value RIL wants to override the one pre-configured in FW
    optional int32 suggested_retry_time_millis = 2;

    optional RilDataCall call = 3;
  }

  // Carrier Key Change Event.
  message CarrierKeyChange {

    enum KeyType {

      // Key Type Unknown.
      UNKNOWN = 0;
      // Key Type for WLAN.
      WLAN = 1;
      // Key Type for EPDG.
      EPDG = 2;
    }

    // Key type of the Encryption key.
    optional KeyType key_type = 1;

    // Whether the download was successful or not.
    optional bool isDownloadSuccessful = 2;
  }

  // Deactivate packet data connection
  message RilDeactivateDataCall {

    // Context ID
    optional int32 cid = 1;

    // Reason for deactivating data call
    optional DeactivateReason reason = 2;

    // Deactivate data call reasons
    enum DeactivateReason {

      // Reason is unknown.
      DEACTIVATE_REASON_UNKNOWN = 0;

      DEACTIVATE_REASON_NONE = 1;

      DEACTIVATE_REASON_RADIO_OFF = 2;

      DEACTIVATE_REASON_PDP_RESET = 3;

      DEACTIVATE_REASON_HANDOVER = 4;
    }
  }

  message ModemRestart {
     // The baseband_version is used to identify the particular software version
     // where the modem restarts happened
     optional string baseband_version = 1;

     // Indicates the modem restart reason. The restart reason can be used to
     // categorize any modem crashes and group similar crashes together. This
     // information will be useful to identify the cause of modem crashes,
     // reproduce the issue and confirm that the fix works.
     optional string reason = 2;
  }

  message CarrierIdMatching {

    // Carrier id table version number
    optional int32 cid_table_version = 1;

    // Carrier id matching result object
    optional CarrierIdMatchingResult result = 2;
  }

  message CarrierIdMatchingResult {

    // A unique carrier id
    optional int32 carrier_id = 1;

    // Group id level 1. Logged only if gid1 is configured from subscription
    // but its matching rule is unknown
    optional string gid1 = 2;

    // MCC and MNC that map to this carrier. Logged only if mccmnc is configured
    // from subscription but its matching rule is unknown
    optional string mccmnc = 3;
  }

  // Time when event happened on device, in milliseconds since epoch
  optional int64 timestamp_millis = 1;

  // In Multi-SIM devices this indicates SIM slot
  optional int32 phone_id = 2;

  // Event type
  optional Type type = 3;

  // User settings
  optional TelephonySettings settings = 4;

  // RIL Service State
  optional TelephonyServiceState service_state = 5;

  // IMS state
  optional ImsConnectionState ims_connection_state = 6;

  // IMS capabilities
  optional ImsCapabilities ims_capabilities = 7;

  // List of data calls when changed
  repeated RilDataCall data_calls = 8;

  // RIL error code
  optional RilErrno error = 9;

  // Setup data call request
  optional RilSetupDataCall setup_data_call = 10;

  // Setup data call response
  optional RilSetupDataCallResponse setup_data_call_response = 11;

  // Deactivate data call request
  optional RilDeactivateDataCall deactivate_data_call = 12;

  // Data call stall recovery action
  optional int32 data_stall_action = 13;

  // Modem restart event
  optional ModemRestart modem_restart = 14;

  // NITZ time in milliseconds
  optional int64 nitz_timestamp_millis = 15;

  // Carrier id matching event
  optional CarrierIdMatching carrier_id_matching = 16;

  // Carrier key change
  optional CarrierKeyChange carrier_key_change = 17;
}

enum TimeInterval {
  TI_UNKNOWN = 0;
  TI_10_MILLIS = 1;
  TI_20_MILLIS = 2;
  TI_50_MILLIS = 3;
  TI_100_MILLIS = 4;
  TI_200_MILLIS = 5;
  TI_500_MILLIS = 6;
  TI_1_SEC = 7;
  TI_2_SEC = 8;
  TI_5_SEC = 9;
  TI_10_SEC = 10;
  TI_30_SEC = 11;
  TI_1_MINUTE = 12;
  TI_3_MINUTES = 13;
  TI_10_MINUTES = 14;
  TI_30_MINUTES = 15;
  TI_1_HOUR = 16;
  TI_2_HOURS = 17;
  TI_4_HOURS = 18;
  TI_MANY_HOURS = 19;
}

// Information about CS and/or PS call session.
// Session starts when call is placed or accepted and
// ends when there are no more active calls.
message TelephonyCallSession {

  message Event {

    enum Type {

      // Unknown event
      EVENT_UNKNOWN = 0;

      // Telephony related user settings changed
      SETTINGS_CHANGED = 1;

      // Phone state changed
      RIL_SERVICE_STATE_CHANGED = 2;

      // IMS connected/disconnected
      IMS_CONNECTION_STATE_CHANGED = 3;

      // IMS Voice, Video and Ut capabilities changed
      IMS_CAPABILITIES_CHANGED = 4;

      // Notification that new data call has appeared in the list
      // or old data call has removed.
      DATA_CALL_LIST_CHANGED = 5;

      // Send request to RIL
      RIL_REQUEST = 6;

      // Result of the RIL request
      RIL_RESPONSE = 7;

      // Ring indication for an incoming call
      RIL_CALL_RING = 8;

      // Notification that Single Radio Voice Call Continuity(SRVCC)
      // progress state has changed.
      RIL_CALL_SRVCC = 9;

      // Notification that list of calls has changed.
      RIL_CALL_LIST_CHANGED = 10;

      // Command sent to IMS Service. See ImsCommand.
      IMS_COMMAND = 11;

      // Command sent to IMS Service. See ImsCommand.
      IMS_COMMAND_RECEIVED = 12;

      // Command sent to IMS Service. See ImsCommand.
      IMS_COMMAND_FAILED = 13;

      // Command sent to IMS Service. See ImsCommand.
      IMS_COMMAND_COMPLETE = 14;

      // Notification about incoming voice call
      IMS_CALL_RECEIVE = 15;

      // Notification that state of the call has changed
      IMS_CALL_STATE_CHANGED = 16;

      // Notification about IMS call termination
      IMS_CALL_TERMINATED = 17;

      // Notification that session access technology has changed
      IMS_CALL_HANDOVER = 18;

      // Notification that session access technology has changed
      IMS_CALL_HANDOVER_FAILED = 19;

      // Notification about phone state changed.
      PHONE_STATE_CHANGED = 20;

      // System time overwritten by NITZ (Network time)
      NITZ_TIME = 21;

      // Change of audio codec
      AUDIO_CODEC = 22;
    }

    enum RilRequest {

      RIL_REQUEST_UNKNOWN = 0;

      // Initiate voice call
      RIL_REQUEST_DIAL = 1;

      // Answer incoming call
      RIL_REQUEST_ANSWER = 2;

      // Hang up a specific line
      RIL_REQUEST_HANGUP = 3;

      // Configure current call waiting state
      RIL_REQUEST_SET_CALL_WAITING = 4;

      RIL_REQUEST_SWITCH_HOLDING_AND_ACTIVE = 5;

      // Send FLASH
      RIL_REQUEST_CDMA_FLASH = 6;

      // Conference holding and active
      RIL_REQUEST_CONFERENCE = 7;
    }

    enum ImsCommand {

      // Command is unknown.
      IMS_CMD_UNKNOWN = 0;

      IMS_CMD_START = 1;

      IMS_CMD_ACCEPT = 2;

      IMS_CMD_REJECT = 3;

      IMS_CMD_TERMINATE = 4;

      IMS_CMD_HOLD = 5;

      IMS_CMD_RESUME = 6;

      IMS_CMD_MERGE = 7;

      IMS_CMD_UPDATE = 8;

      IMS_CMD_CONFERENCE_EXTEND = 9;

      IMS_CMD_INVITE_PARTICIPANT = 10;

      IMS_CMD_REMOVE_PARTICIPANT = 11;
    }

    enum PhoneState {

      // State is unknown.
      STATE_UNKNOWN = 0;

      STATE_IDLE = 1;

      STATE_RINGING = 2;

      STATE_OFFHOOK = 3;
    }

    // Telephony call states
    enum CallState {

      // State is unknown.
      CALL_UNKNOWN = 0;

      CALL_IDLE = 1;

      CALL_ACTIVE = 2;

      CALL_HOLDING = 3;

      CALL_DIALING = 4;

      CALL_ALERTING = 5;

      CALL_INCOMING = 6;

      CALL_WAITING = 7;

      CALL_DISCONNECTED = 8;

      CALL_DISCONNECTING = 9;
    }

    // Audio codecs
    enum AudioCodec {

      // Unknown codec
      AUDIO_CODEC_UNKNOWN = 0;

      AUDIO_CODEC_AMR = 1;

      AUDIO_CODEC_AMR_WB = 2;

      AUDIO_CODEC_QCELP13K = 3;

      AUDIO_CODEC_EVRC = 4;

      AUDIO_CODEC_EVRC_B = 5;

      AUDIO_CODEC_EVRC_WB = 6;

      AUDIO_CODEC_EVRC_NW = 7;

      AUDIO_CODEC_GSM_EFR = 8;

      AUDIO_CODEC_GSM_FR = 9;

      AUDIO_CODEC_GSM_HR = 10;

      AUDIO_CODEC_G711U = 11;

      AUDIO_CODEC_G723 = 12;

      AUDIO_CODEC_G711A = 13;

      AUDIO_CODEC_G722 = 14;

      AUDIO_CODEC_G711AB = 15;

      AUDIO_CODEC_G729 = 16;

      AUDIO_CODEC_EVS_NB = 17;

      AUDIO_CODEC_EVS_WB = 18;

      AUDIO_CODEC_EVS_SWB = 19;

      AUDIO_CODEC_EVS_FB = 20;
    }

    // The information about a voice call
    message RilCall {

      enum Type {

        // Scan Type is unknown.
        UNKNOWN = 0;

        // Mobile originated
        MO = 1;

        // Mobile terminated
        MT = 2;
      }

      // Connection Index
      optional int32 index = 1;

      optional CallState state = 2;

      optional Type type = 3;

      // For possible values for a call end reason check
      // frameworks/base/telephony/java/android/telephony/DisconnectCause.java
      optional int32 call_end_reason = 4;

      // This field is true for Conference Calls
      optional bool is_multiparty = 5;
    }

    // Single Radio Voice Call Continuity(SRVCC) progress state
    enum RilSrvccState {

      // State is unknown.
      HANDOVER_UNKNOWN = 0;

      HANDOVER_STARTED = 1;

      HANDOVER_COMPLETED = 2;

      HANDOVER_FAILED = 3;

      HANDOVER_CANCELED = 4;
    }

    // Event type
    optional Type type = 1;

    // Time since previous event
    optional TimeInterval delay = 2;

    // Settings at the beginning of the session or when changed
    optional TelephonySettings settings = 3;

    // State at the beginning of the session or when changed
    optional TelephonyServiceState service_state = 4;

    // State at the beginning of the session or when changed
    optional ImsConnectionState ims_connection_state = 5;

    // Capabilities at the beginning of the session or when changed
    optional ImsCapabilities ims_capabilities = 6;

    // List of data calls at the beginning of the session or when changed
    repeated RilDataCall data_calls = 7;

    // New state
    optional PhoneState phone_state = 8;

    // New state
    optional CallState call_state = 9;

    // CS or IMS Voice call index
    optional int32 call_index = 10;

    // New merged call
    optional int32 merged_call_index = 11;

    // Active CS Voice calls
    repeated RilCall calls = 12;

    // RIL error code
    optional RilErrno error = 13;

    // RIL request
    optional RilRequest ril_request = 14;

    // Numeric ID
    optional int32 ril_request_id = 15;

    // New SRVCC state
    optional RilSrvccState srvcc_state = 16;

    // IMS command
    optional ImsCommand ims_command = 17;

    // IMS Failure reason
    optional ImsReasonInfo reason_info = 18;

    // Original access technology
    optional RadioAccessTechnology src_access_tech = 19 [default = UNKNOWN];

    // New access technology
    optional RadioAccessTechnology target_access_tech = 20 [default = UNKNOWN];

    // NITZ time in milliseconds
    optional int64 nitz_timestamp_millis = 21;

    // Audio codec at the beginning of the session or when changed
    optional AudioCodec audio_codec = 22;
  }

  // Time when call has started, in minutes since epoch,
  // with 5 minutes precision
  optional int32 start_time_minutes = 1;

  // In Multi-SIM devices this indicates SIM slot
  optional int32 phone_id = 2;

  // List of events happened during the call
  repeated Event events = 3;

  // Indicating some call events are dropped
  optional bool events_dropped = 4;
}

message SmsSession {

  message Event {

    enum Type {

      // Unknown event
      EVENT_UNKNOWN = 0;

      // Telephony related user settings changed
      SETTINGS_CHANGED = 1;

      // Phone state changed
      RIL_SERVICE_STATE_CHANGED = 2;

      // IMS connected/disconnected
      IMS_CONNECTION_STATE_CHANGED = 3;

      // IMS Voice, Video and Ut capabilities changed
      IMS_CAPABILITIES_CHANGED = 4;

      // Notification that new data call has appeared in the list
      // or old data call has removed.
      DATA_CALL_LIST_CHANGED = 5;

      // Send a SMS message over RIL
      SMS_SEND = 6;

      // Message has been sent to network using RIL
      SMS_SEND_RESULT = 7;

      // Notification about received SMS using RIL
      SMS_RECEIVED = 8;

      // CB message received
      CB_SMS_RECEIVED = 9;

      // Send an SMS message over ImsService
      SMS_SEND_IMS_SERVICE = 10;

      // Receive an SMS message result over ImsService
      SMS_SEND_RESULT_IMS_SERVICE = 11;

      // Receive an SMS message over ImsService
      SMS_RECEIVED_IMS_SERVICE = 12;

    }

    // Formats used to encode SMS messages
    enum Format {

      // State is unknown.
      SMS_FORMAT_UNKNOWN = 0;

      // GSM, WCDMA
      SMS_FORMAT_3GPP = 1;

      // CDMA
      SMS_FORMAT_3GPP2 = 2;
    }

    enum Tech {
      SMS_UNKNOWN = 0;

      SMS_GSM = 1;

      SMS_CDMA = 2;

      SMS_IMS = 3;
    }

    message CBMessage {
      // CB message format
      optional Format msg_format = 1;

      // CB message priority
      optional CBPriority msg_priority = 2;

      // Type of CB msg
      optional CBMessageType msg_type = 3;

      // Service category of CB message
      optional int32 service_category = 4;
    }

    enum CBMessageType {
      // Unknown type
      TYPE_UNKNOWN = 0;

      // ETWS CB msg
      ETWS = 1;

      // CMAS CB msg
      CMAS = 2;

      // CB msg other than ETWS and CMAS
      OTHER = 3;
    }

    enum CBPriority {
      // Unknown priority
      PRIORITY_UNKNOWN = 0;

      // NORMAL priority
      NORMAL = 1;

      // Interactive priority
      INTERACTIVE = 2;

      // Urgent priority
      URGENT = 3;

      // Emergency priority
      EMERGENCY = 4;
    }

    // Event type
    optional Type type = 1;

    // Time since previous event
    optional TimeInterval delay = 2;

    // Settings at the beginning of the session or when changed
    optional TelephonySettings settings = 3;

    // State at the beginning of the session or when changed
    optional TelephonyServiceState service_state = 4;

    // State at the beginning of the session or when changed
    optional ImsConnectionState ims_connection_state = 5;

    // Capabilities at the beginning of the session or when changed
    optional ImsCapabilities ims_capabilities = 6;

    // List of data calls at the beginning of the session or when changed
    repeated RilDataCall data_calls = 7;

    // Format of the message
    optional Format format = 8;

    // Technology used to send/receive SMS
    optional Tech tech = 9;

    // See 3GPP 27.005, 3.2.5 for GSM/UMTS,
    // 3GPP2 N.S0005 (IS-41C) Table 171 for CDMA,
    // or ImsService for IMS specific error codes (using ImsService specific Event.Type)
    // -1 if unknown or not applicable
    optional int32 error_code = 10;

    // RIL error code
    optional RilErrno error = 11;

    // Numeric ID
    optional int32 ril_request_id = 12;

    // Cellbroadcast message content
    optional CBMessage cell_broadcast_message = 13;

    // ImsService error code.
    optional ImsServiceErrno imsError = 14;
  }

  // Time when session has started, in minutes since epoch,
  // with 5 minutes precision
  optional int32 start_time_minutes = 1;

  // In Multi-SIM devices this indicates SIM slot
  optional int32 phone_id = 2;

  // List of events happened during the call
  repeated Event events = 3;

  // Indicating some sms session events are dropped
  optional bool events_dropped = 4;
}

// Power stats for modem
message ModemPowerStats {

  // Duration of log (ms). This is the duration of time device is
  // on battery and modem power stats are collected.
  optional int64 logging_duration_ms = 1;

  // Energy consumed by modem (mAh)
  optional double energy_consumed_mah = 2;

  // Number of packets sent (tx)
  optional int64 num_packets_tx = 3;

  // Amount of time kernel is active because of cellular data (ms)
  optional int64 cellular_kernel_active_time_ms = 4;

  // Amount of time spent in very poor rx signal level (ms)
  optional int64 time_in_very_poor_rx_signal_level_ms = 5;

  // Amount of time modem is in sleep (ms)
  optional int64 sleep_time_ms = 6;

  // Amount of time modem is in idle (ms)
  optional int64 idle_time_ms = 7;

  // Amount of time modem is in rx (ms)
  optional int64 rx_time_ms = 8;

  // Amount of time modem is in tx (ms)
  repeated int64 tx_time_ms = 9;

  // Number of bytes sent (tx)
  optional int64 num_bytes_tx = 10;

  // Number of packets received (rx)
  optional int64 num_packets_rx = 11;

  // Number of bytes received (rx)
  optional int64 num_bytes_rx = 12;

  // Amount of time phone spends in various Radio Access Technologies (ms)
  repeated int64 time_in_rat_ms = 13;

  // Amount of time phone spends in various cellular
  // rx signal strength levels (ms)
  repeated int64 time_in_rx_signal_strength_level_ms = 14;
}
