上一篇大致介绍了wpa_supplicant的初始化的过程,这一篇将重点放在具体的函数上看看这些初始化的函数具体做了什么。
首先看global = wpa_supplicant_init(¶ms)。wpa_supplicant_init函数主要初始化wpa_global全局变量以及随机数资源、eloop事件循环机制以及设置消息全局回调函数等。该函数中有几个重要的重要的函数或概念要做简单介绍。
1.eap_register_methods 函数
该函数根据编译时的配置项注册EAP method, EAP method 是client 和server在认证过程中使用的认证方法。该函数实际是为每个支持的EAP method填充一个struct eap_method *eap 结构。将所有的eap_method 用链表连接起来,链表头指针保存在全局变量eap_methods中。
2.eloop_init 函数
该函数初始化eloop data数据。wpa_supplicant使用eloop event机制,单线程polling timeout,signal,socket等事件。
3. wpa_drivers数组
for (i = 0; wpa_drivers[i]; i++)
global->drv_count++;
这里统计支持的driver类型的数量,具体支持哪些driver类型由编译选项设置。wpa_drivers数组的定义如下,数组的每个成员均为wpa_driver_ops结构,其定义了很多函数。应用程序正是使用wpa driver wrapper hook的这些函数和底层进行通信,wpa_supplicant和hostapd完全只是应用程序,因此这里的wpa driver并不是什么设备或kernel的驱动,而是上层和底层驱动进行通信的接口。
const struct wpa_driver_ops *const wpa_drivers[] =
{
#ifdef CONFIG_DRIVER_NL80211
&wpa_driver_nl80211_ops,
#endif /* CONFIG_DRIVER_NL80211 */
#ifdef CONFIG_DRIVER_WEXT
&wpa_driver_wext_ops,
#endif /* CONFIG_DRIVER_WEXT */
#ifdef CONFIG_DRIVER_HOSTAP
&wpa_driver_hostap_ops,
#endif /* CONFIG_DRIVER_HOSTAP */
#ifdef CONFIG_DRIVER_BSD
&wpa_driver_bsd_ops,
#endif /* CONFIG_DRIVER_BSD */
#ifdef CONFIG_DRIVER_OPENBSD
&wpa_driver_openbsd_ops,
#endif /* CONFIG_DRIVER_OPENBSD */
#ifdef CONFIG_DRIVER_NDIS
&wpa_driver_ndis_ops,
#endif /* CONFIG_DRIVER_NDIS */
#ifdef CONFIG_DRIVER_WIRED
&wpa_driver_wired_ops,
#endif /* CONFIG_DRIVER_WIRED */
#ifdef CONFIG_DRIVER_MACSEC_LINUX
&wpa_driver_macsec_linux_ops,
#endif /* CONFIG_DRIVER_MACSEC_LINUX */
#ifdef CONFIG_DRIVER_MACSEC_QCA
&wpa_driver_macsec_qca_ops,
#endif /* CONFIG_DRIVER_MACSEC_QCA */
#ifdef CONFIG_DRIVER_ROBOSWITCH
&wpa_driver_roboswitch_ops,
#endif /* CONFIG_DRIVER_ROBOSWITCH */
#ifdef CONFIG_DRIVER_ATHEROS
&wpa_driver_atheros_ops,
#endif /* CONFIG_DRIVER_ATHEROS */
#ifdef CONFIG_DRIVER_NONE
&wpa_driver_none_ops,
#endif /* CONFIG_DRIVER_NONE */
NULL
};