http://blog.csdn.net/dickjtk/article/details/11862815
在分析wpa_supplicant软件linux版本下无线驱动事件和无线驱动配置代码之前,先简单介绍下linux无线驱动接口的实现技术和发展情况。
Linux无线驱动接口有两种标准接口,wext(Wireless Extensions无线扩展接口)和nl80211接口。
在linux-2.6.18版本之前,linux内核代码中并没有提供无线驱动接口以及无线驱动协议栈。wext是由开发者Jean Tourrilhes (惠普实验室软件工程师)定义的一套供用户层软件访问无线驱动以及驱动事件通知用户层的接口。当时无线驱动的协议栈软件比较多,如开源项目hostap,madwifi,mac80211,ieee80211协议栈以及无线芯片厂商自己实现的协议栈,基本都使用wext接口。wext接口也逐渐成为一套标准的接口。在linux-2.6.18版本,wext和mac80211协议栈并入内核,成为linux kernel的一部分。wext接口随着802.11协议从802.11,802.11b,802.11a/g的发展,,其API也不断增加,伴随着就是其wext的版本号不断变化。
wext的接口实现上,应用层采用ioctl方式访问驱动,设置无线参数或者获取无线参数,配置无线驱动进行联网操作。无线驱动事件到应用层的传递采用的netlink socket技术,一种netlink route消息技术。这也是很多其他类型的驱动标准的实现方法。但在linux-2.6.25(记得不是很清楚了,懒得确定了)之后,wext API接口版本停止在V22就不再进行更新了。而替代其的是nl80211接口。
nl80211接口其实在linux-2.6.18并入wext和mac80211协议栈的时候已经提供,但当时的功能还不完整,而且应用层的软件还是都使用WEXT接口,驱动基本不使用nl80211接口实现(除了基于mac80211协议栈的驱动)。 nl80211接口是由开发者Johannes Berg实现的,他也是cfg80211(无线协议栈配置接口,在无线驱动接口和mac80211之间的接口)和mac80211的维护者。无论是用户层访问驱动还是驱动事件通知应用层,nl80211接口都采用的netlink技术。
nl80211接口逐渐替代wext接口的原因主要是使用netlink技术在应用层和内核层数据交换上相比ioctl方式具有优势,具体的比较见点击打开链接(转载的一篇文章,写得非常清楚),而且很多其他之前使用ioctl的驱动也逐渐采用了netlink方式。再一个原因就是802.11协议的发展,随着802.11n协议以及P2P,WPS无线规范的加入,协议的很多功能可以在应用层实现,增加了很多应用层与驱动层间的API接口和事件。WEXT接口不方便功能扩展的缺点,nl80211可以完全支持wext的所有功能,又可以在不修改内核的情况下增加命令字和事件。无线驱动接口从wext发展到nl80211也就顺理成章。
目前linux内核中无线驱动的实现大部分基于mac80211协议栈,无线驱动接口也是可选的,可以使用任意一种,也可以同时使用。wpa_supplicant编译时,则根据无线驱动的接口使用情况,确定采用哪种配置接口。
nl80211除了确定应用层和驱动层的交互标准外,对802.11协议的实现功能划分产生影响。目前通常的802.11 SME功能(无线服务管理实体,即协议栈功能)在驱动或者芯片固件中实现,nl802.11的作者希望在应用层实现更多的协议功能。wpa_supplicant(包括hostapd)除了实现WPA认证,P2P,WPS的大部分功能外,它还实现了SME功能,在这种功能划分模式下,无线驱动基本上只需要实现配置硬件和数据收发功能。
linux系统下wpa_supplicant的Driver Event模块和Driver I/F模块(这两者实现是在一个文件,初始化在一个函数,划分成两个模块只是设计理解更清晰)的分析也分wext部分和nl80211部分。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
http://haohetao.iteye.com/blog/1135353
组件交互的基本原理图
[Wireless Card]
|
[Linux Kernel ]
| |
[udev][libnl]-[iw]
| / \
[crda] \
| \
[ Wireless ] |
[Regulatory] |
[ Database ] |
|
|
[ hostapd ]
理解每一部分是做什么的
Wireless Card: Should be self explanitory... handles sending/receiving wireless packets
无线网卡:操作接收/发达无线包
Linux Kernel: The linux kernel contains the driver for the wireless card, the mac80211 subsystem which handles packet generation and scheduling, and the nl80211 subsystem, which handles configuring the wireless interfaces for userspace
linux核:linux核包涵了无线网尗的驱动,mac80211子系统 处理包的产生与时序安排。nl80211处理在用户空间配置无线接口 cfg80211
libnl: libnl is the transport layer used to communicate with the kernel via netlink
libnl:通过netlink与内核对话的传输层
udev: udev is the facility the kernel uses to pass events/calls to crda
udev:udev是内核通过events/calls到 crda的设施
iw: iw is a userspace utility that we can use to test that libnl is working correctly, as well as create additional virtual wireless interfaces on the wireless card
iw:是我们用来测试 libnl是否正确工作,以及在无线网卡上创建额外的虚拟无线接口的用户空间工具 。
crda: crda is a userspace program that the kernel queries (through udev) to find what channels/frequencies are usable, and at what powers. This moves the information out of static tables maintained in kernel to userspace, which allows them to be updated without reloading drivers/rebooting
crda:是内核通过udev来查找什么频段/频率是有效的,在什么强度的用户空间程序。这个从内核维护的静态表中移到用户空间,它可以不需要重载驱动和重启的情况下更新。
Wireless Regulatory Database: database of allowable frequencies and transmit power levels used by crda
无线控制数据库:crda使用允许的频率和传输强度等级的数据库
hostapd: This is the daemon that handles generation of beacons and other wireless packets, as wel as wpa-psk, wpa2, etc encryptions.
hostapd:这是个用来操作信号的产生和其它无线包,以及wpa-psk, wpa2等加密的守护进程
softMAC是一个用于描述无线网尗的类型的一个术语。