基于Linux的802.11 协议与驱动研究

2013-08-01 07:14
微型电脑应用 2013年4期
关键词:驱动程序网络设备网卡

沈 华

0 引言

Linux 上无线组件由于各个WLAN 厂家芯片设计不同,有些厂家不愿意提供芯片的驱动或者只提供部分驱动源代码,导致linux 各个版本含有很多不同版本的驱动程序。且有很多驱动是由志愿者提供的。为了提供统一的配置管理,Linux 提供了很多的工具,实用程序。

1 两种linux 无线子系统

1)旧的无线子系统Wireless extensions (wext)

是由HP 公司Jean Tourrilhes 当年为了使得无线设备能够应用在linux 上开发的,在前些年很多WLAN 公司也都基于此开发了很多驱动程序,比如WLAN 芯片公司Atheros开发的madwifi 即是基于此系统开发的,不过当前该系统开发进度缓慢且由新的mac80211 系统所替代,所以本文不做探讨。

2)新的无线子系统:新的无线子系统是由Cfg80211模块、nl80211 模块以及Mac80211 模块等组成。

Cfg80211:无线配置API——新的配置API。主要替代旧的无线子系统wireless extensions,Cfg80211 目前仍然在开发中。cfg80211 是为802.11 设备在Linux的配置API。它是用户空间和驱动程序之间的桥梁,并提供一些与802.11 相关的实用功能。 cfg80211 必须直接或间接通过mac80211,可用于所有现代无线驱动程序在Linux,让他们提供一个一致的API,通过nl80211的。为了向后兼容,cfg80211 还提供无线扩展到用户空间,但需要完全隐藏他们。 此外,cfg80211 还包含代码,以帮助实施监管的频谱的使用限制。在cfg80211 模块中需要:

1)实际的BSSID 哈希,而不是把东西放入一个列表

2)提供BSS 列表功能,使mac80211 不需要跟踪

3)允许在每个硬件提供的大小的扫描结果“私人”区域

4)妥善处理网格

5)提供了硬件的方式来限制扫描的SSID 号码

Cfg80211 定义在include/net/cfg80211.h 中;通过priv 指针来实现注册/注销;明确定义的命令,每一个的范围都非常有限。它的操作有:所有常规操作例如扫描等以及列出所有接口信息。

Mac80211:是为SoftMAC(一个用于描述无线网尗的类型的一个术语)无线设备的基础无线框架,是用来编写SoftMAC 无线驱动的Linux API,如图1所示:

图1 协议栈框架

支持802.11 abgn,802.11d;整合正在拟制的802.11s 标准;支持定制特设频率

支持多种无线模式:

接入点模式:AP的模式,AP 可接交换机或路由器,进行无线信号发送和接收。

站点模式

Monitor 模式:AP 设为一个专用的无线监控器,能监控周围的无线干扰、欺诈AP 等信息,随时提交给控制器做相应动作。AP 设为monitor 之后,将不能发射无线信号为客户端提供接入服务了。

Ad-hoc 模式:结构是一种省去了无线AP 而搭建起的对等网络结构,只要安装了无线网卡的计算机彼此之间即可实现无线互联;其原理是网络中的一台电脑主机建立点对点连接相当于虚拟AP,而其它电脑就可以直接通过这个点对点连接进行网络互联与共享。

无线分布式WDS 模式(无线分布式系统)

Mesh 模式:无线网格网络技术,它是一个无线多跳网络,是由ad hoc 网络发展而来,是解决“最后一公里”问题的关键技术之一。

支持Qos

在mac80211 中,我们需要通过扫描要求的硬件卸载、扫描处理多个SSID、正确处理主动/被动状态以及使用BSS列表罗列出全部需要提供的cfg80211 协议。

新的无线子系统MAC80211的思想之一就是分离无线射频收发器与驱动接口,射频收发器是作为wiphy 结构出现在系统里,而驱动接口被称为devices。这种思想的优点是使得可以实现虚拟无线设备,每一个虚拟设备都可以单独配置,所有进来的802.11 包都转发到wiphy 接口,然后再分发到虚拟设备上,每一个设备都可以访问wiphy 并且发送帧出去。

