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

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

Defer dataCallList for source transport duing HO

when source PDN is reported lost duing HO, this event is dropped. So that when HO is over, if the HO failed, we are unaware of
that the current PDN is lost. Fix by defer the event so we can tear down
if HO unsuccessful.

Test: atest + basic data browsing and phone call + handover to/from WLAN
Bug: 237206286
Merged-In: I1b954ca9f1228217c2ab9f44ab0ad2c06fa7c983
Change-Id: I1b954ca9f1228217c2ab9f44ab0ad2c06fa7c983
parent b3832a47
Loading
Loading
Loading
Loading
+9 −35
Original line number Diff line number Diff line
@@ -1409,8 +1409,15 @@ public class DataNetwork extends StateMachine {
                    // Otherwise the deferred message might be incorrectly treated as "disconnected"
                    // signal. So we only defer the related data call list changed event, and drop
                    // the unrelated.
                    if (shouldDeferDataStateChangedEvent(msg)) {
                        log("Defer message " + eventToString(msg.what));
                    AsyncResult ar = (AsyncResult) msg.obj;
                    int transport = (int) ar.userObj;
                    List<DataCallResponse> responseList = (List<DataCallResponse>) ar.result;
                    if (transport != mTransport) {
                        log("Dropped unrelated "
                                + AccessNetworkConstants.transportTypeToString(transport)
                                + " data call list changed event. " + responseList);
                    } else {
                        log("Defer message " + eventToString(msg.what) + ":" + responseList);
                        deferMessage(msg);
                    }
                    break;
@@ -1457,39 +1464,6 @@ public class DataNetwork extends StateMachine {
            }
            return HANDLED;
        }

        /**
         * Check if the data call list changed event should be deferred or dropped when handover
         * is in progress.
         *
         * @param msg The data call list changed message.
         *
         * @return {@code true} if the message should be deferred.
         */
        private boolean shouldDeferDataStateChangedEvent(@NonNull Message msg) {
            // The data call list changed event should be conditionally deferred.
            // Otherwise the deferred message might be incorrectly treated as "disconnected"
            // signal. So we only defer the related data call list changed event, and drop
            // the unrelated.
            AsyncResult ar = (AsyncResult) msg.obj;
            int transport = (int) ar.userObj;
            List<DataCallResponse> responseList = (List<DataCallResponse>) ar.result;
            if (transport != mTransport) {
                log("Dropped unrelated " + AccessNetworkConstants.transportTypeToString(transport)
                        + " data call list changed event. " + responseList);
                return false;
            }

            // Check if the data call list changed event are related to the current data network.
            boolean related = responseList.stream().anyMatch(
                    r -> mCid.get(mTransport) == r.getId());
            if (related) {
                log("Deferred the related data call list changed event." + responseList);
            } else {
                log("Dropped unrelated data call list changed event. " + responseList);
            }
            return related;
        }
    }

    /**
+11 −0
Original line number Diff line number Diff line
@@ -1063,6 +1063,17 @@ public class DataNetworkTest extends TelephonyTest {
        assertThat(pdcsList.get(3).getState()).isEqualTo(TelephonyManager.DATA_CONNECTED);
        assertThat(pdcsList.get(3).getLastCauseCode())
                .isEqualTo(DataFailCause.SERVICE_TEMPORARILY_UNAVAILABLE);

        // Test source PDN lost during the HO, expect tear down after HO
        setFailedSetupDataResponse(mMockedWlanDataServiceManager,
                DataServiceCallback.RESULT_ERROR_TEMPORARILY_UNAVAILABLE);
        mDataNetworkUT.startHandover(AccessNetworkConstants.TRANSPORT_TYPE_WLAN, null);
        mDataNetworkUT.sendMessage(8/*EVENT_DATA_STATE_CHANGED*/,
                new AsyncResult(AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
                        Collections.emptyList(), null)); // the source transport report PDN lost
        processAllMessages();

        assertThat(mDataNetworkUT.isConnected()).isFalse();
    }

    @Test