本文为读书笔记,整理自网络文献和源码
5 WPA_SUPPLICANT分析
5.1、WPA_SUPPLICANT 分析1:
参考文献:
http://www.cnblogs.com/chenbin7/p/3266032.html
http://blog.chinaunix.net/uid-26585427-id-4051479.html
wpa_supplicant软件架构分析http://blog.csdn.net/fxfzz/article/details/6176414
wpa_supplicant本是开源项目源码,被谷歌修改后加入android移动平台,它主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的,而实际上的工作内容是通过socket(不管是wpa_supplicant与上层还是wpa_supplicant与驱动都采用socket通讯)与驱动交互上报数据给用户,而用户可以通过socket发送命令给wpa_supplicant调动驱动来对WiFi芯片操作。简单的说,wpa_supplicant就是WiFi驱动和用户的中转站外加对协议和加密认证的支持。
wpa_supplicant.c
首先定义一个驱动操作数组externstructwpa_driver_ops*wpa_supplicant_drivers[],然后是系列wpa_supplicant_XXX()方法,很多方法里面调用 wpa_drv_XXX()方法,这些方法是wpa_supplicant_i.h中实现的方法。几乎每个方法都需要一个wpa_supplicant结构,对其进行所有的控制和通信操作。
Wpa_supplicant_i.h
其中定义了一个重要数据结构wpa_supplicant,其中有一个重要的driver成 员,它是wpa_driver_ops类型,可以被用来调用抽象层的接口。接下来是系列方法声明,这些方法声明在wpa_supplicant.c中实现,然后就是wpa_drv_XXX方法,这些方法就是在 wpa_supplicant.c中被wpa_supplicant_xxx方法调用的,而这些wpa_drv_xxx方法也都有一个wpa_supplicant结构的变量指针,用来调用封装的抽象接口,而这些抽象接口的实现在driver_wext.c中(如果使用的汉斯WEXT驱动)。
这里要注意的是:在wpa_suppliant.c文件中定义的很多方法是在该头文件中声明的,而不是在wpa_supplicant.h中声明的。
上行接口:
wpa_supplicant提供两种方式的上行接口。一种基于传统dbus机制实现与其他进程间的IPC通信;另一种通过Unix domain socket机制实现进程间的IPC通信。
(1) Dbus
(2) Socket
该接口主要在文件”wpa_ctrl.h”,“wpa_ctrl.c”,“ctrl_iface_unix.c”,“ctrl_iface.h”和“ctrl_iface.c”实现。
1. “wpa_ctrl.h”,“wpa_ctrl.c”完成对controlinterface的封装,对外提供统一的接口。其主要的工作是通过Unix domainsocket建立一个controlinterface 的client结点,与作为server的wpa_supplicant结点通信。
wpa_supplicant 提供两种由外部模块获取信息的方式:一种是外部模块通过发送request 命令然后获取response的问答模式,另一种是wpa_supplicant主动向外部发送event事件,由外部模块监听接收。
一般的常用做法是外部模块通过调用wpa_ctrl_open()两次,分别建立两个controlinterface接口。