Merge "Don't completely stop offload if setting data limit fails." into oc-mr1-dev
am: 9b601f2066
Change-Id: I7fc47e60b2da5f39c26fb22c1325618f9948dd38
This commit is contained in:
@@ -131,21 +131,25 @@ public class OffloadController {
|
|||||||
new OffloadHardwareInterface.ControlCallback() {
|
new OffloadHardwareInterface.ControlCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onStarted() {
|
public void onStarted() {
|
||||||
|
if (!started()) return;
|
||||||
mLog.log("onStarted");
|
mLog.log("onStarted");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStoppedError() {
|
public void onStoppedError() {
|
||||||
|
if (!started()) return;
|
||||||
mLog.log("onStoppedError");
|
mLog.log("onStoppedError");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStoppedUnsupported() {
|
public void onStoppedUnsupported() {
|
||||||
|
if (!started()) return;
|
||||||
mLog.log("onStoppedUnsupported");
|
mLog.log("onStoppedUnsupported");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSupportAvailable() {
|
public void onSupportAvailable() {
|
||||||
|
if (!started()) return;
|
||||||
mLog.log("onSupportAvailable");
|
mLog.log("onSupportAvailable");
|
||||||
|
|
||||||
// [1] Poll for statistics and notify NetworkStats
|
// [1] Poll for statistics and notify NetworkStats
|
||||||
@@ -153,11 +157,12 @@ public class OffloadController {
|
|||||||
// [a] push local prefixes
|
// [a] push local prefixes
|
||||||
// [b] push downstreams
|
// [b] push downstreams
|
||||||
// [c] push upstream parameters
|
// [c] push upstream parameters
|
||||||
pushUpstreamParameters();
|
pushUpstreamParameters(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStoppedLimitReached() {
|
public void onStoppedLimitReached() {
|
||||||
|
if (!started()) return;
|
||||||
mLog.log("onStoppedLimitReached");
|
mLog.log("onStoppedLimitReached");
|
||||||
|
|
||||||
// We cannot reliably determine on which interface the limit was reached,
|
// We cannot reliably determine on which interface the limit was reached,
|
||||||
@@ -185,6 +190,7 @@ public class OffloadController {
|
|||||||
public void onNatTimeoutUpdate(int proto,
|
public void onNatTimeoutUpdate(int proto,
|
||||||
String srcAddr, int srcPort,
|
String srcAddr, int srcPort,
|
||||||
String dstAddr, int dstPort) {
|
String dstAddr, int dstPort) {
|
||||||
|
if (!started()) return;
|
||||||
mLog.log(String.format("NAT timeout update: %s (%s,%s) -> (%s,%s)",
|
mLog.log(String.format("NAT timeout update: %s (%s,%s) -> (%s,%s)",
|
||||||
proto, srcAddr, srcPort, dstAddr, dstPort));
|
proto, srcAddr, srcPort, dstAddr, dstPort));
|
||||||
}
|
}
|
||||||
@@ -197,6 +203,9 @@ public class OffloadController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void stop() {
|
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();
|
final boolean wasStarted = started();
|
||||||
updateStatsForCurrentUpstream();
|
updateStatsForCurrentUpstream();
|
||||||
mUpstreamLinkProperties = null;
|
mUpstreamLinkProperties = null;
|
||||||
@@ -305,10 +314,7 @@ public class OffloadController {
|
|||||||
// onOffloadEvent() callback to tell us offload is available again and
|
// onOffloadEvent() callback to tell us offload is available again and
|
||||||
// then reapply all state).
|
// then reapply all state).
|
||||||
computeAndPushLocalPrefixes();
|
computeAndPushLocalPrefixes();
|
||||||
pushUpstreamParameters();
|
pushUpstreamParameters(prevUpstream);
|
||||||
|
|
||||||
// Update stats after we've told the hardware to change routing so we don't miss packets.
|
|
||||||
maybeUpdateStats(prevUpstream);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLocalPrefixes(Set<IpPrefix> localPrefixes) {
|
public void setLocalPrefixes(Set<IpPrefix> localPrefixes) {
|
||||||
@@ -342,8 +348,9 @@ public class OffloadController {
|
|||||||
return mConfigInitialized && mControlInitialized;
|
return mConfigInitialized && mControlInitialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean pushUpstreamParameters() {
|
private boolean pushUpstreamParameters(String prevUpstream) {
|
||||||
if (mUpstreamLinkProperties == null) {
|
if (mUpstreamLinkProperties == null) {
|
||||||
|
maybeUpdateStats(prevUpstream);
|
||||||
return mHwInterface.setUpstreamParameters(null, null, null, null);
|
return mHwInterface.setUpstreamParameters(null, null, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -382,9 +389,14 @@ public class OffloadController {
|
|||||||
return success;
|
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.
|
// Data limits can only be set once offload is running on the upstream.
|
||||||
success = maybeUpdateDataLimit(iface);
|
success = maybeUpdateDataLimit(iface);
|
||||||
if (!success) {
|
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.");
|
mLog.log("Setting data limit for " + iface + " failed, disabling offload.");
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,7 +110,9 @@ public class OffloadControllerTest {
|
|||||||
when(mHardware.initOffloadConfig()).thenReturn(true);
|
when(mHardware.initOffloadConfig()).thenReturn(true);
|
||||||
when(mHardware.initOffloadControl(mControlCallbackCaptor.capture()))
|
when(mHardware.initOffloadControl(mControlCallbackCaptor.capture()))
|
||||||
.thenReturn(true);
|
.thenReturn(true);
|
||||||
|
when(mHardware.setUpstreamParameters(anyString(), any(), any(), any())).thenReturn(true);
|
||||||
when(mHardware.getForwardedStats(any())).thenReturn(new ForwardedStats());
|
when(mHardware.getForwardedStats(any())).thenReturn(new ForwardedStats());
|
||||||
|
when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void enableOffload() {
|
private void enableOffload() {
|
||||||
@@ -256,6 +258,7 @@ public class OffloadControllerTest {
|
|||||||
inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
|
inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
|
||||||
inOrder.verify(mHardware, times(1)).setUpstreamParameters(
|
inOrder.verify(mHardware, times(1)).setUpstreamParameters(
|
||||||
eq(testIfName), eq(null), eq(null), eq(null));
|
eq(testIfName), eq(null), eq(null), eq(null));
|
||||||
|
inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
|
||||||
inOrder.verifyNoMoreInteractions();
|
inOrder.verifyNoMoreInteractions();
|
||||||
|
|
||||||
final String ipv4Addr = "192.0.2.5";
|
final String ipv4Addr = "192.0.2.5";
|
||||||
@@ -273,6 +276,7 @@ public class OffloadControllerTest {
|
|||||||
inOrder.verify(mHardware, times(1)).setUpstreamParameters(
|
inOrder.verify(mHardware, times(1)).setUpstreamParameters(
|
||||||
eq(testIfName), eq(ipv4Addr), eq(null), eq(null));
|
eq(testIfName), eq(ipv4Addr), eq(null), eq(null));
|
||||||
inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
|
inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
|
||||||
|
inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
|
||||||
inOrder.verifyNoMoreInteractions();
|
inOrder.verifyNoMoreInteractions();
|
||||||
|
|
||||||
final String ipv4Gateway = "192.0.2.1";
|
final String ipv4Gateway = "192.0.2.1";
|
||||||
@@ -283,6 +287,7 @@ public class OffloadControllerTest {
|
|||||||
inOrder.verify(mHardware, times(1)).setUpstreamParameters(
|
inOrder.verify(mHardware, times(1)).setUpstreamParameters(
|
||||||
eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), eq(null));
|
eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), eq(null));
|
||||||
inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
|
inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
|
||||||
|
inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
|
||||||
inOrder.verifyNoMoreInteractions();
|
inOrder.verifyNoMoreInteractions();
|
||||||
|
|
||||||
final String ipv6Gw1 = "fe80::cafe";
|
final String ipv6Gw1 = "fe80::cafe";
|
||||||
@@ -296,6 +301,7 @@ public class OffloadControllerTest {
|
|||||||
ArrayList<String> v6gws = mStringArrayCaptor.getValue();
|
ArrayList<String> v6gws = mStringArrayCaptor.getValue();
|
||||||
assertEquals(1, v6gws.size());
|
assertEquals(1, v6gws.size());
|
||||||
assertTrue(v6gws.contains(ipv6Gw1));
|
assertTrue(v6gws.contains(ipv6Gw1));
|
||||||
|
inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
|
||||||
inOrder.verifyNoMoreInteractions();
|
inOrder.verifyNoMoreInteractions();
|
||||||
|
|
||||||
final String ipv6Gw2 = "fe80::d00d";
|
final String ipv6Gw2 = "fe80::d00d";
|
||||||
@@ -310,6 +316,7 @@ public class OffloadControllerTest {
|
|||||||
assertEquals(2, v6gws.size());
|
assertEquals(2, v6gws.size());
|
||||||
assertTrue(v6gws.contains(ipv6Gw1));
|
assertTrue(v6gws.contains(ipv6Gw1));
|
||||||
assertTrue(v6gws.contains(ipv6Gw2));
|
assertTrue(v6gws.contains(ipv6Gw2));
|
||||||
|
inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
|
||||||
inOrder.verifyNoMoreInteractions();
|
inOrder.verifyNoMoreInteractions();
|
||||||
|
|
||||||
final LinkProperties stacked = new LinkProperties();
|
final LinkProperties stacked = new LinkProperties();
|
||||||
@@ -328,6 +335,7 @@ public class OffloadControllerTest {
|
|||||||
assertEquals(2, v6gws.size());
|
assertEquals(2, v6gws.size());
|
||||||
assertTrue(v6gws.contains(ipv6Gw1));
|
assertTrue(v6gws.contains(ipv6Gw1));
|
||||||
assertTrue(v6gws.contains(ipv6Gw2));
|
assertTrue(v6gws.contains(ipv6Gw2));
|
||||||
|
inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
|
||||||
inOrder.verifyNoMoreInteractions();
|
inOrder.verifyNoMoreInteractions();
|
||||||
|
|
||||||
// Add in some IPv6 upstream info. When there is a tethered downstream
|
// Add in some IPv6 upstream info. When there is a tethered downstream
|
||||||
@@ -359,6 +367,7 @@ public class OffloadControllerTest {
|
|||||||
assertTrue(v6gws.contains(ipv6Gw1));
|
assertTrue(v6gws.contains(ipv6Gw1));
|
||||||
assertTrue(v6gws.contains(ipv6Gw2));
|
assertTrue(v6gws.contains(ipv6Gw2));
|
||||||
inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
|
inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
|
||||||
|
inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
|
||||||
inOrder.verifyNoMoreInteractions();
|
inOrder.verifyNoMoreInteractions();
|
||||||
|
|
||||||
// Completely identical LinkProperties updates are de-duped.
|
// Completely identical LinkProperties updates are de-duped.
|
||||||
@@ -520,6 +529,7 @@ public class OffloadControllerTest {
|
|||||||
offload.setUpstreamLinkProperties(lp);
|
offload.setUpstreamLinkProperties(lp);
|
||||||
provider.setInterfaceQuota(mobileIface, mobileLimit);
|
provider.setInterfaceQuota(mobileIface, mobileLimit);
|
||||||
waitForIdle();
|
waitForIdle();
|
||||||
|
inOrder.verify(mHardware).getForwardedStats(ethernetIface);
|
||||||
inOrder.verify(mHardware).stopOffloadControl();
|
inOrder.verify(mHardware).stopOffloadControl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user