Loading src/java/com/android/internal/telephony/data/DataNetwork.java +35 −33 Original line number Diff line number Diff line Loading @@ -82,6 +82,7 @@ import com.android.internal.telephony.CommandsInterface; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.RIL; import com.android.internal.telephony.data.DataEvaluation.DataAllowedReason; import com.android.internal.telephony.data.DataNetworkController.NetworkRequestList; import com.android.internal.telephony.data.DataRetryManager.DataHandoverRetryEntry; Loading Loading @@ -457,7 +458,6 @@ public class DataNetwork extends StateMachine { /** Metrics of per data network connection. */ private final DataCallSessionStats mDataCallSessionStats; /** * The unique context id assigned by the data service in {@link DataCallResponse#getId()}. One * for {@link AccessNetworkConstants#TRANSPORT_TYPE_WWAN} and one for Loading Loading @@ -554,6 +554,11 @@ public class DataNetwork extends StateMachine { */ private @DataFailureCause int mFailCause = DataFailCause.NONE; /** * The retry delay in milliseconds from setup data failure. */ private long mRetryDelayMillis = DataCallResponse.RETRY_DURATION_UNDEFINED; /** * Indicates if data network is suspended. Note this is slightly different from the * {@link TelephonyManager#DATA_SUSPENDED}, which is only possible when data network is in Loading Loading @@ -1258,7 +1263,16 @@ public class DataNetwork extends StateMachine { @Override public void enter() { logl("Data network disconnected."); // The detach all network requests must be tge last message to handle. if (mEverConnected) { mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback .onDisconnected(DataNetwork.this, mFailCause)); } else { mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback .onSetupDataFailed(DataNetwork.this, new NetworkRequestList(mAttachedNetworkRequestList), mFailCause, mRetryDelayMillis)); } // The detach all network requests must be the last message to handle. sendMessage(EVENT_DETACH_ALL_NETWORK_REQUESTS); // Gracefully handle all the un-processed events then quit the state machine. // quit() throws a QUIT event to the end of message queue. All the events before quit() Loading Loading @@ -1977,12 +1991,8 @@ public class DataNetwork extends StateMachine { transitionTo(mConnectedState); } else { // Setup data failed. long retryDelayMillis = response != null ? response.getRetryDurationMillis() mRetryDelayMillis = response != null ? response.getRetryDurationMillis() : DataCallResponse.RETRY_DURATION_UNDEFINED; NetworkRequestList requestList = new NetworkRequestList(mAttachedNetworkRequestList); mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback.onSetupDataFailed( DataNetwork.this, requestList, mFailCause, retryDelayMillis)); transitionTo(mDisconnectedState); } Loading @@ -2009,9 +2019,7 @@ public class DataNetwork extends StateMachine { + DataServiceCallback.resultCodeToString(resultCode)); if (resultCode == DataServiceCallback.RESULT_ERROR_INVALID_RESPONSE) { log("Remove network since deactivate request returned an error."); mDataNetworkCallback.invokeFromExecutor( () -> mDataNetworkCallback.onDisconnected( DataNetwork.this, DataFailCause.RADIO_NOT_AVAILABLE)); mFailCause = DataFailCause.RADIO_NOT_AVAILABLE; transitionTo(mDisconnectedState); } } Loading Loading @@ -2107,23 +2115,24 @@ public class DataNetwork extends StateMachine { log("onDataStateChanged: " + response); mDataCallResponse = response; if (response.getLinkStatus() != DataCallResponse.LINK_STATUS_INACTIVE) { if (mPhone.getHalVersion().greaterOrEqual(RIL.RADIO_HAL_VERSION_1_6) && response.getTrafficDescriptors().isEmpty()) { log("onDataStateChanged: No traffic descriptors reported by " + AccessNetworkConstants.transportTypeToString(mTransport) + " data service."); mFailCause = DataFailCause.NO_TRAFFIC_DESCRIPTORS; mRetryDelayMillis = DataCallResponse.RETRY_DURATION_UNDEFINED; transitionTo(mDisconnectedState); } else { updateDataNetwork(response); } } else { log("onDataStateChanged: PDN inactive reported by " + AccessNetworkConstants.transportTypeToString(mTransport) + " data service."); if (mEverConnected) { mDataNetworkCallback.invokeFromExecutor( () -> mDataNetworkCallback.onDisconnected( DataNetwork.this, response.getCause())); } else { log("onDataStateChanged: never in connected state. Treated as a setup " + "failure."); mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback .onSetupDataFailed(DataNetwork.this, mAttachedNetworkRequestList, DataFailCause.NO_RETRY_FAILURE, DataCallResponse.RETRY_DURATION_UNDEFINED)); } mFailCause = mEverConnected ? response.getCause() : DataFailCause.NO_RETRY_FAILURE; mRetryDelayMillis = DataCallResponse.RETRY_DURATION_UNDEFINED; transitionTo(mDisconnectedState); } } Loading @@ -2133,16 +2142,9 @@ public class DataNetwork extends StateMachine { // for that log("onDataStateChanged: PDN disconnected reported by " + AccessNetworkConstants.transportTypeToString(mTransport) + " data service."); if (mEverConnected) { mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback .onDisconnected(DataNetwork.this, DataFailCause.LOST_CONNECTION)); } else { log("onDataStateChanged: never in connected state. Treated as a setup failure."); mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback .onSetupDataFailed(DataNetwork.this, mAttachedNetworkRequestList, DataFailCause.NO_RETRY_FAILURE, DataCallResponse.RETRY_DURATION_UNDEFINED)); } mFailCause = mEverConnected ? DataFailCause.LOST_CONNECTION : DataFailCause.NO_RETRY_FAILURE; mRetryDelayMillis = DataCallResponse.RETRY_DURATION_UNDEFINED; transitionTo(mDisconnectedState); } } Loading tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java +24 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ import android.testing.TestableLooper; import android.util.Pair; import android.util.SparseArray; import com.android.internal.telephony.RIL; import com.android.internal.telephony.TelephonyTest; import com.android.internal.telephony.data.DataEvaluation.DataAllowedReason; import com.android.internal.telephony.data.DataNetwork.DataNetworkCallback; Loading Loading @@ -704,4 +705,27 @@ public class DataNetworkTest extends TelephonyTest { DataFailCause.RADIO_NOT_AVAILABLE)); assertThat(mDataNetworkUT.isConnected()).isFalse(); } @Test public void tearTearDownNoTrafficDescriptors() throws Exception { doReturn(RIL.RADIO_HAL_VERSION_1_6).when(mPhone).getHalVersion(); testCreateDataNetwork(); assertThat(mDataNetworkUT.isConnected()).isTrue(); mDataNetworkUT.sendMessage(8/*EVENT_DATA_STATE_CHANGED*/, new AsyncResult(AccessNetworkConstants.TRANSPORT_TYPE_WWAN, new ArrayList<>(Arrays.asList(new DataCallResponse.Builder() .setCause(DataFailCause.NONE) .setRetryDurationMillis(DataCallResponse.RETRY_DURATION_UNDEFINED) .setId(123) .setLinkStatus(DataCallResponse.LINK_STATUS_ACTIVE) .setProtocolType(ApnSetting.PROTOCOL_IPV4V6) .setQosBearerSessions(new ArrayList<>()) .setTrafficDescriptors(new ArrayList<>()) .build())), null)); processAllMessages(); verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT), eq(DataFailCause.NO_TRAFFIC_DESCRIPTORS)); assertThat(mDataNetworkUT.isConnected()).isFalse(); } } Loading
src/java/com/android/internal/telephony/data/DataNetwork.java +35 −33 Original line number Diff line number Diff line Loading @@ -82,6 +82,7 @@ import com.android.internal.telephony.CommandsInterface; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.RIL; import com.android.internal.telephony.data.DataEvaluation.DataAllowedReason; import com.android.internal.telephony.data.DataNetworkController.NetworkRequestList; import com.android.internal.telephony.data.DataRetryManager.DataHandoverRetryEntry; Loading Loading @@ -457,7 +458,6 @@ public class DataNetwork extends StateMachine { /** Metrics of per data network connection. */ private final DataCallSessionStats mDataCallSessionStats; /** * The unique context id assigned by the data service in {@link DataCallResponse#getId()}. One * for {@link AccessNetworkConstants#TRANSPORT_TYPE_WWAN} and one for Loading Loading @@ -554,6 +554,11 @@ public class DataNetwork extends StateMachine { */ private @DataFailureCause int mFailCause = DataFailCause.NONE; /** * The retry delay in milliseconds from setup data failure. */ private long mRetryDelayMillis = DataCallResponse.RETRY_DURATION_UNDEFINED; /** * Indicates if data network is suspended. Note this is slightly different from the * {@link TelephonyManager#DATA_SUSPENDED}, which is only possible when data network is in Loading Loading @@ -1258,7 +1263,16 @@ public class DataNetwork extends StateMachine { @Override public void enter() { logl("Data network disconnected."); // The detach all network requests must be tge last message to handle. if (mEverConnected) { mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback .onDisconnected(DataNetwork.this, mFailCause)); } else { mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback .onSetupDataFailed(DataNetwork.this, new NetworkRequestList(mAttachedNetworkRequestList), mFailCause, mRetryDelayMillis)); } // The detach all network requests must be the last message to handle. sendMessage(EVENT_DETACH_ALL_NETWORK_REQUESTS); // Gracefully handle all the un-processed events then quit the state machine. // quit() throws a QUIT event to the end of message queue. All the events before quit() Loading Loading @@ -1977,12 +1991,8 @@ public class DataNetwork extends StateMachine { transitionTo(mConnectedState); } else { // Setup data failed. long retryDelayMillis = response != null ? response.getRetryDurationMillis() mRetryDelayMillis = response != null ? response.getRetryDurationMillis() : DataCallResponse.RETRY_DURATION_UNDEFINED; NetworkRequestList requestList = new NetworkRequestList(mAttachedNetworkRequestList); mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback.onSetupDataFailed( DataNetwork.this, requestList, mFailCause, retryDelayMillis)); transitionTo(mDisconnectedState); } Loading @@ -2009,9 +2019,7 @@ public class DataNetwork extends StateMachine { + DataServiceCallback.resultCodeToString(resultCode)); if (resultCode == DataServiceCallback.RESULT_ERROR_INVALID_RESPONSE) { log("Remove network since deactivate request returned an error."); mDataNetworkCallback.invokeFromExecutor( () -> mDataNetworkCallback.onDisconnected( DataNetwork.this, DataFailCause.RADIO_NOT_AVAILABLE)); mFailCause = DataFailCause.RADIO_NOT_AVAILABLE; transitionTo(mDisconnectedState); } } Loading Loading @@ -2107,23 +2115,24 @@ public class DataNetwork extends StateMachine { log("onDataStateChanged: " + response); mDataCallResponse = response; if (response.getLinkStatus() != DataCallResponse.LINK_STATUS_INACTIVE) { if (mPhone.getHalVersion().greaterOrEqual(RIL.RADIO_HAL_VERSION_1_6) && response.getTrafficDescriptors().isEmpty()) { log("onDataStateChanged: No traffic descriptors reported by " + AccessNetworkConstants.transportTypeToString(mTransport) + " data service."); mFailCause = DataFailCause.NO_TRAFFIC_DESCRIPTORS; mRetryDelayMillis = DataCallResponse.RETRY_DURATION_UNDEFINED; transitionTo(mDisconnectedState); } else { updateDataNetwork(response); } } else { log("onDataStateChanged: PDN inactive reported by " + AccessNetworkConstants.transportTypeToString(mTransport) + " data service."); if (mEverConnected) { mDataNetworkCallback.invokeFromExecutor( () -> mDataNetworkCallback.onDisconnected( DataNetwork.this, response.getCause())); } else { log("onDataStateChanged: never in connected state. Treated as a setup " + "failure."); mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback .onSetupDataFailed(DataNetwork.this, mAttachedNetworkRequestList, DataFailCause.NO_RETRY_FAILURE, DataCallResponse.RETRY_DURATION_UNDEFINED)); } mFailCause = mEverConnected ? response.getCause() : DataFailCause.NO_RETRY_FAILURE; mRetryDelayMillis = DataCallResponse.RETRY_DURATION_UNDEFINED; transitionTo(mDisconnectedState); } } Loading @@ -2133,16 +2142,9 @@ public class DataNetwork extends StateMachine { // for that log("onDataStateChanged: PDN disconnected reported by " + AccessNetworkConstants.transportTypeToString(mTransport) + " data service."); if (mEverConnected) { mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback .onDisconnected(DataNetwork.this, DataFailCause.LOST_CONNECTION)); } else { log("onDataStateChanged: never in connected state. Treated as a setup failure."); mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback .onSetupDataFailed(DataNetwork.this, mAttachedNetworkRequestList, DataFailCause.NO_RETRY_FAILURE, DataCallResponse.RETRY_DURATION_UNDEFINED)); } mFailCause = mEverConnected ? DataFailCause.LOST_CONNECTION : DataFailCause.NO_RETRY_FAILURE; mRetryDelayMillis = DataCallResponse.RETRY_DURATION_UNDEFINED; transitionTo(mDisconnectedState); } } Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java +24 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ import android.testing.TestableLooper; import android.util.Pair; import android.util.SparseArray; import com.android.internal.telephony.RIL; import com.android.internal.telephony.TelephonyTest; import com.android.internal.telephony.data.DataEvaluation.DataAllowedReason; import com.android.internal.telephony.data.DataNetwork.DataNetworkCallback; Loading Loading @@ -704,4 +705,27 @@ public class DataNetworkTest extends TelephonyTest { DataFailCause.RADIO_NOT_AVAILABLE)); assertThat(mDataNetworkUT.isConnected()).isFalse(); } @Test public void tearTearDownNoTrafficDescriptors() throws Exception { doReturn(RIL.RADIO_HAL_VERSION_1_6).when(mPhone).getHalVersion(); testCreateDataNetwork(); assertThat(mDataNetworkUT.isConnected()).isTrue(); mDataNetworkUT.sendMessage(8/*EVENT_DATA_STATE_CHANGED*/, new AsyncResult(AccessNetworkConstants.TRANSPORT_TYPE_WWAN, new ArrayList<>(Arrays.asList(new DataCallResponse.Builder() .setCause(DataFailCause.NONE) .setRetryDurationMillis(DataCallResponse.RETRY_DURATION_UNDEFINED) .setId(123) .setLinkStatus(DataCallResponse.LINK_STATUS_ACTIVE) .setProtocolType(ApnSetting.PROTOCOL_IPV4V6) .setQosBearerSessions(new ArrayList<>()) .setTrafficDescriptors(new ArrayList<>()) .build())), null)); processAllMessages(); verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT), eq(DataFailCause.NO_TRAFFIC_DESCRIPTORS)); assertThat(mDataNetworkUT.isConnected()).isFalse(); } }