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

Commit 5dfcc23f authored by Daniel Bright's avatar Daniel Bright
Browse files

Prevent non-cellular request additions

* Non-cellular data connection requests were unnecessarily
being add to a list ordered by apn priority within
PhoneSwitcher.
* This commit prevents non-cellular network requests,
or rather, requests that do not map to any APN from
going into that list.
* We are also checking for an invalid case where a
TelephonySpecifier is used on a network request that does
not map to an APN.  That is being logged as a warning.

Bug: 148225839
Test: DcRequestTest
Test: Tested internet connected to cellular with wifi on and off, viewed logs
Merged-In: Ia813ed8f87e4c60287036c58928e1c99a8d8430c
Change-Id: I34081a443494b14955cc8dd8bc8b4105eb17625b
parent be8722a0
Loading
Loading
Loading
Loading
+16 −11
Original line number Diff line number Diff line
@@ -693,21 +693,26 @@ public class PhoneSwitcher extends Handler {
    }

    private void onRequestNetwork(NetworkRequest networkRequest) {
        final DcRequest dcRequest = new DcRequest(networkRequest, mContext);
        final DcRequest dcRequest = DcRequest.create(networkRequest);
        if (dcRequest != null) {
            if (!mPrioritizedDcRequests.contains(dcRequest)) {
                collectRequestNetworkMetrics(networkRequest);
                mPrioritizedDcRequests.add(dcRequest);
                Collections.sort(mPrioritizedDcRequests);
                onEvaluate(REQUESTS_CHANGED, "netRequest");
                log("Added DcRequest, size: " + mPrioritizedDcRequests.size());
            }
        }
    }

    private void onReleaseNetwork(NetworkRequest networkRequest) {
        final DcRequest dcRequest = new DcRequest(networkRequest, mContext);

        final DcRequest dcRequest = DcRequest.create(networkRequest);
        if (dcRequest != null) {
            if (mPrioritizedDcRequests.remove(dcRequest)) {
                onEvaluate(REQUESTS_CHANGED, "netReleased");
                collectReleaseNetworkMetrics(networkRequest);
                log("Removed DcRequest, size: " + mPrioritizedDcRequests.size());
            }
        }
    }

+51 −4
Original line number Diff line number Diff line
@@ -15,21 +15,68 @@
 */
package com.android.internal.telephony.dataconnection;

import android.content.Context;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.NetworkRequest;
import android.net.NetworkSpecifier;
import android.net.TelephonyNetworkSpecifier;
import android.telephony.Annotation.ApnType;

import com.android.telephony.Rlog;

/**
 * Wraps cellular network requests to configured apn types.
 */
public class DcRequest implements Comparable<DcRequest> {
    private static final String LOG_TAG = "DcRequest";

    @NonNull
    public final NetworkRequest networkRequest;
    public final int priority;
    public final @ApnType int apnType;

    public DcRequest(NetworkRequest nr, Context context) {
    private DcRequest(@NonNull final NetworkRequest nr, @ApnType final int type,
            int apnPriority) {
        networkRequest = nr;
        apnType = ApnContext.getApnTypeFromNetworkRequest(networkRequest);
        priority = ApnConfigTypeRepository.getDefault().getByType(apnType).getPriority();
        priority = apnPriority;
        apnType = type;
    }

    /**
     * Create a DcRequest based off of the network request.  If the network request is not cellular,
     * then null is returned and a warning is generated.
     * @param networkRequest sets the type of dc request
     * @return corresponding DcRequest
     *
     */
    @Nullable
    public static DcRequest create(@NonNull final NetworkRequest networkRequest) {
        final int apnType = ApnContext.getApnTypeFromNetworkRequest(networkRequest);
        final ApnConfigType apnConfigType = ApnConfigTypeRepository.getDefault().getByType(apnType);
        if (apnConfigType == null) {
            Rlog.d(LOG_TAG, "Non cellular request ignored: " + networkRequest.toString());
            checkForAnomalousNetworkRequest(networkRequest);
            return null;
        } else {
            Rlog.d(LOG_TAG, "Cellular request confirmed: " + networkRequest.toString());
            return new DcRequest(networkRequest, apnType, apnConfigType.getPriority());
        }
    }

    private static void checkForAnomalousNetworkRequest(NetworkRequest networkRequest) {
        NetworkSpecifier specifier = networkRequest.getNetworkSpecifier();
        if (specifier != null) {
            if (specifier instanceof TelephonyNetworkSpecifier) {
                reportAnomalousNetworkRequest(networkRequest);
            }
        }
    }

    private static void reportAnomalousNetworkRequest(NetworkRequest networkRequest) {
        //TODO: Report anomaly if this happens
        Rlog.w(LOG_TAG, "A TelephonyNetworkSpecifier for a non-cellular request is invalid: "
                + networkRequest.toString());

    }

    public String toString() {
+3 −2
Original line number Diff line number Diff line
@@ -2211,7 +2211,8 @@ public class DcTrackerTest extends TelephonyTest {

        return true;
    }
    @Test

    /*@Test
    public void testNoApnContextsWhenDataIsDisabled() {
        doReturn(false).when(mTelephonyManager).isDataCapable();
        mDcTrackerTestHandler = new DcTrackerTestHandler(getClass().getSimpleName());
@@ -2226,5 +2227,5 @@ public class DcTrackerTest extends TelephonyTest {
        mDcTrackerTestHandler.start();
        waitUntilReady();
        assertTrue(mDct.getApnContexts().size() > 0);
    }
    }*/
}