android P onProvisioningFailure 与onReachabilityLost
onProvisioningFailure
通常发生在获取ipv4, ipv6,获取网关失败的情况下发生; 包括dhcp动态或静态分配,renew时都可以发生
代码在 frameworks/base/services/net/java/android/net/ip/IpClient.java
一种是在LOST_PROVISIONING被调用
compareProvisioning()
wasProvisioned && !isProvisioned delta = ProvisioningChange.LOST_PROVISIONING
lostIPv4Address || (lostIPv6 !ignoreIPv6ProvisioningLoss)
oldLp.hasGlobalIPv6Address() && (lostIPv6Router && !ignoreIPv6ProvisioningLoss
processMessage(DhcpClient.CMD_CONFIGURE_LINKADDRESS)
setIPv4Address failure
dispatchCallback(ProvisioningChange.LOST_PROVISIONING)
dispatchCallback(LOST_PROVISIONING)
mCallback.onProvisioningFailure()
一种被doImmediateProvisioningFailure()调用
startProvisioning
if (!req.isValid()) {
doImmediateProvisioningFailure(IpManagerEvent.ERROR_INVALID_PROVISIONING);
f (mInterfaceParams == null) {
doImmediateProvisioningFailure(IpManagerEvent.ERROR_INTERFACE_NOT_FOUND);
class RunningState extends State
enter() ->doImmediateProvisioningFailure
!startIPv6()
!startIPv4()
!applyInitialConfig
!startIpReachabilityMonitor()
doImmediateProvisioningFailure
mCallback.onProvisioningFailure()
mCallback.onProvisioningFailure()主要调用在:(别的地方也可以)
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java
public void onProvisioningFailure(LinkProperties newLp) {
sendMessage(CMD_IP_CONFIGURATION_LOST);
在连接的状态下 L2ConnectedState处理后,状态会变成disconnecting ->disconnected
processMessage(CMD_IP_CONFIGURATION_LOST)
handleIpConfigurationLost();
reportConnectionAttemptEnd()
transitionTo(mDisconnectingState);
这个与IpReachabilityMonitor里的onReachabilityLost / CMD_IP_REACHABILITY_LOST有所不同。
这个是与arp(ipv4) Neighbor网络,如果没有arp response三次则认为NUD_FAILED,可以断开也可以忽略,由mIpReachabilityDisconnectEnabled决定
/frameworks/base/services/net/java/android/net/ip/IpReachabilityMonitor.java
if (event.nudState == StructNdMsg.NUD_FAILED) {
handleNeighborLost(event);
mCallback.notifyLost(ip, logMsg)
/frameworks/base/services/net/java/android/net/ip/IpClient.java
public void notifyLost(InetAddress ip, String logMsg) {
mCallback.onReachabilityLost(logMsg);
}
/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java
public void onReachabilityLost(String logMsg) {
sendMessage(CMD_IP_REACHABILITY_LOST, logMsg);
case CMD_IP_REACHABILITY_LOST:
if (mVerboseLoggingEnabled && message.obj != null) log((String) message.obj);
if (mIpReachabilityDisconnectEnabled) {
handleIpReachabilityLost();
transitionTo(mDisconnectingState);
} else {
logd("CMD_IP_REACHABILITY_LOST but disconnect disabled -- ignore");
}