Loading services/core/java/com/android/server/connectivity/tethering/OffloadController.java +18 −6 Original line number Diff line number Diff line Loading @@ -131,21 +131,25 @@ public class OffloadController { new OffloadHardwareInterface.ControlCallback() { @Override public void onStarted() { if (!started()) return; mLog.log("onStarted"); } @Override public void onStoppedError() { if (!started()) return; mLog.log("onStoppedError"); } @Override public void onStoppedUnsupported() { if (!started()) return; mLog.log("onStoppedUnsupported"); } @Override public void onSupportAvailable() { if (!started()) return; mLog.log("onSupportAvailable"); // [1] Poll for statistics and notify NetworkStats Loading @@ -153,11 +157,12 @@ public class OffloadController { // [a] push local prefixes // [b] push downstreams // [c] push upstream parameters pushUpstreamParameters(); pushUpstreamParameters(null); } @Override public void onStoppedLimitReached() { if (!started()) return; mLog.log("onStoppedLimitReached"); // We cannot reliably determine on which interface the limit was reached, Loading Loading @@ -185,6 +190,7 @@ public class OffloadController { public void onNatTimeoutUpdate(int proto, String srcAddr, int srcPort, String dstAddr, int dstPort) { if (!started()) return; mLog.log(String.format("NAT timeout update: %s (%s,%s) -> (%s,%s)", proto, srcAddr, srcPort, dstAddr, dstPort)); } Loading @@ -197,6 +203,9 @@ public class OffloadController { } public void stop() { // Completely stops tethering offload. After this method is called, it is no longer safe to // call any HAL method, no callbacks from the hardware will be delivered, and any in-flight // callbacks must be ignored. Offload may be started again by calling start(). final boolean wasStarted = started(); updateStatsForCurrentUpstream(); mUpstreamLinkProperties = null; Loading Loading @@ -305,10 +314,7 @@ public class OffloadController { // onOffloadEvent() callback to tell us offload is available again and // then reapply all state). computeAndPushLocalPrefixes(); pushUpstreamParameters(); // Update stats after we've told the hardware to change routing so we don't miss packets. maybeUpdateStats(prevUpstream); pushUpstreamParameters(prevUpstream); } public void setLocalPrefixes(Set<IpPrefix> localPrefixes) { Loading Loading @@ -342,8 +348,9 @@ public class OffloadController { return mConfigInitialized && mControlInitialized; } private boolean pushUpstreamParameters() { private boolean pushUpstreamParameters(String prevUpstream) { if (mUpstreamLinkProperties == null) { maybeUpdateStats(prevUpstream); return mHwInterface.setUpstreamParameters(null, null, null, null); } Loading Loading @@ -382,9 +389,14 @@ public class OffloadController { return success; } // Update stats after we've told the hardware to change routing so we don't miss packets. maybeUpdateStats(prevUpstream); // Data limits can only be set once offload is running on the upstream. success = maybeUpdateDataLimit(iface); if (!success) { // If we failed to set a data limit, don't use this upstream, because we don't want to // blow through the data limit that we were told to apply. mLog.log("Setting data limit for " + iface + " failed, disabling offload."); stop(); } Loading tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java +10 −0 Original line number Diff line number Diff line Loading @@ -110,7 +110,9 @@ public class OffloadControllerTest { when(mHardware.initOffloadConfig()).thenReturn(true); when(mHardware.initOffloadControl(mControlCallbackCaptor.capture())) .thenReturn(true); when(mHardware.setUpstreamParameters(anyString(), any(), any(), any())).thenReturn(true); when(mHardware.getForwardedStats(any())).thenReturn(new ForwardedStats()); when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(true); } private void enableOffload() { Loading Loading @@ -256,6 +258,7 @@ public class OffloadControllerTest { inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture()); inOrder.verify(mHardware, times(1)).setUpstreamParameters( eq(testIfName), eq(null), eq(null), eq(null)); inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); final String ipv4Addr = "192.0.2.5"; Loading @@ -273,6 +276,7 @@ public class OffloadControllerTest { inOrder.verify(mHardware, times(1)).setUpstreamParameters( eq(testIfName), eq(ipv4Addr), eq(null), eq(null)); inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); final String ipv4Gateway = "192.0.2.1"; Loading @@ -283,6 +287,7 @@ public class OffloadControllerTest { inOrder.verify(mHardware, times(1)).setUpstreamParameters( eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), eq(null)); inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); final String ipv6Gw1 = "fe80::cafe"; Loading @@ -296,6 +301,7 @@ public class OffloadControllerTest { ArrayList<String> v6gws = mStringArrayCaptor.getValue(); assertEquals(1, v6gws.size()); assertTrue(v6gws.contains(ipv6Gw1)); inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); final String ipv6Gw2 = "fe80::d00d"; Loading @@ -310,6 +316,7 @@ public class OffloadControllerTest { assertEquals(2, v6gws.size()); assertTrue(v6gws.contains(ipv6Gw1)); assertTrue(v6gws.contains(ipv6Gw2)); inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); final LinkProperties stacked = new LinkProperties(); Loading @@ -328,6 +335,7 @@ public class OffloadControllerTest { assertEquals(2, v6gws.size()); assertTrue(v6gws.contains(ipv6Gw1)); assertTrue(v6gws.contains(ipv6Gw2)); inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); // Add in some IPv6 upstream info. When there is a tethered downstream Loading Loading @@ -359,6 +367,7 @@ public class OffloadControllerTest { assertTrue(v6gws.contains(ipv6Gw1)); assertTrue(v6gws.contains(ipv6Gw2)); inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); // Completely identical LinkProperties updates are de-duped. Loading Loading @@ -520,6 +529,7 @@ public class OffloadControllerTest { offload.setUpstreamLinkProperties(lp); provider.setInterfaceQuota(mobileIface, mobileLimit); waitForIdle(); inOrder.verify(mHardware).getForwardedStats(ethernetIface); inOrder.verify(mHardware).stopOffloadControl(); } Loading Loading
services/core/java/com/android/server/connectivity/tethering/OffloadController.java +18 −6 Original line number Diff line number Diff line Loading @@ -131,21 +131,25 @@ public class OffloadController { new OffloadHardwareInterface.ControlCallback() { @Override public void onStarted() { if (!started()) return; mLog.log("onStarted"); } @Override public void onStoppedError() { if (!started()) return; mLog.log("onStoppedError"); } @Override public void onStoppedUnsupported() { if (!started()) return; mLog.log("onStoppedUnsupported"); } @Override public void onSupportAvailable() { if (!started()) return; mLog.log("onSupportAvailable"); // [1] Poll for statistics and notify NetworkStats Loading @@ -153,11 +157,12 @@ public class OffloadController { // [a] push local prefixes // [b] push downstreams // [c] push upstream parameters pushUpstreamParameters(); pushUpstreamParameters(null); } @Override public void onStoppedLimitReached() { if (!started()) return; mLog.log("onStoppedLimitReached"); // We cannot reliably determine on which interface the limit was reached, Loading Loading @@ -185,6 +190,7 @@ public class OffloadController { public void onNatTimeoutUpdate(int proto, String srcAddr, int srcPort, String dstAddr, int dstPort) { if (!started()) return; mLog.log(String.format("NAT timeout update: %s (%s,%s) -> (%s,%s)", proto, srcAddr, srcPort, dstAddr, dstPort)); } Loading @@ -197,6 +203,9 @@ public class OffloadController { } public void stop() { // Completely stops tethering offload. After this method is called, it is no longer safe to // call any HAL method, no callbacks from the hardware will be delivered, and any in-flight // callbacks must be ignored. Offload may be started again by calling start(). final boolean wasStarted = started(); updateStatsForCurrentUpstream(); mUpstreamLinkProperties = null; Loading Loading @@ -305,10 +314,7 @@ public class OffloadController { // onOffloadEvent() callback to tell us offload is available again and // then reapply all state). computeAndPushLocalPrefixes(); pushUpstreamParameters(); // Update stats after we've told the hardware to change routing so we don't miss packets. maybeUpdateStats(prevUpstream); pushUpstreamParameters(prevUpstream); } public void setLocalPrefixes(Set<IpPrefix> localPrefixes) { Loading Loading @@ -342,8 +348,9 @@ public class OffloadController { return mConfigInitialized && mControlInitialized; } private boolean pushUpstreamParameters() { private boolean pushUpstreamParameters(String prevUpstream) { if (mUpstreamLinkProperties == null) { maybeUpdateStats(prevUpstream); return mHwInterface.setUpstreamParameters(null, null, null, null); } Loading Loading @@ -382,9 +389,14 @@ public class OffloadController { return success; } // Update stats after we've told the hardware to change routing so we don't miss packets. maybeUpdateStats(prevUpstream); // Data limits can only be set once offload is running on the upstream. success = maybeUpdateDataLimit(iface); if (!success) { // If we failed to set a data limit, don't use this upstream, because we don't want to // blow through the data limit that we were told to apply. mLog.log("Setting data limit for " + iface + " failed, disabling offload."); stop(); } Loading
tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java +10 −0 Original line number Diff line number Diff line Loading @@ -110,7 +110,9 @@ public class OffloadControllerTest { when(mHardware.initOffloadConfig()).thenReturn(true); when(mHardware.initOffloadControl(mControlCallbackCaptor.capture())) .thenReturn(true); when(mHardware.setUpstreamParameters(anyString(), any(), any(), any())).thenReturn(true); when(mHardware.getForwardedStats(any())).thenReturn(new ForwardedStats()); when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(true); } private void enableOffload() { Loading Loading @@ -256,6 +258,7 @@ public class OffloadControllerTest { inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture()); inOrder.verify(mHardware, times(1)).setUpstreamParameters( eq(testIfName), eq(null), eq(null), eq(null)); inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); final String ipv4Addr = "192.0.2.5"; Loading @@ -273,6 +276,7 @@ public class OffloadControllerTest { inOrder.verify(mHardware, times(1)).setUpstreamParameters( eq(testIfName), eq(ipv4Addr), eq(null), eq(null)); inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); final String ipv4Gateway = "192.0.2.1"; Loading @@ -283,6 +287,7 @@ public class OffloadControllerTest { inOrder.verify(mHardware, times(1)).setUpstreamParameters( eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), eq(null)); inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); final String ipv6Gw1 = "fe80::cafe"; Loading @@ -296,6 +301,7 @@ public class OffloadControllerTest { ArrayList<String> v6gws = mStringArrayCaptor.getValue(); assertEquals(1, v6gws.size()); assertTrue(v6gws.contains(ipv6Gw1)); inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); final String ipv6Gw2 = "fe80::d00d"; Loading @@ -310,6 +316,7 @@ public class OffloadControllerTest { assertEquals(2, v6gws.size()); assertTrue(v6gws.contains(ipv6Gw1)); assertTrue(v6gws.contains(ipv6Gw2)); inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); final LinkProperties stacked = new LinkProperties(); Loading @@ -328,6 +335,7 @@ public class OffloadControllerTest { assertEquals(2, v6gws.size()); assertTrue(v6gws.contains(ipv6Gw1)); assertTrue(v6gws.contains(ipv6Gw2)); inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); // Add in some IPv6 upstream info. When there is a tethered downstream Loading Loading @@ -359,6 +367,7 @@ public class OffloadControllerTest { assertTrue(v6gws.contains(ipv6Gw1)); assertTrue(v6gws.contains(ipv6Gw2)); inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); // Completely identical LinkProperties updates are de-duped. Loading Loading @@ -520,6 +529,7 @@ public class OffloadControllerTest { offload.setUpstreamLinkProperties(lp); provider.setInterfaceQuota(mobileIface, mobileLimit); waitForIdle(); inOrder.verify(mHardware).getForwardedStats(ethernetIface); inOrder.verify(mHardware).stopOffloadControl(); } Loading