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