linux下移植wifi之概念介紹

詳細介紹linux下移植wifi的步驟.docx

Linux系統下移植wifi模塊,使其正常工作。包括兩部分內容,第一部分是識別無線設備,並且正確安裝驅動程序。第二部分是選擇管理無線連接的方法。本文將介紹這兩部分內容。

 

一、   背景
配置wifi有三種方式:圖形客戶端,文本模式接口和命令行界面。最簡單的方法是在安裝桌面環境後使用圖形客戶端。它們提供了一個方便的點擊式界面,可以在幾秒鐘內讓用戶進入網絡。也可以通過編輯一些配置文件從命令行配置無線,這需要花費更多的時間來設置。

 

有三種工具支持命令行驅動的無線配置:net-wireless / iw,net-wireless / wireless-tools和net-wireless /wpa_supplicant。在這三個中,net-wireless / wpa_supplicant是首選的。需要記住的重要一點是,無線網絡是在全局基礎上配置的,而不是基於接口的。

 

net-wireless/iw是net-wireless/wireless-tools延伸的產品(繼承者),它支持幾乎所有卡和驅動,但它不能連接到WPA-only接入點。如果網絡只提供WEP加密或完全開放,那麼net-wireless/iw輕輕鬆鬆勝過其他軟件。

 

市場上現在經常使用 iw 和 wpa_supplicant兩種軟件。wifi 是 完全開放 或者 WEP 模式的時候,使用iw。如果wifi 需要WPA加密的話,則使用wpa_supplicant軟件。

 

 

二、   概念介紹
1.      Card introduction
 

市場上現在有兩種類型的無線卡,FullMac和SoftMac。下圖是這兩種卡同用戶空間交互數據時,調用的說明圖。即不同部分cfg80211 / mac80211 / nl80211如何協同工作的圖片。

FullMac

此類無線卡通過硬件處理的MLME(MAC子層管理實體),通常出於省電的原因(例如智能手機,平板電腦,SBC和物聯網)。除了少數例外,這些卡都不支持監控模式和注入。

SoftMac

SoftMac無線卡使用mac80211在軟件中處理MLME。其中大多數都支持捕獲和注入(少數例外)。

 

小知識點:

>>>>>>>>>>>begin<<<<<<<<<<<<

Wifi設備的協議棧如下框圖: 

SoftMAC和FullMAC的區別在於MLME是在軟件還是硬件上實現,藍色部分表示WiFi芯片上執行 

SoftMAC: 無線網絡MAC層通過軟件實現. 
FullMAC: 無線網絡MAC層通過硬件實現,也叫HardMAC.

SoftMAC優勢: 
1. 低硬件成本 
2. 升級驅動可以直接通過更新軟件實現 
3. 不同無線網絡設備可以分享同一個驅動 
4. 對設備有更精細的控制

FullMAC的主要優勢是執行快,不佔用cpu

SoftMAC通過mac80211框架實現,FullMAC通過cfg80211框架實現 
不管SoftMAC還是FullMAC,都要調用cfg80211,mac80211通過cfg80211的callback來執行

>>>>>>>>>>>>>end<<<<<<<<<<<<<<

2.   cfg80211
cfg80211是Linux802.11配置API。cfg80211取代了Wireless-Extensions。nl80211用於配置cfg80211設備,用於內核←→用戶空間通信。cfg80211現在功能齊全,具有無線擴展功能,在實施cfg80211驅動程序時,仍然會通過cfg80211到CONFIG_CFG80211_WEXT自動爲您提供無線擴展支持。不再需要無線擴展的發行版可以刪除它,並鼓勵這樣做。

3.      mac80211
mac80211是一個驅動程序,開發人員可以用來爲SoftMAC無線設備編寫驅動程序的框架。

SoftMAC設備允許更精細地控制硬件,允許在軟件中完成802.11幀管理,用於解析和生成802.11無線幀。目前大多數802.11設備都屬於這種類型

mac80211實現了SoftMAC設備的cfg80211回調,然後mac80211依賴於cfg80211來註冊網絡子系統和配置。配置由cfg80211通過nl80211和無線擴展來處理。

在mac80211中,MLME在用於站模式(STA)的內核中以及在用於AP模式的用戶空間(hostapd)中完成。

