APP下载

802.11网卡Windows驱动的设计与实现*

2013-02-21马洪亮

网络安全与数据管理 2013年4期
关键词:驱动程序网卡队列

何 柳, 程 鹏, 陈 勇,马洪亮, 吴 斌

(1.重庆邮电大学,重庆 400065;2.中国科学院微电子研究所,北京100029)

近年来,无线上网逐渐成为了生活中不可或缺的部分。人们对无线网络的需求越来越强烈,而无线局域网(WLAN)技术的快速发展也适时地满足了人们的需求。无线局域网克服了有线网络存在的布线问题,但同时也导致网络越加复杂,需要研究和关注的内容越来越多。在无线局域网中,驱动程序的设计是一个很重要的环节。无线网卡驱动程序设计的优劣直接影响到整个无线局域网的传输速率和稳定性。文章介绍了802.11系列协议的发展和异同以及Windows操作系统下无线网卡驱动程序的设计模型,着重分析了驱动程序中收发队列的设计和管理,以及802.11协议中驱动层状态转化的设计。

1 802.11协议分析

1997年11月26日,IEEE发布了第一个在国际上被认可的无线局域网协议——802.11协议。随后又推出了802.11b、802.11a、802.11g等一系列物理层协议,目前最新的802.11ac协议正在逐渐完善中。表1为各个版本的802.11协议的简单比较。

表1中提到的速率为最高传输速率,每个协议又可提供多个速率值,以便适应不同的传输环境。例如802.11b协议提供了 4种传输速率,分别为 11 Mb/s、5.5 Mb/s、2 Mb/s和 1 Mb/s。在 802.11系列协议中802.11a与802.11b因使用频段不同,相互之间无法进行通信[1-2]。

表1 802.11系列协议比较

802.11协议功能的实现需要物理层和MAC层协助完成。物理层以芯片的形式存在,主要完成无线信号的发送/接收功能。而MAC层主要以网络驱动程序和硬件协议加速器的形式存在,主要完成数据收发的管理、协议状态切换和维护,以及与操作系统的交互等功能,在实现时需要遵循操作系统所规定的网络驱动模型。

2 Windows网络驱动模型

在Windows系统中实现802.11协议时需要遵循Windows NDIS(Network Driver Interface Specification)网络驱动程序接口规范。NDIS规范分离了上层协议与底层接口,使得在设计无线网卡驱动时更加方便快捷。NDIS规范将网络驱动程序划分为三个层次:协议驱动层、中间驱动层和小端口驱动层,其中中间驱动层根据实际情况可以不用实现。图1为其驱动框架。不同的驱动层间通过NDIS库进行通信,这样在设计各层驱动时不用考虑与其他层之间的交互细节,只需要遵循相应的接口即可[3]。

按照NDIS规范,设计与实现802.11网卡驱动的主要工作在于编写小端口驱动。其中,只需要向NDIS注册指定的派遣函数,即可在Windows系统中增加802.11无线网络功能。一般而言,在小端口驱动中需要注册的派遣函数如表2所示[4]。

表2 小端口驱动中需实现的派遣函数

在小端口驱动中,通过设置某个特定数据结构体中派遣函数指针的方式实现派遣函数的注册。在WinXP系统中,该数据结构为NDIS_MINIPORT_CHARACTERISTICS,从Vista系统开始使用新的数据结构PNDIS_MINIPORT_DRIVER_CHARACTERISTICS。下面以 WinXP中的数据结构为例,介绍派遣函数的注册方式:

当完成上述函数注册之后,上层执行网络相关操作时最终会调用到小端口层驱动的相应函数。如当上层查询网络信息时调用MPQueryInformation()函数,而要发送数据包时则调用MpMultipleSend()函数。在802.11网络驱动程序的设计中,数据收发队列的设计与管理是整个驱动程序设计开发的核心,其设计的优劣直接影响网络驱动程序的效率,下节针对该部分的设计展开论述。

3 数据收发队列的设计与管理

在无线网卡驱动的设计中,数据收发队列的管理方式和性能直接影响驱动程序的数据处理能力和工作性能。在设计数据收发队列时需要考虑下面几个内容[5]:内存分配和管理、收发队列的构造、队列资源的重用和同步。