nl80211:802.11 网络链路接口,处理用户空间至内核空间通信传输。Nl80211的现状是:

1)基于genetlink、

2)用户空间的ABI 在include/linux/nl80211.h

3)代码在net/wireless/nl80211.c

在nl80211 中,大多数操作是一个单一的参数的命令并且一些MLME的属性组合在一起以允许在一个fullMAC 配置卡中。

1 系统架构与实现

无线子系统架构,如图2所示:

图2 MAC80211 架构

Cfg80211 子系统

位于用户空间与 MAC80211 协议驱动之间,通过nl80211 接口来进行协议转发以及配置无线设备。主要功能有:设备注册、站点管理、密钥管理、Mesh 管理、虚拟接口管理、链路扫描

参数设置

设备注册包括带宽,信道,比特率,HT 能力以及支持的接口模式。

站点管理包括增加,删除,修改站点以及打印站点的log信息。这些都是作为AP的实现的功能。

Mesh 管理包含Mesh 参数设置与获取,Mesh 路径的处理等。

虚拟接口管理提供了创建,删除以及改变类型和监测标志。也能够跟踪网络无线接口。

扫描功能允许用户发起扫描和报告。

链路扫描包括发起扫描请求,接受被动扫描。

MAC802.11 子系统

初始化与注销:

初始化涉及到的数据结构主要有:

在使用802.11 设备前,必须先调用ieee80211_alloc_hw分配一个硬件设备资源,然后通过函数ieee80211_register_hw 向系统注册硬件设备信息并对设备进行初始化设置。

接收和发送处理:

发送通路和接收通路的的数据流程如下图所示。发送数据是高层包将逻辑链路层的的包转换为IEEE802.11 帧格式,初始化所有需要的buffer 以及帧头,发送链路选择密钥,发送速率,插入顺序号,选择加密算法,分片机制,计算发送时间以及产生发送控制信息。

接收通路是在硬件驱动接收到数据后产生中断,将数据发送到MAC80211,并且指示硬件接收状态信息。MAC80211检测包得类型,接收状态并且准备接收数据包处理。接收数据包处理解密,解包,并且根据不同包得类型进行处理,是数据包将会转换为IEEE802.3 送给上层协议,如图3所示:

图3 发送和接收数据流程

3 MLME 实现

MLME 是MAC 层管理实体,MLME 管理实体的物理层(PHY)MAC 状态机。在MAC80211 子系统里,通过软件实现了MAC 层的管理实体即SoftMAC。MLME 是通过上层接口调用相关请求和收到的响应来进入不同的状态的:常见的包有:探测请求/响应、认证请求/响应、关联请求/响应、去认证/去关联。出了设备的几种主要状态以及在不同状态下允许的帧的类别。如图4所示:

图4 802.11 状态图

而在典型的站点模式下,设备状态转换,如图5所示:

图5 Station State

对于接入点模式,则非常简单只有初始化,扫描以及运行状态。这里不列。

在将来,cfg80211/nl80211 将提供访问的MAC的用户空间MLME;cfg80211/nl80211 还需要提供MLME 访问的MAC 卡。

Linux 无线网卡驱动的移植

Linux 无线网卡驱动程序涉及到Linux 网络设备驱动程序和接口驱动程序,本文以USB 无线网卡驱动程序设计为例,主要涉及到Linux USB 设备驱动程序和Linux 网络设备驱动程序的设计。

Linux USB 设备驱动程序与其它Linux 设备驱动程序类似,分为设备的注册和注销、设备的打开和关闭以及设备的控制。

在Linux 中用usb_driver 描述USB 设备驱动,USB 设备的注册和注销用usb_register 和usb_deregister 函数来完成。USB 设备的探测需要完成usb_driver 中的probe 函数,而断开连接需要实现disconnect 函数。对USB 设备的数据读写操作与普通的Linux 字符设备不完全一样,因为USB设备中数据通信是通过端点来进行的,所以对USB 设备读写操作通过URB(USB 设备请求块)的结构体来传递数据。

