Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 73f88f7b authored by Nagendra Prasad Nagarle Basavaraju's avatar Nagendra Prasad Nagarle Basavaraju
Browse files

Avoid PDN Tear down at Out of service scenario

- skip data availability service check at oos scenario during
  data network evaluation to avoid pdn tear down.
- check available services change check to trigger re-evaluation
  of data network and network requests.

Flag: com.android.internal.telephony.flags.data_service_check
Bug: 381338283
Test: m and atest
Test: Device test at b/381338283
Change-Id: I429e98d7dd4adc0c881af7297be321c68de46a7c
parent b92238ba
Loading
Loading
Loading
Loading
+40 −20
Original line number Diff line number Diff line
@@ -1640,8 +1640,14 @@ public class DataNetworkController extends Handler {
            evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_CONFIG_NOT_READY);
        }

        if (mFeatureFlags.dataServiceCheck() && !isDataServiceSupported(transport)) {
            evaluation.addDataDisallowedReason(DataDisallowedReason.SERVICE_OPTION_NOT_SUPPORTED);
        if (mFeatureFlags.dataServiceCheck()) {
            NetworkRegistrationInfo nri = mServiceState.getNetworkRegistrationInfo(
                    NetworkRegistrationInfo.DOMAIN_PS, transport);
            if (nri != null && !nri.getAvailableServices().contains(
                    NetworkRegistrationInfo.SERVICE_TYPE_DATA)) {
                evaluation.addDataDisallowedReason(
                        DataDisallowedReason.SERVICE_OPTION_NOT_SUPPORTED);
            }
        }

        // Check CS call state and see if concurrent voice/data is allowed.
@@ -1977,9 +1983,14 @@ public class DataNetworkController extends Handler {
            evaluation.addDataDisallowedReason(DataDisallowedReason.CDMA_EMERGENCY_CALLBACK_MODE);
        }

        if (mFeatureFlags.dataServiceCheck()
                && !isDataServiceSupported(dataNetwork.getTransport())) {
            evaluation.addDataDisallowedReason(DataDisallowedReason.SERVICE_OPTION_NOT_SUPPORTED);
        if (mFeatureFlags.dataServiceCheck()) {
            NetworkRegistrationInfo nri = mServiceState.getNetworkRegistrationInfo(
                    NetworkRegistrationInfo.DOMAIN_PS, dataNetwork.getTransport());
            if (nri != null && nri.isInService() && !nri.getAvailableServices().contains(
                    NetworkRegistrationInfo.SERVICE_TYPE_DATA)) {
                evaluation.addDataDisallowedReason(
                        DataDisallowedReason.SERVICE_OPTION_NOT_SUPPORTED);
            }
        }

        // If the network is satellite, then the network must be restricted.
@@ -2176,21 +2187,6 @@ public class DataNetworkController extends Handler {
        return evaluation;
    }

    /**
     * Check if the available services support data service.
     * {@link NetworkRegistrationInfo#SERVICE_TYPE_DATA} service or not.
     *
     * @param transport The preferred transport type for the request. The transport here is
     * WWAN/WLAN.
     * @return {@code true} if data services is supported, otherwise {@code false}.
     */
    private boolean isDataServiceSupported(@TransportType int transport) {
        NetworkRegistrationInfo nri = mServiceState.getNetworkRegistrationInfo(
                    NetworkRegistrationInfo.DOMAIN_PS, transport);
        return nri != null && nri.getAvailableServices().contains(
                    NetworkRegistrationInfo.SERVICE_TYPE_DATA);
    }

    /**
     * Check if the transport from connectivity service can satisfy the network request. Note the
     * transport here is connectivity service's transport (Wifi, cellular, satellite, etc..), not
@@ -3801,6 +3797,22 @@ public class DataNetworkController extends Handler {
        }
    }

    /**
     * Check if network available services list is changed
     *
     * @param oldNri Previous network registration info.
     * @param newNri Current network registration info.
     * @return {@code true} if available services list is changed else return false
     */
    private boolean areNetworkAvailableServicesChanged(@NonNull NetworkRegistrationInfo oldNri,
            @NonNull NetworkRegistrationInfo newNri) {
        List<Integer> oldAvailableServicesList = oldNri.getAvailableServices();
        List<Integer> newAvailableServicesList = newNri.getAvailableServices();

        return !(oldAvailableServicesList.size() == newAvailableServicesList.size()
                && oldAvailableServicesList.stream().allMatch(newAvailableServicesList::contains));
    }

    /**
     * Check if needed to re-evaluate the existing data networks.
     *
@@ -3817,6 +3829,10 @@ public class DataNetworkController extends Handler {
            return false;
        }

        if (areNetworkAvailableServicesChanged(oldNri, newNri)) {
            return true;
        }

        if (oldNri.getAccessNetworkTechnology() != newNri.getAccessNetworkTechnology()
                // Some CarrierConfig disallows vops in nonVops area for specified home/roaming.
                || (oldNri.isRoaming() != newNri.isRoaming())) {
@@ -3862,6 +3878,10 @@ public class DataNetworkController extends Handler {
            return false;
        }

        if (areNetworkAvailableServicesChanged(oldPsNri, newPsNri)) {
            return true;
        }

        if (oldPsNri == null
                || oldPsNri.getAccessNetworkTechnology() != newPsNri.getAccessNetworkTechnology()
                || (!oldPsNri.isInService() && newPsNri.isInService())
+150 −22
Original line number Diff line number Diff line
@@ -186,7 +186,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
    private LinkBandwidthEstimatorCallback mLinkBandwidthEstimatorCallback;

    private boolean mIsNonTerrestrialNetwork = false;
    private ArrayList<Integer> mCarrierSupportedSatelliteServices = new ArrayList<>();
    private ArrayList<Integer> mCarrierSupportedServices = new ArrayList<>();

    private final DataProfile mGeneralPurposeDataProfile = new DataProfile.Builder()
            .setApnSetting(new ApnSetting.Builder()
@@ -692,7 +692,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
                .setDomain(NetworkRegistrationInfo.DOMAIN_PS)
                .setDataSpecificInfo(dsri)
                .setIsNonTerrestrialNetwork(mIsNonTerrestrialNetwork)
                .setAvailableServices(mCarrierSupportedSatelliteServices)
                .setAvailableServices(mCarrierSupportedServices)
                .setEmergencyOnly(isEmergencyOnly)
                .build());

@@ -702,7 +702,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
                .setRegistrationState(iwlanRegState)
                .setDomain(NetworkRegistrationInfo.DOMAIN_PS)
                .setIsNonTerrestrialNetwork(mIsNonTerrestrialNetwork)
                .setAvailableServices(mCarrierSupportedSatelliteServices)
                .setAvailableServices(mCarrierSupportedServices)
                .setEmergencyOnly(isEmergencyOnly)
                .build());

@@ -1124,7 +1124,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
        doReturn(CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED)
                .when(mSatelliteController)
                .getSatelliteDataServicePolicyForPlmn(anyInt(), any());
        mCarrierSupportedSatelliteServices.add(NetworkRegistrationInfo.SERVICE_TYPE_DATA);
        mCarrierSupportedServices.add(NetworkRegistrationInfo.SERVICE_TYPE_DATA);
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
        logd("DataNetworkControllerTest -Setup!");
@@ -1538,15 +1538,144 @@ public class DataNetworkControllerTest extends TelephonyTest {
    public void testMovingFromInServiceToNoService() throws Exception {
        testSetupDataNetwork();

        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
        // clear available services at no service
        mCarrierSupportedServices.clear();

        serviceStateChanged(TelephonyManager.NETWORK_TYPE_UNKNOWN,
                NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING);
        // Verify we don't tear down the data network.
        verifyInternetConnected();
    }

    @Test
    public void testInServiceAvailableServicesChanged() throws Exception {
        testSetupDataNetwork();

        List<DataDisallowedReason> reasons = mDataNetworkControllerUT
                .getInternetDataDisallowedReasons();
        assertThat(reasons).isEmpty();

        // Add available services sms to existing available services with data
        mCarrierSupportedServices.add(NetworkRegistrationInfo.SERVICE_TYPE_SMS);

        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);

        serviceStateChanged(TelephonyManager.NETWORK_TYPE_UNKNOWN,
                NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING);
        // Verify we don't tear down the data network.
        verifyInternetConnected();


        mCarrierSupportedServices.clear();
        // Add available services data and mms
        mCarrierSupportedServices.add(NetworkRegistrationInfo.SERVICE_TYPE_DATA);
        mCarrierSupportedServices.add(NetworkRegistrationInfo.SERVICE_TYPE_MMS);

        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);

        // Verify we don't tear down the data network.
        verifyInternetConnected();

        // clear all available services
        mCarrierSupportedServices.clear();
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);

        // Verify internet is not connected
        verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);

        reasons = mDataNetworkControllerUT.getInternetDataDisallowedReasons();
        assertThat(reasons).contains(DataDisallowedReason.SERVICE_OPTION_NOT_SUPPORTED);

    }

    @Test
    public void testHomeToRoamingAvailableServicesChangedWithDataRoamingDisabled()
            throws Exception {
        testSetupDataNetwork();

        List<DataDisallowedReason> reasons = mDataNetworkControllerUT
                .getInternetDataDisallowedReasons();
        assertThat(reasons).isEmpty();

        // Disable data roaming setting
        mDataNetworkControllerUT.getDataSettingsManager().setDataRoamingEnabled(false);

        // Home to roaming with same available services
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING);

        // Verify internet is not connected due to roaming disabled
        verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);

        reasons = mDataNetworkControllerUT.getInternetDataDisallowedReasons();
        assertThat(reasons).contains(DataDisallowedReason.ROAMING_DISABLED);
    }

    @Test
    public void testHomeToRoamingAvailableServicesChangedWithDataRoamingEnabled()
            throws Exception {
        testSetupDataNetwork();

        List<DataDisallowedReason> reasons = mDataNetworkControllerUT
                .getInternetDataDisallowedReasons();
        assertThat(reasons).isEmpty();

        // Enable data roaming setting
        mDataNetworkControllerUT.getDataSettingsManager().setDataRoamingEnabled(true);

        // Home to roaming with same available services
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING);

        // Verify we don't tear down the data network since available services as still data
        // with data roaming enabled
        verifyInternetConnected();

        // clear all available services
        mCarrierSupportedServices.clear();
        // At roaming
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING);

        // Verify internet is not connected
        verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);

        reasons = mDataNetworkControllerUT.getInternetDataDisallowedReasons();
        assertThat(reasons).contains(DataDisallowedReason.SERVICE_OPTION_NOT_SUPPORTED);
    }

    @Test
    public void testOnAvailableServiceChanged_WithReevaluateNetworkRequest()
            throws Exception {
        // clear available services at no service
        mCarrierSupportedServices.clear();

        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);

        // Set network request transport with Internet capability
        mDataNetworkControllerUT.addNetworkRequest(
                createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET));
        processAllMessages();

        // Verify internet is not connected due to roaming disabled
        verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);

        List<DataDisallowedReason> reasons = mDataNetworkControllerUT
                .getInternetDataDisallowedReasons();
        assertThat(reasons).contains(DataDisallowedReason.SERVICE_OPTION_NOT_SUPPORTED);

        // add available services with data, re-evaluate network request
        mCarrierSupportedServices.add(NetworkRegistrationInfo.SERVICE_TYPE_DATA);
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);

        // Verify now internet was connected
        verifyInternetConnected();

        reasons = mDataNetworkControllerUT.getInternetDataDisallowedReasons();
        assertThat(reasons).isEmpty();
    }

    @Test
@@ -1572,7 +1701,6 @@ public class DataNetworkControllerTest extends TelephonyTest {
        verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_INTERNET);


        // PS unrestricted, new setup is allowed
        mDataNetworkControllerUT.obtainMessage(7/*EVENT_PS_RESTRICT_DISABLED*/).sendToTarget();
        processAllMessages();
@@ -2129,7 +2257,7 @@ public class DataNetworkControllerTest extends TelephonyTest {

        // reset satellite network and roaming registration
        mIsNonTerrestrialNetwork = false;
        mCarrierSupportedSatelliteServices.clear();
        mCarrierSupportedServices.clear();
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
    }
@@ -5839,8 +5967,8 @@ public class DataNetworkControllerTest extends TelephonyTest {
    @Test
    public void testNotRestrictedDataConnectionRequest_WithoutDataServiceSupport()
            throws Exception {
        mCarrierSupportedSatelliteServices.clear();
        mCarrierSupportedSatelliteServices.add(NetworkRegistrationInfo.SERVICE_TYPE_VOICE);
        mCarrierSupportedServices.clear();
        mCarrierSupportedServices.add(NetworkRegistrationInfo.SERVICE_TYPE_VOICE);
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);

@@ -5856,7 +5984,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
        Mockito.clearInvocations(mMockedDataNetworkControllerCallback);

        // reset satellite network and roaming registration
        mCarrierSupportedSatelliteServices.clear();
        mCarrierSupportedServices.clear();
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
    }
@@ -5865,8 +5993,8 @@ public class DataNetworkControllerTest extends TelephonyTest {
    public void testConnection_WithDataServiceCheckFlagDisabled_WithoutDataServiceSupport()
            throws Exception {
        doReturn(false).when(mFeatureFlags).dataServiceCheck();
        mCarrierSupportedSatelliteServices.clear();
        mCarrierSupportedSatelliteServices.add(NetworkRegistrationInfo.SERVICE_TYPE_VOICE);
        mCarrierSupportedServices.clear();
        mCarrierSupportedServices.add(NetworkRegistrationInfo.SERVICE_TYPE_VOICE);
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);

@@ -5882,7 +6010,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
        Mockito.clearInvocations(mMockedDataNetworkControllerCallback);

        // reset satellite network and roaming registration
        mCarrierSupportedSatelliteServices.clear();
        mCarrierSupportedServices.clear();
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
    }
@@ -5890,8 +6018,8 @@ public class DataNetworkControllerTest extends TelephonyTest {
    @Test
    public void testRestrictedDataConnectionRequest_WithoutDataServiceSupport()
            throws Exception {
        mCarrierSupportedSatelliteServices.clear();
        mCarrierSupportedSatelliteServices.add(NetworkRegistrationInfo.SERVICE_TYPE_VOICE);
        mCarrierSupportedServices.clear();
        mCarrierSupportedServices.add(NetworkRegistrationInfo.SERVICE_TYPE_VOICE);
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);

@@ -5911,7 +6039,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
        Mockito.clearInvocations(mMockedDataNetworkControllerCallback);

        // reset satellite network and roaming registration
        mCarrierSupportedSatelliteServices.clear();
        mCarrierSupportedServices.clear();
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
    }
@@ -5940,7 +6068,7 @@ public class DataNetworkControllerTest extends TelephonyTest {

        // reset satellite network and roaming registration
        mIsNonTerrestrialNetwork = false;
        mCarrierSupportedSatelliteServices.clear();
        mCarrierSupportedServices.clear();
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
    }
@@ -5975,7 +6103,7 @@ public class DataNetworkControllerTest extends TelephonyTest {

        // reset satellite network and roaming registration
        mIsNonTerrestrialNetwork = false;
        mCarrierSupportedSatelliteServices.clear();
        mCarrierSupportedServices.clear();
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
    }
@@ -6010,7 +6138,7 @@ public class DataNetworkControllerTest extends TelephonyTest {

        // reset satellite network and roaming registration
        mIsNonTerrestrialNetwork = false;
        mCarrierSupportedSatelliteServices.clear();
        mCarrierSupportedServices.clear();
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
    }
@@ -6046,7 +6174,7 @@ public class DataNetworkControllerTest extends TelephonyTest {

        // reset satellite network and roaming registration
        mIsNonTerrestrialNetwork = false;
        mCarrierSupportedSatelliteServices.clear();
        mCarrierSupportedServices.clear();
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
    }