内存分配和管理是无线网卡驱动程序设计中必需考虑的问题。数据收发队列中内存的分配有两种方式:(1)仅被驱动访问的内存,调用库函数NdisAllocateMemory()进行非分页内存分配并返回内存的虚拟地址;(2)驱动和硬件都需进行访问的内存,调用库函数NdisMAllocate-SharedMemory()进行分配。此函数首先分配内存,然后将分配的内存进行物理映射,最后同时返回内存的虚拟地址和物理地址。

数据收发队列的设计和管理是无线网卡驱动中的难点。设计一个高效的数据收发队列需要在驱动和硬件MAC中进行交互设计。下面讲解此次设计的具体细节。

驱动层:

(1)构建一个发送队列、一个空闲发送链表。空闲发送链表中包含所有未使用的发送资源,发送队列中包含所有准备发送的包。

(2)在上层有数据包传入时,从发送链表中取出首节点。填充发送包的相关信息,插入发送队列尾部。

(3)从发送队列头开始发送数据,直到发送队列为空。

(4)等待发送完成中断,若产生则读取HW_TX_MSDU结构中硬件设置参数的值,根据状态值更新驱动状态。最后将节点插入空闲发送链表尾部,实现资源的重用。发送队列示意图如图2所示。

硬件层:

(1)硬件访问HW_TX_MSDU结构,获取实际数据所在的物理地址;然后根据硬件结构中的next指针判断是否有下一个需发送的包,若有则从next中获得下个包的物理地址;最后根据结构中相关参数设置对数据进行处理。

(2)硬件处理完包,填充HW_TX_MSDU结构的相关状态变量。向系统发出一个中断,通知驱动包已处理完毕。

数据接收管理的设计与发送类似,这里不再赘述。实际收发链表以及队列的建立和管理与硬件的工作行为有十分密切的关系,在构造相关队列之前需了解硬件与主机交互数据的方式。因此与硬件工程师交流或熟读芯片数据手册是网卡驱动开发中的基础工作。无线网卡驱动程序的设计中除了收发包管理设计外,状态切换的设计也是一个需要重点注意的内容。

4 802.11协议状态分析

802.11协议中涉及到许多状态切换,状态切换的方式直接影响系统的稳定性。因此,设计一个合理的状态切换很有必要。在802.11协议的MAC层中有以下几种状态:初始态、加入(Connection)、认证、关联(Association)、运行和解关联[6]。

在无线网卡启动时首先启动扫描操作,通过扫描操作可以探测出覆盖范围内的所有基本服务集 (BSS),然后根据用户的选择或者默认的设置连接/关联某个BSS。由于无线链路的不稳定性,当前扫描到的BSS有可能在一段时间后消失,因此程序内部需要一个定时扫描信道的功能模块,用来实时更新当前可用的BSS列表。

在802.11协议状态设计时需首先分析出所有涉及到的状态,然后列出各个状态之间切换的方式,最后画出状态切换图表,用以指导具体代码的编写。图3为无线网卡驱动中STA模式下协议状态的切换。

本文提出的收发队列的设计和802.11协议中不同状态切换的设计对Windows下无线网卡驱动的设计有着一定的指导性作用。其中,收发包管理方式和状态切换设计已经在研发的芯片上进行了测试,证实了设计的有效性。

[1]MATTHEW S G.802.11 wirelessnetworks the definitive guide[M].O’Reilly,2005.

[2]IEEE 802.11 protocol wireless LAN medium access control(MAC)and physical layer(PHY)Specifications[S].IEEE,2007.

[3]贺鹏,李建东,陈彦辉.带有WDM底层接口的NDIS微端口驱动程序实现方法的研究[J].现代电子技术,2004,27(2):93-95.

[4]Microsoft.Microsoft Windows driverkits[EB/OL].[2009-12-xx].http//www.micorsoft.com//wdk.

[5]谭文,杨潇,邵坚磊.Windows内核安全编程[M].北京:电子工业出版社,2009.

[6]孙吉泉,鞠艳.802.11MAC层协议分析[J].中国科技信息,2009(14):134-135.

猜你喜欢

驱动程序网卡队列
队列里的小秘密
部署Linux虚拟机出现的网络故障
基于多队列切换的SDN拥塞控制*
阻止Windows Update更新驱动程序
Server 2016网卡组合模式
在队列里
计算机硬件设备驱动程序分析
丰田加速驶入自动驾驶队列
挑战Killer网卡Realtek网游专用Dragon网卡
USB故障又一原因