Loading src/java/com/android/internal/telephony/dataconnection/DataConnection.java +3 −1 Original line number Diff line number Diff line Loading @@ -2317,8 +2317,10 @@ public class DataConnection extends StateMachine { } else if (delay >= 0) { retryTime = SystemClock.elapsedRealtime() + delay; } int newRequestType = DcTracker.calculateNewRetryRequestType( mHandoverFailureMode, cp.mRequestType, mDcFailCause); mDct.getDataThrottler().setRetryTime(mApnSetting.getApnTypeBitmask(), retryTime, dataCallResponse.getHandoverFailureMode()); retryTime, newRequestType); String str = "DcActivatingState: ERROR_DATA_SERVICE_SPECIFIC_ERROR " + " delay=" + delay Loading src/java/com/android/internal/telephony/dataconnection/DataThrottler.java +15 −18 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import android.telephony.Annotation; import android.telephony.Annotation.ApnType; import android.telephony.data.ApnSetting; import android.telephony.data.ApnThrottleStatus; import android.telephony.data.DataCallResponse; import com.android.internal.telephony.RetryManager; import com.android.telephony.Rlog; Loading Loading @@ -67,7 +66,7 @@ public class DataThrottler { * {@link RetryManager#NO_RETRY} indicates retry should never happen. */ public void setRetryTime(@ApnType int apnTypes, long retryElapsedTime, @DataCallResponse.HandoverFailureMode int handoverFailureMode) { @DcTracker.RequestNetworkType int newRequestType) { if (retryElapsedTime < 0) { retryElapsedTime = RetryManager.NO_SUGGESTED_RETRY_DELAY; } Loading @@ -79,8 +78,7 @@ public class DataThrottler { int apnType = apnTypes & -apnTypes; //Update the apn throttle status ApnThrottleStatus newStatus = createStatus(apnType, retryElapsedTime, handoverFailureMode); ApnThrottleStatus newStatus = createStatus(apnType, retryElapsedTime, newRequestType); ApnThrottleStatus oldStatus = mApnThrottleStatus.get(apnType); Loading Loading @@ -130,13 +128,13 @@ public class DataThrottler { } private ApnThrottleStatus createStatus(@Annotation.ApnType int apnType, long retryElapsedTime, @DataCallResponse.HandoverFailureMode int handoverFailureMode) { @DcTracker.RequestNetworkType int newRequestType) { ApnThrottleStatus.Builder builder = new ApnThrottleStatus.Builder(); if (retryElapsedTime == RetryManager.NO_SUGGESTED_RETRY_DELAY) { builder .setNoThrottle() .setRetryType(getRetryType(handoverFailureMode)); .setRetryType(getRetryType(newRequestType)); } else if (retryElapsedTime == RetryManager.NO_RETRY) { builder .setThrottleExpiryTimeMillis(RetryManager.NO_RETRY) Loading @@ -144,7 +142,7 @@ public class DataThrottler { } else { builder .setThrottleExpiryTimeMillis(retryElapsedTime) .setRetryType(getRetryType(handoverFailureMode)); .setRetryType(getRetryType(newRequestType)); } return builder .setSlotIndex(mSlotIndex) Loading @@ -153,18 +151,17 @@ public class DataThrottler { .build(); } private static int getRetryType(@DataCallResponse.HandoverFailureMode int handoverFailureMode) { int retryType; int requestType = DcTracker.calcRequestType(handoverFailureMode); if (requestType == DcTracker.REQUEST_TYPE_NORMAL) { retryType = ApnThrottleStatus.RETRY_TYPE_NEW_CONNECTION; } else if (requestType == DcTracker.REQUEST_TYPE_HANDOVER) { retryType = ApnThrottleStatus.RETRY_TYPE_HANDOVER; } else { loge("createStatus: Unknown requestType=" + requestType); retryType = ApnThrottleStatus.RETRY_TYPE_NEW_CONNECTION; private static int getRetryType(@DcTracker.RequestNetworkType int newRequestType) { if (newRequestType == DcTracker.REQUEST_TYPE_NORMAL) { return ApnThrottleStatus.RETRY_TYPE_NEW_CONNECTION; } if (newRequestType == DcTracker.REQUEST_TYPE_HANDOVER) { return ApnThrottleStatus.RETRY_TYPE_HANDOVER; } return retryType; loge("createStatus: Unknown requestType=" + newRequestType); return ApnThrottleStatus.RETRY_TYPE_NEW_CONNECTION; } private void sendApnThrottleStatusChanged(List<ApnThrottleStatus> statuses) { Loading src/java/com/android/internal/telephony/dataconnection/DcTracker.java +51 −33 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static android.telephony.data.ApnSetting.TYPE_DEFAULT; import static android.telephony.data.ApnSetting.TYPE_IA; import static android.telephony.data.DataCallResponse.HANDOVER_FAILURE_MODE_DO_FALLBACK; import static android.telephony.data.DataCallResponse.HANDOVER_FAILURE_MODE_LEGACY; import static android.telephony.data.DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_SETUP_NORMAL; import static com.android.internal.telephony.RILConstants.DATA_PROFILE_DEFAULT; import static com.android.internal.telephony.RILConstants.DATA_PROFILE_INVALID; Loading Loading @@ -534,7 +535,8 @@ public class DcTracker extends Handler { if (DBG) log("onDataReconnect: keep associated"); } // TODO: IF already associated should we send the EVENT_TRY_SETUP_DATA??? sendMessage(obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, apnContext)); sendMessage(obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, requestType, 0, apnContext)); } } Loading Loading @@ -2421,7 +2423,7 @@ public class DcTracker extends Handler { if (ac != null) { @ApnType int apnTypes = ac.getApnTypeBitmask(); mDataThrottler.setRetryTime(apnTypes, RetryManager.NO_SUGGESTED_RETRY_DELAY, DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_SETUP_NORMAL); REQUEST_TYPE_NORMAL); } else { loge("EVENT_APN_UNTHROTTLED: Invalid APN passed: " + apn); } Loading Loading @@ -2496,20 +2498,19 @@ public class DcTracker extends Handler { private void sendRequestNetworkCompleteMsg(Message message, boolean success, @TransportType int transport, @RequestNetworkType int requestType, @HandoverFailureMode int handoverFailureMode, @DataFailureCause int cause) { boolean doFallbackOnFailedHandover) { if (message == null) return; Bundle b = message.getData(); b.putBoolean(DATA_COMPLETE_MSG_EXTRA_SUCCESS, success); b.putInt(DATA_COMPLETE_MSG_EXTRA_REQUEST_TYPE, requestType); b.putInt(DATA_COMPLETE_MSG_EXTRA_TRANSPORT_TYPE, transport); b.putBoolean(DATA_COMPLETE_MSG_EXTRA_HANDOVER_FAILURE_FALLBACK, shouldFallbackOnFailedHandover(handoverFailureMode, requestType, cause)); b.putBoolean(DATA_COMPLETE_MSG_EXTRA_HANDOVER_FAILURE_FALLBACK, doFallbackOnFailedHandover); message.sendToTarget(); } private boolean shouldFallbackOnFailedHandover(@HandoverFailureMode int handoverFailureMode, private static boolean shouldFallbackOnFailedHandover( @HandoverFailureMode int handoverFailureMode, @RequestNetworkType int requestType, @DataFailureCause int cause) { if (requestType != REQUEST_TYPE_HANDOVER) { Loading @@ -2524,6 +2525,33 @@ public class DcTracker extends Handler { } } /** * Calculates the new request type that will be used the next time a data connection retries * after a failed data call attempt. */ @RequestNetworkType public static int calculateNewRetryRequestType(@HandoverFailureMode int handoverFailureMode, @RequestNetworkType int requestType, @DataFailureCause int cause) { boolean fallbackOnFailedHandover = shouldFallbackOnFailedHandover(handoverFailureMode, requestType, cause); if (requestType != REQUEST_TYPE_HANDOVER) { //The fallback is only relevant if the request is a handover return requestType; } if (fallbackOnFailedHandover) { // Since fallback is happening, the request type is really "NONE". return REQUEST_TYPE_NORMAL; } if (handoverFailureMode == HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_SETUP_NORMAL) { return REQUEST_TYPE_NORMAL; } return REQUEST_TYPE_HANDOVER; } public void enableApn(@ApnType int apnType, @RequestNetworkType int requestType, Message onCompleteMsg) { sendMessage(obtainMessage(DctConstants.EVENT_ENABLE_APN, apnType, requestType, Loading @@ -2536,7 +2564,7 @@ public class DcTracker extends Handler { if (apnContext == null) { loge("onEnableApn(" + apnType + "): NO ApnContext"); sendRequestNetworkCompleteMsg(onCompleteMsg, false, mTransportType, requestType, DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN, DataFailCause.NONE); false); return; } Loading @@ -2552,7 +2580,7 @@ public class DcTracker extends Handler { if (DBG) log(str); apnContext.requestLog(str); sendRequestNetworkCompleteMsg(onCompleteMsg, false, mTransportType, requestType, DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN, DataFailCause.NONE); false); return; } Loading @@ -2568,15 +2596,13 @@ public class DcTracker extends Handler { if (DBG) log("onEnableApn: 'CONNECTED' so return"); // Don't add to local log since this is so common sendRequestNetworkCompleteMsg(onCompleteMsg, true, mTransportType, requestType, DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN, DataFailCause.NONE); requestType, false); return; case DISCONNECTING: if (DBG) log("onEnableApn: 'DISCONNECTING' so return"); apnContext.requestLog("onEnableApn state=DISCONNECTING, so return"); sendRequestNetworkCompleteMsg(onCompleteMsg, false, mTransportType, requestType, DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN, DataFailCause.NONE); requestType, false); return; case IDLE: // fall through: this is unexpected but if it happens cleanup and try setup Loading Loading @@ -2605,8 +2631,7 @@ public class DcTracker extends Handler { addRequestNetworkCompleteMsg(onCompleteMsg, apnType); } else { sendRequestNetworkCompleteMsg(onCompleteMsg, false, mTransportType, requestType, DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN, DataFailCause.NONE); requestType, false); } } else { log("onEnableApn: config not ready yet."); Loading Loading @@ -2879,6 +2904,9 @@ public class DcTracker extends Handler { protected void onDataSetupComplete(ApnContext apnContext, boolean success, @DataFailureCause int cause, @RequestNetworkType int requestType, @HandoverFailureMode int handoverFailureMode) { boolean fallbackOnFailedHandover = shouldFallbackOnFailedHandover( handoverFailureMode, requestType, cause); if (success && (handoverFailureMode != DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN && handoverFailureMode != DataCallResponse.HANDOVER_FAILURE_MODE_LEGACY)) { Log.wtf(mLogTag, "bad failure mode: " Loading @@ -2890,7 +2918,7 @@ public class DcTracker extends Handler { if (messageList != null) { for (Message msg : messageList) { sendRequestNetworkCompleteMsg(msg, success, mTransportType, requestType, handoverFailureMode, cause); fallbackOnFailedHandover); } messageList.clear(); } Loading Loading @@ -3044,22 +3072,13 @@ public class DcTracker extends Handler { apnContext.markApnPermanentFailed(apn); } requestType = calcRequestType(handoverFailureMode); onDataSetupCompleteError(apnContext, requestType, shouldFallbackOnFailedHandover(handoverFailureMode, requestType, cause)); int newRequestType = calculateNewRetryRequestType(handoverFailureMode, requestType, cause); onDataSetupCompleteError(apnContext, newRequestType, fallbackOnFailedHandover); } } /** * Converts the handover failure mode to the corresponding request network type. */ @RequestNetworkType public static int calcRequestType( @HandoverFailureMode int handoverFailureMode) { return (handoverFailureMode == DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_HANDOVER) ? REQUEST_TYPE_HANDOVER : REQUEST_TYPE_NORMAL; } /** * Error has occurred during the SETUP {aka bringUP} request and the DCT Loading @@ -3068,11 +3087,10 @@ public class DcTracker extends Handler { * be a delay defined by {@link ApnContext#getDelayForNextApn(boolean)}. */ protected void onDataSetupCompleteError(ApnContext apnContext, @RequestNetworkType int requestType, boolean fallback) { @RequestNetworkType int requestType, boolean fallbackOnFailedHandover) { long delay = apnContext.getDelayForNextApn(mFailFast); // Check if we need to retry or not. if (delay >= 0 && delay != RetryManager.NO_RETRY && !fallback) { if (delay >= 0 && delay != RetryManager.NO_RETRY && !fallbackOnFailedHandover) { if (DBG) { log("onDataSetupCompleteError: APN type=" + apnContext.getApnType() + ". Request type=" + requestTypeToString(requestType) + ", Retry in " Loading Loading @@ -3652,7 +3670,7 @@ public class DcTracker extends Handler { break; case DctConstants.EVENT_TRY_SETUP_DATA: trySetupData((ApnContext) msg.obj, REQUEST_TYPE_NORMAL); trySetupData((ApnContext) msg.obj, msg.arg1); break; case DctConstants.EVENT_CLEAN_UP_CONNECTION: Loading src/java/com/android/internal/telephony/vendor/dataconnection/VendorDcTracker.java +3 −2 Original line number Diff line number Diff line Loading @@ -148,7 +148,7 @@ public class VendorDcTracker extends DcTracker { @Override protected void onDataSetupCompleteError(ApnContext apnContext, @RequestNetworkType int requestType, boolean fallback) { @RequestNetworkType int requestType, boolean fallbackOnFailedHandover) { long delay = apnContext.getDelayForNextApn(mFailFast); if (mPhone.getContext().getResources().getBoolean( com.android.internal.R.bool.config_pdp_reject_enable_retry)) { Loading Loading @@ -275,7 +275,8 @@ public class VendorDcTracker extends DcTracker { cancelReconnect(apnContext); if (retry) { if (DBG) log("onResetEvent: retry data call on apnContext=" + apnContext); sendMessage(obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, apnContext)); sendMessage(obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, REQUEST_TYPE_NORMAL, 0, apnContext)); } } } Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataThrottlerTest.java +7 −6 Original line number Diff line number Diff line Loading @@ -16,6 +16,9 @@ package com.android.internal.telephony.dataconnection; import static com.android.internal.telephony.dataconnection.DcTracker.REQUEST_TYPE_HANDOVER; import static com.android.internal.telephony.dataconnection.DcTracker.REQUEST_TYPE_NORMAL; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; Loading @@ -23,7 +26,6 @@ import static org.mockito.Mockito.verify; import android.telephony.AccessNetworkConstants; import android.telephony.data.ApnSetting; import android.telephony.data.ApnThrottleStatus; import android.telephony.data.DataCallResponse; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; Loading Loading @@ -87,7 +89,7 @@ public class DataThrottlerTest extends TelephonyTest { mDataThrottler.setRetryTime(ApnSetting.TYPE_DEFAULT, 1234567890L, DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN); REQUEST_TYPE_NORMAL); assertEquals(1234567890L, mDataThrottler.getRetryTime(ApnSetting.TYPE_DEFAULT)); assertEquals(RetryManager.NO_SUGGESTED_RETRY_DELAY, mDataThrottler.getRetryTime(ApnSetting.TYPE_MMS)); Loading @@ -112,7 +114,7 @@ public class DataThrottlerTest extends TelephonyTest { mDataThrottler.setRetryTime(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_DUN, 13579L, DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_HANDOVER); REQUEST_TYPE_HANDOVER); assertEquals(13579L, mDataThrottler.getRetryTime(ApnSetting.TYPE_DEFAULT)); assertEquals(13579L, mDataThrottler.getRetryTime(ApnSetting.TYPE_DUN)); Loading Loading @@ -143,7 +145,7 @@ public class DataThrottlerTest extends TelephonyTest { mDataThrottler.setRetryTime(ApnSetting.TYPE_MMS, -10, DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN); REQUEST_TYPE_NORMAL); assertEquals(RetryManager.NO_SUGGESTED_RETRY_DELAY, mDataThrottler.getRetryTime(ApnSetting.TYPE_MMS)); processAllMessages(); Loading @@ -158,8 +160,7 @@ public class DataThrottlerTest extends TelephonyTest { )); mDataThrottler.setRetryTime(ApnSetting.TYPE_FOTA | ApnSetting.TYPE_EMERGENCY, RetryManager.NO_RETRY, DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_HANDOVER); RetryManager.NO_RETRY, REQUEST_TYPE_HANDOVER); processAllMessages(); expectedStatuses.add(List.of( Loading Loading
src/java/com/android/internal/telephony/dataconnection/DataConnection.java +3 −1 Original line number Diff line number Diff line Loading @@ -2317,8 +2317,10 @@ public class DataConnection extends StateMachine { } else if (delay >= 0) { retryTime = SystemClock.elapsedRealtime() + delay; } int newRequestType = DcTracker.calculateNewRetryRequestType( mHandoverFailureMode, cp.mRequestType, mDcFailCause); mDct.getDataThrottler().setRetryTime(mApnSetting.getApnTypeBitmask(), retryTime, dataCallResponse.getHandoverFailureMode()); retryTime, newRequestType); String str = "DcActivatingState: ERROR_DATA_SERVICE_SPECIFIC_ERROR " + " delay=" + delay Loading
src/java/com/android/internal/telephony/dataconnection/DataThrottler.java +15 −18 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import android.telephony.Annotation; import android.telephony.Annotation.ApnType; import android.telephony.data.ApnSetting; import android.telephony.data.ApnThrottleStatus; import android.telephony.data.DataCallResponse; import com.android.internal.telephony.RetryManager; import com.android.telephony.Rlog; Loading Loading @@ -67,7 +66,7 @@ public class DataThrottler { * {@link RetryManager#NO_RETRY} indicates retry should never happen. */ public void setRetryTime(@ApnType int apnTypes, long retryElapsedTime, @DataCallResponse.HandoverFailureMode int handoverFailureMode) { @DcTracker.RequestNetworkType int newRequestType) { if (retryElapsedTime < 0) { retryElapsedTime = RetryManager.NO_SUGGESTED_RETRY_DELAY; } Loading @@ -79,8 +78,7 @@ public class DataThrottler { int apnType = apnTypes & -apnTypes; //Update the apn throttle status ApnThrottleStatus newStatus = createStatus(apnType, retryElapsedTime, handoverFailureMode); ApnThrottleStatus newStatus = createStatus(apnType, retryElapsedTime, newRequestType); ApnThrottleStatus oldStatus = mApnThrottleStatus.get(apnType); Loading Loading @@ -130,13 +128,13 @@ public class DataThrottler { } private ApnThrottleStatus createStatus(@Annotation.ApnType int apnType, long retryElapsedTime, @DataCallResponse.HandoverFailureMode int handoverFailureMode) { @DcTracker.RequestNetworkType int newRequestType) { ApnThrottleStatus.Builder builder = new ApnThrottleStatus.Builder(); if (retryElapsedTime == RetryManager.NO_SUGGESTED_RETRY_DELAY) { builder .setNoThrottle() .setRetryType(getRetryType(handoverFailureMode)); .setRetryType(getRetryType(newRequestType)); } else if (retryElapsedTime == RetryManager.NO_RETRY) { builder .setThrottleExpiryTimeMillis(RetryManager.NO_RETRY) Loading @@ -144,7 +142,7 @@ public class DataThrottler { } else { builder .setThrottleExpiryTimeMillis(retryElapsedTime) .setRetryType(getRetryType(handoverFailureMode)); .setRetryType(getRetryType(newRequestType)); } return builder .setSlotIndex(mSlotIndex) Loading @@ -153,18 +151,17 @@ public class DataThrottler { .build(); } private static int getRetryType(@DataCallResponse.HandoverFailureMode int handoverFailureMode) { int retryType; int requestType = DcTracker.calcRequestType(handoverFailureMode); if (requestType == DcTracker.REQUEST_TYPE_NORMAL) { retryType = ApnThrottleStatus.RETRY_TYPE_NEW_CONNECTION; } else if (requestType == DcTracker.REQUEST_TYPE_HANDOVER) { retryType = ApnThrottleStatus.RETRY_TYPE_HANDOVER; } else { loge("createStatus: Unknown requestType=" + requestType); retryType = ApnThrottleStatus.RETRY_TYPE_NEW_CONNECTION; private static int getRetryType(@DcTracker.RequestNetworkType int newRequestType) { if (newRequestType == DcTracker.REQUEST_TYPE_NORMAL) { return ApnThrottleStatus.RETRY_TYPE_NEW_CONNECTION; } if (newRequestType == DcTracker.REQUEST_TYPE_HANDOVER) { return ApnThrottleStatus.RETRY_TYPE_HANDOVER; } return retryType; loge("createStatus: Unknown requestType=" + newRequestType); return ApnThrottleStatus.RETRY_TYPE_NEW_CONNECTION; } private void sendApnThrottleStatusChanged(List<ApnThrottleStatus> statuses) { Loading
src/java/com/android/internal/telephony/dataconnection/DcTracker.java +51 −33 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static android.telephony.data.ApnSetting.TYPE_DEFAULT; import static android.telephony.data.ApnSetting.TYPE_IA; import static android.telephony.data.DataCallResponse.HANDOVER_FAILURE_MODE_DO_FALLBACK; import static android.telephony.data.DataCallResponse.HANDOVER_FAILURE_MODE_LEGACY; import static android.telephony.data.DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_SETUP_NORMAL; import static com.android.internal.telephony.RILConstants.DATA_PROFILE_DEFAULT; import static com.android.internal.telephony.RILConstants.DATA_PROFILE_INVALID; Loading Loading @@ -534,7 +535,8 @@ public class DcTracker extends Handler { if (DBG) log("onDataReconnect: keep associated"); } // TODO: IF already associated should we send the EVENT_TRY_SETUP_DATA??? sendMessage(obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, apnContext)); sendMessage(obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, requestType, 0, apnContext)); } } Loading Loading @@ -2421,7 +2423,7 @@ public class DcTracker extends Handler { if (ac != null) { @ApnType int apnTypes = ac.getApnTypeBitmask(); mDataThrottler.setRetryTime(apnTypes, RetryManager.NO_SUGGESTED_RETRY_DELAY, DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_SETUP_NORMAL); REQUEST_TYPE_NORMAL); } else { loge("EVENT_APN_UNTHROTTLED: Invalid APN passed: " + apn); } Loading Loading @@ -2496,20 +2498,19 @@ public class DcTracker extends Handler { private void sendRequestNetworkCompleteMsg(Message message, boolean success, @TransportType int transport, @RequestNetworkType int requestType, @HandoverFailureMode int handoverFailureMode, @DataFailureCause int cause) { boolean doFallbackOnFailedHandover) { if (message == null) return; Bundle b = message.getData(); b.putBoolean(DATA_COMPLETE_MSG_EXTRA_SUCCESS, success); b.putInt(DATA_COMPLETE_MSG_EXTRA_REQUEST_TYPE, requestType); b.putInt(DATA_COMPLETE_MSG_EXTRA_TRANSPORT_TYPE, transport); b.putBoolean(DATA_COMPLETE_MSG_EXTRA_HANDOVER_FAILURE_FALLBACK, shouldFallbackOnFailedHandover(handoverFailureMode, requestType, cause)); b.putBoolean(DATA_COMPLETE_MSG_EXTRA_HANDOVER_FAILURE_FALLBACK, doFallbackOnFailedHandover); message.sendToTarget(); } private boolean shouldFallbackOnFailedHandover(@HandoverFailureMode int handoverFailureMode, private static boolean shouldFallbackOnFailedHandover( @HandoverFailureMode int handoverFailureMode, @RequestNetworkType int requestType, @DataFailureCause int cause) { if (requestType != REQUEST_TYPE_HANDOVER) { Loading @@ -2524,6 +2525,33 @@ public class DcTracker extends Handler { } } /** * Calculates the new request type that will be used the next time a data connection retries * after a failed data call attempt. */ @RequestNetworkType public static int calculateNewRetryRequestType(@HandoverFailureMode int handoverFailureMode, @RequestNetworkType int requestType, @DataFailureCause int cause) { boolean fallbackOnFailedHandover = shouldFallbackOnFailedHandover(handoverFailureMode, requestType, cause); if (requestType != REQUEST_TYPE_HANDOVER) { //The fallback is only relevant if the request is a handover return requestType; } if (fallbackOnFailedHandover) { // Since fallback is happening, the request type is really "NONE". return REQUEST_TYPE_NORMAL; } if (handoverFailureMode == HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_SETUP_NORMAL) { return REQUEST_TYPE_NORMAL; } return REQUEST_TYPE_HANDOVER; } public void enableApn(@ApnType int apnType, @RequestNetworkType int requestType, Message onCompleteMsg) { sendMessage(obtainMessage(DctConstants.EVENT_ENABLE_APN, apnType, requestType, Loading @@ -2536,7 +2564,7 @@ public class DcTracker extends Handler { if (apnContext == null) { loge("onEnableApn(" + apnType + "): NO ApnContext"); sendRequestNetworkCompleteMsg(onCompleteMsg, false, mTransportType, requestType, DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN, DataFailCause.NONE); false); return; } Loading @@ -2552,7 +2580,7 @@ public class DcTracker extends Handler { if (DBG) log(str); apnContext.requestLog(str); sendRequestNetworkCompleteMsg(onCompleteMsg, false, mTransportType, requestType, DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN, DataFailCause.NONE); false); return; } Loading @@ -2568,15 +2596,13 @@ public class DcTracker extends Handler { if (DBG) log("onEnableApn: 'CONNECTED' so return"); // Don't add to local log since this is so common sendRequestNetworkCompleteMsg(onCompleteMsg, true, mTransportType, requestType, DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN, DataFailCause.NONE); requestType, false); return; case DISCONNECTING: if (DBG) log("onEnableApn: 'DISCONNECTING' so return"); apnContext.requestLog("onEnableApn state=DISCONNECTING, so return"); sendRequestNetworkCompleteMsg(onCompleteMsg, false, mTransportType, requestType, DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN, DataFailCause.NONE); requestType, false); return; case IDLE: // fall through: this is unexpected but if it happens cleanup and try setup Loading Loading @@ -2605,8 +2631,7 @@ public class DcTracker extends Handler { addRequestNetworkCompleteMsg(onCompleteMsg, apnType); } else { sendRequestNetworkCompleteMsg(onCompleteMsg, false, mTransportType, requestType, DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN, DataFailCause.NONE); requestType, false); } } else { log("onEnableApn: config not ready yet."); Loading Loading @@ -2879,6 +2904,9 @@ public class DcTracker extends Handler { protected void onDataSetupComplete(ApnContext apnContext, boolean success, @DataFailureCause int cause, @RequestNetworkType int requestType, @HandoverFailureMode int handoverFailureMode) { boolean fallbackOnFailedHandover = shouldFallbackOnFailedHandover( handoverFailureMode, requestType, cause); if (success && (handoverFailureMode != DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN && handoverFailureMode != DataCallResponse.HANDOVER_FAILURE_MODE_LEGACY)) { Log.wtf(mLogTag, "bad failure mode: " Loading @@ -2890,7 +2918,7 @@ public class DcTracker extends Handler { if (messageList != null) { for (Message msg : messageList) { sendRequestNetworkCompleteMsg(msg, success, mTransportType, requestType, handoverFailureMode, cause); fallbackOnFailedHandover); } messageList.clear(); } Loading Loading @@ -3044,22 +3072,13 @@ public class DcTracker extends Handler { apnContext.markApnPermanentFailed(apn); } requestType = calcRequestType(handoverFailureMode); onDataSetupCompleteError(apnContext, requestType, shouldFallbackOnFailedHandover(handoverFailureMode, requestType, cause)); int newRequestType = calculateNewRetryRequestType(handoverFailureMode, requestType, cause); onDataSetupCompleteError(apnContext, newRequestType, fallbackOnFailedHandover); } } /** * Converts the handover failure mode to the corresponding request network type. */ @RequestNetworkType public static int calcRequestType( @HandoverFailureMode int handoverFailureMode) { return (handoverFailureMode == DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_HANDOVER) ? REQUEST_TYPE_HANDOVER : REQUEST_TYPE_NORMAL; } /** * Error has occurred during the SETUP {aka bringUP} request and the DCT Loading @@ -3068,11 +3087,10 @@ public class DcTracker extends Handler { * be a delay defined by {@link ApnContext#getDelayForNextApn(boolean)}. */ protected void onDataSetupCompleteError(ApnContext apnContext, @RequestNetworkType int requestType, boolean fallback) { @RequestNetworkType int requestType, boolean fallbackOnFailedHandover) { long delay = apnContext.getDelayForNextApn(mFailFast); // Check if we need to retry or not. if (delay >= 0 && delay != RetryManager.NO_RETRY && !fallback) { if (delay >= 0 && delay != RetryManager.NO_RETRY && !fallbackOnFailedHandover) { if (DBG) { log("onDataSetupCompleteError: APN type=" + apnContext.getApnType() + ". Request type=" + requestTypeToString(requestType) + ", Retry in " Loading Loading @@ -3652,7 +3670,7 @@ public class DcTracker extends Handler { break; case DctConstants.EVENT_TRY_SETUP_DATA: trySetupData((ApnContext) msg.obj, REQUEST_TYPE_NORMAL); trySetupData((ApnContext) msg.obj, msg.arg1); break; case DctConstants.EVENT_CLEAN_UP_CONNECTION: Loading
src/java/com/android/internal/telephony/vendor/dataconnection/VendorDcTracker.java +3 −2 Original line number Diff line number Diff line Loading @@ -148,7 +148,7 @@ public class VendorDcTracker extends DcTracker { @Override protected void onDataSetupCompleteError(ApnContext apnContext, @RequestNetworkType int requestType, boolean fallback) { @RequestNetworkType int requestType, boolean fallbackOnFailedHandover) { long delay = apnContext.getDelayForNextApn(mFailFast); if (mPhone.getContext().getResources().getBoolean( com.android.internal.R.bool.config_pdp_reject_enable_retry)) { Loading Loading @@ -275,7 +275,8 @@ public class VendorDcTracker extends DcTracker { cancelReconnect(apnContext); if (retry) { if (DBG) log("onResetEvent: retry data call on apnContext=" + apnContext); sendMessage(obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, apnContext)); sendMessage(obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, REQUEST_TYPE_NORMAL, 0, apnContext)); } } } Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataThrottlerTest.java +7 −6 Original line number Diff line number Diff line Loading @@ -16,6 +16,9 @@ package com.android.internal.telephony.dataconnection; import static com.android.internal.telephony.dataconnection.DcTracker.REQUEST_TYPE_HANDOVER; import static com.android.internal.telephony.dataconnection.DcTracker.REQUEST_TYPE_NORMAL; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; Loading @@ -23,7 +26,6 @@ import static org.mockito.Mockito.verify; import android.telephony.AccessNetworkConstants; import android.telephony.data.ApnSetting; import android.telephony.data.ApnThrottleStatus; import android.telephony.data.DataCallResponse; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; Loading Loading @@ -87,7 +89,7 @@ public class DataThrottlerTest extends TelephonyTest { mDataThrottler.setRetryTime(ApnSetting.TYPE_DEFAULT, 1234567890L, DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN); REQUEST_TYPE_NORMAL); assertEquals(1234567890L, mDataThrottler.getRetryTime(ApnSetting.TYPE_DEFAULT)); assertEquals(RetryManager.NO_SUGGESTED_RETRY_DELAY, mDataThrottler.getRetryTime(ApnSetting.TYPE_MMS)); Loading @@ -112,7 +114,7 @@ public class DataThrottlerTest extends TelephonyTest { mDataThrottler.setRetryTime(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_DUN, 13579L, DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_HANDOVER); REQUEST_TYPE_HANDOVER); assertEquals(13579L, mDataThrottler.getRetryTime(ApnSetting.TYPE_DEFAULT)); assertEquals(13579L, mDataThrottler.getRetryTime(ApnSetting.TYPE_DUN)); Loading Loading @@ -143,7 +145,7 @@ public class DataThrottlerTest extends TelephonyTest { mDataThrottler.setRetryTime(ApnSetting.TYPE_MMS, -10, DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN); REQUEST_TYPE_NORMAL); assertEquals(RetryManager.NO_SUGGESTED_RETRY_DELAY, mDataThrottler.getRetryTime(ApnSetting.TYPE_MMS)); processAllMessages(); Loading @@ -158,8 +160,7 @@ public class DataThrottlerTest extends TelephonyTest { )); mDataThrottler.setRetryTime(ApnSetting.TYPE_FOTA | ApnSetting.TYPE_EMERGENCY, RetryManager.NO_RETRY, DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_HANDOVER); RetryManager.NO_RETRY, REQUEST_TYPE_HANDOVER); processAllMessages(); expectedStatuses.add(List.of( Loading