1. 程式人生 > >linux下移植wifi之概念介紹(一)

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軟體。

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

FullMac

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

SoftMac

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

cfg80211是Linux802.11配置API。cfg80211取代了Wireless-Extensions。nl80211用於配置cfg80211裝置,用於核心←→使用者空間通訊。cfg80211現在功能齊全,具有無線擴充套件功能,在實施cfg80211驅動程式時,仍然會通過cfg80211到CONFIG_CFG80211_WEXT自動為您提供無線擴充套件支援。不再需要無線擴充套件的發行版可以刪除它,並鼓勵這樣做。

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

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

testmode(CONFIG_NL80211_TESTMODE =y)

nl80211 testmode命令有助於實現工廠校準或無線晶片驗證工具等。

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

無線網路的安全性由認證和加密來保證。

認證允許只有被許可的使用者才能連線到無線網路;

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

關於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上事先設定密碼,如果手機提供的密碼和事先設定的密碼一樣,那麼手機就可以使用無線網路。

安裝驅動程式這項任務,又包括兩部分內容。第一部分是驅動程式原始碼,第二部分是依賴。

預設的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網站去尋找。

這些網站是國外的網站,這裡面的驅動原始碼程式是比較全面的,可以在這裡面查詢與下載。

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-linuxfirmware-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,因為這個版本引入了genlGeneric Netlinknl80211依賴它。如果您的發行版的libnl版本錯誤,那麼您現在必須自己下載並編譯libnlhttp://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 介面

下載路徑:

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)。

下載地址:

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

使用帶有nl80211hostapd要求你至少擁有libnl-1.0pre8,因為這個版本引入了nl80211所依賴的genlGeneric Netlink。大多數發行版現在釋出此版本或更高版本。要在Fedora或其他將二進位制檔案中的標題分開的發行版上進行編譯,您需要libnl-devel包。

支援的無線卡/驅動程式:

Linux mac80211驅動程式

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

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

madwifi(Atheros ar521x)

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

配置檔案:

下載地址:

4.      總結:

1. iw            (無線網絡卡連線其它裝置,工作於STA模式,開放模式或者WEP)

2. wpa_supplicant(無線網絡卡連線其它裝置,工作於STA模式,WPA或者WPA2)

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

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

注意點:

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

2. 下載本部落格的詳細文件格式,請去網頁:

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

3. 原創作,不做商業。