如果您有支持nl80211的新用戶空間實用程序,則不需要無線擴展來支持mac80211設備。

 

支持的功能:
IEEE 802.11abgn

IEEE 802.11d

Integration of work for the emerging 802.11sstandard

使用wpa_supplicant進行漫遊(802.11r也是如此)。

不同類型的接口,詳見支持的無線模式。

供應商特定費率支持

QoS

all mac80211 drivers get monitor modesupport

 

4.      nl80211
nl80211 is the new 802.11 netlink interfacepublic header. Together with cfg80211 it is intended to replace Wireless-Extensions. nl80211and cfg80211 are still under development.

 
nl80211的當前用戶:
iw

crda

hostapd

wpa_supplicant (with -Dnl80211)

testmode(CONFIG_NL80211_TESTMODE =y)
nl80211 testmode命令有助於實現工廠校準或無線芯片驗證工具等。

該功能可能用於SAR測試(比吸收率),MPE測試(最大允許曝光),RF測試(射頻),如FCC等機構可能要求的。

5.      加密方式
無線網絡的安全性由認證和加密來保證。

認證允許只有被許可的用戶才能連接到無線網絡;

加密的目的是提供數據的保密性和完整性(數據在傳輸過程中不會被篡改)。

 

關於wifi的加密/認證,以手機爲例主要有四種模式:

(1)OPEN模式

(2)WEP模式

(3)WPA(TKIP)

(4)WPA2(AES)

 

階段劃分

 

初級版本:認證不需要密碼, 傳輸不需要加密

 

         認證不需要密碼, 傳輸需要加密(用WEP算法)

 

         認證需要密碼(用WEP算法), 傳輸需要加密(用WEP算法,容易破解)

 

過渡版本:WPA  認證方式(802.1x),加密方式(TKIP,WEP)

 

                認證方式(PSK),加密方式(TKIP,WEP)

 

終極版本: WPA2  認證方式(802.1x),加密方式CCMP(AES-CCMP),TKIP,WEP

 

                 認證方式(PSK),加密方式CCMP(AES-CCMP),TKIP,WEP

 

802.1x:手機連接到AP後,它的認證過程不是在AP上進行的,而是發送到一個服務器,由服務器進行認證,在大型公司裏面,用一個服務器統一進行認證這樣比較好,但對於家庭網絡,這樣做認證成本太高,因而用PSK替代

 

PSK;手機只需要連接AP,AP會提示手機輸入密碼,AP上事先設置密碼,如果手機提供的密碼和事先設置的密碼一樣,那麼手機就可以使用無線網絡。

 

 

 

三、   正確安裝驅動程序
安裝驅動程序這項任務,又包括兩部分內容。第一部分是驅動程序源碼,第二部分是依賴。

1.      驅動程序源碼
默認的Arch Linux內核是模塊化的,這意味着許多機器硬件的驅動程序位於硬盤驅動器上,可以作爲模塊使用。在啓動時,udev獲取硬件的清單,併爲相應的硬件加載適當的模塊(驅動程序),從而允許創建網絡接口。

除了相應的驅動程序之外,一些無線芯片組還需要固件。許多固件映像由默認安裝的linux-firmware軟件包提供,但是,不包含專有固件映像,必須單獨安裝。

注意:如果udev在啓動時未加載正確的模塊,只需手動加載即可。如果udev爲設備加載多個驅動程序,則產生的衝突可能會阻止成功配置。確保將不需要的模塊列入黑名單。

 

上面的內容說的通俗點就是:

設備驅動程序是模塊化的,內核啓動的時候,加載了驅動程序的模塊,就會識別這個無線模塊。有些無線芯片,除了要有驅動程序,還需要固件。許多固件映像由默認安裝的linux-firmware軟件包提供,但是,有些專有固件映像,必須單獨安裝(在網上下載固件,放在根文件系統下,加載驅動模塊後,發命令指定固件位置)。

無線網卡的源碼驅動程序可由以下三種方式獲得。

 

1.    內核程序裏,自帶的驅動程序源碼。

我現在使用的無線wifi網卡是雷凌的RT3070,這款芯片的驅動在內核裏有,不需要專門下載。

 

項目思路:

