Loading src/java/com/android/internal/telephony/data/DataNetwork.java +17 −4 Original line number Diff line number Diff line Loading @@ -266,8 +266,9 @@ public class DataNetwork extends StateMachine { private static final int DEFAULT_INTERNET_NETWORK_SCORE = 50; private static final int OTHER_NETWORK_SCORE = 45; @IntDef(prefix = {"DEACTIVATION_REASON_"}, @IntDef(prefix = {"TEAR_DOWN_REASON_"}, value = { TEAR_DOWN_REASON_NONE, TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED, TEAR_DOWN_REASON_SIM_REMOVAL, TEAR_DOWN_REASON_AIRPLANE_MODE_ON, Loading Loading @@ -300,6 +301,9 @@ public class DataNetwork extends StateMachine { }) public @interface TearDownReason {} /** Data network was not torn down. */ public static final int TEAR_DOWN_REASON_NONE = 0; /** Data network tear down requested by connectivity service. */ public static final int TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED = 1; Loading Loading @@ -377,7 +381,7 @@ public class DataNetwork extends StateMachine { /** Data network tear down due to data profile not preferred. */ public static final int TEAR_DOWN_REASON_DATA_PROFILE_NOT_PREFERRED = 26; /** Data network tear down due to not allowed by policy. */ /** Data network tear down due to handover not allowed by policy. */ public static final int TEAR_DOWN_REASON_NOT_ALLOWED_BY_POLICY = 27; /** Data network tear down due to illegal state. */ Loading Loading @@ -625,6 +629,11 @@ public class DataNetwork extends StateMachine { */ private @DataFailureCause int mFailCause = DataFailCause.NONE; /** * The tear down reason if the data call is voluntarily deactivated, not due to failure. */ private @TearDownReason int mTearDownReason = TEAR_DOWN_REASON_NONE; /** * The retry delay in milliseconds from setup data failure. */ Loading Loading @@ -785,9 +794,10 @@ public class DataNetwork extends StateMachine { * * @param dataNetwork The data network. * @param cause The disconnect cause. * @param tearDownReason The reason the network was torn down */ public abstract void onDisconnected(@NonNull DataNetwork dataNetwork, @DataFailureCause int cause); @DataFailureCause int cause, @TearDownReason int tearDownReason); /** * Called when handover between IWLAN and cellular network succeeded. Loading Loading @@ -1564,7 +1574,7 @@ public class DataNetwork extends StateMachine { if (mEverConnected) { mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback .onDisconnected(DataNetwork.this, mFailCause)); .onDisconnected(DataNetwork.this, mFailCause, mTearDownReason)); if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) { unregisterForWwanEvents(); } Loading Loading @@ -2532,6 +2542,7 @@ public class DataNetwork extends StateMachine { if (getCurrentState() == null || isDisconnected()) { return; } mTearDownReason = reason; sendMessage(obtainMessage(EVENT_TEAR_DOWN_NETWORK, reason)); } Loading Loading @@ -3357,6 +3368,8 @@ public class DataNetwork extends StateMachine { */ public static @NonNull String tearDownReasonToString(@TearDownReason int reason) { switch (reason) { case TEAR_DOWN_REASON_NONE: return "NONE"; case TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED: return "CONNECTIVITY_SERVICE_UNWANTED"; case TEAR_DOWN_REASON_SIM_REMOVAL: Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +12 −8 Original line number Diff line number Diff line Loading @@ -1850,7 +1850,7 @@ public class DataNetworkController extends Handler { } } log("Evaluated " + dataNetwork + ", " + evaluation.toString()); log("Evaluated " + dataNetwork + ", " + evaluation); return evaluation; } Loading Loading @@ -2044,7 +2044,7 @@ public class DataNetworkController extends Handler { return DataNetwork.TEAR_DOWN_REASON_ONLY_ALLOWED_SINGLE_NETWORK; } } return 0; return DataNetwork.TEAR_DOWN_REASON_NONE; } /** Loading Loading @@ -2486,9 +2486,9 @@ public class DataNetworkController extends Handler { @Override public void onDisconnected(@NonNull DataNetwork dataNetwork, @DataFailureCause int cause) { @DataFailureCause int cause, @TearDownReason int tearDownReason) { DataNetworkController.this.onDataNetworkDisconnected( dataNetwork, cause); dataNetwork, cause, tearDownReason); } @Override Loading Loading @@ -2810,11 +2810,13 @@ public class DataNetworkController extends Handler { * * @param dataNetwork The data network. * @param cause The disconnect cause. * @param tearDownReason The reason the network was torn down */ private void onDataNetworkDisconnected(@NonNull DataNetwork dataNetwork, @DataFailureCause int cause) { @DataFailureCause int cause, @TearDownReason int tearDownReason) { logl("onDataNetworkDisconnected: " + dataNetwork + ", cause=" + DataFailCause.toString(cause) + "(" + cause + ")"); + DataFailCause.toString(cause) + "(" + cause + "), tearDownReason=" + DataNetwork.tearDownReasonToString(tearDownReason)); mDataNetworkList.remove(dataNetwork); mPendingImsDeregDataNetworks.remove(dataNetwork); mDataRetryManager.cancelPendingHandoverRetry(dataNetwork); Loading @@ -2835,11 +2837,13 @@ public class DataNetworkController extends Handler { () -> callback.onAnyDataNetworkExistingChanged(mAnyDataNetworkExisting))); } // Immediately reestablish on target transport if network was torn down due to policy long delayMillis = tearDownReason == DataNetwork.TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED ? 0 : mDataConfigManager.getRetrySetupAfterDisconnectMillis(); // Sometimes network was unsolicitedly reported lost for reasons. We should re-evaluate // and see if data network can be re-established again. sendMessageDelayed(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.RETRY_AFTER_DISCONNECTED), mDataConfigManager.getRetrySetupAfterDisconnectMillis()); DataEvaluationReason.RETRY_AFTER_DISCONNECTED), delayMillis); } /** Loading tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -3471,7 +3471,7 @@ public class DataNetworkControllerTest extends TelephonyTest { @Test public void testHandoverDataNetworkSourceOos() throws Exception { testSetupImsDataNetwork(); // Configured handover is allowed from OOS to 4G/5G/IWLAN. // Configured handover is disallowed from OOS to 4G/5G/IWLAN. mCarrierConfig.putStringArray( CarrierConfigManager.KEY_IWLAN_HANDOVER_POLICY_STRING_ARRAY, new String[]{ Loading tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java +7 −7 Original line number Diff line number Diff line Loading @@ -365,8 +365,7 @@ public class DataNetworkTest extends TelephonyTest { .setQosBearerSessions(new ArrayList<>()) .setTrafficDescriptors(new ArrayList<>()) .build(); mDataNetworkUT.sendMessage(7/*EVENT_TEAR_DOWN_NETWORK*/, 1/*TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED*/); mDataNetworkUT.tearDown(1/*TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED*/); mDataNetworkUT.sendMessage(8/*EVENT_DATA_STATE_CHANGED*/, new AsyncResult(transport, new ArrayList<>(Arrays.asList(response)), null)); processAllMessages(); Loading Loading @@ -599,7 +598,7 @@ public class DataNetworkTest extends TelephonyTest { processAllMessages(); verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT), eq(DataFailCause.RADIO_NOT_AVAILABLE)); eq(DataFailCause.RADIO_NOT_AVAILABLE), eq(DataNetwork.TEAR_DOWN_REASON_NONE)); } @Test Loading Loading @@ -857,8 +856,9 @@ public class DataNetworkTest extends TelephonyTest { anyInt()); verify(mMockedWwanDataServiceManager).deactivateDataCall(eq(123), eq(DataService.REQUEST_REASON_NORMAL), any(Message.class)); verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT), eq( DataFailCause.EMM_DETACHED)); verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT), eq(DataFailCause.EMM_DETACHED), eq(DataNetwork.TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED)); ArgumentCaptor<PreciseDataConnectionState> pdcsCaptor = ArgumentCaptor.forClass(PreciseDataConnectionState.class); Loading Loading @@ -971,7 +971,7 @@ public class DataNetworkTest extends TelephonyTest { verify(mMockedWlanDataServiceManager).deactivateDataCall(eq(123), eq(DataService.REQUEST_REASON_NORMAL), any(Message.class)); verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT), eq( DataFailCause.EMM_DETACHED)); DataFailCause.EMM_DETACHED), anyInt() /* tear down reason */); ArgumentCaptor<PreciseDataConnectionState> pdcsCaptor = ArgumentCaptor.forClass(PreciseDataConnectionState.class); Loading Loading @@ -1245,7 +1245,7 @@ public class DataNetworkTest extends TelephonyTest { processAllMessages(); verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT), eq( DataFailCause.RADIO_NOT_AVAILABLE)); DataFailCause.RADIO_NOT_AVAILABLE), eq(DataNetwork.TEAR_DOWN_REASON_NONE)); assertThat(mDataNetworkUT.isConnected()).isFalse(); } Loading Loading
src/java/com/android/internal/telephony/data/DataNetwork.java +17 −4 Original line number Diff line number Diff line Loading @@ -266,8 +266,9 @@ public class DataNetwork extends StateMachine { private static final int DEFAULT_INTERNET_NETWORK_SCORE = 50; private static final int OTHER_NETWORK_SCORE = 45; @IntDef(prefix = {"DEACTIVATION_REASON_"}, @IntDef(prefix = {"TEAR_DOWN_REASON_"}, value = { TEAR_DOWN_REASON_NONE, TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED, TEAR_DOWN_REASON_SIM_REMOVAL, TEAR_DOWN_REASON_AIRPLANE_MODE_ON, Loading Loading @@ -300,6 +301,9 @@ public class DataNetwork extends StateMachine { }) public @interface TearDownReason {} /** Data network was not torn down. */ public static final int TEAR_DOWN_REASON_NONE = 0; /** Data network tear down requested by connectivity service. */ public static final int TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED = 1; Loading Loading @@ -377,7 +381,7 @@ public class DataNetwork extends StateMachine { /** Data network tear down due to data profile not preferred. */ public static final int TEAR_DOWN_REASON_DATA_PROFILE_NOT_PREFERRED = 26; /** Data network tear down due to not allowed by policy. */ /** Data network tear down due to handover not allowed by policy. */ public static final int TEAR_DOWN_REASON_NOT_ALLOWED_BY_POLICY = 27; /** Data network tear down due to illegal state. */ Loading Loading @@ -625,6 +629,11 @@ public class DataNetwork extends StateMachine { */ private @DataFailureCause int mFailCause = DataFailCause.NONE; /** * The tear down reason if the data call is voluntarily deactivated, not due to failure. */ private @TearDownReason int mTearDownReason = TEAR_DOWN_REASON_NONE; /** * The retry delay in milliseconds from setup data failure. */ Loading Loading @@ -785,9 +794,10 @@ public class DataNetwork extends StateMachine { * * @param dataNetwork The data network. * @param cause The disconnect cause. * @param tearDownReason The reason the network was torn down */ public abstract void onDisconnected(@NonNull DataNetwork dataNetwork, @DataFailureCause int cause); @DataFailureCause int cause, @TearDownReason int tearDownReason); /** * Called when handover between IWLAN and cellular network succeeded. Loading Loading @@ -1564,7 +1574,7 @@ public class DataNetwork extends StateMachine { if (mEverConnected) { mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback .onDisconnected(DataNetwork.this, mFailCause)); .onDisconnected(DataNetwork.this, mFailCause, mTearDownReason)); if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) { unregisterForWwanEvents(); } Loading Loading @@ -2532,6 +2542,7 @@ public class DataNetwork extends StateMachine { if (getCurrentState() == null || isDisconnected()) { return; } mTearDownReason = reason; sendMessage(obtainMessage(EVENT_TEAR_DOWN_NETWORK, reason)); } Loading Loading @@ -3357,6 +3368,8 @@ public class DataNetwork extends StateMachine { */ public static @NonNull String tearDownReasonToString(@TearDownReason int reason) { switch (reason) { case TEAR_DOWN_REASON_NONE: return "NONE"; case TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED: return "CONNECTIVITY_SERVICE_UNWANTED"; case TEAR_DOWN_REASON_SIM_REMOVAL: Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +12 −8 Original line number Diff line number Diff line Loading @@ -1850,7 +1850,7 @@ public class DataNetworkController extends Handler { } } log("Evaluated " + dataNetwork + ", " + evaluation.toString()); log("Evaluated " + dataNetwork + ", " + evaluation); return evaluation; } Loading Loading @@ -2044,7 +2044,7 @@ public class DataNetworkController extends Handler { return DataNetwork.TEAR_DOWN_REASON_ONLY_ALLOWED_SINGLE_NETWORK; } } return 0; return DataNetwork.TEAR_DOWN_REASON_NONE; } /** Loading Loading @@ -2486,9 +2486,9 @@ public class DataNetworkController extends Handler { @Override public void onDisconnected(@NonNull DataNetwork dataNetwork, @DataFailureCause int cause) { @DataFailureCause int cause, @TearDownReason int tearDownReason) { DataNetworkController.this.onDataNetworkDisconnected( dataNetwork, cause); dataNetwork, cause, tearDownReason); } @Override Loading Loading @@ -2810,11 +2810,13 @@ public class DataNetworkController extends Handler { * * @param dataNetwork The data network. * @param cause The disconnect cause. * @param tearDownReason The reason the network was torn down */ private void onDataNetworkDisconnected(@NonNull DataNetwork dataNetwork, @DataFailureCause int cause) { @DataFailureCause int cause, @TearDownReason int tearDownReason) { logl("onDataNetworkDisconnected: " + dataNetwork + ", cause=" + DataFailCause.toString(cause) + "(" + cause + ")"); + DataFailCause.toString(cause) + "(" + cause + "), tearDownReason=" + DataNetwork.tearDownReasonToString(tearDownReason)); mDataNetworkList.remove(dataNetwork); mPendingImsDeregDataNetworks.remove(dataNetwork); mDataRetryManager.cancelPendingHandoverRetry(dataNetwork); Loading @@ -2835,11 +2837,13 @@ public class DataNetworkController extends Handler { () -> callback.onAnyDataNetworkExistingChanged(mAnyDataNetworkExisting))); } // Immediately reestablish on target transport if network was torn down due to policy long delayMillis = tearDownReason == DataNetwork.TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED ? 0 : mDataConfigManager.getRetrySetupAfterDisconnectMillis(); // Sometimes network was unsolicitedly reported lost for reasons. We should re-evaluate // and see if data network can be re-established again. sendMessageDelayed(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.RETRY_AFTER_DISCONNECTED), mDataConfigManager.getRetrySetupAfterDisconnectMillis()); DataEvaluationReason.RETRY_AFTER_DISCONNECTED), delayMillis); } /** Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -3471,7 +3471,7 @@ public class DataNetworkControllerTest extends TelephonyTest { @Test public void testHandoverDataNetworkSourceOos() throws Exception { testSetupImsDataNetwork(); // Configured handover is allowed from OOS to 4G/5G/IWLAN. // Configured handover is disallowed from OOS to 4G/5G/IWLAN. mCarrierConfig.putStringArray( CarrierConfigManager.KEY_IWLAN_HANDOVER_POLICY_STRING_ARRAY, new String[]{ Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java +7 −7 Original line number Diff line number Diff line Loading @@ -365,8 +365,7 @@ public class DataNetworkTest extends TelephonyTest { .setQosBearerSessions(new ArrayList<>()) .setTrafficDescriptors(new ArrayList<>()) .build(); mDataNetworkUT.sendMessage(7/*EVENT_TEAR_DOWN_NETWORK*/, 1/*TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED*/); mDataNetworkUT.tearDown(1/*TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED*/); mDataNetworkUT.sendMessage(8/*EVENT_DATA_STATE_CHANGED*/, new AsyncResult(transport, new ArrayList<>(Arrays.asList(response)), null)); processAllMessages(); Loading Loading @@ -599,7 +598,7 @@ public class DataNetworkTest extends TelephonyTest { processAllMessages(); verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT), eq(DataFailCause.RADIO_NOT_AVAILABLE)); eq(DataFailCause.RADIO_NOT_AVAILABLE), eq(DataNetwork.TEAR_DOWN_REASON_NONE)); } @Test Loading Loading @@ -857,8 +856,9 @@ public class DataNetworkTest extends TelephonyTest { anyInt()); verify(mMockedWwanDataServiceManager).deactivateDataCall(eq(123), eq(DataService.REQUEST_REASON_NORMAL), any(Message.class)); verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT), eq( DataFailCause.EMM_DETACHED)); verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT), eq(DataFailCause.EMM_DETACHED), eq(DataNetwork.TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED)); ArgumentCaptor<PreciseDataConnectionState> pdcsCaptor = ArgumentCaptor.forClass(PreciseDataConnectionState.class); Loading Loading @@ -971,7 +971,7 @@ public class DataNetworkTest extends TelephonyTest { verify(mMockedWlanDataServiceManager).deactivateDataCall(eq(123), eq(DataService.REQUEST_REASON_NORMAL), any(Message.class)); verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT), eq( DataFailCause.EMM_DETACHED)); DataFailCause.EMM_DETACHED), anyInt() /* tear down reason */); ArgumentCaptor<PreciseDataConnectionState> pdcsCaptor = ArgumentCaptor.forClass(PreciseDataConnectionState.class); Loading Loading @@ -1245,7 +1245,7 @@ public class DataNetworkTest extends TelephonyTest { processAllMessages(); verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT), eq( DataFailCause.RADIO_NOT_AVAILABLE)); DataFailCause.RADIO_NOT_AVAILABLE), eq(DataNetwork.TEAR_DOWN_REASON_NONE)); assertThat(mDataNetworkUT.isConnected()).isFalse(); } Loading