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

猜你喜欢

转载自blog.csdn.net/kv110/article/details/103550803
今日推荐