Linux 网络设备驱动移植从上到下可分为4 个层次。主要分为网络协议接口层、网络设备接口层、设备驱动功能层以及网络设备与网络设备媒介层。网络设备驱动结构,如图6所示:

图6 网络设备驱动结构

网络协议接口层向上一层网络提供统一的数据包接口,使得上层无论哪种协议都可以通过dev_queue_xmit 函数来发送。并通过函数netif_rx 函数来接收。而设备驱动程序主要跟设备驱动功能层有关。通过dev_start_xmit 执行发送数据的操作,并通过中断触发接收数据的操作。

网络设备驱动程序的编写也涉及到注册、初始化、设备打开与关闭、发送和接收数据操作。而这些操作主要通过填充n

et_device 数据结构完成函数调用的。

Linux网络驱动通过register_netdev 和unregister_netdev完成设备驱动程序的注册与注销。

驱动程序的注册:

Int register_netdev(struct net_device *dev);

驱动程序的注销:

Void unregister_netdev(struct net_device *dev);

注册和注销分别在加载驱动程序和卸载驱动程序时调用。

打开网络设备:

Void netif_start_queue(struct net_device *dev);

关闭网络设备:

Void netif_stop_queue(struct net_device *dev);

而内核在发送数据包时会调用hard_start_transmit 函数,而网络设备驱动中接收数据是通过中断引发中断处理函数,将数据填充到缓冲区中并调用netif_rx 函数将数据传送给上层程序。

比如一个具体的Ralink USB 无线网卡的驱动程序,流程,如图7所示:

图7 无线网卡驱动程序流程图

首先加载模块,USB 无线网卡进行设备的探测。如果探测到设备,进行网络设备所需资源的初始化以及相关的配置,然后打开设备,判断是否有数据的发送和接收。当不再需要该设备时,可以卸载设备驱动程序。

4 结论

主要介绍了Linux 下一种新的无线子系统MAC80211的架构、各功能组件的作用与目的,然后探讨了具体实现机制。包括设备的初始化,注册过程,收发数据包处理,以及MLME 协议层处理。通过对Linux 无线子系统MAC80211基本原理的分析,从而加深了读者对802.11 无线通信协议的理解,并且,在文章的后面,本文结合理论实际,给出了一种实际应用中Linux 无线网卡驱动程序的设计和移植方法。

[1]Vipin M Analysis of Open Source Drivers for [J]IEEE802.11 WLANs ICWCSC 2010

[2]Johannes Martin Berg mac80211 overview [OL]Intel 2009

[3]Weihua Zhao.[J]Madwifi Summary 2007

[4]魏永明,耿岳,钟书毅 译.Linux 设备驱动程序 第三版 [M]中国电力出版社 2005年

[5]罗训,赵利 译.下一代无线局域网,[M]北京人民邮电出版社 2010年

[6]班藤,顾小峰等 一种基于IEEE802.11 [R]标准的SOFTMAC 实现方法

[7]罗训,赵利 译,《下一代无线局域网》,[M]北京人民邮电出版社 2010年

[8](美)加斯特 著 《80211 无线网络权威指南》,[M]天津东南大学出版社 2006年4 月

[9]李全 基于Linux的USB 网络设备驱动程序的研究,[M]武汉华中科技大学 2010年11 月

猜你喜欢
驱动程序网络设备网卡
网络设备的安装与调试课程思政整体设计
一种基于C# 的网络设备自动化登录工具的研制
部署Linux虚拟机出现的网络故障
阻止Windows Update更新驱动程序
Server 2016网卡组合模式
计算机硬件设备驱动程序分析
防范加固SNMP团体名漏洞
挑战Killer网卡Realtek网游专用Dragon网卡
USB故障又一原因
妙用鼠标驱动