wpasuppicant介绍
本来以为这个东西只有在 Atheros的平台上用的,突然发现 Ralink的平台也可以用,甚至还看到还有老美把这个东西往 android上 移植。看来是个好东西,学习一下。 官方的模块框图 一般来说很多模块可以根据需要选用的 EAP s 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 WPA-PSK): 1 读取配臵文件 2 初始化配臵参数,驱动函数 wrapper 3 让驱动 scan当前所有 bssid(包括 wpa AP和 non-wpa AP) 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 WPA-PSK配臵文件的写法 一般这样写可以兼容 WPA和 WPA2 CCMP和 TKIP network={ ssid=“myssid “ key_mgmt=WPA-PSK proto=WPA RSN pairwise=TKIP CCMP psk=“myasciipsk“ } 编译方法: Makefile需要读取一个.config文件,这个文件里面包含交叉编译路径设臵,模块配臵选项。 参考配臵文件 For wpa-psk 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和 auth timeout wpa_supplicant_event_disassoc wpa_blacklist_add wpa_supplicant_timeout wpa_blacklist_add 何时会从黑名单中删除。 wpa_supplicant扫描的结果是从 madwifi中得到的,由于 linux kernel里面设臵了扫描 buffer的大小,wireless.h中定义这个大 小为#define IW_SCAN_MAX_DATA 4096,所以这个 buffer很容易就溢出了, 导致一些结果无法传送到 wpa_supplicant, 为此 madwifi 在扫描的时候设臵了一个过滤条件,现提取 wpa的 AP,再提取 none-wpa的,这样改善了很多,但是通常在公司研发环境中还是很容 易出现溢出。 ( 以下分析基于 wpa_supplicant 0.5.10 版本) 1. 启动命令 wpa supplicant 在启动时,启动命令可以带有很多参数,目前我们的启动命令如下: wpa_supplicant /system/bin/wpa_supplicant -Dwext -ieth0 -c/data/wifi/wpa_supplicant.conf -f/data/wifi/wpa_log.txt wpa_supplicant对于启动命令带的参数,用了两个数据结构来保存, 一个是 wpa_params, 另一个是 wpa_interface. 这主要是考虑到 wpa_supplicant是可以同时支持多个网络接口的。 wpa_params数据结构主要记录与网络接口无关的一些参数设臵。 而每一个网络接口就用一个 wpa_interfac