wifi連接-密碼正確但連接時supplicant state返回的是ERROR_AUTHENTICATING(Android M 6.0)

frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiStateMachine.java

frameworks\base\core\java\com\android\internal\util\StateMachine.java

frameworks\base\core\java\com\android\internal\util\State.java

frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiService.java

反正把frameworks導入source insight中就可以全部都搜得到了。

 

wifi hal(wifi抽象層)的源碼在:

hardware\broadcom\wlan\bcmdhd\wifi_hal\wifi_hal.cpp

hardware\broadcom\wlan\bcmdhd\wifi_hal\wifi_logger.cpp

導入hardware\broadcom\wlan\bcmdhd\wifi_hal到source insight就可以很方便看wifi hal相關的代碼了。

關於wifi狀態機的一些概述可以看我之前的一篇博文:

https://blog.csdn.net/b1480521874/article/details/79051676

 

各個State的關係(WifiStateMachine的構造方法,父類是StateMachine):

       addState(mDefaultState);
            addState(mInitialState, mDefaultState);
            addState(mSupplicantStartingState, mDefaultState);
            addState(mSupplicantStartedState, mDefaultState);
                addState(mDriverStartingState, mSupplicantStartedState);
                addState(mDriverStartedState, mSupplicantStartedState);
                    addState(mScanModeState, mDriverStartedState);
                    addState(mConnectModeState, mDriverStartedState);
                        addState(mL2ConnectedState, mConnectModeState);
                            addState(mObtainingIpState, mL2ConnectedState);
                            addState(mVerifyingLinkState, mL2ConnectedState);
                            addState(mConnectedState, mL2ConnectedState);
                            addState(mRoamingState, mL2ConnectedState);
                        addState(mDisconnectingState, mConnectModeState);
                        addState(mDisconnectedState, mConnectModeState);
                        addState(mWpsRunningState, mConnectModeState);
                addState(mWaitForP2pDisableState, mSupplicantStartedState);
                addState(mDriverStoppingState, mSupplicantStartedState);
                addState(mDriverStoppedState, mSupplicantStartedState);
            addState(mSupplicantStoppingState, mDefaultState);
            addState(mSoftApStartingState, mDefaultState);
            addState(mSoftApStartedState, mDefaultState);
                addState(mTetheringState, mSoftApStartedState);
                addState(mTetheredState, mSoftApStartedState);
                addState(mUntetheringState, mSoftApStartedState);

        setInitialState(mInitialState);

初始狀態是InitialState,而InitialState的父狀態是DefaultState。StateMachine#addState()

/**
     * Add a new state to the state machine
     * @param state the state to add
     * @param parent the parent of state
     */
    protected final void addState(State state, State parent) {
        mSmHandler.addState(state, parent);
    }

WifiStateMachine對消息的處理原則是,如果子狀態處理不了,就給父狀態處理,層層上報,直到DefaultState,如果DefaultState都處理不了就報Error。消息由State的子類的processMessage(Message msg)去處理,返回true表示處理了,false則表示給父狀態處理。給出ConnectModeState#processMessage的部分代碼:

 @Override
        public boolean processMessage(Message message) {
            WifiConfiguration config;
            int netId;
            boolean ok;
            boolean didDisconnect;
            String bssid;
            String ssid;
            NetworkUpdateResult result;
            logStateAndMessage(message, getClass().getSimpleName());

            switch (message.what) {
                case WifiMonitor.ASSOCIATION_REJECTION_EVENT:
                    mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_ASSOC_FAILURE);
                    didBlackListBSSID = false;
                    bssid = (String) message.obj;
                    if (bssid == null || TextUtils.isEmpty(bssid)) {
                        // If BSSID is null, use the target roam BSSID
                        bssid = mTargetRoamBSSID;
                    }
                    if (bssid != null) {
                        // If we have a BSSID, tell configStore to black list it
                        synchronized(mScanResultCache) {
                            didBlackListBSSID = mWifiConfigStore.handleBSSIDBlackList
                                    (mLastNetworkId, bssid, false);
                        }
                    }
                    mSupplicantStateTracker.sendMessage(WifiMonitor.ASSOCIATION_REJECTION_EVENT);
                    break;
                case WifiMonitor.AUTHENTICATION_FAILURE_EVENT:
                    mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_AUTH_FAILURE);
                    mSupplicantStateTracker.sendMessage(WifiMonitor.AUTHENTICATION_FAILURE_EVENT);

                    ///M:@{
                    if (mWifiFwkExt != null) {
                        mWifiFwkExt.setNotificationVisible(true);
                    }
                    ///@}
                    break;
                case WifiMonitor.SSID_TEMP_DISABLED:
                case WifiMonitor.SSID_REENABLED:
                    String substr = (String) message.obj;
                    String en = message.what == WifiMonitor.SSID_TEMP_DISABLED ?
                            "temp-disabled" : "re-enabled";
                    logd("ConnectModeState SSID state=" + en + " nid="
                            + Integer.toString(message.arg1) + " [" + substr + "]");
                    synchronized(mScanResultCache) {
                        mWifiConfigStore.handleSSIDStateChange(message.arg1, message.what ==
                                WifiMonitor.SSID_REENABLED, substr, mWifiInfo.getBSSID());
                    }
                    break;
//... ...
}

State的子類都在WifiStateMachine.cpp中實現,是WifiStateMachine的內部類,每個State子類都會在processMessage中調用logStateAndMessage(message, getClass().getSimpleName());,下面看logStateAndMessage的源碼:

