WiFi Command流程
3. wpa_supplicant启动流程
4. WifiService启动流程
5. SIGNAL_POLL调用流程
eloop_run->..
wpa_supplicant_ctrl_iface_receive-> //接收并处理来自framework的command
wpa_supplicant_ctrl_iface_process-> (SIGNAL_POLL)
wpa_supplicant_signal_poll->
wpa_drv_signal_poll (struct wpa_supplicant *wpa_s,struct wpa_signal_info *si)->
wpa_driver_signal_poll (void *priv, struct wpa_signal_info *si)->
wpa_driver_wext_driver_cmd(priv, RSSI_CMD, buf, sizeof(buf))或 //driver_cmd_wext.c
wpa_driver_wext_driver_cmd(priv, LINKSPEED_CMD, buf, sizeof(buf))->
struct iwreq iwr;
iwr.u.data.pointer = buf;
iwr.u.data.length = buf_len;
ioctl(drv->ioctl_sock, SIOCSIWPRIV, &iwr);
在Kernel中对应函数:
cfg80211_wext_setpriv (wext-compat.c)
RSSI_CMD:
cfg80211_wireless_stats (获取当前已连接AP的信号强度等信息)
对于上面的LINKSPEED_CMD,如果ioctl不成功,则调用ioctl(drv->ioctl_sock, SIOCGIWRATE, &wrq)
在Kernel中对应函数:
cfg80211_wext_giwrate (获取当前已连接AP的发送速度)
//每个AP对应的信息
struct station_info {
u32 filled;
u32 connected_time;
u32 inactive_time;
u32 rx_bytes;
u32 tx_bytes;
u16 llid;
u16 plid;
u8 plink_state;
s8 signal; //信号强度
s8 signal_avg;
struct rate_info txrate; //发送速度
struct rate_info rxrate;
u32 rx_packets;
u32 tx_packets;
u32 tx_retries;
u32 tx_failed;
u32 rx_dropped_misc;
struct sta_bss_parameters bss_param;
int generation;
};
在生产时,默认Wifi是关闭的,如果需要默认打开,可修改wifiservice.java中的如下代码:
/**
* Check if Wi-Fi needs to be enabled and start
* if needed
*
* This function is used only at boot time
*/
public void checkAndStartWifi() {
mAirplaneModeOn.set(isAirplaneModeOn());
mPersistWifiState.set(getPersistedWifiState());
/* Start if Wi-Fi should be enabled or the saved state indicates Wi-Fi was on */
boolean wifiEnabled = shouldWifiBeEnabled() || testAndClearWifiSavedState();
Slog.i(TAG, "WifiService starting up with Wi-Fi " +
(wifiEnabled ? "enabled" : "disabled"));
setWifiEnabled(wifiEnabled); //强制设置为true
mWifiWatchdogStateMachine = WifiWatchdogStateMachine.
makeWifiWatchdogStateMachine(mContext);
}