Merge "Handle IpReachabilityMonitor errors better." am: 3af34c8e0a
am: 4467b79592
Change-Id: I5d4d2d9888d85a684425b8204785099f818e6546
This commit is contained in:
@@ -38,9 +38,15 @@ public final class IpManagerEvent implements Parcelable {
|
|||||||
public static final int PROVISIONING_OK = 1;
|
public static final int PROVISIONING_OK = 1;
|
||||||
public static final int PROVISIONING_FAIL = 2;
|
public static final int PROVISIONING_FAIL = 2;
|
||||||
public static final int COMPLETE_LIFECYCLE = 3;
|
public static final int COMPLETE_LIFECYCLE = 3;
|
||||||
|
/** @hide */ public static final int ERROR_STARTING_IPV4 = 4;
|
||||||
|
/** @hide */ public static final int ERROR_STARTING_IPV6 = 5;
|
||||||
|
/** @hide */ public static final int ERROR_STARTING_IPREACHABILITYMONITOR = 6;
|
||||||
|
|
||||||
/** {@hide} */
|
/** {@hide} */
|
||||||
@IntDef(value = {PROVISIONING_OK, PROVISIONING_FAIL, COMPLETE_LIFECYCLE})
|
@IntDef(value = {
|
||||||
|
PROVISIONING_OK, PROVISIONING_FAIL, COMPLETE_LIFECYCLE,
|
||||||
|
ERROR_STARTING_IPV4, ERROR_STARTING_IPV6, ERROR_STARTING_IPREACHABILITYMONITOR,
|
||||||
|
})
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public @interface EventType {}
|
public @interface EventType {}
|
||||||
|
|
||||||
@@ -95,6 +101,7 @@ public final class IpManagerEvent implements Parcelable {
|
|||||||
|
|
||||||
final static class Decoder {
|
final static class Decoder {
|
||||||
static final SparseArray<String> constants = MessageUtils.findMessageNames(
|
static final SparseArray<String> constants = MessageUtils.findMessageNames(
|
||||||
new Class[]{IpManagerEvent.class}, new String[]{"PROVISIONING_", "COMPLETE_"});
|
new Class[]{IpManagerEvent.class},
|
||||||
|
new String[]{"PROVISIONING_", "COMPLETE_", "ERROR_"});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -631,6 +631,11 @@ public class IpManager extends StateMachine {
|
|||||||
return shouldLog;
|
return shouldLog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Migrate all Log.e(...) to logError(...).
|
||||||
|
private void logError(String fmt, Object... args) {
|
||||||
|
mLocalLog.log("ERROR " + String.format(fmt, args));
|
||||||
|
}
|
||||||
|
|
||||||
private void getNetworkInterface() {
|
private void getNetworkInterface() {
|
||||||
try {
|
try {
|
||||||
mNetworkInterface = NetworkInterface.getByName(mInterfaceName);
|
mNetworkInterface = NetworkInterface.getByName(mInterfaceName);
|
||||||
@@ -880,7 +885,7 @@ public class IpManager extends StateMachine {
|
|||||||
mNwService.setInterfaceConfig(mInterfaceName, ifcg);
|
mNwService.setInterfaceConfig(mInterfaceName, ifcg);
|
||||||
if (VDBG) Log.d(mTag, "IPv4 configuration succeeded");
|
if (VDBG) Log.d(mTag, "IPv4 configuration succeeded");
|
||||||
} catch (IllegalStateException | RemoteException e) {
|
} catch (IllegalStateException | RemoteException e) {
|
||||||
Log.e(mTag, "IPv4 configuration failed: ", e);
|
logError("IPv4 configuration failed: %s", e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -944,6 +949,12 @@ public class IpManager extends StateMachine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void doImmediateProvisioningFailure(int failureType) {
|
||||||
|
if (DBG) { Log.e(mTag, "onProvisioningFailure(): " + failureType); }
|
||||||
|
recordMetric(failureType);
|
||||||
|
mCallback.onProvisioningFailure(new LinkProperties(mLinkProperties));
|
||||||
|
}
|
||||||
|
|
||||||
private boolean startIPv4() {
|
private boolean startIPv4() {
|
||||||
// If we have a StaticIpConfiguration attempt to apply it and
|
// If we have a StaticIpConfiguration attempt to apply it and
|
||||||
// handle the result accordingly.
|
// handle the result accordingly.
|
||||||
@@ -951,9 +962,6 @@ public class IpManager extends StateMachine {
|
|||||||
if (setIPv4Address(mConfiguration.mStaticIpConfig.ipAddress)) {
|
if (setIPv4Address(mConfiguration.mStaticIpConfig.ipAddress)) {
|
||||||
handleIPv4Success(new DhcpResults(mConfiguration.mStaticIpConfig));
|
handleIPv4Success(new DhcpResults(mConfiguration.mStaticIpConfig));
|
||||||
} else {
|
} else {
|
||||||
if (VDBG) { Log.d(mTag, "onProvisioningFailure()"); }
|
|
||||||
recordMetric(IpManagerEvent.PROVISIONING_FAIL);
|
|
||||||
mCallback.onProvisioningFailure(new LinkProperties(mLinkProperties));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -972,16 +980,40 @@ public class IpManager extends StateMachine {
|
|||||||
mNwService.setInterfaceIpv6PrivacyExtensions(mInterfaceName, true);
|
mNwService.setInterfaceIpv6PrivacyExtensions(mInterfaceName, true);
|
||||||
mNwService.enableIpv6(mInterfaceName);
|
mNwService.enableIpv6(mInterfaceName);
|
||||||
} catch (RemoteException re) {
|
} catch (RemoteException re) {
|
||||||
Log.e(mTag, "Unable to change interface settings: " + re);
|
logError("Unable to change interface settings: %s", re);
|
||||||
return false;
|
return false;
|
||||||
} catch (IllegalStateException ie) {
|
} catch (IllegalStateException ie) {
|
||||||
Log.e(mTag, "Unable to change interface settings: " + ie);
|
logError("Unable to change interface settings: %s", ie);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean startIpReachabilityMonitor() {
|
||||||
|
try {
|
||||||
|
mIpReachabilityMonitor = new IpReachabilityMonitor(
|
||||||
|
mContext,
|
||||||
|
mInterfaceName,
|
||||||
|
new IpReachabilityMonitor.Callback() {
|
||||||
|
@Override
|
||||||
|
public void notifyLost(InetAddress ip, String logMsg) {
|
||||||
|
mCallback.onReachabilityLost(logMsg);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mAvoidBadWifiTracker);
|
||||||
|
} catch (IllegalArgumentException iae) {
|
||||||
|
// Failed to start IpReachabilityMonitor. Log it and call
|
||||||
|
// onProvisioningFailure() immediately.
|
||||||
|
//
|
||||||
|
// See http://b/31038971.
|
||||||
|
logError("IpReachabilityMonitor failure: %s", iae);
|
||||||
|
mIpReachabilityMonitor = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (mIpReachabilityMonitor != null);
|
||||||
|
}
|
||||||
|
|
||||||
private void stopAllIP() {
|
private void stopAllIP() {
|
||||||
// We don't need to worry about routes, just addresses, because:
|
// We don't need to worry about routes, just addresses, because:
|
||||||
// - disableIpv6() will clear autoconf IPv6 routes as well, and
|
// - disableIpv6() will clear autoconf IPv6 routes as well, and
|
||||||
@@ -1165,29 +1197,23 @@ public class IpManager extends StateMachine {
|
|||||||
mCallback.setFallbackMulticastFilter(mMulticastFiltering);
|
mCallback.setFallbackMulticastFilter(mMulticastFiltering);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mConfiguration.mEnableIPv6) {
|
if (mConfiguration.mEnableIPv6 && !startIPv6()) {
|
||||||
// TODO: Consider transitionTo(mStoppingState) if this fails.
|
doImmediateProvisioningFailure(IpManagerEvent.ERROR_STARTING_IPV6);
|
||||||
startIPv6();
|
transitionTo(mStoppingState);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mConfiguration.mEnableIPv4) {
|
if (mConfiguration.mEnableIPv4 && !startIPv4()) {
|
||||||
if (!startIPv4()) {
|
doImmediateProvisioningFailure(IpManagerEvent.ERROR_STARTING_IPV4);
|
||||||
transitionTo(mStoppingState);
|
transitionTo(mStoppingState);
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mConfiguration.mUsingIpReachabilityMonitor) {
|
if (mConfiguration.mUsingIpReachabilityMonitor && !startIpReachabilityMonitor()) {
|
||||||
mIpReachabilityMonitor = new IpReachabilityMonitor(
|
doImmediateProvisioningFailure(
|
||||||
mContext,
|
IpManagerEvent.ERROR_STARTING_IPREACHABILITYMONITOR);
|
||||||
mInterfaceName,
|
transitionTo(mStoppingState);
|
||||||
new IpReachabilityMonitor.Callback() {
|
return;
|
||||||
@Override
|
|
||||||
public void notifyLost(InetAddress ip, String logMsg) {
|
|
||||||
mCallback.onReachabilityLost(logMsg);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mAvoidBadWifiTracker);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user