linux wireless基础知识


1 基本概念:

Wireless Card:无线网卡:操作接收/发达无线包。

linux内核:linux核包涵了无线网尗的驱动,mac80211子系统处理包的产生与时序安排。nl80211处理在用户空间配置无线接口cfg80211。

libnl:通过netlink与内核对话的传输层。

udev:udev是内核通过events/calls到 crda的设施。

iw:是我们用来测试libnl是否正确工作,以及在无线网卡上创建额外的虚拟无线接口的用户空间工具。

crda:是内核通过udev来查找什么频段/频率是有效的,在什么强度的用户空间程序。这个从内核维护的静态表中移到用户空间,它可以不需要重载驱动和重启的情况下更新。

Wireless Regulatory Database: 无线控制数据库,crda使用允许的频率和传输强度等级的数据库。

hostapd:是个用来操作信号的产生和其它无线包,以及wpa-psk, wpa2等加密的守护进程。

cfg80211:  用于对无线设备进行配置管理。与FullMAC, mac80211和nl80211一起工作。(Kernel态)。

wext:Wireless-Extensions--旧的无线驱动框架。

nl80211: 用于对无线设备进行配置管理,它是一个基本Netlink的用户态协议(User态)

WNIC : Wireless Network Interface Controller, 它总是指望硬件执行协议(如IEEE802.11)描述的功能。

wpa_supplicant: 是用户空间一个应用程序,主要发起MLME命令,然后处理相关结果。

mac80211: 是一个driver开发者可用于为SoftMAC无线设备写驱动的框架 (Kernel态)。mac80211为SoftMAC设备实现了cfg80211回调函数,且mac80211通过cfg80211实现了向网络子系统注册和配置。配置由cfg80211通过nl80211和wext实现。

2 SoftMAC和FullMAC

MLME: 即MAC(Media Access Control ) Layer Management Entity,它管理物理层MAC状态机。

SoftMAC: 其MLME由软件实现,mac80211为SoftMAC实现提供了一个driver API。 即SoftMAC设备允许对硬件执行更好地控制,允许用软件实现对802.11的帧管理,包括解析和产生802.11无线帧。目前大多数802.11设 备为SoftMAC,而FullMAC设备较少。

FullMAC:其MLME由硬件管理,当写FullMAC无线驱动时,不需要使用mac80211。

主要区别:

(1)SoftMAC无线网络MAC层通过软件实现,FullMAC无线网络MAC层通过硬件实现,也叫HardMAC。

(2)SoftMAC优势:低硬件成本;升级驱动可以直接通过更新软件实现;不同无线网络设备可以分享同一个驱动;对设备有更精细的控制。FullMAC的主要优势是执行快,不占用cpu。

(3)SoftMAC通过mac80211框架实现,FullMAC通过cfg80211框架实现。但是不管SoftMAC还是FullMAC,都要调用cfg80211,因为mac80211也要通过cfg80211的callback来执行。

3 linux 无线接口

3.1 简介

  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部分。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM