supplicant初始化流程及wifi打开慢原因分析

wpa_supplicant是一个独立的进程,对应的文件为external/wpa_supplicant_8/wpa_supplicant/main.c。

 int main(int argc, char *argv[]) {     global = wpa_supplicant_init(¶ms);     if (global == NULL) {         wpa_printf(MSG_ERROR, "Failed to initialize wpa_supplicant"); exitcode = -1;         goto out;     } else { wpa_printf(MSG_INFO, "Successfully initialized ""wpa_supplicant");     }     for (i = 0; exitcode == 0 && i < iface_count; i++) {         struct wpa_supplicant *wpa_s; wpa_s = wpa_supplicant_add_iface(global, &ifaces[i]); if (wpa_s == NULL) {     exitcode = -1;     break; } if (exitcode == 0)     exitcode = wpa_supplicant_run(global); wpa_supplicant_deinit(global); return exitcode; }

总体流程为wpa_supplicant_init–>wpa_supplicant_add_iface–>wpa_supplicant_init_iface–>wpa_supplicant_driver_init–>wapi_supplicant_init。

1 wpa_supplicant_init是用struct wpa_params初始化struct wpa_global,,struct wpa_params是调用wpa_supplicant命令对应的参数列表。

 struct wpa_global * wpa_supplicant_init(struct wpa_params *params) 对应的log有 04-28 11:14:13.444 D/wpa_supplicant(19277): wpa_supplicant v2.1-devel-4.4.4 04-28 11:14:13.444 D/wpa_supplicant(19277): Global control interface '@android:wpa_wlan0' 04-28 11:14:13.444 D/wpa_supplicant(19277): Using Android control socket 'wpa_wlan0' 04-28 11:14:13.444 I/wpa_supplicant(19277): Successfully initialized wpa_supplicant

2 wpa_supplicant_add_iface用struct wpa_global初始化struct wpa_interface,增加wlan0和p2p0两个接口。

 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global, struct wpa_interface *iface) 04-28 11:14:13.444 D/wpa_supplicant(19277): Override interface parameter: ctrl_interface ('(null)' -> '/data/misc/wifi/sockets')

3 wpa_supplicant_init_iface负责用struct wpa_interface初始化wlan0、p2p0等代表的struct wpa_supplicant。

 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s, struct wpa_interface *iface) {     wpa_s->conf = wpa_config_read(wpa_s->confname, NULL);     wpa_config_read(wpa_s->confanother, wpa_s->conf);     if (wpas_init_driver(wpa_s, iface) < 0)//调用wpa_supplicant_set_driver        return -1;     if (wpa_supplicant_driver_init(wpa_s) < 0)        return -1;          if (wpa_supplicant_init_eapol(wpa_s) < 0)        return -1; }对应的log有 04-28 11:14:13.444 D/wpa_supplicant(19277): Initializing interface 'p2p0' conf '/data/misc/wifi/p2p_supplicant.conf'                                              driver 'nl80211' ctrl_interface '/data/misc/wifi/sockets' bridge 'N/A' 04-28 11:14:13.444 D/wpa_supplicant(19277): Configuration file '/data/misc/wifi/p2p_supplicant.conf'                                              -> '/data/misc/wifi/p2p_supplicant.conf' 04-28 11:14:13.444 D/wpa_supplicant(19277): Reading configuration file '/data/misc/wifi/p2p_supplicant.conf' 04-28 11:14:13.444 D/wpa_supplicant(19277): Reading configuration file '/system/etc/wifi/p2p_supplicant_overlay.conf' 04-28 11:14:13.804 D/wpa_supplicant(19277): Initializing interface 'wlan0' conf '/data/misc/wifi/wpa_supplicant.conf'                                              driver 'nl80211' ctrl_interface '/data/misc/wifi/sockets' bridge 'N/A'  04-28 11:14:13.804 D/wpa_supplicant(19277): Configuration file '/data/misc/wifi/wpa_supplicant.conf'                                              -> '/data/misc/wifi/wpa_supplicant.conf' 04-28 11:14:14.234 D/wpa_supplicant(19277): eap_proxy: IMSI not available

4 wpa_supplicant_driver_init中包含wapi_supplicant_init,利用函数进一步初始化struct wpa_supplicant。

int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s) {wpa_supplicant_update_mac_addr(wpa_s);wapi_supplicant_init(wpa_s);wpa_drv_flush_pmkid(wpa_s);wpa_supplicant_enabled_networks(wpa_s); } 对应的log有 04-28 11:14:13.534 D/wpa_supplicant(19277): p2p0: Own MAC address: 3e:cb:7c:7d:20:06 04-28 11:14:13.674 D/wpa_supplicant(19277): p2p0: RSN: flushing PMKID list in the driver 04-28 11:14:14.094 D/wpa_supplicant(19277): wlan0: Own MAC address: 3c:cb:7c:7d:20:06 04-28 11:14:14.184 D/wpa_supplicant(19277): wlan0: RSN: flushing PMKID list in the driver孤单不是与生俱来,而是由你爱上一个人的那一刻开始。

supplicant初始化流程及wifi打开慢原因分析

相关文章:

你感兴趣的文章:

标签云: