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

Commit d2ef1669 authored by Jack Yu's avatar Jack Yu Committed by android-build-merger
Browse files

Route network requests to corresponding DcTracker am: 57526ba9

am: ef5aecfc

Change-Id: Ie4b3b3fd0ef8553e79d198e905af4ce6f841422e
parents 8552780c ef5aecfc
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
@@ -211,6 +211,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";
@@ -3848,6 +3851,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= ");
@@ -3856,7 +3860,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");
        }
@@ -4632,5 +4640,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