遇到WifiStateMachine 在InitialState下启动WifiMonitor的问题代码如下
/* Stop a running supplicant after a runtime restart
* Avoids issues with drivers that do not handle interface down
* on a running supplicant properly.
*/
/*在这里killsupplicant,下文看详细代码*/
mWifiMonitor.killSupplicant(mP2pSupported);
/*开启HAL,下文详细代码*/
if (WifiNative.startHal() == false) {
/* starting HAL is optional */
loge("Failed to start HAL");
}
/*开启wpa_supplicant,下文详细代码*/
if (mWifiNative.startSupplicant(mP2pSupported)) {
/*设置wifistate为enable*/
setWifiState(WIFI_STATE_ENABLING);
if (DBG) log("Supplicant start successful");
/*开启wifimonitor*/
mWifiMonitor.startMonitoring();
transitionTo(mSupplicantStartingState);
} else {
loge("Failed to start supplicant!");
}
killSupplicant(mP2pSupported)代码如下
public synchronized void killSupplicant(boolean p2pSupported) {
String suppState = System.getProperty("init.svc.wpa_supplicant");
if (suppState == null) suppState = "unknown";
String p2pSuppState = System.getProperty("init.svc.p2p_supplicant");
if (p2pSuppState == null) p2pSuppState = "unknown";
Log.e(TAG, "killSupplicant p2p" + p2pSupported
+ " init.svc.wpa_supplicant=" + suppState
+ " init.svc.p2p_supplicant=" + p2pSuppState);
WifiNative.killSupplicant(p2pSupported);
/*重点!设为false*/
mConnected = false;
for (WifiMonitor m : mIfaceMap.values()) {
m.mMonitoring = false;
}
}
在此中mConnected设为false,mConnected定义在类 WifiMonitorSingleton 中
在看下startHal()代码
synchronized public static boolean startHal() {
String debugLog = "startHal stack: ";
java.lang.StackTraceElement[] elements = Thread.currentThread().getStackTrace();
for (int i = 2; i < elements.length && i <= 7; i++ ) {
debugLog = debugLog + " - " + elements[i].getMethodName();
}
mLocalLog.log(debugLog);
synchronized (mLock) {
if (startHalNative() && (getInterfaces() != 0) && (sWlan0Index != -1)) {
sThread = new MonitorThread();
sThread.start();
return true;
} else {
if (DBG) mLocalLog.log("Could not start hal");
Log.e(TAG, "Could not start hal");
return false;
}
}
函数在wifinative中。并未对mConnected进行操作,再看下startSupplicant,最终调用,wifi.c中的wifi_start_supplicant;
{
char supp_status[PROPERTY_VALUE_MAX] = {'\0'};
int count = 200; /* wait at most 20 seconds for completion */
const prop_info *pi;
unsigned serial = 0, i;
#ifdef CONFIG_MTK_WIFI
ifc_init();
ifc_up("wlan0");
#endif
if (p2p_supported) {
strcpy(supplicant_name, P2P_SUPPLICANT_NAME);
strcpy(supplicant_prop_name, P2P_PROP_NAME);
/* Ensure p2p config file is created */
if (ensure_config_file_exists(P2P_CONFIG_FILE) < 0) {
ALOGE("Failed to create a p2p config file");
return -1;
}
} else {
strcpy(supplicant_name, SUPPLICANT_NAME);
strcpy(supplicant_prop_name, SUPP_PROP_NAME);
}
/* Check whether already running */
if (property_get(supplicant_prop_name, supp_status, NULL)
&& strcmp(supp_status, "running") == 0) {
return 0;
}
if (ensure_entropy_file_exists() < 0) {
ALOGE("Wi-Fi entropy file was not created");
}
/* Clear out any stale socket files that might be left over. */
wpa_ctrl_cleanup();
/* Reset sockets used for exiting from hung state */
exit_sockets[0] = exit_sockets[1] = -1;
/*
* Get a reference to the status property, so we can distinguish
* the case where it goes stopped => running => stopped (i.e.,
* it start up, but fails right away) from the case in which
* it starts in the stopped state and never manages to start
* running at all.
*/
pi = __system_property_find(supplicant_prop_name);
if (pi != NULL) {
serial = __system_property_serial(pi);
}
property_get("wifi.interface", primary_iface, WIFI_TEST_INTERFACE);
property_set("ctl.start", supplicant_name);
sched_yield();
while (count-- > 0) {
if (pi == NULL) {
pi = __system_property_find(supplicant_prop_name);
}
if (pi != NULL) {
/*
* property serial updated means that init process is scheduled
* after we sched_yield, further property status checking is based on this */
if (__system_property_serial(pi) != serial) {
__system_property_read(pi, NULL, supp_status);
if (strcmp(supp_status, "running") == 0) {
return 0;
} else if (strcmp(supp_status, "stopped") == 0) {
return -1;
}
}
}
usleep(100000);
}
return -1;
}
亦未对mConnected进行操作,在看下startwifimonitor函数
public synchronized void startMonitoring(String iface) {
WifiMonitor m = mIfaceMap.get(iface);
if (m == null) {
Log.e(TAG, "startMonitor called with unknown iface=" + iface);
return;
}
Log.d(TAG, "startMonitoring(" + iface + ") with mConnected = " + mConnected);
/*一直为false???????????*/
if (mConnected) {
m.mMonitoring = true;
m.mStateMachine.sendMessage(SUP_CONNECTION_EVENT);
} else {
if (DBG) Log.d(TAG, "connecting to supplicant");
int connectTries = 0;
while (true) {
if (mWifiNative.connectToSupplicant()) {
m.mMonitoring = true;
m.mStateMachine.sendMessage(SUP_CONNECTION_EVENT);
mConnected = true;
new MonitorThread(mWifiNative, this).start();
break;
}
if (connectTries++ < 5) {
try {
Thread.sleep(1000);
} catch (InterruptedException ignore) {
}
} else {
m.mStateMachine.sendMessage(SUP_DISCONNECTION_EVENT);
Log.e(TAG, "startMonitoring(" + iface + ") failed!");
break;
}
}
}
}
笔者未能找到mConnected在其他地方被调用后修改的痕迹。不知是否有知道如何定位变量在何处被调用?希望不吝赐教。或者告知哪出被遗漏了?