wpa_supplicant代码初探收藏linux
这几天在尝试把wpa_supplicant移植到windows ce上,替换微软的WZC。先把源代码down下来,了解了一下大体的结构。android
wpa_supplicant运行的整个核心就是eloop_run函数。这个函数负责处理应用程序的请求和数据链路层发来的EAPOL数据。eloop的针对不一样的平台有好几个实现版本,我这里只讨论针对WIN32的eloop_win.c版本。windows
外部须要经过调用eloop_register_event或者eloop_register_read_sock来注册一个回调函数,并绑定了一个相应的事件。eloop会等待每个事件的发生,并在事件发生时调用相应的回调函数进行处理。数组
全部与平台相关的网络驱动程序接口,都被经过wpa_driver_ops结构抽象成统一的接口,无论你是WEXT或者NDIS。所以也实现了平台无关性。sass
此外,wpa_supplicant与应用层通讯的方式多种多样,有pipe、socket,你也能够实现本身的方式。只须要实现几个基本的函数就能够了:网络
wpa_supplicant_global_ctrl_iface_init数据结构
wpa_supplicant_global_ctrl_iface_deinitapp
wpa_supplicant_ctrl_iface_initless
wpa_supplicant_ctrl_iface_deinitsocket
wpa_supplicant_ctrl_iface_wait
好比我在CE上就把wpa_supplicant做为一个stream device或者service来运行,上层应用经过文件系统接口来与之进行交互。
初始化过程:
1. 初始化wpa_supplicant,调用下面这个函数:
struct wpa_global *wpa_supplicant_init(struct wpa_params *params)
其中,经过structwpa_params中的参数能够进行相关配置。
2. 经过调用wpa_supplicant_add_iface来将ctrl interface和driver绑定起来。
3. 执行wpa_supplicant_run。
原本觉得这个东西只有在Atheros的平台上用的,忽然发现Ralink的平台也能够用,甚至还看到还有老美把这个东西往android上移植。看来是个好东西,学习一下。
官方的模块框图
通常来讲不少模块能够根据须要选用的
EAP methods EAP state machine
若是你不须要支持wpa-enterprise那么这两个模块都不须要编译。
wpa_cli和GUI
这两个能够不要,直接写个控制脚本,把用户的参数变为配置文件,重启wpa_supplicant
driver event
driver event 无线驱动和本程序通信的接口,通常高级的无线驱动都支持WEXT。就是驱动里面经过wireless_send_event把一些状态信息发到本程序处理。
driver i/f
一些ioctl接口,一样用于无线驱动和本程序之间传递信息。
EAPOL state machine
负责处理PTK 4-way HS和GTK 2-way HS
l2_package
EAPOL和pre auth都要经过这个接口收发包。
configuration
负责处理用户配置文件的模块
大体流程(For WPAPSK):程序是哪些?
1 读取配置文件
2 初始化配置参数,驱动函数wrapper
3 让驱动scan当前全部bssid(包括wpa AP和non-wpaAP)
4 检查扫描的参数是否和用户设置的相符
5 若是相符,设置associate request ie 通知驱动进行auth assoc步骤
4 Four-way handshake for PTK
5 Two-way handshake for GTK
6 接收AP发出的指令,按期更换GTK
这个程序和madwifi通讯主要经过wirelessEXT,其实就是netlink,在madwifi驱动中会调用wireless_event_send这个函数把相关的东西发到wpa_supplicant
WPAPSK配置文件的写法
通常这样写能够兼容WPA和WPA2CCMP和TKIP
network={
ssid="myssid "
key_mgmt=WPA-PSK
proto=WPA RSN
pairwise=TKIP CCMP
psk="myasciipsk"
}
编译方法:
Makefile须要读取一个.config文件,这个文件里面包含交叉编译路径设置,模块配置选项。
参考配置文件For wpapsk madwifi
#*******************************************************
CROSS_COMPILE=/opt/mips-linux-
CC=${CROSS_COMPILE}gcc
CONFIG_DRIVER_MADWIFI=y
CFLAGS += -I../src/802_11/madwifi/madwifi
CONFIG_DRIVER_WIRED=y
CONFIG_IEEE8021X_EAPOL=y
CONFIG_BACKEND=file
#*******************************************************
启动方法(Atheros Driver):
#建立无线interface模式设置为managed
wlaconfig ath create wlandev wifi0 wlanmode sta
#设置ath0到自动模式,这样scan的时候会扫全部的频道2.4g 5g 11nagb。
iwpriv ath0 mode auto
#设置好配置文件,启动wpa_supplicant
wpa_supplicant –i ath0 –b br0 –c /tmp/supplicant.conf -B
主要参数含义:
ath0是无线interface,经过这个参数,函数就能够经过iotcl调用无线驱动中的接口。
br0 是bridge interface,EAPOL L2 package都经过这个接口收发。
-c 表示配置文件
-B daemonlise
源码关键函数
wpa_supplicant_add_iface
wpa_supplicant_init_iface
wpa_supplicant_set_driver
wpa_config_read
wpa_supplicant_init_iface2
wpa_supplicant_init_eapol
wpa_drv_init
wpa_drv_set_param
wpa_supplicant_init_wpa
wpa_supplicant_driver_init
wpa_supplicant_req_scan // trigger scan state
wpa_supplicant_scan
wpa_supplicant_set_suites
wpa_sm_set_assoc_wpa_ie_default //add wpa rsn ie in associate req
有时候AP会被加到blackList中,主要缘由能够参考下面的代码。主要是收到deauth这个event和authtimeout
wpa_supplicant_event_disassoc
wpa_blacklist_add
wpa_supplicant_timeout
wpa_blacklist_add
什么时候会从黑名单中删除
wpa_supplicant 初始化流程分析
|