本站小编为你精心准备了网络设计论文:无线网平台模具设计的改良参考范文,愿这些范文能点燃您思维的火花,激发您的写作灵感。欢迎深入阅读并收藏。
作者:郑汉彬张勇单位:北京邮电大学电子工程学院
Linux下802.11驱动的结构
1802.11网卡分类
802.11无线网卡的软硬件结构如图2所示:图2的最左侧是天线和收发器,用来从空中接收信号或将信号发向空中。中间部分的基带处理器(BasebandProcessor)是数字和模拟组件之间的接口,它负责处理负载的扩频调制,检测物理载波,并且当接收到的电波能量超过一定的阈值时,会加以解调。MAC负责完成协议规定的部分介质访问控制功能,具体的功能随不同的硬件实现而不同,其他的介质访问功能由驱动模块实现。QoS是服务质量功能的实现模块。SecurityEngine实现硬件加解密功能。在不同的硬件实现中,QoS和SecurityEngine两个模块可能有也可能没有,如果没有,其对应的功能就由驱动模块实现。图3的左侧和中间部分是硬件实现部分,它们通过不同的总线接口和主机相连,这个接口可以使USB,也可以是PCI或其他总线接口。最右侧是主机的软件部分,底部驱动模块负责控制硬件,结合硬件的功能实现完整的MAC层功能。从硬件接收的帧在驱动模块中进行处理后将被传递到上层协议栈,上层协议栈传来的数据包将被驱动模块封装成帧后传给硬件。
从上面的讨论可以看出,802.11协议规定的功能可以由硬件实现,也可以交给驱动模块去实现,根据MAC层管理实体(MLME)的管理功能是由软件实现还是硬件实现,802.11网卡可分为三类:FullMAC:MLME由硬件实现的网卡,当前只有很少的网卡是FullMAC类型的,Intel的iwmc3200是其中的代表。SoftMAC:MLME由驱动软件实现的网卡,由于这种网卡允许通过软件对硬件进行更精细的调整,便于功能升级,所以现在大部分的网卡都是SoftMAC类型的,比如Ralink的RT2X00系列,Atheros的AR5xxx系列等。
HalfMAC:介于上面两者之间,MLME的一部分由硬件实现,另一部分由软件实现。然而,即使同样是SoftMAC类型的网卡,不同厂家不同系列的网卡在软硬件之间的功能分配仍然会存在不同,所以针对不同系列的网卡,仍然需要不同的驱动模块。本文接下来讨论的内容将主要集中在SoftMAC类型的网卡上。
2Linux下802.11协议栈结构
在Linux内核2.6.22及以后的版本下实现SoftMAC类型网卡的驱动比较简单,因为2.6.22及以后版本的内核中包含了802.11协议栈框架,这个协议栈实现了802.11不同模式下的MLME的功能和其他相关功能。协议栈结构如图3所示:由于802.11协议栈在2.6.22版本加入内核,所以当前多种方式开发的网卡驱动模块并存于一个Linux内核里。一些旧的驱动程序(Olddriver)使用WirelessExtension(wext)作为用户空间配置驱动的接口,这些旧的驱动程序可能自己实现MLME的功能(SoftMAC类型的网卡)也可能使用其驱动的网卡硬件提供的MLME的功能(FullMAC类型网卡)。
当前的802.11协议栈由两部分构成:cfg80211和mac80211。cfg802.11负责管理网卡设备和网络接口的关联关系,并通过nl802.11接收用户空间对网卡的配置,同时,为了向后兼容,也支持使用WirelessExtension(wext)进行配置。对于FullMAC类型的网卡,可直接通过cfg80211提供的框架来编写驱动模块。mac80211使用cfg80211提供的配置框架,为驱动开发者提供一个给SoftMAC/HalfMAC类型的网卡开发驱动模块的框架。驱动需要的MLME的功能由mac80211提供。
Linux下802.11驱动模块的总体设计流程
Linux内核代码由许多子系统模块组成,并且各个子系统之间可能会有依赖关系。各个子系统模块实现相应功能的通用操作流程,并提供定义好的结构体和函数指针,而与硬件或具体算法相关的数据信息和操作由开发者提供。内核开发者只需要按照子系统的要求实现相关函数,填写并向子系统注册相关结构体就可以实现具体的功能。例如要开发USB设备驱动程序,开发者需要根据具体的设备信息填写描述驱动程序信息的structusb_driver结构体和描述驱动程序所支持的设备信息的structusb_device_id结构体,并实现structusb_driver结构体中规定的回调函数。至于这些函数如何实现,则由具体的设备和开发者设计的算法决定。
一个802.11网卡驱动的设计,需要Linux内核中多个子系统模块的支持,例如,一个使用USB总线的SoftMAC类型802.11网卡驱动模块与Linux内核中各子系统的依赖关系如图4所示:在图4中,箭头由依赖模块指向被依赖模块。网卡驱动模块需要依赖usb子系统提供的功能来驱动总线和网卡通信,同时,为了完成802.11协议规定的功能,驱动模块需要使用相关的结构体向mac80211子系统注册自己,并实现mac80211规定的回调函数。mac80211依靠cfg80211子系统与用户空间通信,使用户空间能够对网卡进行配置。综上所述,802.11网卡驱动的设计过程就是按照各子系统的规定,填写并注册结构体,设计子系统规定的函数的过程,设计流程如图5所示
数据包信号强度信息的提取与向协议栈上层的传递
1设计思路
为了满足一些分布式网络平台对于接收数据包的信号强度信息的需求,需要在接收每个数据包时,从硬件中提取能够指示接收这个包时的信号强度的数值,并与接收到的包对应存储,传递到协议栈的上层。802.11协议中,在物理介质相关层(PMD)及以上各层使用接收信号强度指示(RSSI)来衡量接收到的当前物理帧的信号强度。对应到图2的软硬件结构中,就是由基带处理器(BasebandProcessor)测量并生成。RSSI的取值范围为0至RSSIMax,802.11协议规定RSSIMax的值小于等于255。
802.11协议规定的RSSI是一个相对值,它仅仅用来指示信号强度的相对大小,而其与dBm值之间的对应关系由网卡芯片厂商自己定义。RSSI值在网卡和驱动内部用来指示接收到的信号强度的大小,网卡和驱动借此来完成判断某个信道是否空闲,判断是否该切换接入点,控制传输功率等操作。由于RSSI值仅仅用在网卡和驱动内部,所以即使各个厂商的定义方法不同,只要驱动程序正确,并不影响兼容性。RSSI值是在网卡和驱动内部使用的,不传到上层协议栈。
为了使分布式网络平台的上层协议能够得到接收包的信号强度信息,需要在驱动模块里针对每一个接收到的数据包,提取RSSI值,并根据特定的网卡芯片将RSSI值转换成dBm值,与数据包对应存储,一并传递到协议栈上层。数据包在协议栈中的传输路径如图6所示一般而言,网卡芯片厂商都会选择将RSSI值与接收到的帧一并通过USB总线传递给主机,而负责驱动模块和USB子系统之间数据传递的是structurb结构体,所以驱动模块可以从接收数据帧的structurb结构体中得到RSSI值,具体的操作过程会因不同的网卡芯片而不同。
在Linux内核中,负责在协议栈各层之间传递数据包的结构体是structsk_buff。驱动模块在得到数据帧和对应的RSSI值后,将RSSI值转换成dBm值,与数据帧一并存入structsk_buff中,向协议栈的上层传递。这样分布式无线网络平台的相关协议在得到接收到的数据包的同时就可以得到接收这个包时的信号强度dBm值。具体结构如图7所示:
2应用:使用RSSI改进AODV路由协议性能
分布式无线网络平台可以根据自己的需要来使用数据包对应的信号强度信息。下面以笔者曾经使用过的瑞士乌普萨拉大学开发的AODV协议来说明信号强度信息的使用。AODV路由协议会维护当前的邻居列表,并在需要传输数据时从邻居中选择一个作为下一跳节点。标准的AODV协议会选择最先响应路由请求信息的邻居节点作为下一跳节点,但这种方式在以802.11无线网络中却有可能造成选择的下一跳节点不理想的情况。这是因为802.11中节点是公平的竞争无线网络信道,这就会造成可能链路质量不高的邻居节点最先占用了信道,从而成为一个不理想的下一跳节点。这样的下一跳节点不仅使数据传输速率不高,而且容易使传输失败。如果利用接收包的信号强度信息,只维护信号强度足够好的邻居节点,那么在路由请求时获得的链路质量就会比较高,网络会更加稳定,数据传输速率也有显著提高。具体的设计结构如图8所示:AODV内核在过滤维护邻居列表的控制信息的时候,会过滤掉信号强度过低的控制信息,这样act_nb_list中都是链路质量足够好的邻居。AODV路由守护进程在路由请求过程中会参照邻居列表的信息选取下一跳节点。
3测试结果
经过实际网络实验平台的测试,更改后的AODV在路由特别是多跳路由稳定性方面要提高很多,多跳路由的数据传输速率也有显著提高。具体测试环境如下表:
结论
本文系统的阐述了Linux下802.11协议栈的结构和当前主流的网卡芯片的软硬件结构,并简要介绍了Linux下802.11网卡驱动的设计流程。针对分布式无线网络平台对信号强度信息的需求,本文详细介绍了如何改进驱动模块,并给出了在AODV路由协议中的应用实例。随着分布式无线网络平台的发展,802.11协议必然会得到更广泛的应用,而随着应用的深入,对802.11驱动模块的改进要求也会越来越多,这样一来,对802.11协议栈的深入了解以及驱动模块的设计能力会越来越重要。