根據無線芯片的VID, PID在內核drivers/net/wireless/中搜索該芯片的驅動的配置參數,比如CONFIG_RTL8192CU,CONFIG_ATH9K_HTC等等。配置.config 使CONFIG_RTL8192CU=m,或者CONFIG_ATH9K_HTC=m。

如下圖內核裏有需要的芯片驅動,直接配置成模塊就行。

2.    官方網站或者wiki網站去尋找。

https://en.wikipedia.org/wiki/Comparison_of_open-source_wireless_drivers

https://wireless.wiki.kernel.org/en/users/drivers

https://www.mediatek.com/products/connectivity-and-networking/broadband-wifi

https://www.mediatek.com/products/connectivity-and-networking/legacy-products

這些網站是國外的網站,這裏面的驅動源碼程序是比較全面的,可以在這裏面查找與下載。

 

3.    找代理商要驅動源碼程序。

我之前用的無線wifi網卡芯片是博通的bcm8335,驅動程序就是代理商提供的。

供應商驅動程序有自己的堆棧,通常稱爲STA驅動程序。它們通常僅限於託管模式(客戶端),有時還限制基礎設施(有限的接入點功能)以共享Internet連接(網絡共享)。它們可以是開源的或閉源的(或兩者兼而有之)。

編譯時的注意點:

您將需要以下內容來編譯驅動程序:

與當前運行的內核匹配的Linux內核頭文件。在openSUSE上,還必須安裝內核源代碼。根據驅動程序和發行版,您還必須安裝完整的內核源代碼。

用於編譯內核的相同gcc版本。至少要確保前兩個版本號或編譯器是相同的(例如,如果內核是由gcc 3.4 .2 編譯的話,可以使用gcc 3.4 .6編譯驅動程序)。忽略此規則將導致模塊加載期間出現無效的模塊格式錯誤。可以通過/ proc/ version檢查。

 

 

2.   依賴
由上面講的可知,無線卡工作,要有cfg80211 , mac80211 ,nl80211的支持,所以配置內核的時候,要選擇上這幾個選項。

如下圖:

 

 

 

 

 

======================================================================================================================================加載驅動之後,可能驅動沒有正常工作,可以從下面查找一下,解決辦法。
硬件驗證
第一個關鍵步驟是確保您的系統識別您的無線設備。有多種方法可以驗證您的系統是否成功完成了此操作。以下是一些方法:

§  “dmesg”命令通常可以包含指示正確檢測到無線設備的詳細消息。

§  如果卡是PCI卡(miniPCI/ miniPCI Express / PCI Express),則需要使用命令“lspci”來顯示卡識別字符串。

§  如果硬件是USB加密狗,則需要使用命令“lsusb”來顯示加密狗標識字符串。在某些情況下,“lsusb”不起作用(例如,如果未安裝usbfs),您可以使用“dmesg”(或在/ var /log / messages中)從內核日誌中獲取標識字符串。

 

modprobe
首先運行“modprobe<kernel module name>”。

查看dmesg輸出
運行“dmesg”命令並​​查找與您的無線設備相關的錯誤。至少應該有一些與您的設備加載和模塊初始化有關的消息。如果沒有消息或錯誤,您將不得不調查並糾正問題。

兩個常見問題是:

*“未知符號”。*缺少固件

缺少固件
某些無線卡需要固件才能工作。

這個消息在dmesg中非常清楚,它會告訴你缺少什麼文件名以及它在哪裏。在某些情況下,驅動程序可以退回並嘗試以前版本的固件。

可以手動添加文件來解決問題,但大多數情況下,固件可以在軟件包中找到(例如firmware-linux或firmware-linux-nonfree)。

“未知符號”錯誤
加載驅動程序內核模塊時,您會收到另一個字段名稱的“未知符號”錯誤消息。有時您也會在dmesg輸出中看到這一點。這是由於您加載的模塊與您正在運行的內核版本不匹配而導致的。

查看lsmod輸出
運行“lsmod”命令可以用來查看加載的模塊。確認實際加載了無線設備的內核模塊。如果未加載,則必須調查並更正問題。

有時其他模塊與您嘗試運行的模塊衝突。請參閱下面的黑名單。此外,衝突的模塊可以移出模塊樹。如果這樣做,請在之後運行“depmod-ae”。

