Merge "Handle IpReachabilityMonitor errors better."

am: 3af34c8e0a

Change-Id: Ie13ed70165359e8f312a3744cc26a8d1b6f4730c
This commit is contained in:
Erik Kline
2016-12-07 09:26:05 +00:00
committed by android-build-merger
2 changed files with 60 additions and 27 deletions

View File

@@ -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_"});
} }
} }

View File

@@ -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);
} }
} }