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

Commit 75b9dc5e authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Update and retry ENTERPRISE if TDs changed" am: 625e9508

Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/telephony/+/1846874

Change-Id: I1f33c251901e6d6359595bc0c10095b5c9bbed68
parents 768692f3 625e9508
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -208,6 +208,7 @@ public interface PhoneInternalInterface {
    static final String REASON_IWLAN_DATA_SERVICE_DIED = "iwlanDataServiceDied";
    static final String REASON_VCN_REQUESTED_TEARDOWN = "vcnRequestedTeardown";
    static final String REASON_DATA_UNTHROTTLED = "dataUnthrottled";
    static final String REASON_TRAFFIC_DESCRIPTORS_UPDATED = "trafficDescriptorsUpdated";

    // Reasons for Radio being powered off
    int RADIO_POWER_REASON_USER = 0;
+10 −8
Original line number Diff line number Diff line
@@ -680,6 +680,8 @@ public class DataConnection extends StateMachine {
     */
    public void updateTrafficDescriptors(DataCallResponse response) {
        mTrafficDescriptors = response.getTrafficDescriptors();
        mDcController.updateTrafficDescriptorsForCid(response.getId(),
                response.getTrafficDescriptors());
    }

    @VisibleForTesting
@@ -1404,6 +1406,12 @@ public class DataConnection extends StateMachine {
            }
        } else if (cp.mApnContext.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE
                && mDcController.getActiveDcByCid(response.getId()) != null) {
            if (!mDcController.getTrafficDescriptorsForCid(response.getId())
                    .equals(response.getTrafficDescriptors())) {
                if (DBG) log("Updating traffic descriptors: " + response.getTrafficDescriptors());
                mDcController.getActiveDcByCid(response.getId()).updateTrafficDescriptors(response);
                mDct.obtainMessage(DctConstants.EVENT_TRAFFIC_DESCRIPTORS_UPDATED).sendToTarget();
            }
            if (DBG) log("DataConnection already exists for cid: " + response.getId());
            result = SetupResult.ERROR_DUPLICATE_CID;
            result.mFailCause = DataFailCause.DUPLICATE_CID;
@@ -1809,14 +1817,8 @@ public class DataConnection extends StateMachine {
     * @return True if this data connection supports enterprise use.
     */
    private boolean isEnterpriseUse() {
        boolean enterpriseTrafficDescriptor = mTrafficDescriptors
                .stream()
                .anyMatch(td -> td.getOsAppId() != null && Arrays.equals(td.getOsAppId(),
                        getEnterpriseOsAppId()));
        boolean enterpriseApnContext = mApnContexts.keySet()
                .stream()
                .anyMatch(ac -> ac.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE);
        return enterpriseTrafficDescriptor || enterpriseApnContext;
        return  mApnContexts.keySet().stream().anyMatch(
                ac -> ac.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE);
    }

    /**
+49 −7
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.telephony.AccessNetworkConstants;
import android.telephony.DataFailCause;
import android.telephony.data.ApnSetting;
import android.telephony.data.DataCallResponse;
import android.telephony.data.TrafficDescriptor;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.DctConstants;
@@ -86,6 +87,9 @@ public class DcController extends Handler {
    final ArrayList<DataConnection> mDcListAll = new ArrayList<>();
    // @GuardedBy("mDcListAll")
    private final HashMap<Integer, DataConnection> mDcListActiveByCid = new HashMap<>();
    // @GuardedBy("mTrafficDescriptorsByCid")
    private final HashMap<Integer, List<TrafficDescriptor>> mTrafficDescriptorsByCid =
            new HashMap<>();

    /**
     * Aggregated physical link state from all data connections. This reflects the device's RRC
@@ -138,6 +142,9 @@ public class DcController extends Handler {
            mDcListActiveByCid.remove(dc.mCid);
            mDcListAll.remove(dc);
        }
        synchronized (mTrafficDescriptorsByCid) {
            mTrafficDescriptorsByCid.remove(dc.mCid);
        }
    }

    public void addActiveDcByCid(DataConnection dc) {
@@ -147,6 +154,7 @@ public class DcController extends Handler {
        synchronized (mDcListAll) {
            mDcListActiveByCid.put(dc.mCid, dc);
        }
        updateTrafficDescriptorsForCid(dc.mCid, dc.getTrafficDescriptors());
    }

    DataConnection getActiveDcByCid(int cid) {
@@ -162,6 +170,9 @@ public class DcController extends Handler {
                log("removeActiveDcByCid removedDc=null dc=" + dc);
            }
        }
        synchronized (mTrafficDescriptorsByCid) {
            mTrafficDescriptorsByCid.remove(dc.mCid);
        }
    }

    boolean isDefaultDataActive() {
@@ -172,6 +183,18 @@ public class DcController extends Handler {
        }
    }

    List<TrafficDescriptor> getTrafficDescriptorsForCid(int cid) {
        synchronized (mTrafficDescriptorsByCid) {
            return mTrafficDescriptorsByCid.get(cid);
        }
    }

    void updateTrafficDescriptorsForCid(int cid, List<TrafficDescriptor> tds) {
        synchronized (mTrafficDescriptorsByCid) {
            mTrafficDescriptorsByCid.put(cid, tds);
        }
    }

    @Override
    public void handleMessage(Message msg) {
        AsyncResult ar;
@@ -207,19 +230,29 @@ public class DcController extends Handler {
        }

        // Create hashmap of cid to DataCallResponse
        HashMap<Integer, DataCallResponse> dataCallResponseListByCid =
                new HashMap<Integer, DataCallResponse>();
        HashMap<Integer, DataCallResponse> dataCallResponseListByCid = new HashMap<>();
        for (DataCallResponse dcs : dcsList) {
            dataCallResponseListByCid.put(dcs.getId(), dcs);
        }

        // Add a DC that is active but not in the
        // dcsList to the list of DC's to retry
        ArrayList<DataConnection> dcsToRetry = new ArrayList<DataConnection>();
        // Add a DC that is active but not in the dcsList to the list of DC's to retry
        ArrayList<DataConnection> dcsToRetry = new ArrayList<>();
        for (DataConnection dc : dcListActiveByCid.values()) {
            if (dataCallResponseListByCid.get(dc.mCid) == null) {
            DataCallResponse response = dataCallResponseListByCid.get(dc.mCid);
            if (response == null) {
                if (DBG) log("onDataStateChanged: add to retry dc=" + dc);
                dcsToRetry.add(dc);
            } else {
                List<TrafficDescriptor> oldTds = getTrafficDescriptorsForCid(dc.mCid);
                List<TrafficDescriptor> newTds = response.getTrafficDescriptors();
                if (!oldTds.equals(newTds)) {
                    if (DBG) {
                        log("onDataStateChanged: add to retry due to TD changed dc=" + dc
                                + ", oldTds=" + oldTds + ", newTds=" + newTds);
                    }
                    updateTrafficDescriptorsForCid(dc.mCid, newTds);
                    dcsToRetry.add(dc);
                }
            }
        }
        if (DBG) log("onDataStateChanged: dcsToRetry=" + dcsToRetry);
@@ -448,9 +481,15 @@ public class DcController extends Handler {

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        synchronized (mDcListAll) {
            return "mDcListAll=" + mDcListAll + " mDcListActiveByCid=" + mDcListActiveByCid;
            sb.append("mDcListAll=").append(mDcListAll)
                    .append(" mDcListActiveByCid=").append(mDcListActiveByCid);
        }
        synchronized (mTrafficDescriptorsByCid) {
            sb.append("mTrafficDescriptorsByCid=").append(mTrafficDescriptorsByCid);
        }
        return sb.toString();
    }

    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
@@ -459,5 +498,8 @@ public class DcController extends Handler {
            pw.println(" mDcListAll=" + mDcListAll);
            pw.println(" mDcListActiveByCid=" + mDcListActiveByCid);
        }
        synchronized (mTrafficDescriptorsByCid) {
            pw.println(" mTrafficDescriptorsByCid=" + mTrafficDescriptorsByCid);
        }
    }
}
+13 −0
Original line number Diff line number Diff line
@@ -2591,6 +2591,16 @@ public class DcTracker extends Handler {
        }
    }

    private void onTrafficDescriptorsUpdated() {
        for (ApnContext apnContext : mPrioritySortedApnContexts) {
            if (apnContext.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE
                    && apnContext.getApnSetting().getPermanentFailed()) {
                setupDataOnConnectableApn(
                        apnContext, Phone.REASON_TRAFFIC_DESCRIPTORS_UPDATED, RetryFailures.ALWAYS);
            }
        }
    }

    private DataConnection checkForCompatibleDataConnection(ApnContext apnContext,
            ApnSetting nextApn) {
        int apnType = apnContext.getApnTypeBitmask();
@@ -4233,6 +4243,9 @@ public class DcTracker extends Handler {
                String apn = (String) ar.result;
                onApnUnthrottled(apn);
                break;
            case DctConstants.EVENT_TRAFFIC_DESCRIPTORS_UPDATED:
                onTrafficDescriptorsUpdated();
                break;
            default:
                Rlog.e("DcTracker", "Unhandled event=" + msg);
                break;
+26 −4
Original line number Diff line number Diff line
@@ -100,6 +100,7 @@ import java.util.function.Consumer;

public class DataConnectionTest extends TelephonyTest {
    private static final int DEFAULT_DC_CID = 10;
    private static final ArrayList<TrafficDescriptor> DEFAULT_TD_LIST = new ArrayList<>();

    @Mock
    DcTesterFailBringUpAll mDcTesterFailBringUpAll;
@@ -209,7 +210,7 @@ public class DataConnectionTest extends TelephonyTest {
        }
    }

    private void setSuccessfulSetupDataResponse(int cid) {
    private void setSuccessfulSetupDataResponse(int cid, ArrayList<TrafficDescriptor> tds) {
        doAnswer(invocation -> {
            final Message msg = (Message) invocation.getArguments()[10];

@@ -237,7 +238,7 @@ public class DataConnectionTest extends TelephonyTest {
                    .setMtuV6(1500)
                    .setPduSessionId(1)
                    .setQosBearerSessions(new ArrayList<>())
                    .setTrafficDescriptors(new ArrayList<>())
                    .setTrafficDescriptors(tds)
                    .build();
            msg.getData().putParcelable("data_call_response", response);
            msg.arg1 = DataServiceCallback.RESULT_SUCCESS;
@@ -292,7 +293,7 @@ public class DataConnectionTest extends TelephonyTest {

        mDcp.mApnContext = mApnContext;

        setSuccessfulSetupDataResponse(DEFAULT_DC_CID);
        setSuccessfulSetupDataResponse(DEFAULT_DC_CID, DEFAULT_TD_LIST);

        doAnswer(invocation -> {
            final Message msg = (Message) invocation.getArguments()[2];
@@ -485,7 +486,7 @@ public class DataConnectionTest extends TelephonyTest {
        assertTrue(mDc.isInactive());

        // Change the CID
        setSuccessfulSetupDataResponse(DEFAULT_DC_CID + 1);
        setSuccessfulSetupDataResponse(DEFAULT_DC_CID + 1, DEFAULT_TD_LIST);

        // Verify that ENTERPRISE was set up
        connectEvent(true);
@@ -493,6 +494,27 @@ public class DataConnectionTest extends TelephonyTest {
                NetworkCapabilities.NET_CAPABILITY_ENTERPRISE));
    }

    @Test
    public void testConnectEventDuplicateContextIdsDifferentTDs() throws Exception {
        setUpDefaultData(DEFAULT_DC_CID);

        // Try to connect ENTERPRISE with the same CID as default but different TrafficDescriptors
        replaceInstance(ConnectionParams.class, "mApnContext", mCp, mEnterpriseApnContext);
        doReturn(mApn1).when(mEnterpriseApnContext).getApnSetting();
        doReturn(ApnSetting.TYPE_ENTERPRISE_STRING).when(mEnterpriseApnContext).getApnType();
        doReturn(ApnSetting.TYPE_ENTERPRISE).when(mEnterpriseApnContext).getApnTypeBitmask();
        ArrayList<TrafficDescriptor> tdList = new ArrayList<>();
        tdList.add(new TrafficDescriptor("dnn", DataConnection.getEnterpriseOsAppId()));
        setSuccessfulSetupDataResponse(DEFAULT_DC_CID, tdList);

        // Verify that ENTERPRISE wasn't set up but the TD list was updated
        connectEvent(false);
        assertTrue(mDc.isInactive());
        ArgumentCaptor<DataCallResponse> captor = ArgumentCaptor.forClass(DataCallResponse.class);
        verify(mDefaultDc).updateTrafficDescriptors(captor.capture());
        assertEquals(tdList, captor.getValue().getTrafficDescriptors());
    }

    @Test
    public void testConnectEventNoDefaultData() throws Exception {
        assertFalse(mDefaultDc.isActive());