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

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

Add anomaly reports for IMS throttle retry attempt

Test: manual
Bug: 222031425
Merged-In: I4c34c5d744e96cf84c3aa14a1b1bbd4a7befc7d6
Change-Id: I4c34c5d744e96cf84c3aa14a1b1bbd4a7befc7d6
parent 879e132f
Loading
Loading
Loading
Loading
+18 −0
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@ import android.os.Looper;
import android.os.Message;
import android.os.Message;
import android.os.PersistableBundle;
import android.os.PersistableBundle;
import android.os.RegistrantList;
import android.os.RegistrantList;
import android.provider.DeviceConfig;
import android.telephony.Annotation.ApnType;
import android.telephony.Annotation.ApnType;
import android.telephony.Annotation.NetCapability;
import android.telephony.Annotation.NetCapability;
import android.telephony.Annotation.NetworkType;
import android.telephony.Annotation.NetworkType;
@@ -184,6 +185,14 @@ public class DataConfigManager extends Handler {
    @Retention(RetentionPolicy.SOURCE)
    @Retention(RetentionPolicy.SOURCE)
    private @interface DataConfigNetworkType {}
    private @interface DataConfigNetworkType {}


    /**
     * The minimal time window for duplicate release-request for IMS, the violation of which
     * triggers anomaly report in {@link DataNetworkController}.
     */
    private final long mImsRequestReleaseThrottleAnomalyWindowMs =
            DeviceConfig.getInt(DeviceConfig.NAMESPACE_TELEPHONY,
                    "ims_release_request_window", 0);

    private @NonNull final Phone mPhone;
    private @NonNull final Phone mPhone;
    private @NonNull final String mLogTag;
    private @NonNull final String mLogTag;


@@ -655,6 +664,13 @@ public class DataConfigManager extends Handler {
        }
        }
    }
    }


     /**
     * @return The IMS back to back request/release minimal interval.
     */
    public long getImsRequestReleaseThrottleAnomalyWindowMs() {
        return mImsRequestReleaseThrottleAnomalyWindowMs;
    }

    /**
    /**
     * Get the TCP config string, used by {@link LinkProperties#setTcpBufferSizes(String)}.
     * Get the TCP config string, used by {@link LinkProperties#setTcpBufferSizes(String)}.
     * The config string will have the following form, with values in bytes:
     * The config string will have the following form, with values in bytes:
@@ -957,6 +973,8 @@ public class DataConfigManager extends Handler {
        pw.increaseIndent();
        pw.increaseIndent();
        mDataHandoverRetryRules.forEach(pw::println);
        mDataHandoverRetryRules.forEach(pw::println);
        pw.decreaseIndent();
        pw.decreaseIndent();
        pw.println("IMS request release throttle anomaly window in ms="
                + mImsRequestReleaseThrottleAnomalyWindowMs);
        pw.println("Metered APN types=" + mMeteredApnTypes.stream()
        pw.println("Metered APN types=" + mMeteredApnTypes.stream()
                .map(ApnSetting::getApnTypeString).collect(Collectors.joining(",")));
                .map(ApnSetting::getApnTypeString).collect(Collectors.joining(",")));
        pw.println("Roaming metered APN types=" + mRoamingMeteredApnTypes.stream()
        pw.println("Roaming metered APN types=" + mRoamingMeteredApnTypes.stream()
+35 −0
Original line number Original line Diff line number Diff line
@@ -42,6 +42,7 @@ import android.telephony.Annotation.DataFailureCause;
import android.telephony.Annotation.NetCapability;
import android.telephony.Annotation.NetCapability;
import android.telephony.Annotation.NetworkType;
import android.telephony.Annotation.NetworkType;
import android.telephony.Annotation.ValidationStatus;
import android.telephony.Annotation.ValidationStatus;
import android.telephony.AnomalyReporter;
import android.telephony.CarrierConfigManager;
import android.telephony.CarrierConfigManager;
import android.telephony.DataFailCause;
import android.telephony.DataFailCause;
import android.telephony.DataSpecificRegistrationInfo;
import android.telephony.DataSpecificRegistrationInfo;
@@ -78,6 +79,7 @@ import android.util.SparseBooleanArray;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.SlidingWindowEventCounter;
import com.android.internal.telephony.SubscriptionInfoUpdater;
import com.android.internal.telephony.SubscriptionInfoUpdater;
import com.android.internal.telephony.TelephonyComponentFactory;
import com.android.internal.telephony.TelephonyComponentFactory;
import com.android.internal.telephony.data.AccessNetworksManager.AccessNetworksManagerCallback;
import com.android.internal.telephony.data.AccessNetworksManager.AccessNetworksManagerCallback;
@@ -112,6 +114,7 @@ import java.util.Locale;
import java.util.Map;
import java.util.Map;
import java.util.Objects;
import java.util.Objects;
import java.util.Set;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Executor;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.function.Function;
@@ -201,6 +204,13 @@ public class DataNetworkController extends Handler {
    private static final long REEVALUATE_PREFERRED_TRANSPORT_DELAY_MILLIS =
    private static final long REEVALUATE_PREFERRED_TRANSPORT_DELAY_MILLIS =
            TimeUnit.SECONDS.toMillis(3);
            TimeUnit.SECONDS.toMillis(3);


    /**
     * The maximum number of occurrences within a time window defined by
     * {@link DataConfigManager#getImsRequestReleaseThrottleAnomalyWindowMs}
     * for duplicate release-request for IMS, the violation of which triggers anomaly report.
     */
    private static final int IMS_REQUEST_RELEASE_THROTTLE_ANOMALY_NUM_OCCURRENCES = 2;

    private final Phone mPhone;
    private final Phone mPhone;
    private final String mLogTag;
    private final String mLogTag;
    private final LocalLog mLocalLog = new LocalLog(128);
    private final LocalLog mLocalLog = new LocalLog(128);
