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

Commit 34073efb authored by junyulai's avatar junyulai
Browse files

[SP18.6] Make offload controller poll interval configurable

Test: atest TetheringTests
Bug: 149467454

Change-Id: I0b07a0b520dedb479bf863fbfe898ae85b84b0f3
parent 92bb1f4d
Loading
Loading
Loading
Loading
+11 −9
Original line number Original line Diff line number Diff line
@@ -26,6 +26,8 @@ import static android.net.NetworkStats.UID_TETHERING;
import static android.net.netstats.provider.NetworkStatsProvider.QUOTA_UNLIMITED;
import static android.net.netstats.provider.NetworkStatsProvider.QUOTA_UNLIMITED;
import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;
import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;


import static com.android.networkstack.tethering.TetheringConfiguration.DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS;

import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.app.usage.NetworkStatsManager;
import android.app.usage.NetworkStatsManager;
@@ -77,8 +79,6 @@ public class OffloadController {
    private static final boolean DBG = false;
    private static final boolean DBG = false;
    private static final String ANYIP = "0.0.0.0";
    private static final String ANYIP = "0.0.0.0";
    private static final ForwardedStats EMPTY_STATS = new ForwardedStats();
    private static final ForwardedStats EMPTY_STATS = new ForwardedStats();
    @VisibleForTesting
    static final int DEFAULT_PERFORM_POLL_INTERVAL_MS = 5000;


    @VisibleForTesting
    @VisibleForTesting
    enum StatsType {
    enum StatsType {
@@ -135,11 +135,9 @@ public class OffloadController {
    private final Dependencies mDeps;
    private final Dependencies mDeps;


    // TODO: Put more parameters in constructor into dependency object.
    // TODO: Put more parameters in constructor into dependency object.
    static class Dependencies {
    interface Dependencies {
        int getPerformPollInterval() {
        @NonNull
            // TODO: Consider make this configurable.
        TetheringConfiguration getTetherConfig();
            return DEFAULT_PERFORM_POLL_INTERVAL_MS;
        }
    }
    }


    public OffloadController(Handler h, OffloadHardwareInterface hwi,
    public OffloadController(Handler h, OffloadHardwareInterface hwi,
@@ -453,12 +451,16 @@ public class OffloadController {
        if (mHandler.hasCallbacks(mScheduledPollingTask)) {
        if (mHandler.hasCallbacks(mScheduledPollingTask)) {
            mHandler.removeCallbacks(mScheduledPollingTask);
            mHandler.removeCallbacks(mScheduledPollingTask);
        }
        }
        mHandler.postDelayed(mScheduledPollingTask, mDeps.getPerformPollInterval());
        mHandler.postDelayed(mScheduledPollingTask,
                mDeps.getTetherConfig().getOffloadPollInterval());
    }
    }


    private boolean isPollingStatsNeeded() {
    private boolean isPollingStatsNeeded() {
        return started() && mRemainingAlertQuota > 0
        return started() && mRemainingAlertQuota > 0
                && !TextUtils.isEmpty(currentUpstreamInterface());
                && !TextUtils.isEmpty(currentUpstreamInterface())
                && mDeps.getTetherConfig() != null
                && mDeps.getTetherConfig().getOffloadPollInterval()
                >= DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS;
    }
    }


    private boolean maybeUpdateDataLimit(String iface) {
    private boolean maybeUpdateDataLimit(String iface) {
+7 −1
Original line number Original line Diff line number Diff line
@@ -273,7 +273,13 @@ public class Tethering {
        mHandler = mTetherMasterSM.getHandler();
        mHandler = mTetherMasterSM.getHandler();
        mOffloadController = new OffloadController(mHandler,
        mOffloadController = new OffloadController(mHandler,
                mDeps.getOffloadHardwareInterface(mHandler, mLog), mContext.getContentResolver(),
                mDeps.getOffloadHardwareInterface(mHandler, mLog), mContext.getContentResolver(),
                statsManager, mLog, new OffloadController.Dependencies());
                statsManager, mLog, new OffloadController.Dependencies() {

                    @Override
                    public TetheringConfiguration getTetherConfig() {
                        return mConfig;
                    }
                });
        mUpstreamNetworkMonitor = mDeps.getUpstreamNetworkMonitor(mContext, mTetherMasterSM, mLog,
        mUpstreamNetworkMonitor = mDeps.getUpstreamNetworkMonitor(mContext, mTetherMasterSM, mLog,
                TetherMasterSM.EVENT_UPSTREAM_CALLBACK);
                TetherMasterSM.EVENT_UPSTREAM_CALLBACK);
        mForwardedDownstreams = new LinkedHashSet<>();
        mForwardedDownstreams = new LinkedHashSet<>();
+12 −15
Original line number Original line Diff line number Diff line
@@ -26,10 +26,10 @@ import static android.net.NetworkStats.UID_TETHERING;
import static android.net.RouteInfo.RTN_UNICAST;
import static android.net.RouteInfo.RTN_UNICAST;
import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;
import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;


import static com.android.networkstack.tethering.OffloadController.DEFAULT_PERFORM_POLL_INTERVAL_MS;
import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_IFACE;
import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_IFACE;
import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_UID;
import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_UID;
import static com.android.networkstack.tethering.OffloadHardwareInterface.ForwardedStats;
import static com.android.networkstack.tethering.OffloadHardwareInterface.ForwardedStats;
import static com.android.networkstack.tethering.TetheringConfiguration.DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS;
import static com.android.testutils.MiscAssertsKt.assertContainsAll;
import static com.android.testutils.MiscAssertsKt.assertContainsAll;
import static com.android.testutils.MiscAssertsKt.assertThrows;
import static com.android.testutils.MiscAssertsKt.assertThrows;
import static com.android.testutils.NetworkStatsUtilsKt.assertNetworkStatsEquals;
import static com.android.testutils.NetworkStatsUtilsKt.assertNetworkStatsEquals;
@@ -109,6 +109,7 @@ public class OffloadControllerTest {
    @Mock private ApplicationInfo mApplicationInfo;
    @Mock private ApplicationInfo mApplicationInfo;
    @Mock private Context mContext;
    @Mock private Context mContext;
    @Mock private NetworkStatsManager mStatsManager;
    @Mock private NetworkStatsManager mStatsManager;
    @Mock private TetheringConfiguration mTetherConfig;
    // Late init since methods must be called by the thread that created this object.
    // Late init since methods must be called by the thread that created this object.
    private TestableNetworkStatsProviderCbBinder mTetherStatsProviderCb;
    private TestableNetworkStatsProviderCbBinder mTetherStatsProviderCb;
    private OffloadController.OffloadTetheringStatsProvider mTetherStatsProvider;
    private OffloadController.OffloadTetheringStatsProvider mTetherStatsProvider;
@@ -120,8 +121,8 @@ public class OffloadControllerTest {
    private final TestLooper mTestLooper = new TestLooper();
    private final TestLooper mTestLooper = new TestLooper();
    private OffloadController.Dependencies mDeps = new OffloadController.Dependencies() {
    private OffloadController.Dependencies mDeps = new OffloadController.Dependencies() {
        @Override
        @Override
        int getPerformPollInterval() {
        public TetheringConfiguration getTetherConfig() {
            return -1; // Disabled.
            return mTetherConfig;
        }
        }
    };
    };


@@ -133,6 +134,7 @@ public class OffloadControllerTest {
        mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
        mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
        when(mContext.getContentResolver()).thenReturn(mContentResolver);
        when(mContext.getContentResolver()).thenReturn(mContentResolver);
        FakeSettingsProvider.clearSettingsProvider();
        FakeSettingsProvider.clearSettingsProvider();
        when(mTetherConfig.getOffloadPollInterval()).thenReturn(-1); // Disabled.
    }
    }


    @After public void tearDown() throws Exception {
    @After public void tearDown() throws Exception {
@@ -153,12 +155,7 @@ public class OffloadControllerTest {
    }
    }


    private void setOffloadPollInterval(int interval) {
    private void setOffloadPollInterval(int interval) {
        mDeps = new OffloadController.Dependencies() {
        when(mTetherConfig.getOffloadPollInterval()).thenReturn(interval);
            @Override
            int getPerformPollInterval() {
                return interval;
            }
        };
    }
    }


    private void waitForIdle() {
    private void waitForIdle() {
@@ -785,7 +782,7 @@ public class OffloadControllerTest {
    public void testOnSetAlert() throws Exception {
    public void testOnSetAlert() throws Exception {
        setupFunctioningHardwareInterface();
        setupFunctioningHardwareInterface();
        enableOffload();
        enableOffload();
        setOffloadPollInterval(DEFAULT_PERFORM_POLL_INTERVAL_MS);
        setOffloadPollInterval(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS);
        final OffloadController offload = makeOffloadController();
        final OffloadController offload = makeOffloadController();
        offload.start();
        offload.start();


@@ -807,14 +804,14 @@ public class OffloadControllerTest {
        when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(
        when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(
                new ForwardedStats(0, 0));
                new ForwardedStats(0, 0));
        mTetherStatsProvider.onSetAlert(100);
        mTetherStatsProvider.onSetAlert(100);
        mTestLooper.moveTimeForward(DEFAULT_PERFORM_POLL_INTERVAL_MS);
        mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS);
        waitForIdle();
        waitForIdle();
        mTetherStatsProviderCb.assertNoCallback();
        mTetherStatsProviderCb.assertNoCallback();


        // Verify that notifyAlertReached fired when quota is reached.
        // Verify that notifyAlertReached fired when quota is reached.
        when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(
        when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(
                new ForwardedStats(50, 50));
                new ForwardedStats(50, 50));
        mTestLooper.moveTimeForward(DEFAULT_PERFORM_POLL_INTERVAL_MS);
        mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS);
        waitForIdle();
        waitForIdle();
        mTetherStatsProviderCb.expectNotifyAlertReached();
        mTetherStatsProviderCb.expectNotifyAlertReached();


@@ -822,7 +819,7 @@ public class OffloadControllerTest {
        // any stats since the polling is stopped.
        // any stats since the polling is stopped.
        reset(mHardware);
        reset(mHardware);
        mTetherStatsProvider.onSetAlert(NetworkStatsProvider.QUOTA_UNLIMITED);
        mTetherStatsProvider.onSetAlert(NetworkStatsProvider.QUOTA_UNLIMITED);
        mTestLooper.moveTimeForward(DEFAULT_PERFORM_POLL_INTERVAL_MS);
        mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS);
        waitForIdle();
        waitForIdle();
        mTetherStatsProviderCb.assertNoCallback();
        mTetherStatsProviderCb.assertNoCallback();
        verify(mHardware, never()).getForwardedStats(any());
        verify(mHardware, never()).getForwardedStats(any());