本文为读书笔记,整理自网络文献和源码
6 wpa_supplicant 与kernel交互
源码位置:external/wpa_supplicant_8/
wpa_supplicant与kernel交互的操作,一般需要先明确驱动接口,以及用户态和kernel态的接口方法,以此来进行调用操作。这里分为4个步骤。
1.首先需要明确指定的驱动接口。因为有较多的驱动接口可以使用,如wext、nl80211等。指定了之后,才能调用相应接口的方法。
2.保存驱动接口
3.接口方法的实现(分为用户态和kernel态)。系统已经定义了,我们只需找到定义的地方,了解有哪些方法。
4.交互
(a)用户态向kernel态发送请求(通过ioctl)
(b)kernel态向用户态发送事件通知(通过netlink)
前3步都已经在5.2中描述过。
ps:driver_cmd用于处理DRIVER的命令,调用流程如下:
wpa_supplicant_ctrl_iface_process-> (根据命令字符串调用对应的方法)
wpa_supplicant_driver_cmd->
wpa_drv_driver_cmd->
wpa_s->driver->driver_cmd->
wpa_driver_nl80211_driver_cmd -> (User)
……
6.1 kernel态实现
Kernel态实现的操作方法,实现代码见drivers/net/wireless/bcmdhd/wl_w.c
static const iw_handlerwl_iw_handler[] =
{
(iw_handler)wl_iw_config_commit,
(iw_handler)wl_iw_get_name,
(iw_handler)NULL,
(iw_handler)NULL,
(iw_handler)wl_iw_set_freq,
(iw_handler)wl_iw_get_freq,
(iw_handler)wl_iw_set_mode,
(iw_handler)wl_iw_get_mode,
(iw_handler)NULL,
(iw_handler)NULL,
(iw_handler)NULL,
(iw_handler)wl_iw_get_range,
(iw_handler)wl_iw_set_priv,
(iw_handler)NULL,
(iw_handler)NULL,
(iw_handler)NULL,
(iw_handler)wl_iw_set_spy,
(iw_handler)wl_iw_get_spy,
(iw_handler)NULL,
(iw_handler)NULL,
(iw_handler)wl_iw_set_wap,
(iw_handler)wl_iw_get_wap,
#if WIRELESS_EXT > 17
(iw_handler)wl_iw_mlme,
#else
(iw_handler)NULL,
#endif
#if defined(WL_IW_USE_ISCAN)
(iw_handler)wl_iw_iscan_get_aplist,
#else
(iw_handler)wl_iw_get_aplist,
#endif
#if WIRELESS_EXT > 13
#if defined(WL_IW_USE_ISCAN)
(iw_handler)wl_iw_iscan_set_scan,
(iw_handler)wl_iw_iscan_get_scan,
#else
(iw_handler)wl_iw_set_scan,
(iw_handler)wl_iw_get_scan,
#endif
#else
(iw_handler)NULL,
(iw_handler)NULL,
#endif
(iw_handler)wl_iw_set_essid,
(iw_handler)wl_iw_get_essid,
(iw_handler)wl_iw_set_nick,
(iw_handler)wl_iw_get_nick,
(iw_handler)NULL,
(iw_handler)NULL,
(iw_handler)wl_iw_set_rate,
(iw_handler)wl_iw_get_rate,
(iw_handler)wl_iw_set_rts,
(iw_handler)wl_iw_get_rts,
(iw_handler)wl_iw_set_frag,
(iw_handler)wl_iw_get_frag,
(iw_handler)wl_iw_set_txpow,
(iw_handler)wl_iw_get_txpow,
#if WIRELESS_EXT > 10
(iw_handler)wl_iw_set_retry,
(iw_handler)wl_iw_get_retry,
#endif
(iw_handler)