Loading src/java/com/android/internal/telephony/data/DataConfigManager.java +22 −9 Original line number Diff line number Diff line Loading @@ -220,19 +220,19 @@ public class DataConfigManager extends Handler { /** * Timeout in ms before creating an anomaly report for a DataNetwork stuck in * {@link DataNetwork#ConnectingState}. * {@link DataNetwork.ConnectingState}. */ private int mNetworkConnectingTimeout; /** * Timeout in ms before creating an anomaly report for a DataNetwork stuck in * {@link DataNetwork#DisconnectingState}. * {@link DataNetwork.DisconnectingState}. */ private int mNetworkDisconnectingTimeout; /** * Timeout in ms before creating an anomaly report for a DataNetwork stuck in * {@link DataNetwork#HandoverState}. * {@link DataNetwork.HandoverState}. */ private int mNetworkHandoverTimeout; Loading Loading @@ -776,7 +776,7 @@ public class DataConfigManager extends Handler { /** * @return Timeout in ms before creating an anomaly report for a DataNetwork stuck in * {@link DataNetwork#ConnectingState}. * {@link DataNetwork.ConnectingState}. */ public int getAnomalyNetworkConnectingTimeoutMs() { return mNetworkConnectingTimeout; Loading @@ -784,7 +784,7 @@ public class DataConfigManager extends Handler { /** * @return Timeout in ms before creating an anomaly report for a DataNetwork stuck in * {@link DataNetwork#DisconnectingState}. * {@link DataNetwork.DisconnectingState}. */ public int getAnomalyNetworkDisconnectingTimeoutMs() { return mNetworkDisconnectingTimeout; Loading @@ -792,7 +792,7 @@ public class DataConfigManager extends Handler { /** * @return Timeout in ms before creating an anomaly report for a DataNetwork stuck in * {@link DataNetwork#HandoverState}. * {@link DataNetwork.HandoverState}. */ public int getNetworkHandoverTimeoutMs() { return mNetworkHandoverTimeout; Loading Loading @@ -1116,10 +1116,22 @@ public class DataConfigManager extends Handler { } /** * Registration point for subscription info ready * @return {@code true} if enhanced IWLAN handover check is enabled. If enabled, telephony * frameworks will not perform handover if the target transport is out of service, or VoPS not * supported. The network will be torn down on the source transport, and will be * re-established on the target transport when condition is allowed for bringing up a new * network. */ public boolean isEnhancedIwlanHandoverCheckEnabled() { return mResources.getBoolean( com.android.internal.R.bool.config_enhanced_iwlan_handover_check); } /** * Registration point for subscription info ready. * * @param h handler to notify * @param what what code of message when delivered * @param h handler to notify. * @param what what code of message when delivered. */ public void registerForConfigUpdate(Handler h, int what) { mConfigUpdateRegistrants.addUnique(h, what, null); Loading Loading @@ -1213,6 +1225,7 @@ public class DataConfigManager extends Handler { pw.println("Bandwidth estimation source=" + mResources.getString( com.android.internal.R.string.config_bandwidthEstimateSource)); pw.println("isDelayTearDownImsEnabled=" + isImsDelayTearDownEnabled()); pw.println("isEnhancedIwlanHandoverCheckEnabled=" + isEnhancedIwlanHandoverCheckEnabled()); pw.decreaseIndent(); } } src/java/com/android/internal/telephony/data/DataEvaluation.java +14 −1 Original line number Diff line number Diff line Loading @@ -148,12 +148,25 @@ public class DataEvaluation { * Check if only one disallowed reason prevent data connection. * * @param reason The given reason to check * @return True if the given reason is the only one that prevents data connection * @return {@code true} if the given reason is the only one that prevents data connection */ public boolean containsOnly(DataDisallowedReason reason) { return mDataDisallowedReasons.size() == 1 && contains(reason); } /** * Check if the any of the disallowed reasons match one of the provided reason. * * @param reasons The given reasons to check. * @return {@code true} if any of the given reasons matches one of the disallowed reasons. */ public boolean containsAny(DataDisallowedReason... reasons) { for (DataDisallowedReason reason : reasons) { if (mDataDisallowedReasons.contains(reason)) return true; } return false; } /** * Check if the allowed reason is the specified reason. * Loading src/java/com/android/internal/telephony/data/DataNetwork.java +1 −1 Original line number Diff line number Diff line Loading @@ -1745,7 +1745,7 @@ public class DataNetwork extends StateMachine { NetworkRegistrationInfo nri = getNetworkRegistrationInfo(); if (nri != null) { DataSpecificRegistrationInfo dsri = nri.getDataSpecificInfo(); // Check if VoPS is supported by the network. // Check if the network is non-VoPS. if (dsri != null && dsri.getVopsSupportInfo() != null && !dsri.getVopsSupportInfo().isVopsSupported()) { builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL); Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +44 −9 Original line number Diff line number Diff line Loading @@ -1777,19 +1777,46 @@ public class DataNetworkController extends Handler { private @NonNull DataEvaluation evaluateDataNetworkHandover(@NonNull DataNetwork dataNetwork) { DataEvaluation dataEvaluation = new DataEvaluation(DataEvaluationReason.DATA_HANDOVER); if (!dataNetwork.isConnecting() && !dataNetwork.isConnected()) { log("evaluateDataNetworkHandover:" + dataNetwork + " it not in the right state."); dataEvaluation.addDataDisallowedReason(DataDisallowedReason.ILLEGAL_STATE); return dataEvaluation; } if (mDataRetryManager.isAnyHandoverRetryScheduled(dataNetwork)) { log("evaluateDataNetworkHandover: Found handover retry entry for " + dataNetwork); dataEvaluation.addDataDisallowedReason(DataDisallowedReason.RETRY_SCHEDULED); return dataEvaluation; } // If enhanced handover check is enabled, perform extra checks. if (mDataConfigManager.isEnhancedIwlanHandoverCheckEnabled()) { int targetTransport = DataUtils.getTargetTransport(dataNetwork.getTransport()); NetworkRegistrationInfo nri = mServiceState.getNetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_PS, targetTransport); if (nri != null) { // Check if OOS on target transport. if (!nri.isInService()) { dataEvaluation.addDataDisallowedReason(DataDisallowedReason.NOT_IN_SERVICE); } // Check if VoPS is required, but the target transport is non-VoPS. NetworkRequestList networkRequestList = dataNetwork.getAttachedNetworkRequestList(); if (networkRequestList.stream().anyMatch(request -> request.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL))) { DataSpecificRegistrationInfo dsri = nri.getDataSpecificInfo(); // Check if the network is non-VoPS. if (dsri != null && dsri.getVopsSupportInfo() != null && !dsri.getVopsSupportInfo().isVopsSupported()) { dataEvaluation.addDataDisallowedReason( DataDisallowedReason.VOPS_NOT_SUPPORTED); } } if (dataEvaluation.containsDisallowedReasons()) { return dataEvaluation; } } } if (mDataConfigManager.isIwlanHandoverPolicyEnabled()) { List<HandoverRule> handoverRules = mDataConfigManager.getHandoverRules(); Loading Loading @@ -1841,7 +1868,6 @@ public class DataNetworkController extends Handler { // Allow handover by default if no rule is found/not enabled by config. dataEvaluation.addDataAllowedReason(DataAllowedReason.NORMAL); log("evaluateDataNetworkHandover: " + dataEvaluation); return dataEvaluation; } Loading Loading @@ -2836,18 +2862,27 @@ public class DataNetworkController extends Handler { } DataEvaluation dataEvaluation = evaluateDataNetworkHandover(dataNetwork); log("evaluatePreferredTransport: " + dataEvaluation + ", " + dataNetwork); if (!dataEvaluation.containsDisallowedReasons()) { logl("Start handover " + dataNetwork + " to " + AccessNetworkConstants.transportTypeToString(preferredTransport)); dataNetwork.startHandover(preferredTransport, null); } else if (dataEvaluation.containsOnly( DataDisallowedReason.NOT_ALLOWED_BY_POLICY)) { logl("evaluatePreferredTransport: Handover not allowed by policy. Tear " + "down the network so a new network can be setup on " } else if (dataEvaluation.containsAny(DataDisallowedReason.NOT_ALLOWED_BY_POLICY, DataDisallowedReason.NOT_IN_SERVICE, DataDisallowedReason.VOPS_NOT_SUPPORTED)) { logl("evaluatePreferredTransport: Handover not allowed. Tear " + "down " + dataNetwork + " so a new network can be setup on " + AccessNetworkConstants.transportTypeToString(preferredTransport) + "."); tearDownGracefully(dataNetwork, DataNetwork.TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED); } else if (dataEvaluation.containsAny(DataDisallowedReason.ILLEGAL_STATE, DataDisallowedReason.RETRY_SCHEDULED)) { logl("evaluatePreferredTransport: Handover not allowed. " + dataNetwork + " will remain on " + AccessNetworkConstants.transportTypeToString( dataNetwork.getTransport())); } else { loge("evaluatePreferredTransport: Unexpected handover evaluation result."); } } } Loading tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +218 −73 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
src/java/com/android/internal/telephony/data/DataConfigManager.java +22 −9 Original line number Diff line number Diff line Loading @@ -220,19 +220,19 @@ public class DataConfigManager extends Handler { /** * Timeout in ms before creating an anomaly report for a DataNetwork stuck in * {@link DataNetwork#ConnectingState}. * {@link DataNetwork.ConnectingState}. */ private int mNetworkConnectingTimeout; /** * Timeout in ms before creating an anomaly report for a DataNetwork stuck in * {@link DataNetwork#DisconnectingState}. * {@link DataNetwork.DisconnectingState}. */ private int mNetworkDisconnectingTimeout; /** * Timeout in ms before creating an anomaly report for a DataNetwork stuck in * {@link DataNetwork#HandoverState}. * {@link DataNetwork.HandoverState}. */ private int mNetworkHandoverTimeout; Loading Loading @@ -776,7 +776,7 @@ public class DataConfigManager extends Handler { /** * @return Timeout in ms before creating an anomaly report for a DataNetwork stuck in * {@link DataNetwork#ConnectingState}. * {@link DataNetwork.ConnectingState}. */ public int getAnomalyNetworkConnectingTimeoutMs() { return mNetworkConnectingTimeout; Loading @@ -784,7 +784,7 @@ public class DataConfigManager extends Handler { /** * @return Timeout in ms before creating an anomaly report for a DataNetwork stuck in * {@link DataNetwork#DisconnectingState}. * {@link DataNetwork.DisconnectingState}. */ public int getAnomalyNetworkDisconnectingTimeoutMs() { return mNetworkDisconnectingTimeout; Loading @@ -792,7 +792,7 @@ public class DataConfigManager extends Handler { /** * @return Timeout in ms before creating an anomaly report for a DataNetwork stuck in * {@link DataNetwork#HandoverState}. * {@link DataNetwork.HandoverState}. */ public int getNetworkHandoverTimeoutMs() { return mNetworkHandoverTimeout; Loading Loading @@ -1116,10 +1116,22 @@ public class DataConfigManager extends Handler { } /** * Registration point for subscription info ready * @return {@code true} if enhanced IWLAN handover check is enabled. If enabled, telephony * frameworks will not perform handover if the target transport is out of service, or VoPS not * supported. The network will be torn down on the source transport, and will be * re-established on the target transport when condition is allowed for bringing up a new * network. */ public boolean isEnhancedIwlanHandoverCheckEnabled() { return mResources.getBoolean( com.android.internal.R.bool.config_enhanced_iwlan_handover_check); } /** * Registration point for subscription info ready. * * @param h handler to notify * @param what what code of message when delivered * @param h handler to notify. * @param what what code of message when delivered. */ public void registerForConfigUpdate(Handler h, int what) { mConfigUpdateRegistrants.addUnique(h, what, null); Loading Loading @@ -1213,6 +1225,7 @@ public class DataConfigManager extends Handler { pw.println("Bandwidth estimation source=" + mResources.getString( com.android.internal.R.string.config_bandwidthEstimateSource)); pw.println("isDelayTearDownImsEnabled=" + isImsDelayTearDownEnabled()); pw.println("isEnhancedIwlanHandoverCheckEnabled=" + isEnhancedIwlanHandoverCheckEnabled()); pw.decreaseIndent(); } }
src/java/com/android/internal/telephony/data/DataEvaluation.java +14 −1 Original line number Diff line number Diff line Loading @@ -148,12 +148,25 @@ public class DataEvaluation { * Check if only one disallowed reason prevent data connection. * * @param reason The given reason to check * @return True if the given reason is the only one that prevents data connection * @return {@code true} if the given reason is the only one that prevents data connection */ public boolean containsOnly(DataDisallowedReason reason) { return mDataDisallowedReasons.size() == 1 && contains(reason); } /** * Check if the any of the disallowed reasons match one of the provided reason. * * @param reasons The given reasons to check. * @return {@code true} if any of the given reasons matches one of the disallowed reasons. */ public boolean containsAny(DataDisallowedReason... reasons) { for (DataDisallowedReason reason : reasons) { if (mDataDisallowedReasons.contains(reason)) return true; } return false; } /** * Check if the allowed reason is the specified reason. * Loading
src/java/com/android/internal/telephony/data/DataNetwork.java +1 −1 Original line number Diff line number Diff line Loading @@ -1745,7 +1745,7 @@ public class DataNetwork extends StateMachine { NetworkRegistrationInfo nri = getNetworkRegistrationInfo(); if (nri != null) { DataSpecificRegistrationInfo dsri = nri.getDataSpecificInfo(); // Check if VoPS is supported by the network. // Check if the network is non-VoPS. if (dsri != null && dsri.getVopsSupportInfo() != null && !dsri.getVopsSupportInfo().isVopsSupported()) { builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL); Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +44 −9 Original line number Diff line number Diff line Loading @@ -1777,19 +1777,46 @@ public class DataNetworkController extends Handler { private @NonNull DataEvaluation evaluateDataNetworkHandover(@NonNull DataNetwork dataNetwork) { DataEvaluation dataEvaluation = new DataEvaluation(DataEvaluationReason.DATA_HANDOVER); if (!dataNetwork.isConnecting() && !dataNetwork.isConnected()) { log("evaluateDataNetworkHandover:" + dataNetwork + " it not in the right state."); dataEvaluation.addDataDisallowedReason(DataDisallowedReason.ILLEGAL_STATE); return dataEvaluation; } if (mDataRetryManager.isAnyHandoverRetryScheduled(dataNetwork)) { log("evaluateDataNetworkHandover: Found handover retry entry for " + dataNetwork); dataEvaluation.addDataDisallowedReason(DataDisallowedReason.RETRY_SCHEDULED); return dataEvaluation; } // If enhanced handover check is enabled, perform extra checks. if (mDataConfigManager.isEnhancedIwlanHandoverCheckEnabled()) { int targetTransport = DataUtils.getTargetTransport(dataNetwork.getTransport()); NetworkRegistrationInfo nri = mServiceState.getNetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_PS, targetTransport); if (nri != null) { // Check if OOS on target transport. if (!nri.isInService()) { dataEvaluation.addDataDisallowedReason(DataDisallowedReason.NOT_IN_SERVICE); } // Check if VoPS is required, but the target transport is non-VoPS. NetworkRequestList networkRequestList = dataNetwork.getAttachedNetworkRequestList(); if (networkRequestList.stream().anyMatch(request -> request.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL))) { DataSpecificRegistrationInfo dsri = nri.getDataSpecificInfo(); // Check if the network is non-VoPS. if (dsri != null && dsri.getVopsSupportInfo() != null && !dsri.getVopsSupportInfo().isVopsSupported()) { dataEvaluation.addDataDisallowedReason( DataDisallowedReason.VOPS_NOT_SUPPORTED); } } if (dataEvaluation.containsDisallowedReasons()) { return dataEvaluation; } } } if (mDataConfigManager.isIwlanHandoverPolicyEnabled()) { List<HandoverRule> handoverRules = mDataConfigManager.getHandoverRules(); Loading Loading @@ -1841,7 +1868,6 @@ public class DataNetworkController extends Handler { // Allow handover by default if no rule is found/not enabled by config. dataEvaluation.addDataAllowedReason(DataAllowedReason.NORMAL); log("evaluateDataNetworkHandover: " + dataEvaluation); return dataEvaluation; } Loading Loading @@ -2836,18 +2862,27 @@ public class DataNetworkController extends Handler { } DataEvaluation dataEvaluation = evaluateDataNetworkHandover(dataNetwork); log("evaluatePreferredTransport: " + dataEvaluation + ", " + dataNetwork); if (!dataEvaluation.containsDisallowedReasons()) { logl("Start handover " + dataNetwork + " to " + AccessNetworkConstants.transportTypeToString(preferredTransport)); dataNetwork.startHandover(preferredTransport, null); } else if (dataEvaluation.containsOnly( DataDisallowedReason.NOT_ALLOWED_BY_POLICY)) { logl("evaluatePreferredTransport: Handover not allowed by policy. Tear " + "down the network so a new network can be setup on " } else if (dataEvaluation.containsAny(DataDisallowedReason.NOT_ALLOWED_BY_POLICY, DataDisallowedReason.NOT_IN_SERVICE, DataDisallowedReason.VOPS_NOT_SUPPORTED)) { logl("evaluatePreferredTransport: Handover not allowed. Tear " + "down " + dataNetwork + " so a new network can be setup on " + AccessNetworkConstants.transportTypeToString(preferredTransport) + "."); tearDownGracefully(dataNetwork, DataNetwork.TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED); } else if (dataEvaluation.containsAny(DataDisallowedReason.ILLEGAL_STATE, DataDisallowedReason.RETRY_SCHEDULED)) { logl("evaluatePreferredTransport: Handover not allowed. " + dataNetwork + " will remain on " + AccessNetworkConstants.transportTypeToString( dataNetwork.getTransport())); } else { loge("evaluatePreferredTransport: Unexpected handover evaluation result."); } } } Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +218 −73 File changed.Preview size limit exceeded, changes collapsed. Show changes