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

Commit c211cbdf authored by Ling Ma's avatar Ling Ma Committed by Jack Yu
Browse files

Reevaluate condition on handover retry

This change reevaluate conditions on handover retry attempts.

Bug: 254023175
Test: atest + basic voice call + data browsing
Merged-In: I50efebe9e8047fbc32396a7abbc7e171e94686a8
Change-Id: I50efebe9e8047fbc32396a7abbc7e171e94686a8
parent 392e8a37
Loading
Loading
Loading
Loading
+44 −29
Original line number Diff line number Diff line
@@ -1897,11 +1897,6 @@ public class DataNetworkController extends Handler {
            return dataEvaluation;
        }

        if (mDataRetryManager.isAnyHandoverRetryScheduled(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());
@@ -2744,7 +2739,7 @@ public class DataNetworkController extends Handler {
        logl("onDataNetworkHandoverRetry: Start handover " + dataNetwork + " to "
                + AccessNetworkConstants.transportTypeToString(preferredTransport)
                + ", " + dataHandoverRetryEntry);
        dataNetwork.startHandover(preferredTransport, dataHandoverRetryEntry);
        tryHandoverDataNetwork(dataNetwork, preferredTransport, dataHandoverRetryEntry);
    }

    /**
@@ -3031,30 +3026,50 @@ public class DataNetworkController extends Handler {
                    continue;
                }

                tryHandoverDataNetwork(dataNetwork, preferredTransport, null/*handoverRetryEntry*/);
            }
        }
    }

    /**
     * Perform data network handover if condition allows, otherwise tear down the network to allow
     * new network setup on the target transport.
     *
     * @param dataNetwork The network on which the handover occurs
     * @param targetTransport The target transport of the handover
     * @param dataHandoverRetryEntry {@code null} if the handover attempt is not due to scheduled
     *                                           retry
     */
    private void tryHandoverDataNetwork(@NonNull DataNetwork dataNetwork,
            @TransportType int targetTransport,
            @Nullable DataHandoverRetryEntry dataHandoverRetryEntry) {
        if (dataHandoverRetryEntry == null // This handover is a new request
                && mDataRetryManager.isAnyHandoverRetryScheduled(dataNetwork)) {
            log("tryHandoverDataNetwork: retry scheduled for" + dataNetwork
                    + ", ignore this attempt");
            return;
        }
        DataEvaluation dataEvaluation = evaluateDataNetworkHandover(dataNetwork);
                log("onEvaluatePreferredTransport: " + dataEvaluation + ", " + dataNetwork);
        log("tryHandoverDataNetwork: " + dataEvaluation + ", " + dataNetwork);
        if (!dataEvaluation.containsDisallowedReasons()) {
            logl("Start handover " + dataNetwork + " to "
                            + AccessNetworkConstants.transportTypeToString(preferredTransport));
                    dataNetwork.startHandover(preferredTransport, null);
                    + AccessNetworkConstants.transportTypeToString(targetTransport));
            dataNetwork.startHandover(targetTransport, dataHandoverRetryEntry);
        } else if (dataEvaluation.containsAny(DataDisallowedReason.NOT_ALLOWED_BY_POLICY,
                DataDisallowedReason.NOT_IN_SERVICE,
                DataDisallowedReason.VOPS_NOT_SUPPORTED)) {
                    logl("onEvaluatePreferredTransport: Handover not allowed. Tear "
                            + "down " + dataNetwork + " so a new network can be setup on "
                            + AccessNetworkConstants.transportTypeToString(preferredTransport)
                            + ".");
            logl("tryHandoverDataNetwork: Handover not allowed. Tear down"
                    + dataNetwork + " so a new network can be setup on "
                    + AccessNetworkConstants.transportTypeToString(targetTransport));
            tearDownGracefully(dataNetwork,
                    DataNetwork.TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED);
        } else if (dataEvaluation.containsAny(DataDisallowedReason.ILLEGAL_STATE,
                DataDisallowedReason.RETRY_SCHEDULED)) {
                    logl("onEvaluatePreferredTransport: Handover not allowed. " + dataNetwork
            logl("tryHandoverDataNetwork: Handover not allowed. " + dataNetwork
                    + " will remain on " + AccessNetworkConstants.transportTypeToString(
                    dataNetwork.getTransport()));
        } else {
                    loge("onEvaluatePreferredTransport: Unexpected handover evaluation result.");
                }
            }
            loge("tryHandoverDataNetwork: Unexpected handover evaluation result.");
        }
    }

+17 −0
Original line number Diff line number Diff line
@@ -2283,9 +2283,26 @@ public class DataNetworkControllerTest extends TelephonyTest {
        assertThat(dataNetwork.getTransport()).isEqualTo(
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN);

        // Set target transport OOS
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_UNKNOWN,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME, /* data */
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME, /* voice */
                NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING, /* iwlan */
                null);
        setSuccessfulSetupDataResponse(mMockedWlanDataServiceManager, 1);

        processAllFutureMessages();
        // Verify that data network is still on cellular
        assertThat(dataNetwork.getTransport()).isEqualTo(
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN);

        // Set target transport back to service
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_UNKNOWN,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME, /* data */
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME, /* voice */
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME, /* iwlan */
                null);
        processAllFutureMessages();

        dataNetwork = getDataNetworks().get(0);
        // Verify that data network is handovered to IWLAN