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