1 /* 2 * Copyright 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.android.iwlan.proto; 18 19 import android.net.ipsec.ike.exceptions.IkeIOException; 20 import android.net.ipsec.ike.exceptions.IkeInternalException; 21 import android.util.Log; 22 23 import com.google.android.iwlan.IwlanError; 24 import com.google.android.iwlan.IwlanStatsLog; 25 26 public class MetricsAtom { 27 public static int INVALID_MESSAGE_ID = -1; 28 private static final String TAG = "IwlanMetrics"; 29 30 public static final int NETWORK_VALIDATION_TRANSPORT_TYPE_UNSPECIFIED = 0; 31 public static final int NETWORK_VALIDATION_TRANSPORT_TYPE_CELLULAR = 1; 32 public static final int NETWORK_VALIDATION_TRANSPORT_TYPE_WIFI = 2; 33 34 public static final int NETWORK_VALIDATION_EVENT_UNSPECIFIED = 0; 35 public static final int NETWORK_VALIDATION_EVENT_MAKING_CALL = 1; 36 public static final int NETWORK_VALIDATION_EVENT_SCREEN_ON = 2; 37 public static final int NETWORK_VALIDATION_EVENT_NO_RESPONSE = 3; 38 39 public static final int NETWORK_VALIDATION_RESULT_UNSPECIFIED = 0; 40 public static final int NETWORK_VALIDATION_RESULT_INVALID = 1; 41 public static final int NETWORK_VALIDATION_RESULT_VALID = 2; 42 public static final int NETWORK_VALIDATION_RESULT_PARTIALLY_VALID = 3; 43 public static final int NETWORK_VALIDATION_RESULT_SKIPPED = 4; 44 45 private int mMessageId; 46 private int mApnType; 47 private boolean mIsHandover; 48 private String mEpdgServerAddress; 49 private int mSourceRat; 50 private boolean mIsCellularRoaming; 51 private boolean mIsNetworkConnected; 52 private int mTransportType; 53 private int mSetupRequestResult; 54 private int mIwlanError; 55 private int mDataCallFailCause; 56 private int mProcessingDurationMillis; 57 private int mEpdgServerSelectionDurationMillis; 58 private int mIkeTunnelEstablishmentDurationMillis; 59 private int mTunnelState; 60 private int mHandoverFailureMode; 61 private int mRetryDurationMillis; 62 private int mWifiSignalValue; 63 private String mIwlanErrorWrappedClassname; 64 private String mIwlanErrorWrappedStackFirstFrame; 65 private int mErrorCountOfSameCause; 66 private boolean mIsNetworkValidated; 67 private int mTriggerReason; 68 private int mValidationResult; 69 private int mValidationTransportType; 70 private int mValidationDurationMills; 71 private long mValidationStartTimeMills; 72 private boolean mValidationTriggered; 73 setMessageId(int messageId)74 public void setMessageId(int messageId) { 75 this.mMessageId = messageId; 76 } 77 getMessageId()78 public int getMessageId() { 79 return mMessageId; 80 } 81 setApnType(int apnType)82 public void setApnType(int apnType) { 83 this.mApnType = apnType; 84 } 85 setIsHandover(boolean isHandover)86 public void setIsHandover(boolean isHandover) { 87 this.mIsHandover = isHandover; 88 } 89 setEpdgServerAddress(String epdgServerAddress)90 public void setEpdgServerAddress(String epdgServerAddress) { 91 this.mEpdgServerAddress = epdgServerAddress; 92 } 93 setSourceRat(int sourceRat)94 public void setSourceRat(int sourceRat) { 95 this.mSourceRat = sourceRat; 96 } 97 setIsCellularRoaming(boolean isCellularRoaming)98 public void setIsCellularRoaming(boolean isCellularRoaming) { 99 this.mIsCellularRoaming = isCellularRoaming; 100 } 101 setIsNetworkConnected(boolean isNetworkConnected)102 public void setIsNetworkConnected(boolean isNetworkConnected) { 103 this.mIsNetworkConnected = isNetworkConnected; 104 } 105 setTransportType(int transportType)106 public void setTransportType(int transportType) { 107 this.mTransportType = transportType; 108 } 109 setSetupRequestResult(int setupRequestResult)110 public void setSetupRequestResult(int setupRequestResult) { 111 this.mSetupRequestResult = setupRequestResult; 112 } 113 setIwlanError(int iwlanError)114 public void setIwlanError(int iwlanError) { 115 this.mIwlanError = iwlanError; 116 } 117 setDataCallFailCause(int dataCallFailCause)118 public void setDataCallFailCause(int dataCallFailCause) { 119 this.mDataCallFailCause = dataCallFailCause; 120 } 121 setProcessingDurationMillis(int processingDurationMillis)122 public void setProcessingDurationMillis(int processingDurationMillis) { 123 this.mProcessingDurationMillis = processingDurationMillis; 124 } 125 setEpdgServerSelectionDurationMillis(int epdgServerSelectionDurationMillis)126 public void setEpdgServerSelectionDurationMillis(int epdgServerSelectionDurationMillis) { 127 this.mEpdgServerSelectionDurationMillis = epdgServerSelectionDurationMillis; 128 } 129 setIkeTunnelEstablishmentDurationMillis(int ikeTunnelEstablishmentDurationMillis)130 public void setIkeTunnelEstablishmentDurationMillis(int ikeTunnelEstablishmentDurationMillis) { 131 this.mIkeTunnelEstablishmentDurationMillis = ikeTunnelEstablishmentDurationMillis; 132 } 133 setTunnelState(int tunnelState)134 public void setTunnelState(int tunnelState) { 135 this.mTunnelState = tunnelState; 136 } 137 setHandoverFailureMode(int handoverFailureMode)138 public void setHandoverFailureMode(int handoverFailureMode) { 139 this.mHandoverFailureMode = handoverFailureMode; 140 } 141 setRetryDurationMillis(int retryDurationMillis)142 public void setRetryDurationMillis(int retryDurationMillis) { 143 this.mRetryDurationMillis = retryDurationMillis; 144 } 145 setWifiSignalValue(int wifiSignalValue)146 public void setWifiSignalValue(int wifiSignalValue) { 147 this.mWifiSignalValue = wifiSignalValue; 148 } 149 setIwlanErrorWrappedClassnameAndStack(IwlanError iwlanError)150 public void setIwlanErrorWrappedClassnameAndStack(IwlanError iwlanError) { 151 Throwable iwlanErrorWrapped = iwlanError.getException(); 152 if (iwlanErrorWrapped instanceof IkeInternalException 153 || iwlanErrorWrapped instanceof IkeIOException) { 154 iwlanErrorWrapped = iwlanErrorWrapped.getCause(); 155 } 156 157 if (iwlanErrorWrapped == null) { 158 this.mIwlanErrorWrappedClassname = null; 159 this.mIwlanErrorWrappedStackFirstFrame = null; 160 return; 161 } 162 163 this.mIwlanErrorWrappedClassname = iwlanErrorWrapped.getClass().getCanonicalName(); 164 165 StackTraceElement[] iwlanErrorWrappedStackTraceElements = iwlanErrorWrapped.getStackTrace(); 166 this.mIwlanErrorWrappedStackFirstFrame = 167 iwlanErrorWrappedStackTraceElements.length != 0 168 ? iwlanErrorWrappedStackTraceElements[0].toString() 169 : null; 170 } 171 getIwlanErrorWrappedClassname()172 public String getIwlanErrorWrappedClassname() { 173 return mIwlanErrorWrappedClassname; 174 } 175 getIwlanErrorWrappedStackFirstFrame()176 public String getIwlanErrorWrappedStackFirstFrame() { 177 return mIwlanErrorWrappedStackFirstFrame; 178 } 179 setErrorCountOfSameCause(int errorCount)180 public void setErrorCountOfSameCause(int errorCount) { 181 mErrorCountOfSameCause = errorCount; 182 } 183 getErrorCountOfSameCause()184 public int getErrorCountOfSameCause() { 185 return mErrorCountOfSameCause; 186 } 187 setIsNetworkValidated(boolean isNetworkValidated)188 public void setIsNetworkValidated(boolean isNetworkValidated) { 189 mIsNetworkValidated = isNetworkValidated; 190 } 191 setTriggerReason(int reason)192 public void setTriggerReason(int reason) { 193 mTriggerReason = reason; 194 } 195 getTriggerReason()196 public int getTriggerReason() { 197 return mTriggerReason; 198 } 199 setValidationResult(int validationResult)200 public void setValidationResult(int validationResult) { 201 mValidationResult = validationResult; 202 } 203 getValidationResult()204 public int getValidationResult() { 205 return mValidationResult; 206 } 207 setValidationTransportType(int transportType)208 public void setValidationTransportType(int transportType) { 209 mValidationTransportType = transportType; 210 } 211 getValidationTransportType()212 public int getValidationTransportType() { 213 return mValidationTransportType; 214 } 215 setValidationDurationMills(int validationDurationMills)216 public void setValidationDurationMills(int validationDurationMills) { 217 mValidationDurationMills = validationDurationMills; 218 } 219 getValidationDurationMills()220 public int getValidationDurationMills() { 221 return mValidationDurationMills; 222 } 223 setValidationStartTimeMills(long validationStartTimeMills)224 public void setValidationStartTimeMills(long validationStartTimeMills) { 225 mValidationStartTimeMills = validationStartTimeMills; 226 } 227 getValidationStartTimeMills()228 public long getValidationStartTimeMills() { 229 return mValidationStartTimeMills; 230 } 231 getValidationTriggered()232 public boolean getValidationTriggered() { 233 return mValidationTriggered; 234 } 235 setValidationTriggered(boolean validationTriggered)236 public void setValidationTriggered(boolean validationTriggered) { 237 mValidationTriggered = validationTriggered; 238 } 239 sendMetricsData()240 public void sendMetricsData() { 241 if (mMessageId == IwlanStatsLog.IWLAN_SETUP_DATA_CALL_RESULT_REPORTED) { 242 Log.d(TAG, "Send metrics data IWLAN_SETUP_DATA_CALL_RESULT_REPORTED"); 243 IwlanStatsLog.write( 244 mMessageId, 245 mApnType, 246 mIsHandover, 247 mEpdgServerAddress, 248 mSourceRat, 249 mIsCellularRoaming, 250 mIsNetworkConnected, 251 mTransportType, 252 mSetupRequestResult, 253 mIwlanError, 254 mDataCallFailCause, 255 mProcessingDurationMillis, 256 mEpdgServerSelectionDurationMillis, 257 mIkeTunnelEstablishmentDurationMillis, 258 mTunnelState, 259 mHandoverFailureMode, 260 mRetryDurationMillis, 261 mIwlanErrorWrappedClassname, 262 mIwlanErrorWrappedStackFirstFrame, 263 mErrorCountOfSameCause, 264 mIsNetworkValidated); 265 } else if (mMessageId == IwlanStatsLog.IWLAN_PDN_DISCONNECTED_REASON_REPORTED) { 266 Log.d(TAG, "Send metrics data IWLAN_PDN_DISCONNECTED_REASON_REPORTED"); 267 IwlanStatsLog.write( 268 mMessageId, 269 mDataCallFailCause, 270 mIsNetworkConnected, 271 mTransportType, 272 mWifiSignalValue); 273 } else if (mMessageId 274 == IwlanStatsLog.IWLAN_UNDERLYING_NETWORK_VALIDATION_RESULT_REPORTED) { 275 Log.d(TAG, "Send metrics data IWLAN_UNDERLYING_NETWORK_VALIDATION_RESULT_REPORTED"); 276 IwlanStatsLog.write( 277 mMessageId, 278 mTriggerReason, 279 mValidationResult, 280 mValidationTransportType, 281 mValidationDurationMills, 282 mValidationTriggered); 283 } else { 284 Log.d("IwlanMetrics", "Invalid Message ID: " + mMessageId); 285 } 286 } 287 } 288