private void logStateAndMessage(Message message, String state) {
        messageHandlingStatus = 0;
        if (mLogMessages) {
            //long now = SystemClock.elapsedRealtimeNanos();
            //String ts = String.format("[%,d us]", now/1000);

            logd(" " + state + " " + getLogRecString(message));
        }
    }

看getLogRecString的源碼:

/**
     * Return the additional string to be logged by LogRec, default
     *
     * @param msg that was processed
     * @return information to be logged as a String
     */
    protected String getLogRecString(Message msg) {
        WifiConfiguration config;
        Long now;
        String report;
        String key;
        StringBuilder sb = new StringBuilder();

        ///M: add log @{
        sb.append("(when=");
        TimeUtils.formatDuration(msg.getWhen() - SystemClock.uptimeMillis() , sb);
        sb.append(" what=");
        sb.append(msg.what);
        if (msg.arg1 != 0) {
            sb.append(" arg1=");
            sb.append(msg.arg1);
        }
        if (msg.arg2 != 0) {
            sb.append(" arg2=");
            sb.append(msg.arg2);
            sb.append(") ");
        }
        ///@}

        if (mScreenOn) {
            sb.append("!");
        }
        if (messageHandlingStatus != MESSAGE_HANDLING_STATUS_UNKNOWN) {
            sb.append("(").append(messageHandlingStatus).append(")");
        }
        sb.append(smToString(msg));
        if (msg.sendingUid > 0 && msg.sendingUid != Process.WIFI_UID) {
            sb.append(" uid=" + msg.sendingUid);
        }
        sb.append(" ").append(printTime());
        switch (msg.what) {
            case CMD_STARTED_GSCAN_DBG:
            case CMD_STARTED_PNO_DBG:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                if (msg.obj != null) {
                    sb.append(" " + (String)msg.obj);
                }
                break;
            case CMD_RESTART_AUTOJOIN_OFFLOAD:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                sb.append("/").append(Integer.toString(mRestartAutoJoinOffloadCounter));
                if (msg.obj != null) {
                    sb.append(" " + (String)msg.obj);
                }
                break;
            case CMD_UPDATE_ASSOCIATED_SCAN_PERMISSION:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                sb.append(" halAllowed=").append(useHalBasedAutoJoinOffload());
                sb.append(" scanAllowed=").append(allowFullBandScanAndAssociated());
                sb.append(" autojoinAllowed=");
                sb.append(mWifiConfigStore.enableAutoJoinWhenAssociated.get());
                sb.append(" withTraffic=").append(getAllowScansWithTraffic());
                sb.append(" tx=").append(mWifiInfo.txSuccessRate);
                sb.append("/").append(mWifiConfigStore.maxTxPacketForFullScans);
                sb.append(" rx=").append(mWifiInfo.rxSuccessRate);
                sb.append("/").append(mWifiConfigStore.maxRxPacketForFullScans);
                sb.append(" -> ").append(mConnectedModeGScanOffloadStarted);
                break;
            case CMD_PNO_NETWORK_FOUND:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                if (msg.obj != null) {
                    ScanResult[] results = (ScanResult[])msg.obj;
                    for (int i = 0; i < results.length; i++) {
                       sb.append(" ").append(results[i].SSID).append(" ");
                       sb.append(results[i].frequency);
                       sb.append(" ").append(results[i].level);
                    }
                }
                break;
            case CMD_START_SCAN:
                now = System.currentTimeMillis();
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                sb.append(" ic=");
                sb.append(Integer.toString(sScanAlarmIntentCount));
                if (msg.obj != null) {
                    Bundle bundle = (Bundle) msg.obj;
                    Long request = bundle.getLong(SCAN_REQUEST_TIME, 0);
                    if (request != 0) {
                        sb.append(" proc(ms):").append(now - request);
                    }
                }
                if (mIsScanOngoing) sb.append(" onGoing");
                if (mIsFullScanOngoing) sb.append(" full");
                if (lastStartScanTimeStamp != 0) {
                    sb.append(" started:").append(lastStartScanTimeStamp);
                    sb.append(",").append(now - lastStartScanTimeStamp);
                }
                if (lastScanDuration != 0) {
                    sb.append(" dur:").append(lastScanDuration);
                }
                sb.append(" cnt=").append(mDelayedScanCounter);
                sb.append(" rssi=").append(mWifiInfo.getRssi());
                sb.append(" f=").append(mWifiInfo.getFrequency());
                sb.append(" sc=").append(mWifiInfo.score);
                sb.append(" link=").append(mWifiInfo.getLinkSpeed());
                sb.append(String.format(" tx=%.1f,", mWifiInfo.txSuccessRate));
                sb.append(String.format(" %.1f,", mWifiInfo.txRetriesRate));
                sb.append(String.format(" %.1f ", mWifiInfo.txBadRate));
                sb.append(String.format(" rx=%.1f", mWifiInfo.rxSuccessRate));
                if (lastScanFreqs != null) {
                    sb.append(" list=").append(lastScanFreqs);
                } else {
                    sb.append(" fiv=").append(fullBandConnectedTimeIntervalMilli);
                }
                report = reportOnTime();
                if (report != null) {
                    sb.append(" ").append(report);
                }
                break;
            case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                StateChangeResult stateChangeResult = (StateChangeResult) msg.obj;
                if (stateChangeResult != null) {
                    sb.append(stateChangeResult.toString());
                }
                break;
            case WifiManager.SAVE_NETWORK:
            case WifiStateMachine.CMD_AUTO_SAVE_NETWORK:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                if (lastSavedConfigurationAttempt != null) {
                    sb.append(" ").append(lastSavedConfigurationAttempt.configKey());
                    sb.append(" nid=").append(lastSavedConfigurationAttempt.networkId);
                    if (lastSavedConfigurationAttempt.hiddenSSID) {
                        sb.append(" hidden");
                    }
                    if (lastSavedConfigurationAttempt.preSharedKey != null
                            && !lastSavedConfigurationAttempt.preSharedKey.equals("*")) {
                        sb.append(" hasPSK");
                    }
                    if (lastSavedConfigurationAttempt.ephemeral) {
                        sb.append(" ephemeral");
                    }
                    if (lastSavedConfigurationAttempt.selfAdded) {
                        sb.append(" selfAdded");
                    }
                    sb.append(" cuid=").append(lastSavedConfigurationAttempt.creatorUid);
                    sb.append(" suid=").append(lastSavedConfigurationAttempt.lastUpdateUid);
                }
                break;
            case WifiManager.FORGET_NETWORK:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                if (lastForgetConfigurationAttempt != null) {
                    sb.append(" ").append(lastForgetConfigurationAttempt.configKey());
                    sb.append(" nid=").append(lastForgetConfigurationAttempt.networkId);
                    if (lastForgetConfigurationAttempt.hiddenSSID) {
                        sb.append(" hidden");
                    }
                    if (lastForgetConfigurationAttempt.preSharedKey != null) {
                        sb.append(" hasPSK");
                    }
                    if (lastForgetConfigurationAttempt.ephemeral) {
                        sb.append(" ephemeral");
                    }
                    if (lastForgetConfigurationAttempt.selfAdded) {
                        sb.append(" selfAdded");
                    }
                    sb.append(" cuid=").append(lastForgetConfigurationAttempt.creatorUid);
                    sb.append(" suid=").append(lastForgetConfigurationAttempt.lastUpdateUid);
                    sb.append(" ajst=").append(lastForgetConfigurationAttempt.autoJoinStatus);
                }
                break;
            case WifiMonitor.ASSOCIATION_REJECTION_EVENT:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                String bssid = (String) msg.obj;
                if (bssid != null && bssid.length() > 0) {
                    sb.append(" ");
                    sb.append(bssid);
                }
                sb.append(" blacklist=" + Boolean.toString(didBlackListBSSID));
                break;
            case WifiMonitor.SCAN_RESULTS_EVENT:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                if (mScanResults != null) {
                    sb.append(" found=");
                    sb.append(mScanResults.size());
                }
                sb.append(" known=").append(mNumScanResultsKnown);
                sb.append(" got=").append(mNumScanResultsReturned);
                if (lastScanDuration != 0) {
                    sb.append(" dur:").append(lastScanDuration);
                }
                if (mOnTime != 0) {
                    sb.append(" on:").append(mOnTimeThisScan).append(",").append(mOnTimeScan);
                    sb.append(",").append(mOnTime);
                }
                if (mTxTime != 0) {
                    sb.append(" tx:").append(mTxTimeThisScan).append(",").append(mTxTimeScan);
                    sb.append(",").append(mTxTime);
                }
                if (mRxTime != 0) {
                    sb.append(" rx:").append(mRxTimeThisScan).append(",").append(mRxTimeScan);
                    sb.append(",").append(mRxTime);
                }
                sb.append(String.format(" bcn=%d", mRunningBeaconCount));
                sb.append(String.format(" con=%d", mConnectionRequests));
                key = mWifiConfigStore.getLastSelectedConfiguration();
                if (key != null) {
                    sb.append(" last=").append(key);
                }
                break;
            case WifiMonitor.SCAN_FAILED_EVENT:
                break;
            case WifiMonitor.NETWORK_CONNECTION_EVENT:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                sb.append(" ").append(mLastBssid);
                sb.append(" nid=").append(mLastNetworkId);
                config = getCurrentWifiConfiguration();
                if (config != null) {
                    sb.append(" ").append(config.configKey());
                }
                key = mWifiConfigStore.getLastSelectedConfiguration();
                if (key != null) {
                    sb.append(" last=").append(key);
                }
                break;
            case CMD_TARGET_BSSID:
            case CMD_ASSOCIATED_BSSID:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                if (msg.obj != null) {
                    sb.append(" BSSID=").append((String) msg.obj);
                }
                if (mTargetRoamBSSID != null) {
                    sb.append(" Target=").append(mTargetRoamBSSID);
                }
                sb.append(" roam=").append(Integer.toString(mAutoRoaming));
                break;
            case WifiMonitor.NETWORK_DISCONNECTION_EVENT:
                if (msg.obj != null) {
                    sb.append(" ").append((String) msg.obj);
                }
                sb.append(" nid=").append(msg.arg1);
                sb.append(" reason=").append(msg.arg2);
                if (mLastBssid != null) {
                    sb.append(" lastbssid=").append(mLastBssid);
                }
                if (mWifiInfo.getFrequency() != -1) {
                    sb.append(" freq=").append(mWifiInfo.getFrequency());
                    sb.append(" rssi=").append(mWifiInfo.getRssi());
                }
                if (linkDebouncing) {
                    sb.append(" debounce");
                }
                break;
            case WifiMonitor.SSID_TEMP_DISABLED:
            case WifiMonitor.SSID_REENABLED:
                sb.append(" nid=").append(msg.arg1);
                if (msg.obj != null) {
                    sb.append(" ").append((String) msg.obj);
                }
                config = getCurrentWifiConfiguration();
                if (config != null) {
                    sb.append(" cur=").append(config.configKey());
                    sb.append(" ajst=").append(config.autoJoinStatus);
                    if (config.selfAdded) {
                        sb.append(" selfAdded");
                    }
                    if (config.status != 0) {
                        sb.append(" st=").append(config.status);
                        sb.append(" rs=").append(config.disableReason);
                    }
                    if (config.lastConnected != 0) {
                        now = System.currentTimeMillis();
                        sb.append(" lastconn=").append(now - config.lastConnected).append("(ms)");
                    }
                    if (mLastBssid != null) {
                        sb.append(" lastbssid=").append(mLastBssid);
                    }
                    if (mWifiInfo.getFrequency() != -1) {
                        sb.append(" freq=").append(mWifiInfo.getFrequency());
                        sb.append(" rssi=").append(mWifiInfo.getRssi());
                        sb.append(" bssid=").append(mWifiInfo.getBSSID());
                    }
                }
                break;
            case CMD_RSSI_POLL:
            case CMD_UNWANTED_NETWORK:
            case WifiManager.RSSI_PKTCNT_FETCH:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                if (mWifiInfo.getSSID() != null)
                    if (mWifiInfo.getSSID() != null)
                        sb.append(" ").append(mWifiInfo.getSSID());
                if (mWifiInfo.getBSSID() != null)
                    sb.append(" ").append(mWifiInfo.getBSSID());
                sb.append(" rssi=").append(mWifiInfo.getRssi());
                sb.append(" f=").append(mWifiInfo.getFrequency());
                sb.append(" sc=").append(mWifiInfo.score);
                sb.append(" link=").append(mWifiInfo.getLinkSpeed());
                sb.append(String.format(" tx=%.1f,", mWifiInfo.txSuccessRate));
                sb.append(String.format(" %.1f,", mWifiInfo.txRetriesRate));
                sb.append(String.format(" %.1f ", mWifiInfo.txBadRate));
                sb.append(String.format(" rx=%.1f", mWifiInfo.rxSuccessRate));
                sb.append(String.format(" bcn=%d", mRunningBeaconCount));
                report = reportOnTime();
                if (report != null) {
                    sb.append(" ").append(report);
                }
                if (wifiScoringReport != null) {
                    sb.append(wifiScoringReport);
                }
                if (mConnectedModeGScanOffloadStarted) {
                    sb.append(" offload-started periodMilli " + mGScanPeriodMilli);
                } else {
                    sb.append(" offload-stopped");
                }
                break;
            case CMD_AUTO_CONNECT:
            case WifiManager.CONNECT_NETWORK:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                config = (WifiConfiguration) msg.obj;
                if (config != null) {
                    sb.append(" ").append(config.configKey());
                    if (config.visibility != null) {
                        sb.append(" ").append(config.visibility.toString());
                    }
                }
                if (mTargetRoamBSSID != null) {
                    sb.append(" ").append(mTargetRoamBSSID);
                }
                sb.append(" roam=").append(Integer.toString(mAutoRoaming));
                config = getCurrentWifiConfiguration();
                if (config != null) {
                    sb.append(config.configKey());
                    if (config.visibility != null) {
                        sb.append(" ").append(config.visibility.toString());
                    }
                }
                break;
            case CMD_AUTO_ROAM:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                ScanResult result = (ScanResult) msg.obj;
                if (result != null) {
                    now = System.currentTimeMillis();
                    sb.append(" bssid=").append(result.BSSID);
                    sb.append(" rssi=").append(result.level);
                    sb.append(" freq=").append(result.frequency);
                    if (result.seen > 0 && result.seen < now) {
                        sb.append(" seen=").append(now - result.seen);
                    } else {
                        // Somehow the timestamp for this scan result is inconsistent
                        sb.append(" !seen=").append(result.seen);
                    }
                }
                if (mTargetRoamBSSID != null) {
                    sb.append(" ").append(mTargetRoamBSSID);
                }
                sb.append(" roam=").append(Integer.toString(mAutoRoaming));
                sb.append(" fail count=").append(Integer.toString(mRoamFailCount));
                break;
            case CMD_ADD_OR_UPDATE_NETWORK:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                if (msg.obj != null) {
                    config = (WifiConfiguration) msg.obj;
                    sb.append(" ").append(config.configKey());
                    sb.append(" prio=").append(config.priority);
                    sb.append(" status=").append(config.status);
                    if (config.BSSID != null) {
                        sb.append(" ").append(config.BSSID);
                    }
                    WifiConfiguration curConfig = getCurrentWifiConfiguration();
                    if (curConfig != null) {
                        if (curConfig.configKey().equals(config.configKey())) {
                            sb.append(" is current");
                        } else {
                            sb.append(" current=").append(curConfig.configKey());
                            sb.append(" prio=").append(curConfig.priority);
                            sb.append(" status=").append(curConfig.status);
                        }
                    }
                }
                break;
            case WifiManager.DISABLE_NETWORK:
            case CMD_ENABLE_NETWORK:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                key = mWifiConfigStore.getLastSelectedConfiguration();
                if (key != null) {
                    sb.append(" last=").append(key);
                }
                config = mWifiConfigStore.getWifiConfiguration(msg.arg1);
                if (config != null && (key == null || !config.configKey().equals(key))) {
                    sb.append(" target=").append(key);
                }
                break;
            case CMD_GET_CONFIGURED_NETWORKS:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                sb.append(" num=").append(mWifiConfigStore.getConfiguredNetworksSize());
                break;
            case DhcpStateMachine.CMD_PRE_DHCP_ACTION:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                sb.append(" txpkts=").append(mWifiInfo.txSuccess);
                sb.append(",").append(mWifiInfo.txBad);
                sb.append(",").append(mWifiInfo.txRetries);
                break;
            case DhcpStateMachine.CMD_POST_DHCP_ACTION:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                if (msg.arg1 == DhcpStateMachine.DHCP_SUCCESS) {
                    sb.append(" OK ");
                } else if (msg.arg1 == DhcpStateMachine.DHCP_FAILURE) {
                    sb.append(" FAIL ");
                }
                if (mLinkProperties != null) {
                    if (mLinkProperties.hasIPv4Address()) {
                        sb.append(" v4");
                    }
                    if (mLinkProperties.hasGlobalIPv6Address()) {
                        sb.append(" v6");
                    }
                    if (mLinkProperties.hasIPv4DefaultRoute()) {
                        sb.append(" v4r");
                    }
                    if (mLinkProperties.hasIPv6DefaultRoute()) {
                        sb.append(" v6r");
                    }
                    if (mLinkProperties.hasIPv4DnsServer()) {
                        sb.append(" v4dns");
                    }
                    if (mLinkProperties.hasIPv6DnsServer()) {
                        sb.append(" v6dns");
                    }
                }
                break;
            case WifiP2pServiceImpl.P2P_CONNECTION_CHANGED:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                if (msg.obj != null) {
                    NetworkInfo info = (NetworkInfo) msg.obj;
                    NetworkInfo.State state = info.getState();
                    NetworkInfo.DetailedState detailedState = info.getDetailedState();
                    if (state != null) {
                        sb.append(" st=").append(state);
                    }
                    if (detailedState != null) {
                        sb.append("/").append(detailedState);
                    }
                }
                break;
            case CMD_IP_CONFIGURATION_LOST:
                int count = -1;
                WifiConfiguration c = getCurrentWifiConfiguration();
                if (c != null) count = c.numIpConfigFailures;
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                sb.append(" failures: ");
                sb.append(Integer.toString(count));
                sb.append("/");
                sb.append(Integer.toString(mWifiConfigStore.getMaxDhcpRetries()));
                if (mWifiInfo.getBSSID() != null) {
                    sb.append(" ").append(mWifiInfo.getBSSID());
                }
                if (c != null) {
                    ScanDetailCache scanDetailCache =
                            mWifiConfigStore.getScanDetailCache(c);
                    if (scanDetailCache != null) {
                        for (ScanDetail sd : scanDetailCache.values()) {
                            ScanResult r = sd.getScanResult();
                            if (r.BSSID.equals(mWifiInfo.getBSSID())) {
                                sb.append(" ipfail=").append(r.numIpConfigFailures);
                                sb.append(",st=").append(r.autoJoinStatus);
                            }
                        }
                    }
                    sb.append(" -> ajst=").append(c.autoJoinStatus);
                    sb.append(" ").append(c.disableReason);
                    sb.append(" txpkts=").append(mWifiInfo.txSuccess);
                    sb.append(",").append(mWifiInfo.txBad);
                    sb.append(",").append(mWifiInfo.txRetries);
                }
                sb.append(String.format(" bcn=%d", mRunningBeaconCount));
                break;
            case CMD_UPDATE_LINKPROPERTIES:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                if (mLinkProperties != null) {
                    if (mLinkProperties.hasIPv4Address()) {
                        sb.append(" v4");
                    }
                    if (mLinkProperties.hasGlobalIPv6Address()) {
                        sb.append(" v6");
                    }
                    if (mLinkProperties.hasIPv4DefaultRoute()) {
                        sb.append(" v4r");
                    }
                    if (mLinkProperties.hasIPv6DefaultRoute()) {
                        sb.append(" v6r");
                    }
                    if (mLinkProperties.hasIPv4DnsServer()) {
                        sb.append(" v4dns");
                    }
                    if (mLinkProperties.hasIPv6DnsServer()) {
                        sb.append(" v6dns");
                    }
                }
                break;
            case CMD_IP_REACHABILITY_LOST:
                if (msg.obj != null) {
                    sb.append(" ").append((String) msg.obj);
                }
                break;
            case CMD_SET_COUNTRY_CODE:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                if (msg.obj != null) {
                    sb.append(" ").append((String) msg.obj);
                }
                break;
            case CMD_ROAM_WATCHDOG_TIMER:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                sb.append(" cur=").append(roamWatchdogCount);
                break;
            case CMD_DISCONNECTING_WATCHDOG_TIMER:
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                sb.append(" cur=").append(disconnectingWatchdogCount);
                break;
            case CMD_START_RSSI_MONITORING_OFFLOAD:
            case CMD_STOP_RSSI_MONITORING_OFFLOAD:
            case CMD_RSSI_THRESHOLD_BREACH:
                sb.append(" rssi=");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" thresholds=");
                sb.append(Arrays.toString(mRssiRanges));
                break;
            default:
                ///M: add log @{
                sb.append(msg.toString());
                ///@}
                sb.append(" ");
                sb.append(Integer.toString(msg.arg1));
                sb.append(" ");
                sb.append(Integer.toString(msg.arg2));
                break;
        }

        return sb.toString();
    }

 

 

 

