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
5 wapi_supplicant_init,其中wapi又调用了自己的Initialization函数。
struct wpa_supplicant *wapi_supplicant_init(struct wpa_supplicant *wpa_s)
{
for (;;) {
wpa_s->l2_wapi = l2_packet_init(wpa_s->ifname, wpa_drv_get_mac_addr(wpa_s), WLAN_WAPI_IFACE,
wapi_supplicant_rx_eapol, wpa_s, 0);
}
l2_packet_get_own_addr(wpa_s->l2_wapi, wpa_s->own_addr);
TE_WAPI_ASUE_Init();
} 对应的log有
04-28 11:14:13.674 I/wpa_supplicant(19277): wapi_supplicant_init: Init WAI packet p2p0
04-28 11:14:13.674 I/wpa_supplicant(19277): Own MAC address: 3e:cb:7c:7d:20:06
04-28 11:14:13.674 D/wpa_supplicant(19277): TE_WAPI_ASUE_Init: WAPI: ASUE INIT
04-28 11:14:13.674 D/wpa_supplicant(19277): Initialization: WAPI: Initializing WAPI Supplicant
04-28 11:14:13.674 E/wpa_supplicant(19277): Initialization: WAPI:set Staues=1