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

Commit ea45a656 authored by Jack Yu's avatar Jack Yu
Browse files

Route network requests to corresponding DcTracker

Depending on the current available networks, route the
network requests to the corresponding DcTracker.

Test: Telephony sanity tests
Bug: 73659459
Change-Id: I37dbb7f9d69efa90457afd5b9e4cfa8273b19079
parent d01476cd
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -84,12 +84,13 @@ public class NetworkRegistrationManager {

    private final Map<NetworkRegStateCallback, Message> mCallbackTable = new Hashtable();

    public void getNetworkRegistrationState(int domain, Message onCompleteMessage) {
    public void getNetworkRegistrationState(@NetworkRegistrationState.Domain int domain,
                                            Message onCompleteMessage) {
        if (onCompleteMessage == null) return;

        logd("getNetworkRegistrationState domain " + domain);
        if (!isServiceConnected()) {
            logd("service not connected.");
            loge("service not connected. Domain = "
                    + ((domain == NetworkRegistrationState.DOMAIN_CS) ? "CS" : "PS"));
            onCompleteMessage.obj = new AsyncResult(onCompleteMessage.obj, null,
                    new IllegalStateException("Service not connected."));
            onCompleteMessage.sendToTarget();
+58 −15
Original line number Diff line number Diff line
@@ -21,22 +21,27 @@ import android.annotation.NonNull;
import android.os.AsyncResult;
import android.os.Handler;
import android.os.Message;
import android.telephony.AccessNetworkConstants.AccessNetworkType;
import android.telephony.AccessNetworkConstants.TransportType;
import android.telephony.CarrierConfigManager;
import android.telephony.Rlog;
import android.telephony.data.ApnSetting.ApnType;
import android.text.TextUtils;

import com.android.internal.telephony.Phone;
import com.android.internal.telephony.dataconnection.AccessNetworksManager.QualifiedNetworks;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.IndentingPrintWriter;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

/**
 * This class represents the transport manager which manages available transports (i.e. WWAN or
@@ -46,7 +51,17 @@ import java.util.List;
public class TransportManager extends Handler {
    private static final String TAG = TransportManager.class.getSimpleName();

    private static final boolean DBG = true;
    private static final Map<Integer, Integer> ACCESS_NETWORK_TRANSPORT_TYPE_MAP;

    static {
        ACCESS_NETWORK_TRANSPORT_TYPE_MAP = new HashMap<>();
        ACCESS_NETWORK_TRANSPORT_TYPE_MAP.put(AccessNetworkType.UNKNOWN, TransportType.WWAN);
        ACCESS_NETWORK_TRANSPORT_TYPE_MAP.put(AccessNetworkType.GERAN, TransportType.WWAN);
        ACCESS_NETWORK_TRANSPORT_TYPE_MAP.put(AccessNetworkType.UTRAN, TransportType.WWAN);
        ACCESS_NETWORK_TRANSPORT_TYPE_MAP.put(AccessNetworkType.EUTRAN, TransportType.WWAN);
        ACCESS_NETWORK_TRANSPORT_TYPE_MAP.put(AccessNetworkType.CDMA2000, TransportType.WWAN);
        ACCESS_NETWORK_TRANSPORT_TYPE_MAP.put(AccessNetworkType.IWLAN, TransportType.WLAN);
    }

    private static final int EVENT_QUALIFIED_NETWORKS_CHANGED = 1;

@@ -87,6 +102,12 @@ public class TransportManager extends Handler {

    private final AccessNetworksManager mAccessNetworksManager;

    /**
     * Available networks. The key is the APN type, and the value is the available network list in
     * the preferred order.
     */
    private final Map<Integer, int[]> mCurrentAvailableNetworks;

    public TransportManager(Phone phone) {
        mPhone = phone;
        mAccessNetworksManager = new AccessNetworksManager(phone);
@@ -94,6 +115,8 @@ public class TransportManager extends Handler {
        mAccessNetworksManager.registerForQualifiedNetworksChanged(this,
                EVENT_QUALIFIED_NETWORKS_CHANGED);

        mCurrentAvailableNetworks = new ConcurrentHashMap<>();

        if (isInLegacyMode()) {
            // For legacy mode, WWAN is the only transport to handle all data connections, even
            // the IWLAN ones.
@@ -117,9 +140,11 @@ public class TransportManager extends Handler {
        }
    }

    private synchronized void updateAvailableNetworks(List<QualifiedNetworks> networks) {
        log("updateAvailableNetworks: " + networks);
        //TODO: Update available networks and transports.
    private synchronized void updateAvailableNetworks(List<QualifiedNetworks> networksList) {
        log("updateAvailableNetworks: " + networksList);
        for (QualifiedNetworks networks : networksList) {
            mCurrentAvailableNetworks.put(networks.apnType, networks.qualifiedNetworks);
        }
    }

    /**
@@ -150,16 +175,35 @@ public class TransportManager extends Handler {
    }

    /**
     * Get the corresponding transport based on the APN type
     * Get the transport based on the APN type
     *
     * @param apnType APN type
     * @return The transport type
     */
    public int getCurrentTransport(@ApnType int apnType) {
        // TODO: Look up the transport from the transport type map
        // In legacy mode, always route to cellular.
        if (isInLegacyMode()) {
            return TransportType.WWAN;
        }

        // If we can't find the available networks, always route to cellular.
        if (!mCurrentAvailableNetworks.containsKey(apnType)) {
            return TransportType.WWAN;
        }

        int[] availableNetworks = mCurrentAvailableNetworks.get(apnType);

        // If the available networks list is empty, route to cellular.
        if (ArrayUtils.isEmpty(availableNetworks)) {
            return TransportType.WWAN;
        }

        // TODO: For now we choose the first network because it's the most preferred one. In the
        // the future we should validate it to make sure this network does not violate carrier
        // preference and user preference.
        return ACCESS_NETWORK_TRANSPORT_TYPE_MAP.get(availableNetworks[0]);
    }

    /**
     * Dump the state of transport manager
     *
@@ -171,12 +215,11 @@ public class TransportManager extends Handler {
        IndentingPrintWriter pw = new IndentingPrintWriter(printwriter, "  ");
        pw.println("TransportManager:");
        pw.increaseIndent();
        pw.print("mAvailableTransports=");
        List<String> transportsStrings = new ArrayList<>();
        for (int i = 0; i < mAvailableTransports.length; i++) {
            transportsStrings.add(TransportType.toString(mAvailableTransports[i]));
        }
        pw.println("[" + TextUtils.join(",", transportsStrings) + "]");
        pw.println("mAvailableTransports=[" + Arrays.stream(mAvailableTransports)
                .mapToObj(type -> TransportType.toString(type))
                .collect(Collectors.joining(",")) + "]");
        pw.println("isInLegacy=" + isInLegacyMode());
        pw.println("IWLAN operation mode=" + mPhone.mCi.getIwlanOperationMode());
        mAccessNetworksManager.dump(fd, pw, args);
        pw.decreaseIndent();
        pw.flush();
+13 −10
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import java.io.FileDescriptor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Access network manager manages the qualified/available networks for mobile data connection.
@@ -80,6 +81,7 @@ public class AccessNetworksManager {

    private QualifiedNetworksServiceConnection mServiceConnection;

    // Available networks. Key is the APN type.
    private final SparseArray<int[]> mAvailableNetworks = new SparseArray<>();

    private final RegistrantList mQualifiedNetworksChangedRegistrants = new RegistrantList();
@@ -119,7 +121,9 @@ public class AccessNetworksManager {
            return "[QualifiedNetworks: apnType="
                    + ApnSetting.getApnTypeString(apnType)
                    + ", networks="
                    + TextUtils.join(", ", accessNetworkStrings)
                    + Arrays.stream(qualifiedNetworks)
                    .mapToObj(type -> AccessNetworkType.toString(type))
                    .collect(Collectors.joining(","))
                    + "]";
        }
    }
@@ -160,9 +164,11 @@ public class AccessNetworksManager {
            IQualifiedNetworksServiceCallback.Stub {
        @Override
        public void onQualifiedNetworkTypesChanged(int apnTypes, int[] qualifiedNetworkTypes) {
            log("onQualifiedNetworkTypesChanged. apnTypes = "
            log("onQualifiedNetworkTypesChanged. apnTypes = ["
                    + ApnSetting.getApnTypesStringFromBitmask(apnTypes)
                    + ", networks = " + Arrays.toString(qualifiedNetworkTypes));
                    + "], networks = [" + Arrays.stream(qualifiedNetworkTypes)
                    .mapToObj(i -> AccessNetworkType.toString(i)).collect(Collectors.joining(","))
                    + "]");
            List<QualifiedNetworks> qualifiedNetworksList = new ArrayList<>();
            for (int supportedApnType : SUPPORTED_APN_TYPES) {
                if ((apnTypes & supportedApnType) == supportedApnType) {
@@ -316,13 +322,10 @@ public class AccessNetworksManager {
        pw.increaseIndent();

        for (int i = 0; i < mAvailableNetworks.size(); i++) {
            pw.print("APN type "
                    + ApnSetting.getApnTypeString(mAvailableNetworks.keyAt(i)) + ": ");
            List<String> networksStrings = new ArrayList<>();
            for (int network : mAvailableNetworks.valueAt(i)) {
                networksStrings.add(AccessNetworkType.toString(network));
            }
            pw.println("[" + TextUtils.join(",", networksStrings) + "]");
            pw.println("APN type " + ApnSetting.getApnTypeString(mAvailableNetworks.keyAt(i))
                    + ": [" + Arrays.stream(mAvailableNetworks.valueAt(i))
                    .mapToObj(type -> AccessNetworkType.toString(type))
                    .collect(Collectors.joining(",")) + "]");
        }
        pw.decreaseIndent();
        pw.decreaseIndent();
+10 −1
Original line number Diff line number Diff line
@@ -207,6 +207,9 @@ public class DcTracker extends Handler {
    /* The Url passed as object parameter in CMD_ENABLE_MOBILE_PROVISIONING */
    private String mProvisioningUrl = null;

    /* Indicating data service is bound or not */
    private boolean mDataServiceBound = false;

    /* Intent for the provisioning apn alarm */
    private static final String INTENT_PROVISIONING_APN_ALARM =
            "com.android.internal.telephony.provisioning_apn_alarm";
@@ -3847,6 +3850,7 @@ public class DcTracker extends Handler {
        pw.println(" mAutoAttachOnCreation=" + mAutoAttachOnCreation.get());
        pw.println(" mIsScreenOn=" + mIsScreenOn);
        pw.println(" mUniqueIdGenerator=" + mUniqueIdGenerator);
        pw.println(" mDataServiceBound=" + mDataServiceBound);
        pw.println(" mDataRoamingLeakageLog= ");
        mDataRoamingLeakageLog.dump(fd, pw, args);
        pw.println(" mApnSettingsInitializationLog= ");
@@ -3855,7 +3859,11 @@ public class DcTracker extends Handler {
        pw.println(" ***************************************");
        DcController dcc = mDcc;
        if (dcc != null) {
            if (mDataServiceBound) {
                dcc.dump(fd, pw, args);
            } else {
                pw.println(" Can't dump mDcc because data service is not bound.");
            }
        } else {
            pw.println(" mDcc=null");
        }
@@ -4537,5 +4545,6 @@ public class DcTracker extends Handler {
        } else {
            mDcc.dispose();
        }
        mDataServiceBound = bound;
    }
}
+30 −11
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ import android.net.StringNetworkSpecifier;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.telephony.AccessNetworkConstants.TransportType;
import android.telephony.Rlog;
import android.util.LocalLog;

@@ -38,6 +37,7 @@ import com.android.internal.util.IndentingPrintWriter;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

public class TelephonyNetworkFactory extends NetworkFactory {
    public final String LOG_TAG;
@@ -52,13 +52,15 @@ public class TelephonyNetworkFactory extends NetworkFactory {
    private final PhoneSwitcher mPhoneSwitcher;
    private final SubscriptionController mSubscriptionController;
    private final SubscriptionMonitor mSubscriptionMonitor;
    private final DcTracker mDcTracker;
    private final LocalLog mLocalLog = new LocalLog(REQUEST_LOG_SIZE);

    // Key: network request. Value: whether it's applied to DcTracker.
    private final HashMap<NetworkRequest, Boolean> mNetworkRequests = new HashMap();
    private final Map<NetworkRequest, Boolean> mNetworkRequests = new HashMap<>();

    private final Phone mPhone;

    private final TransportManager mTransportManager;

    private int mSubscriptionId;

    private final static int TELEPHONY_NETWORK_SCORE = 50;
@@ -74,6 +76,7 @@ public class TelephonyNetworkFactory extends NetworkFactory {
        super(looper, phone.getContext(), "TelephonyNetworkFactory[" + phone.getPhoneId()
                + "]", null);
        mPhone = phone;
        mTransportManager = mPhone.getTransportManager();
        mInternalHandler = new InternalHandler(looper);

        mSubscriptionController = SubscriptionController.getInstance();
@@ -84,9 +87,6 @@ public class TelephonyNetworkFactory extends NetworkFactory {
        mPhoneSwitcher = PhoneSwitcher.getInstance();
        mSubscriptionMonitor = subscriptionMonitor;
        LOG_TAG = "TelephonyNetworkFactory[" + mPhone.getPhoneId() + "]";
        // TODO: Will need to dynamically route network requests to the corresponding DcTracker in
        // the future. For now we route everything to WWAN.
        mDcTracker = mPhone.getDcTracker(TransportType.WWAN);

        mPhoneSwitcher.registerForActivePhoneSwitch(mInternalHandler, EVENT_ACTIVE_PHONE_SWITCH,
                null);
@@ -151,6 +151,26 @@ public class TelephonyNetworkFactory extends NetworkFactory {
        }
    }

    private int getTransportTypeFromNetworkRequest(NetworkRequest networkRequest) {
        int apnType = ApnContext.getApnTypeFromNetworkRequest(networkRequest);
        return mTransportManager.getCurrentTransport(apnType);
    }

    private void requestNetworkInternal(NetworkRequest networkRequest) {
        int transportType = getTransportTypeFromNetworkRequest(networkRequest);
        if (mPhone.getDcTracker(transportType) != null) {
            mPhone.getDcTracker(transportType).requestNetwork(networkRequest, mLocalLog);
        }
    }

    private void releaseNetworkInternal(NetworkRequest networkRequest, boolean cleanUpOnRelease) {
        int transportType = getTransportTypeFromNetworkRequest(networkRequest);
        if (mPhone.getDcTracker(transportType) != null) {
            mPhone.getDcTracker(transportType).releaseNetwork(networkRequest, mLocalLog,
                    cleanUpOnRelease);
        }
    }

    private void applyRequestsOnActivePhoneSwitch(NetworkRequest networkRequest,
            boolean cleanUpOnRelease, int action) {
        if (action == ACTION_NO_OP) return;
@@ -159,9 +179,9 @@ public class TelephonyNetworkFactory extends NetworkFactory {
                ? "Requesting" : "Releasing") + " network request " + networkRequest;
        mLocalLog.log(logStr);
        if (action == ACTION_REQUEST) {
            mDcTracker.requestNetwork(networkRequest, mLocalLog);
            requestNetworkInternal(networkRequest);
        } else if (action == ACTION_RELEASE) {
            mDcTracker.releaseNetwork(networkRequest, mLocalLog, cleanUpOnRelease);
            releaseNetworkInternal(networkRequest, cleanUpOnRelease);
        }
    }

@@ -221,7 +241,7 @@ public class TelephonyNetworkFactory extends NetworkFactory {
        mLocalLog.log(s);

        if (shouldApply) {
            mDcTracker.requestNetwork(networkRequest, mLocalLog);
            requestNetworkInternal(networkRequest);
        }
    }

@@ -242,9 +262,8 @@ public class TelephonyNetworkFactory extends NetworkFactory {
        log(s);
        mLocalLog.log(s);


        if (applied) {
            mDcTracker.releaseNetwork(networkRequest, mLocalLog, false);
            releaseNetworkInternal(networkRequest, false);
        }
    }

Loading