Loading packages/Tethering/src/com/android/networkstack/tethering/OffloadController.java +11 −9 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading Loading @@ -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, Loading Loading @@ -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) { Loading packages/Tethering/src/com/android/networkstack/tethering/Tethering.java +7 −1 Original line number Original line Diff line number Diff line Loading @@ -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<>(); Loading packages/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadControllerTest.java +12 −15 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; } } }; }; Loading @@ -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 { Loading @@ -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() { Loading Loading @@ -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(); Loading @@ -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(); Loading @@ -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()); Loading Loading
packages/Tethering/src/com/android/networkstack/tethering/OffloadController.java +11 −9 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading Loading @@ -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, Loading Loading @@ -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) { Loading
packages/Tethering/src/com/android/networkstack/tethering/Tethering.java +7 −1 Original line number Original line Diff line number Diff line Loading @@ -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<>(); Loading
packages/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadControllerTest.java +12 −15 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; } } }; }; Loading @@ -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 { Loading @@ -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() { Loading Loading @@ -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(); Loading @@ -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(); Loading @@ -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()); Loading