首先看時間點附近的log,看mainLog。

搜索WifiStateMachine,結果如下:

Line 97197: 06-05 10:02:22.841257   650   767 I WifiStateMachine: fetchRssiLinkSpeedAndFrequencyNative, newRssi:-30, newLinkSpeed:135, SSID:"TP-50"
	Line 97198: 06-05 10:02:22.841299   650   767 D WifiStateMachine: mLastSignalLevel:4, newSignalLevel:4
	Line 97201: 06-05 10:02:22.845437   650   767 D WifiStateMachine:  ObtainingIpState (when=0 what=131249!M_CMD_UPDATE_RSSI uid=10047  rt=2746647/2746647{ when=0 what=131249 target=com.android.internal.util.StateMachine$SmHandler } 0 0
	Line 97202: 06-05 10:02:22.845763   650   767 D WifiStateMachine:  L2ConnectedState (when=-1ms what=131249!M_CMD_UPDATE_RSSI uid=10047  rt=2746648/2746648{ when=-1ms what=131249 target=com.android.internal.util.StateMachine$SmHandler } 0 0
	Line 97203: 06-05 10:02:22.848220   650   767 D WifiStateMachine:  ConnectModeState (when=-3ms what=131249!M_CMD_UPDATE_RSSI uid=10047  rt=2746650/2746650{ when=-3ms what=131249 target=com.android.internal.util.StateMachine$SmHandler } 0 0
	Line 97204: 06-05 10:02:22.856197   650   767 D WifiStateMachine:  DriverStartedState (when=-11ms what=131249!M_CMD_UPDATE_RSSI uid=10047  rt=2746658/2746658{ when=-11ms what=131249 target=com.android.internal.util.StateMachine$SmHandler } 0 0
	Line 97205: 06-05 10:02:22.856494   650   767 D WifiStateMachine:  SupplicantStartedState (when=-11ms what=131249!M_CMD_UPDATE_RSSI uid=10047  rt=2746658/2746658{ when=-11ms what=131249 target=com.android.internal.util.StateMachine$SmHandler } 0 0
	Line 97215: 06-05 10:02:22.864223   650   767 I WifiStateMachine: fetchRssiNative, newRssi:-30
	Line 97563: 06-05 10:02:23.902084   650   767 D WifiStateMachine:  ObtainingIpState (when=-2ms what=196613 arg1=2 arg2=2) !CMD_POST_DHCP_ACTION  rt=2747704/2747704 2 2 FAIL 
	Line 97564: 06-05 10:02:23.902509   650   767 D WifiStateMachine:  L2ConnectedState (when=-2ms what=196613 arg1=2 arg2=2) !CMD_POST_DHCP_ACTION  rt=2747704/2747704 2 2 FAIL 
	Line 97565: 06-05 10:02:23.902550   650   767 D WifiStateMachine: CMD_POST_DHCP_ACTION for:2, mDhcpV4Status:0, mDhcpV6Status:2
	Line 97566: 06-05 10:02:23.903208   650   767 D WifiStateMachine: setSuspendOptimizationsNative: 1 true -want true stack:setSuspendOptimizationsNative - handlePostDhcpSetup - processMessage - processMsg
	Line 97649: 06-05 10:02:23.922255   650   767 D WifiStateMachine:  ObtainingIpState (when=-11ms what=147463 arg1=2489!AUTHENTICATION_FAILURE_EVENT  rt=2747724/2747724{ when=-11ms what=147463 arg1=2489 target=com.android.internal.util.StateMachine$SmHandler } 2489 0
	Line 97670: 06-05 10:02:23.922952   650   767 D WifiStateMachine:  L2ConnectedState (when=-12ms what=147463 arg1=2489!AUTHENTICATION_FAILURE_EVENT  rt=2747725/2747725{ when=-12ms what=147463 arg1=2489 target=com.android.internal.util.StateMachine$SmHandler } 2489 0
	Line 97671: 06-05 10:02:23.923348   650   767 D WifiStateMachine:  ConnectModeState (when=-12ms what=147463 arg1=2489!AUTHENTICATION_FAILURE_EVENT  rt=2747725/2747725{ when=-12ms what=147463 arg1=2489 target=com.android.internal.util.StateMachine$SmHandler } 2489 0
	Line 97676: 06-05 10:02:23.924092   650   767 D WifiStateMachine:  ObtainingIpState (when=-12ms what=147496 arg1=-1!P2P_PEER_DISCONNECT_EVENT  rt=2747726/2747726{ when=-12ms what=147496 arg1=-1 obj=3 target=com.android.internal.util.StateMachine$SmHandler obj=3 } -1 0
	Line 97677: 06-05 10:02:23.924443   650   767 D WifiStateMachine:  L2ConnectedState (when=-12ms what=147496 arg1=-1!P2P_PEER_DISCONNECT_EVENT  rt=2747726/2747726{ when=-12ms what=147496 arg1=-1 obj=3 target=com.android.internal.util.StateMachine$SmHandler obj=3 } -1 0
	Line 97678: 06-05 10:02:23.926002   650   767 D WifiStateMachine:  ConnectModeState (when=-14ms what=147496 arg1=-1!P2P_PEER_DISCONNECT_EVENT  rt=2747728/2747728{ when=-14ms what=147496 arg1=-1 obj=3 target=com.android.internal.util.StateMachine$SmHandler obj=3 } -1 0
	Line 97679: 06-05 10:02:23.926376   650   767 D WifiStateMachine:  DriverStartedState (when=-14ms what=147496 arg1=-1!P2P_PEER_DISCONNECT_EVENT  rt=2747728/2747728{ when=-14ms what=147496 arg1=-1 obj=3 target=com.android.internal.util.StateMachine$SmHandler obj=3 } -1 0
	Line 97680: 06-05 10:02:23.926725   650   767 D WifiStateMachine:  SupplicantStartedState (when=-15ms what=147496 arg1=-1!P2P_PEER_DISCONNECT_EVENT  rt=2747729/2747729{ when=-15ms what=147496 arg1=-1 obj=3 target=com.android.internal.util.StateMachine$SmHandler obj=3 } -1 0
	Line 97683: 06-05 10:02:23.929685   650   767 D WifiStateMachine:  DefaultState (when=-17ms what=147496 arg1=-1!P2P_PEER_DISCONNECT_EVENT  rt=2747731/2747731{ when=-17ms what=147496 arg1=-1 obj=3 target=com.android.internal.util.StateMachine$SmHandler obj=3 } -1 0
	Line 97684: 06-05 10:02:23.929733   650   767 E WifiStateMachine: Error! unhandled message{ when=-18ms what=147496 arg1=-1 obj=3 target=com.android.internal.util.StateMachine$SmHandler obj=3 }

最明顯的是WifiStateMachine: Error! unhandled message{ when=-18ms what=147496 arg1=-1 obj=3 target=com.android.internal.util.StateMachine$SmHandler obj=3 }。但是並不是這個導致的。這個報的是wpas發過來的消息沒有state處理,就是一直上報到DefaultState還是不能處理,就會報這個Error!

直接顯示錯誤的log是:

ObtainingIpState (when=-11ms what=147463 arg1=2489!AUTHENTICATION_FAILURE_EVENT  rt=2747724/2747724{ when=-11ms what=147463 arg1=2489 target=com.android.internal.util.StateMachine$SmHandler } 2489 0
	Line 97670: 06-05 10:02:23.922952   650   767 D WifiStateMachine:  L2ConnectedState (when=-12ms what=147463 arg1=2489!AUTHENTICATION_FAILURE_EVENT  rt=2747725/2747725{ when=-12ms what=147463 arg1=2489 target=com.android.internal.util.StateMachine$SmHandler } 2489 0
	Line 97671: 06-05 10:02:23.923348   650   767 D WifiStateMachine:  ConnectModeState (when=-12ms what=147463 arg1=2489!AUTHENTICATION_FAILURE_EVENT  rt=2747725/2747725{ when=-12ms what=147463 arg1=2489 target=com.android.internal.util.StateMachine$SmHandler } 2489 0

可以看出來,這個錯誤的消息沒有一直上報,而是最終ConnectModeState處理了。

 

 

結合整個log一起看,就是結合wifihw,wifi_hal,wpa_supplicant一起看:

#在此開始連接
06-05 10:02:23.913477   650 10218 D WifiHW  : [1] get event: IFNAME=wlan0 <3>CTRL-EVENT-STATE-CHANGE id=8 state=0 BSSID=8c:a6:df:e8:f2:08 SSID=TP-50
06-05 10:02:23.913492   650 10218 D WifiHW  : [2] get event: IFNAME=wlan0 CTRL-EVENT-STATE-CHANGE id=8 state=0 BSSID=8c:a6:df:e8:f2:08 SSID=TP-50
06-05 10:02:23.913562   650 10218 D WifiMonitor: Event [IFNAME=wlan0 CTRL-EVENT-STATE-CHANGE id=8 state=0 BSSID=8c:a6:df:e8:f2:08 SSID=TP-50]
06-05 10:02:23.913897   650 10218 D WifiHW  : enter -->wifi_wait_on_socket buflen=2048
06-05 10:02:23.914498   650   767 D WifiHAL : Start memory dump command
06-05 10:02:23.914536   650   767 D WifiHAL : WifiRequest::create vendor command to iface 13, vendor_id=0x1a11, subcmd=0x1401, res=0
06-05 10:02:23.920562 10210 10210 D wpa_supplicant: RTM_NEWLINK: ifi_index=13 ifname=wlan0 wext ifi_family=0 ifi_flags=0x11003 ([UP][LOWER_UP])
06-05 10:02:23.921482   650   767 D WifiHAL : WifiCommand::requestResponse err=-95
06-05 10:02:23.921571   650   767 E WifiHAL : Failed to register trigger memory dump response; result = -95
#在此開始就認證報錯了,估計是獲取IP失敗,直接原因貌似是上面的Failed to register trigger memory dump response造成的。
06-05 10:02:23.922255   650   767 D WifiStateMachine:  ObtainingIpState (when=-11ms what=147463 arg1=2489!AUTHENTICATION_FAILURE_EVENT  rt=2747724/2747724{ when=-11ms what=147463 arg1=2489 target=com.android.internal.util.StateMachine$SmHandler } 2489 0
06-05 10:02:23.922422 10210 10210 D wpa_supplicant: RTM_NEWLINK: ifi_index=13 ifname=wlan0 operstate=2 linkmode=1 ifi_family=0 ifi_flags=0x1003 ([UP])
06-05 10:02:23.922485 10210 10210 D wpa_supplicant: nl80211: Event message available
06-05 10:02:23.922534 10210 10210 D wpa_supplicant: nl80211: Ignored event (cmd=48) for foreign interface (ifindex 13 wdev 0x0)
06-05 10:02:23.922553 10210 10210 D wpa_supplicant: nl80211: Drv Event 48 (NL80211_CMD_DISCONNECT) received for wlan0
06-05 10:02:23.922574 10210 10210 W wpa_supplicant: nl80211: Was expecting local disconnect but got another disconnect event first
06-05 10:02:23.922585 10210 10210 D wpa_supplicant: nl80211: Disconnect event
06-05 10:02:23.922610 10210 10210 D wpa_supplicant: wlan0: Event DEAUTH (12) received
06-05 10:02:23.922647 10210 10210 D wpa_supplicant: wlan0: Deauthentication notification
06-05 10:02:23.922668 10210 10210 D wpa_supplicant: wlan0:  * reason 0
06-05 10:02:23.922686 10210 10210 D wpa_supplicant: Deauthentication frame IE(s) - hexdump(len=0): [NULL]
06-05 10:02:23.922715 10210 10210 D wpa_supplicant: wlan0: Auto connect disabled: do not try to re-connect
06-05 10:02:23.922735 10210 10210 D wpa_supplicant: TDLS: Remove peers on disassociation
06-05 10:02:23.922755 10210 10210 D wpa_supplicant: wlan0: WPA: Clear old PMK and PTK
06-05 10:02:23.922781 10210 10210 D wpa_supplicant: wlan0: Disconnect event - remove keys
06-05 10:02:23.922804 10210 10210 D wpa_supplicant: wlan0: State: DISCONNECTED -> DISCONNECTED
06-05 10:02:23.922821 10210 10210 D wpa_supplicant: P2P: restorage p2p channels
06-05 10:02:23.922838 10210 10210 D wpa_supplicant: nl80211: Set wlan0 operstate 0->0 (DORMANT)
06-05 10:02:23.922860 10210 10210 D wpa_supplicant: netlink: Operstate: ifindex=13 linkmode=-1 (no change), operstate=5 (IF_OPER_DORMANT)
06-05 10:02:23.922906 10210 10210 D wpa_supplicant: EAPOL: External notification - portEnabled=0
06-05 10:02:23.922927 10210 10210 D wpa_supplicant: EAPOL: External notification - portValid=0
06-05 10:02:23.922952   650   767 D WifiStateMachine:  L2ConnectedState (when=-12ms what=147463 arg1=2489!AUTHENTICATION_FAILURE_EVENT  rt=2747725/2747725{ when=-12ms what=147463 arg1=2489 target=com.android.internal.util.StateMachine$SmHandler } 2489 0
06-05 10:02:23.923348   650   767 D WifiStateMachine:  ConnectModeState (when=-12ms what=147463 arg1=2489!AUTHENTICATION_FAILURE_EVENT  rt=2747725/2747725{ when=-12ms what=147463 arg1=2489 target=com.android.internal.util.StateMachine$SmHandler } 2489 0
06-05 10:02:23.923474   650   767 D WifiHAL : Start memory dump command
06-05 10:02:23.923513   650   767 D WifiHAL : WifiRequest::create vendor command to iface 13, vendor_id=0x1a11, subcmd=0x1401, res=0
06-05 10:02:23.923587   650   767 D WifiHAL : WifiCommand::requestResponse err=-95
06-05 10:02:23.923608   650   767 E WifiHAL : Failed to register trigger memory dump response; result = -95
06-05 10:02:23.924092   650   767 D WifiStateMachine:  ObtainingIpState (when=-12ms what=147496 arg1=-1!P2P_PEER_DISCONNECT_EVENT  rt=2747726/2747726{ when=-12ms what=147496 arg1=-1 obj=3 target=com.android.internal.util.StateMachine$SmHandler obj=3 } -1 0
06-05 10:02:23.924443   650   767 D WifiStateMachine:  L2ConnectedState (when=-12ms what=147496 arg1=-1!P2P_PEER_DISCONNECT_EVENT  rt=2747726/2747726{ when=-12ms what=147496 arg1=-1 obj=3 target=com.android.internal.util.StateMachine$SmHandler obj=3 } -1 0
06-05 10:02:23.926002   650   767 D WifiStateMachine:  ConnectModeState (when=-14ms what=147496 arg1=-1!P2P_PEER_DISCONNECT_EVENT  rt=2747728/2747728{ when=-14ms what=147496 arg1=-1 obj=3 target=com.android.internal.util.StateMachine$SmHandler obj=3 } -1 0
06-05 10:02:23.926376   650   767 D WifiStateMachine:  DriverStartedState (when=-14ms what=147496 arg1=-1!P2P_PEER_DISCONNECT_EVENT  rt=2747728/2747728{ when=-14ms what=147496 arg1=-1 obj=3 target=com.android.internal.util.StateMachine$SmHandler obj=3 } -1 0
06-05 10:02:23.926725   650   767 D WifiStateMachine:  SupplicantStartedState (when=-15ms what=147496 arg1=-1!P2P_PEER_DISCONNECT_EVENT  rt=2747729/2747729{ when=-15ms what=147496 arg1=-1 obj=3 target=com.android.internal.util.StateMachine$SmHandler obj=3 } -1 0
06-05 10:02:23.926863   650 10414 D DhcpClient: DhcpInitState 0 CMD_KICK 0 0 null
06-05 10:02:23.927038   650 10414 D DhcpClient: Broadcasting DHCPDISCOVER
06-05 10:02:23.929685   650   767 D WifiStateMachine:  DefaultState (when=-17ms what=147496 arg1=-1!P2P_PEER_DISCONNECT_EVENT  rt=2747731/2747731{ when=-17ms what=147496 arg1=-1 obj=3 target=com.android.internal.util.StateMachine$SmHandler obj=3 } -1 0
06-05 10:02:23.929733   650   767 E WifiStateMachine: Error! unhandled message{ when=-18ms what=147496 arg1=-1 obj=3 target=com.android.internal.util.StateMachine$SmHandler obj=3 }

 

 

 

貌似是在wifi_logger.cpp#start() -> cpp_bindings.cpp WifiRequest#create(uint32_t id, int subcmd)中出錯了。就是寫命令GOOGLE_OUI和LOGGER_TRIGGER_MEM_DUMP到NL80211_ATTR_VENDOR_ID和NL80211_ATTR_VENDOR_SUBCMD時出錯了。

int WifiRequest::create(uint32_t id, int subcmd) {
    int res = create(NL80211_CMD_VENDOR);
    if (res < 0) {
        return res;
    }

    res = put_u32(NL80211_ATTR_VENDOR_ID, id);
    if (res < 0) {
        return res;
    }

    res = put_u32(NL80211_ATTR_VENDOR_SUBCMD, subcmd);
    if (res < 0) {
        return res;
    }

    if (mIface != -1) {
        res = set_iface_id(mIface);
    }

    return res;
}

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章