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