@@ -325,6 +335,15 @@ public class DataNetworkController extends Handler {
     */
     */
    private boolean mPendingTearDownAllNetworks = false;
    private boolean mPendingTearDownAllNetworks = false;


    /** The counter to detect back to back release/request IMS network. */
    private final @NonNull SlidingWindowEventCounter mImsThrottleCounter;

    /**
     * The capabilities of the latest released IMS request. To detect back to back release/request
     * IMS network.
     */
    private int[] mLastReleasedImsRequestCapabilities;

    /** The broadcast receiver. */
    /** The broadcast receiver. */
    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
        @Override
        @Override
@@ -739,6 +758,9 @@ public class DataNetworkController extends Handler {
        }
        }
        mDataConfigManager = new DataConfigManager(mPhone, looper);
        mDataConfigManager = new DataConfigManager(mPhone, looper);


        mImsThrottleCounter = new SlidingWindowEventCounter(
                mDataConfigManager.getImsRequestReleaseThrottleAnomalyWindowMs(),
                IMS_REQUEST_RELEASE_THROTTLE_ANOMALY_NUM_OCCURRENCES);
        mDataSettingsManager = TelephonyComponentFactory.getInstance().inject(
        mDataSettingsManager = TelephonyComponentFactory.getInstance().inject(
                DataSettingsManager.class.getName())
                DataSettingsManager.class.getName())
                .makeDataSettingsManager(mPhone, this, looper,
                .makeDataSettingsManager(mPhone, this, looper,
@@ -1052,6 +1074,15 @@ public class DataNetworkController extends Handler {
     * @param networkRequest The network request.
     * @param networkRequest The network request.
     */
     */
    private void onAddNetworkRequest(@NonNull TelephonyNetworkRequest networkRequest) {
    private void onAddNetworkRequest(@NonNull TelephonyNetworkRequest networkRequest) {
        if (Arrays.equals(mLastReleasedImsRequestCapabilities, networkRequest.getCapabilities())
                && mImsThrottleCounter.addOccurrence()) {
            AnomalyReporter.reportAnomaly(
                    UUID.fromString("ead6f8db-d2f2-4ed3-8da5-1d8560fe7daf"),
                    networkRequest.getNativeNetworkRequest().getRequestorPackageName()
                            + " requested with same capabilities falls under "
                            + mDataConfigManager.getImsRequestReleaseThrottleAnomalyWindowMs()
                            + " ms window.");
        }
        if (!mAllNetworkRequestList.add(networkRequest)) {
        if (!mAllNetworkRequestList.add(networkRequest)) {
            loge("onAddNetworkRequest: Duplicate network request. " + networkRequest);
            loge("onAddNetworkRequest: Duplicate network request. " + networkRequest);
            return;
            return;
@@ -1766,6 +1797,10 @@ public class DataNetworkController extends Handler {
    }
    }


    private void onRemoveNetworkRequest(@NonNull TelephonyNetworkRequest networkRequest) {
    private void onRemoveNetworkRequest(@NonNull TelephonyNetworkRequest networkRequest) {
        if (networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS)) {
            mImsThrottleCounter.addOccurrence();
            mLastReleasedImsRequestCapabilities = networkRequest.getCapabilities();
        }
        if (!mAllNetworkRequestList.remove(networkRequest)) {
        if (!mAllNetworkRequestList.remove(networkRequest)) {
            loge("onRemoveNetworkRequest: Network request does not exist. " + networkRequest);
            loge("onRemoveNetworkRequest: Network request does not exist. " + networkRequest);
            return;
            return;