查看modinfo輸出
運行“modinfo<kernel module name>”。這將確認模塊實際上在模塊樹中。同樣,確認它是正確的版本。執行“每個modinfo>的ls -l<​​文件位置”並在編譯時確認日期匹配。

 

 

 

四、   管理無線連接的方法
1.      iw
iw是一款基於nl80211的新型無線設備CLI配置實用程序。它支持最近添加到內核的所有新驅動程序。使用WirelessExtensions接口的舊工具iwconfig已棄用,強烈建議切換到iw和nl80211。iw依賴libnl庫。

iw的功能是配置無線網絡。例如,掃描沒有密碼或者wep加密的wifi熱點,然後連接,並且可以修改當前STA的功率,傳輸比特率等等。

 

建立要求
§  libnl>= libnl1

§  libnl-dev>= libnl-dev-1

§  pkg-config使用iw需要你有libnl,第一個工作版本是1.0pre8,因爲這個版本引入了genl,Generic Netlink,nl80211依賴它。如果您的發行版的libnl版本錯誤,那麼您現在必須自己下載並編譯libnl(http://www.infradead.org/~tgr/libnl/)。

 

命令:
# iwhelp    # 幫助

# iwlist    # 獲得所有設備的功能,如帶寬信息(2.4GHz,和5GHz),和802.11n的信息

# iw devwlan0 scan    # 掃描

# iwevent    # 監聽事件

# iw devwlan0 link    # 獲得鏈路狀態

# iw wlan0connect foo    # 連接到已禁用加密的AP,這裏它的SSID是foo

# iw wlan0connect foo 2432  # 假設你有兩個APSSID 都是 foo ,你知道你要連接的是在 2432 頻道

# iw wlan0connect foo keys 0:abcde d:1:0011223344    # 連接到使用WEP的AP

# iw devwlan1 station dump    # 獲取station 的統計信息

# iw devwlan1 station get     # 獲得station對應的peer統計信息

# iw wlan0set bitrates legacy-2.4 12 18 24    # 修改傳輸比特率

# iw devwlan0 set bitrates mcs-5 4    # 修改tx HT MCS的比特率

# iw devwlan0 set bitrates mcs-2.4 10

# iw devwlan0 set bitrates mcs-5    # 清除所有 tx 比特率和設置的東西來恢復正常

# iwdev  set txpower  []   #設置傳輸功率

# iwphy  set txpower  []   #設置傳輸功率

# iw devwlan0 set power_save on  #設置省電模式

# iw devwlan0 get power_save  #查詢當前的節電設定

# iw phyphy0 interface add moni0 type monitor  #添加一個 monitor 接口

 

下載路徑:
http://kernel.org/pub/software/network/iw/.

http://git.kernel.org/?p=linux/kernel/git/jberg/iw.git.

https://packages.gentoo.org/packages/net-wireless/iw

 

 

 

 

2.     wpa_supplicant
wpa_supplicant是適用於Linux,BSD,Mac OS X和Windows的WPA請求者,支持WPA和WPA2(IEEE 802.11i / RSN)。它適用於臺式機/筆記本電腦和嵌入式系統。請求者是客戶端站中使用的IEEE 802.1X / WPA組件。它實現與WPA Authenticator的密鑰協商,並控制wlan驅動程序的漫遊和IEEE 802.11身份驗證/關聯。

wpa_supplicant被設計爲一個“後臺程序”程序,它在後臺運行並充當控制無線連接的後端組件。wpa_supplicant支持單獨的前端程序,wpa_supplicant包含基於文本的前端(wpa_cli)和GUI(wpa_gui),可以通過wpa_cli來進行WIFI的配置與連接,前提要保證wpa_supplicant正常啓動.例如命令:wpa_cli scan_results

 

支持的WPA / IEEE 802.11i功能:
WPA-PSK(“WPA-Personal”)

帶有EAP的WPA(例如,使用RADIUS身份驗證服務器)(“WPA-Enterprise”)

CCMP,TKIP,WEP104,WEP40的密鑰管理

WPA和完整的IEEE 802.11i/ RSN / WPA2

RSN:PMKSA緩存,預身份驗證

IEEE 802.11r

IEEE 802.11w

Wi-Fi保護設置(WPS)

 

使用wpa_supplicant:
使用WPA與AP關聯時使用以下步驟:

wpa_supplicant請求內核驅動程序掃描相鄰BSS

wpa_supplicant根據其配置選擇BSS

wpa_supplicant請求內核驅動程序與所選BSS關聯

如果WPA-EAP:集成的IEEE 802.1X請求方使用認證服務器完成EAP認證(由AP中的認證方代理)

如果從IEEE 802.1X請求方收到WPA-EAP:主密鑰

如果WPA-PSK:wpa_supplicant使用PSK作爲主會話密鑰

wpa_supplicant使用身份驗證器(AP)完成WPA 4-Way Handshake和Group Key Handshake。WPA2已將初始組密鑰握手集成到4路握手中。

wpa_supplicant爲單播和廣播配置加密密鑰

可以發送和接收普通數據包

 

配置文件:
使用文本文件配置wpa_supplicant,該文件列出所有接受的網絡和安全策略,包括預共享密鑰。有關配置格式和支持的字段的詳細信息,請參閱示例配置文件http://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf下的wpa_supplicant.conf。示例配置可用於明文, 靜態WEP,具有動態WEP的IEEE 802.1X(EAP-PEAP / MSCHAPv2), WPA-PSK / TKIP和 WPA2-EAP / CCMP(EAP-TLS)。

 

下載地址:
http://w1.fi/releases/
http://w1.fi/wpa_supplicant/
 
 

3.     hostapd
hostapd是訪問點和身份驗證服務器的用戶空間守護程序。它實現了IEEE802.11接入點管理,IEEE 802.1X / WPA / WPA2 / EAP認證器,RADIUS客戶端,EAP服務器和RADIUS認證服務器。當前版本支持Linux(Host AP,madwifi,基於mac80211的驅動程序)和FreeBSD(net80211)。

hostapd旨在成爲一個“後臺程序”程序,它在後臺運行並充當控制身份驗證的後端組件。hostapd支持單獨的前端程序,並且hostapd中包含一個示例基於文本的前端hostapd_cli。

要與內核驅動程序通信,hostapd必須使用某些接口。所有新的實現AP功能cfg80211(和mac80211)的驅動程序使用支持nl80211接口。

hosatapd負責sta接入點的管理。

下載並編譯hostapd
使用帶有nl80211的hostapd要求你至少擁有libnl-1.0pre8,因爲這個版本引入了nl80211所依賴的genl,Generic Netlink。大多數發行版現在發佈此版本或更高版本。要在Fedora或其他將二進制文件中的標題分開的發行版上進行編譯,您需要libnl-devel包。

 

支持的無線卡/驅動程序:
Linux mac80211驅動程序

在AP模式下支持nl80211 / cfg80211的Linux驅動程序

Prism2 / 2.5 / 3的主機AP驅動程序

madwifi(Atheros ar521x)

BSD net80211層(例如,Atheros驅動程序)(FreeBSD 6-CURRENT)

配置文件:
hostapd使用列出所有配置參數的文本文件進行配置。有關配置格式和支持的字段的詳細信息,請參閱示例配置文件 hostapd.conf。路徑:http://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf

 

下載地址:
http://w1.fi/hostapd/

http://w1.fi/releases/

4.      總結:
1. iw            (無線網卡連接其它設備,工作於STA模式,開放模式或者WEP)

2. wpa_supplicant(無線網卡連接其它設備,工作於STA模式,WPA或者WPA2)

3. hostapd         (無線網卡作爲路由器,工作於AP模式)

4. wpa_supplicant和 hostapd是後臺程序,wpa_cli 和 hostapd_cli是前臺程序。

五、   參考文檔
http://aircrack-ng.org/doku.php?id=install_drivers

https://wireless.wiki.kernel.org/en/users/documentation/hostapd

https://wireless.wiki.kernel.org/en/users/Documentation/iw

 

http://w1.fi/wpa_supplicant/

 

https://wireless.wiki.kernel.org/en/users/documentation/wpa_supplicant

http://w1.fi/wpa_supplicant/

 

http://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf

注意點:

1. 本篇博客是移植wifi的概念介紹,後面的博客會詳細介紹每個步驟的實現過程。

2. 下載本博客的詳細文檔格式,請去網頁:

https://download.csdn.net/download/happygrilclh/10537896

3. 原創作,不做商業。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章