沈 華
Linux 上無線組件由于各個WLAN 廠家芯片設計不同,有些廠家不愿意提供芯片的驅動或者只提供部分驅動源代碼,導致linux 各個版本含有很多不同版本的驅動程序。且有很多驅動是由志愿者提供的。為了提供統一的配置管理,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 配置卡中。
無線子系統架構,如圖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 發送和接收數據流程
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 無線網卡進行設備的探測。如果探測到設備,進行網絡設備所需資源的初始化以及相關的配置,然后打開設備,判斷是否有數據的發送和接收。當不再需要該設備時,可以卸載設備驅動程序。
主要介紹了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 月