Loading src/java/com/android/internal/telephony/data/DataNetwork.java +20 −6 Original line number Diff line number Diff line Loading @@ -124,6 +124,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Objects; import java.util.Set; Loading Loading @@ -1001,23 +1002,36 @@ public class DataNetwork extends StateMachine { && transport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN; mDataAllowedReason = dataAllowedReason; dataProfile.setLastSetupTimestamp(SystemClock.elapsedRealtime()); mAttachedNetworkRequestList.addAll(networkRequestList); for (int transportType : mAccessNetworksManager.getAvailableTransports()) { mCid.put(transportType, INVALID_CID); } mTelephonyDisplayInfo = mPhone.getDisplayInfoController().getTelephonyDisplayInfo(); mTcpBufferSizes = mDataConfigManager.getTcpConfigString(mTelephonyDisplayInfo); for (TelephonyNetworkRequest networkRequest : networkRequestList) { networkRequest.setAttachedNetwork(DataNetwork.this); networkRequest.setState(TelephonyNetworkRequest.REQUEST_STATE_SATISFIED); } // network capabilities infer connectivity transport and MMTEL from the requested // capabilities. // TODO: Ideally we shouldn't infer network capabilities base on the requested capabilities, // but currently there are 2 hacks associated with getForcedCellularTransportCapabilities // and IMS service requesting IMS|MMTEL that need to support. When we stop supporting these // cases, we shouldn't consider the requests when determining the network capabilities. mAttachedNetworkRequestList.addAll(networkRequestList); // Update the capabilities in the constructor is to make sure the data network has initial // capability immediately after created. Doing this connecting state creates the window that // DataNetworkController might check if existing data network's capability can satisfy the // next network request within this window. updateNetworkCapabilities(); // Remove the requests that can't use the initial capabilities ListIterator<TelephonyNetworkRequest> iter = mAttachedNetworkRequestList.listIterator(); while (iter.hasNext()) { TelephonyNetworkRequest request = iter.next(); if (request.canBeSatisfiedBy(mNetworkCapabilities)) { request.setAttachedNetwork(DataNetwork.this); request.setState(TelephonyNetworkRequest.REQUEST_STATE_SATISFIED); } else { iter.remove(); } } } /** Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +19 −10 Original line number Diff line number Diff line Loading @@ -2122,6 +2122,13 @@ public class DataNetworkController extends Handler { */ private boolean canConnectivityTransportSatisfyNetworkRequest( @NonNull TelephonyNetworkRequest networkRequest, @TransportType int transport) { // Check if this is a IWLAN network request. if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { // If the request would result in bringing up network on IWLAN, then no // need to check if the device is using satellite network. return true; } // When the device is on satellite, only restricted network request can request network. if (mServiceState.isUsingNonTerrestrialNetwork() && networkRequest.hasCapability( Loading @@ -2136,14 +2143,6 @@ public class DataNetworkController extends Handler { return true; } // Check if this is a IWLAN network request. if (networkRequest.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) && transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { // If the cellular request would result in bringing up network on IWLAN, then no // need to check if the device is using satellite network. return true; } // As a short term solution, allowing some networks to be always marked as cellular // transport if certain capabilities are in the network request. if (networkRequest.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) && Arrays.stream( Loading Loading @@ -3061,8 +3060,18 @@ public class DataNetworkController extends Handler { List<NetworkRequestList> groupRequestLists = getGroupedUnsatisfiedNetworkRequests(); dataSetupRetryEntry.networkRequestList.stream() .filter(request -> groupRequestLists.stream() .anyMatch(groupRequestList -> groupRequestList .get(request.getCapabilities()) != null)) .anyMatch(groupRequestList -> { // The unsatisfied request has all the requested capabilities. if (groupRequestList.get(request.getCapabilities()) == null) { return false; } TelephonyNetworkRequest leading = groupRequestList.getFirst(); // The unsatisfied request covers all the requested transports. return leading.getTransportTypes().length == 0 || request.getTransportTypes().length == 0 || Arrays.stream(request.getTransportTypes()) .allMatch(leading::hasTransport); })) .forEach(requestList::add); } if (requestList.isEmpty()) { Loading tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +32 −13 Original line number Diff line number Diff line Loading @@ -138,6 +138,8 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.Executor; import javax.annotation.Nullable; @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper public class DataNetworkControllerTest extends TelephonyTest { Loading Loading @@ -1138,19 +1140,24 @@ public class DataNetworkControllerTest extends TelephonyTest { } private @NonNull TelephonyNetworkRequest createNetworkRequest(Integer... capabilities) { return createNetworkRequest(false, capabilities); return createNetworkRequest(null, capabilities); } private @NonNull TelephonyNetworkRequest createNetworkRequest(boolean restricted, private @NonNull TelephonyNetworkRequest createNetworkRequest(@Nullable Boolean restricted, Integer... capabilities) { NetworkCapabilities netCaps = new NetworkCapabilities(); for (int networkCapability : capabilities) { netCaps.addCapability(networkCapability); } if (restricted != null) { if (restricted) { netCaps.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); } } else { // Data Network uses the same to define its own capabilities. netCaps.maybeMarkCapabilitiesRestricted(); } NetworkRequest nativeNetworkRequest = new NetworkRequest(netCaps, ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId, NetworkRequest.Type.REQUEST); Loading Loading @@ -1741,6 +1748,14 @@ public class DataNetworkControllerTest extends TelephonyTest { verify(mMockedDataNetworkControllerCallback, never()) .onConnectedInternetDataNetworksChanged(any()); // However, WLAN network setup shouldn't be affected doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WLAN).when(mAccessNetworksManager) .getPreferredTransportByNetworkCapability(anyInt()); mDataNetworkControllerUT.obtainMessage(5 /*EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS*/, DataEvaluation.DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED).sendToTarget(); processAllMessages(); verify(mMockedDataNetworkControllerCallback).onConnectedInternetDataNetworksChanged(any()); mIsNonTerrestrialNetwork = false; } Loading Loading @@ -3319,12 +3334,20 @@ public class DataNetworkControllerTest extends TelephonyTest { NetworkCapabilities.NET_CAPABILITY_IMS); TelephonyNetworkRequest secondTnr = createNetworkRequest( NetworkCapabilities.NET_CAPABILITY_IMS); TelephonyNetworkRequest thirdTnr = new TelephonyNetworkRequest( new NetworkRequest((new NetworkCapabilities.Builder()) .addCapability(NetworkCapabilities.NET_CAPABILITY_IMS) .addTransportType(NetworkCapabilities.TRANSPORT_SATELLITE) .build(), ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId, NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags); mDataNetworkControllerUT.addNetworkRequest(firstTnr); processAllMessages(); mDataNetworkControllerUT.removeNetworkRequest(firstTnr); mDataNetworkControllerUT.addNetworkRequest(secondTnr); mDataNetworkControllerUT.addNetworkRequest(thirdTnr); processAllFutureMessages(); verify(mMockedWwanDataServiceManager, times(1)).setupDataCall(anyInt(), Loading Loading @@ -4157,6 +4180,7 @@ public class DataNetworkControllerTest extends TelephonyTest { NetworkCapabilities netCaps = new NetworkCapabilities(); netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); netCaps.maybeMarkCapabilitiesRestricted(); netCaps.setRequestorPackageName(FAKE_MMTEL_PACKAGE); NetworkRequest nativeNetworkRequest = new NetworkRequest(netCaps, Loading Loading @@ -4209,6 +4233,7 @@ public class DataNetworkControllerTest extends TelephonyTest { // setup emergency data network. NetworkCapabilities netCaps = new NetworkCapabilities(); netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_EIMS); netCaps.maybeMarkCapabilitiesRestricted(); netCaps.setRequestorPackageName(FAKE_MMTEL_PACKAGE); NetworkRequest nativeNetworkRequest = new NetworkRequest(netCaps, Loading Loading @@ -5097,7 +5122,8 @@ public class DataNetworkControllerTest extends TelephonyTest { serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, NetworkRegistrationInfo.REGISTRATION_STATE_HOME); mDataNetworkControllerUT.addNetworkRequest( createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET)); createNetworkRequest(true/*restricted*/, NetworkCapabilities.NET_CAPABILITY_INTERNET)); processAllMessages(); verifyConnectedNetworkHasDataProfile(mEsimBootstrapDataProfile); Loading @@ -5108,13 +5134,6 @@ public class DataNetworkControllerTest extends TelephonyTest { .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), 2); processAllMessages(); verifyConnectedNetworkHasDataProfile(mEsimBootstrapImsProfile); serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, NetworkRegistrationInfo.REGISTRATION_STATE_HOME); mDataNetworkControllerUT.addNetworkRequest( createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_RCS)); processAllMessages(); verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_RCS); } @Test Loading Loading @@ -5153,7 +5172,7 @@ public class DataNetworkControllerTest extends TelephonyTest { serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, NetworkRegistrationInfo.REGISTRATION_STATE_HOME); mDataNetworkControllerUT.addNetworkRequest( createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET)); createNetworkRequest(true, NetworkCapabilities.NET_CAPABILITY_INTERNET)); processAllMessages(); // With allowed data limit unlimited, connection is allowed verifyConnectedNetworkHasDataProfile(mEsimBootstrapDataProfile); Loading Loading
src/java/com/android/internal/telephony/data/DataNetwork.java +20 −6 Original line number Diff line number Diff line Loading @@ -124,6 +124,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Objects; import java.util.Set; Loading Loading @@ -1001,23 +1002,36 @@ public class DataNetwork extends StateMachine { && transport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN; mDataAllowedReason = dataAllowedReason; dataProfile.setLastSetupTimestamp(SystemClock.elapsedRealtime()); mAttachedNetworkRequestList.addAll(networkRequestList); for (int transportType : mAccessNetworksManager.getAvailableTransports()) { mCid.put(transportType, INVALID_CID); } mTelephonyDisplayInfo = mPhone.getDisplayInfoController().getTelephonyDisplayInfo(); mTcpBufferSizes = mDataConfigManager.getTcpConfigString(mTelephonyDisplayInfo); for (TelephonyNetworkRequest networkRequest : networkRequestList) { networkRequest.setAttachedNetwork(DataNetwork.this); networkRequest.setState(TelephonyNetworkRequest.REQUEST_STATE_SATISFIED); } // network capabilities infer connectivity transport and MMTEL from the requested // capabilities. // TODO: Ideally we shouldn't infer network capabilities base on the requested capabilities, // but currently there are 2 hacks associated with getForcedCellularTransportCapabilities // and IMS service requesting IMS|MMTEL that need to support. When we stop supporting these // cases, we shouldn't consider the requests when determining the network capabilities. mAttachedNetworkRequestList.addAll(networkRequestList); // Update the capabilities in the constructor is to make sure the data network has initial // capability immediately after created. Doing this connecting state creates the window that // DataNetworkController might check if existing data network's capability can satisfy the // next network request within this window. updateNetworkCapabilities(); // Remove the requests that can't use the initial capabilities ListIterator<TelephonyNetworkRequest> iter = mAttachedNetworkRequestList.listIterator(); while (iter.hasNext()) { TelephonyNetworkRequest request = iter.next(); if (request.canBeSatisfiedBy(mNetworkCapabilities)) { request.setAttachedNetwork(DataNetwork.this); request.setState(TelephonyNetworkRequest.REQUEST_STATE_SATISFIED); } else { iter.remove(); } } } /** Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +19 −10 Original line number Diff line number Diff line Loading @@ -2122,6 +2122,13 @@ public class DataNetworkController extends Handler { */ private boolean canConnectivityTransportSatisfyNetworkRequest( @NonNull TelephonyNetworkRequest networkRequest, @TransportType int transport) { // Check if this is a IWLAN network request. if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { // If the request would result in bringing up network on IWLAN, then no // need to check if the device is using satellite network. return true; } // When the device is on satellite, only restricted network request can request network. if (mServiceState.isUsingNonTerrestrialNetwork() && networkRequest.hasCapability( Loading @@ -2136,14 +2143,6 @@ public class DataNetworkController extends Handler { return true; } // Check if this is a IWLAN network request. if (networkRequest.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) && transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { // If the cellular request would result in bringing up network on IWLAN, then no // need to check if the device is using satellite network. return true; } // As a short term solution, allowing some networks to be always marked as cellular // transport if certain capabilities are in the network request. if (networkRequest.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) && Arrays.stream( Loading Loading @@ -3061,8 +3060,18 @@ public class DataNetworkController extends Handler { List<NetworkRequestList> groupRequestLists = getGroupedUnsatisfiedNetworkRequests(); dataSetupRetryEntry.networkRequestList.stream() .filter(request -> groupRequestLists.stream() .anyMatch(groupRequestList -> groupRequestList .get(request.getCapabilities()) != null)) .anyMatch(groupRequestList -> { // The unsatisfied request has all the requested capabilities. if (groupRequestList.get(request.getCapabilities()) == null) { return false; } TelephonyNetworkRequest leading = groupRequestList.getFirst(); // The unsatisfied request covers all the requested transports. return leading.getTransportTypes().length == 0 || request.getTransportTypes().length == 0 || Arrays.stream(request.getTransportTypes()) .allMatch(leading::hasTransport); })) .forEach(requestList::add); } if (requestList.isEmpty()) { Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +32 −13 Original line number Diff line number Diff line Loading @@ -138,6 +138,8 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.Executor; import javax.annotation.Nullable; @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper public class DataNetworkControllerTest extends TelephonyTest { Loading Loading @@ -1138,19 +1140,24 @@ public class DataNetworkControllerTest extends TelephonyTest { } private @NonNull TelephonyNetworkRequest createNetworkRequest(Integer... capabilities) { return createNetworkRequest(false, capabilities); return createNetworkRequest(null, capabilities); } private @NonNull TelephonyNetworkRequest createNetworkRequest(boolean restricted, private @NonNull TelephonyNetworkRequest createNetworkRequest(@Nullable Boolean restricted, Integer... capabilities) { NetworkCapabilities netCaps = new NetworkCapabilities(); for (int networkCapability : capabilities) { netCaps.addCapability(networkCapability); } if (restricted != null) { if (restricted) { netCaps.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); } } else { // Data Network uses the same to define its own capabilities. netCaps.maybeMarkCapabilitiesRestricted(); } NetworkRequest nativeNetworkRequest = new NetworkRequest(netCaps, ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId, NetworkRequest.Type.REQUEST); Loading Loading @@ -1741,6 +1748,14 @@ public class DataNetworkControllerTest extends TelephonyTest { verify(mMockedDataNetworkControllerCallback, never()) .onConnectedInternetDataNetworksChanged(any()); // However, WLAN network setup shouldn't be affected doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WLAN).when(mAccessNetworksManager) .getPreferredTransportByNetworkCapability(anyInt()); mDataNetworkControllerUT.obtainMessage(5 /*EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS*/, DataEvaluation.DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED).sendToTarget(); processAllMessages(); verify(mMockedDataNetworkControllerCallback).onConnectedInternetDataNetworksChanged(any()); mIsNonTerrestrialNetwork = false; } Loading Loading @@ -3319,12 +3334,20 @@ public class DataNetworkControllerTest extends TelephonyTest { NetworkCapabilities.NET_CAPABILITY_IMS); TelephonyNetworkRequest secondTnr = createNetworkRequest( NetworkCapabilities.NET_CAPABILITY_IMS); TelephonyNetworkRequest thirdTnr = new TelephonyNetworkRequest( new NetworkRequest((new NetworkCapabilities.Builder()) .addCapability(NetworkCapabilities.NET_CAPABILITY_IMS) .addTransportType(NetworkCapabilities.TRANSPORT_SATELLITE) .build(), ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId, NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags); mDataNetworkControllerUT.addNetworkRequest(firstTnr); processAllMessages(); mDataNetworkControllerUT.removeNetworkRequest(firstTnr); mDataNetworkControllerUT.addNetworkRequest(secondTnr); mDataNetworkControllerUT.addNetworkRequest(thirdTnr); processAllFutureMessages(); verify(mMockedWwanDataServiceManager, times(1)).setupDataCall(anyInt(), Loading Loading @@ -4157,6 +4180,7 @@ public class DataNetworkControllerTest extends TelephonyTest { NetworkCapabilities netCaps = new NetworkCapabilities(); netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); netCaps.maybeMarkCapabilitiesRestricted(); netCaps.setRequestorPackageName(FAKE_MMTEL_PACKAGE); NetworkRequest nativeNetworkRequest = new NetworkRequest(netCaps, Loading Loading @@ -4209,6 +4233,7 @@ public class DataNetworkControllerTest extends TelephonyTest { // setup emergency data network. NetworkCapabilities netCaps = new NetworkCapabilities(); netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_EIMS); netCaps.maybeMarkCapabilitiesRestricted(); netCaps.setRequestorPackageName(FAKE_MMTEL_PACKAGE); NetworkRequest nativeNetworkRequest = new NetworkRequest(netCaps, Loading Loading @@ -5097,7 +5122,8 @@ public class DataNetworkControllerTest extends TelephonyTest { serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, NetworkRegistrationInfo.REGISTRATION_STATE_HOME); mDataNetworkControllerUT.addNetworkRequest( createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET)); createNetworkRequest(true/*restricted*/, NetworkCapabilities.NET_CAPABILITY_INTERNET)); processAllMessages(); verifyConnectedNetworkHasDataProfile(mEsimBootstrapDataProfile); Loading @@ -5108,13 +5134,6 @@ public class DataNetworkControllerTest extends TelephonyTest { .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), 2); processAllMessages(); verifyConnectedNetworkHasDataProfile(mEsimBootstrapImsProfile); serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, NetworkRegistrationInfo.REGISTRATION_STATE_HOME); mDataNetworkControllerUT.addNetworkRequest( createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_RCS)); processAllMessages(); verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_RCS); } @Test Loading Loading @@ -5153,7 +5172,7 @@ public class DataNetworkControllerTest extends TelephonyTest { serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, NetworkRegistrationInfo.REGISTRATION_STATE_HOME); mDataNetworkControllerUT.addNetworkRequest( createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET)); createNetworkRequest(true, NetworkCapabilities.NET_CAPABILITY_INTERNET)); processAllMessages(); // With allowed data limit unlimited, connection is allowed verifyConnectedNetworkHasDataProfile(mEsimBootstrapDataProfile); Loading