summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2016-10-04 11:01:19 +0900
committergitbuildkicker <android-build@google.com>2016-10-12 19:42:15 -0700
commit9a618958f068d3f1bda9fe5cc4ca564c15d515e0 (patch)
treebdf16b1ac124f45bb466ee929e02265417a49b05
parent03d0f4622816f3ea3241fbb241a92cdedbdf26a8 (diff)
downloadbase-nougat-dr1-release.tar.gz
Ignore loss of IPv6 provisioning when not avoiding bad Wi-Fi.android-7.1.0_r7android-7.1.0_r6android-7.1.0_r5nougat-dr1-releaselinaro-android-7.1.0_r7
Bug: 31827713 Change-Id: I81471f2f3e6c1c4d7bdfebc9dd321bb9d76ad0b6 (cherry picked from commit f11ee9f5928d14d713bb1a7346629c506c968b58)
-rw-r--r--services/net/java/android/net/ip/IpManager.java21
1 files changed, 18 insertions, 3 deletions
diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java
index de2c0c6a268b..d0ab606f039e 100644
--- a/services/net/java/android/net/ip/IpManager.java
+++ b/services/net/java/android/net/ip/IpManager.java
@@ -657,7 +657,7 @@ public class IpManager extends StateMachine {
// object that is a correct and complete assessment of what changed, taking
// account of the asymmetries described in the comments in this function.
// Then switch to using it everywhere (IpReachabilityMonitor, etc.).
- private static ProvisioningChange compareProvisioning(
+ private ProvisioningChange compareProvisioning(
LinkProperties oldLp, LinkProperties newLp) {
ProvisioningChange delta;
@@ -688,6 +688,21 @@ public class IpManager extends StateMachine {
final boolean lostIPv4Address = oldLp.hasIPv4Address() && !newLp.hasIPv4Address();
final boolean lostIPv6Router = oldLp.hasIPv6DefaultRoute() && !newLp.hasIPv6DefaultRoute();
+ // If bad wifi avoidance is disabled, then ignore IPv6 loss of
+ // provisioning. Otherwise, when a hotspot that loses Internet
+ // access sends out a 0-lifetime RA to its clients, the clients
+ // will disconnect and then reconnect, avoiding the bad hotspot,
+ // instead of getting stuck on the bad hotspot. http://b/31827713 .
+ //
+ // This is incorrect because if the hotspot then regains Internet
+ // access with a different prefix, TCP connections on the
+ // deprecated addresses will remain stuck.
+ //
+ // Note that we can still be disconnected by IpReachabilityMonitor
+ // if the IPv6 default gateway (but not the IPv6 DNS servers; see
+ // accompanying code in IpReachabilityMonitor) is unreachable.
+ final boolean ignoreIPv6ProvisioningLoss = !mAvoidBadWifiTracker.currentValue();
+
// Additionally:
//
// Partial configurations (e.g., only an IPv4 address with no DNS
@@ -700,7 +715,7 @@ public class IpManager extends StateMachine {
// Because on such a network isProvisioned() will always return false,
// delta will never be LOST_PROVISIONING. So check for loss of
// provisioning here too.
- if (lostIPv4Address || lostIPv6) {
+ if (lostIPv4Address || (lostIPv6 && !ignoreIPv6ProvisioningLoss)) {
delta = ProvisioningChange.LOST_PROVISIONING;
}
@@ -709,7 +724,7 @@ public class IpManager extends StateMachine {
// If the previous link properties had a global IPv6 address and an
// IPv6 default route then also consider the loss of that default route
// to be a loss of provisioning. See b/27962810.
- if (oldLp.hasGlobalIPv6Address() && lostIPv6Router) {
+ if (oldLp.hasGlobalIPv6Address() && (lostIPv6Router && !ignoreIPv6ProvisioningLoss)) {
delta = ProvisioningChange.LOST_PROVISIONING;
}