最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

淺談Linux內(nèi)核無(wú)線子系統(tǒng)(超詳細(xì)~)

2022-08-12 20:39 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

Linux 內(nèi)核無(wú)線子系統(tǒng)看成兩大塊: cfg80211 和 mac80211 ,它們連通內(nèi)核其他模塊和用戶空間的應(yīng)用程序。Linux 內(nèi)核無(wú)線子系統(tǒng)統(tǒng)一各種 WiFi 設(shè)備,并處理 OSI 模型中最底層的 MAC 、 PHY 兩層。Linux 子系統(tǒng)實(shí)現(xiàn)大部分的 MAC 高層回調(diào)函數(shù)。

Linux 內(nèi)核是如何實(shí)現(xiàn)無(wú)線網(wǎng)絡(luò)接口呢?數(shù)據(jù)包是通過(guò)怎樣的方式被發(fā)送和接收呢?今天跟著 LinuxStory 小編一起來(lái)探索一番吧!

剛開(kāi)始工作接觸 Linux 無(wú)線網(wǎng)絡(luò)時(shí),我曾迷失在浩瀚的基礎(chǔ)代碼中,尋找具有介紹性的材料來(lái)回答如上面提到的那些高層次的問(wèn)題。跟蹤探索了一段時(shí)間的源代碼后,我寫下了這篇總結(jié),希望在 Linux 無(wú)線網(wǎng)絡(luò)的工作原理上,讀者能從這篇文章獲得一個(gè)具有幫助性的概覽。

1 全局概覽

在開(kāi)始探索 Linux 無(wú)線具體細(xì)節(jié)之前,讓我們先來(lái)把握一下 Linux 無(wú)線子系統(tǒng)整體結(jié)構(gòu)。如圖1,展示了 Linux 無(wú)線子系統(tǒng)各個(gè)模塊之間的抽象關(guān)系。


圖示中的虛線內(nèi)展示的是內(nèi)核空間的情況。用戶空間的程序運(yùn)行在最上層,而硬件相關(guān)的設(shè)備則在最下面。圖示中左邊為以太網(wǎng)設(shè)備,右邊為 WiFi 設(shè)備。

正如圖中看到的一樣,存在著兩種 WiFi 設(shè)備,具體是哪一類要看 IEEE802.11 標(biāo)準(zhǔn)的 MLME 如何實(shí)現(xiàn)。

如果直接通過(guò)硬件實(shí)現(xiàn),那么設(shè)備就是硬 MAC (full MAC)設(shè)備;如果通過(guò)軟件的方式實(shí)現(xiàn),那么設(shè)備就是軟 MAC (soft MAC)設(shè)備?,F(xiàn)階段大部分無(wú)線設(shè)備都是軟件實(shí)現(xiàn)的軟 MAC 設(shè)備。

通常我們把 Linux 內(nèi)核無(wú)線子系統(tǒng)看成兩大塊: cfg80211 和 mac80211 ,它們連通內(nèi)核其他模塊和用戶空間的應(yīng)用程序。

特別指出, cfg80211 在內(nèi)核空間提供配置管理服務(wù),內(nèi)核與應(yīng)用層通過(guò) nl80211 實(shí)現(xiàn)配置管理接口。需要記住的是,

硬 MAC 設(shè)備和軟 MAC 設(shè)備都需要 cfg80211 才能工作。而 mac80211 只是一個(gè)驅(qū)動(dòng) API ,它只支持軟件實(shí)現(xiàn)的軟 MAC 設(shè)備。

接下來(lái),我們主要關(guān)注軟 MAC 設(shè)備。

Linux 內(nèi)核無(wú)線子系統(tǒng)統(tǒng)一各種 WiFi 設(shè)備,并處理 OSI 模型中***層的 MAC 、 PHY 兩層。

若進(jìn)一步劃分, MAC 層可以分為 MAC 高層和 MAC 底層。前者負(fù)責(zé)管理 MAC 層無(wú)線網(wǎng)絡(luò)的探測(cè)發(fā)現(xiàn)、身份認(rèn)證、關(guān)聯(lián)等;

后者實(shí)現(xiàn) MAC 層如 ACK 等緊急操作。大部分情況下,硬件(如無(wú)線適配器)處理大部分的 PHY 層以及 MAC 底層操作。Linux 子系統(tǒng)實(shí)現(xiàn)大部分的 MAC 高層回調(diào)函數(shù)。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ? ?


2 模塊間接口

從圖一中我們可以看出,各個(gè)模塊之間分界線很清晰,并且模塊間相互透明不可見(jiàn)。模塊之間一般不會(huì)相互影響。

舉個(gè)例子,我們?cè)?WiFi 設(shè)備驅(qū)動(dòng)做修改(如,打補(bǔ)丁、添加新的 WiFi 驅(qū)動(dòng)等),這些變更并不會(huì)影響到 mac80211 模塊,

所以我們根本不用改動(dòng) mac80211 的代碼。再如,添加一個(gè)新的網(wǎng)絡(luò)協(xié)議理論上是不用修改套接字層以及設(shè)備無(wú)關(guān)層代碼。一般情況下,內(nèi)核通過(guò)一系列的函數(shù)指針實(shí)現(xiàn)各層之間相互透明。

如下代碼展示 rtl73usb 無(wú)線網(wǎng)卡驅(qū)動(dòng)與 mac80211 的聯(lián)系。


左側(cè)是 mac80211 為 WiFi 驅(qū)動(dòng)模塊實(shí)現(xiàn)的 ieee80211_ops 結(jié)構(gòu)體形式的回調(diào)接口,回調(diào)函數(shù)的具體內(nèi)容由驅(qū)動(dòng)層實(shí)現(xiàn)。

顯然,不同設(shè)備相應(yīng)驅(qū)動(dòng)的實(shí)現(xiàn)不同。結(jié)構(gòu)體 ieee80211_ops 負(fù)責(zé)將不同設(shè)備驅(qū)動(dòng)實(shí)現(xiàn)的回調(diào)函數(shù)與 mac80211 提供的 API 映射綁定起來(lái)。

當(dāng)驅(qū)動(dòng)模塊插入注冊(cè)時(shí),這些回調(diào)函數(shù)就被注冊(cè)到 mac80211 里面(通過(guò) ieee80211_alloc_hw 實(shí)現(xiàn)),接著 mac80211 就綁定了相應(yīng)的回調(diào)函數(shù),根本不用知道具體的名字,以及實(shí)現(xiàn)細(xì)節(jié)等。

完整定義的 ieee80211_ops 結(jié)構(gòu)包含很多成員,但不是所有都必須要驅(qū)動(dòng)層實(shí)現(xiàn)。一般而言,實(shí)現(xiàn)的前七個(gè)成員函數(shù)就足夠了。但是,要想正確實(shí)現(xiàn)其他功能,某些相關(guān)的成員函數(shù)就需要被實(shí)現(xiàn),就像上面的例子一樣。

3 數(shù)據(jù)路徑與管理路徑

圖一所示中,存在兩條主要路徑:數(shù)據(jù)路徑和管理路徑。數(shù)據(jù)路徑對(duì)應(yīng) IEEE802.11 數(shù)據(jù)幀,而管理路徑對(duì)應(yīng)著控制幀。

在 IEEE802.11 的控制幀中,大部分用于如 ACK 這類時(shí)間緊急的操作,并且一般直接由硬件實(shí)現(xiàn)。一個(gè)例外可能就是 PS-Poll 幀(用于 Power Save 控制),它也可以由 mac80211 實(shí)現(xiàn)。

數(shù)據(jù)和管理路徑在 mac80211 里面是分開(kāi)實(shí)現(xiàn)的。

4 數(shù)據(jù)包是如何被發(fā)送?

接下來(lái),我們集中探討下數(shù)據(jù)的發(fā)送過(guò)程。

首先,數(shù)據(jù)包起源于用戶空間的應(yīng)用程序,應(yīng)用程序首先創(chuàng)建一個(gè)套接字,然后綁定一個(gè)接口(如,以太網(wǎng)接口、 WiFi 接口)。

接下來(lái)將數(shù)據(jù)寫入到套接字緩沖區(qū),***再將緩沖區(qū)的數(shù)據(jù)發(fā)送出去。在套接字創(chuàng)建時(shí),我們需要指明將要使用的協(xié)議族,這將在內(nèi)核中起作用。

剛才這些發(fā)生在圖一中的 Data Application 模塊中,最終應(yīng)用程序陷入系統(tǒng)調(diào)用,隨后在內(nèi)核空間進(jìn)行接下來(lái)的工作。

數(shù)據(jù)的傳輸首先經(jīng)過(guò)套接字層,這個(gè)過(guò)程中一個(gè)最重要的數(shù)據(jù)結(jié)構(gòu)就是 sk_buff ,一般稱為 skb 。一個(gè) skb 結(jié)構(gòu)中的成員包含著緩沖區(qū)的地址以及數(shù)據(jù)長(zhǎng)度。

它還為內(nèi)核中不同層對(duì)數(shù)據(jù)的操縱提供了良好的支持;實(shí)現(xiàn)了眾多的接口,如,不同網(wǎng)絡(luò)層首部的插入與去除等。整個(gè)數(shù)據(jù)的發(fā)送/接收過(guò)程均會(huì)用到這個(gè)結(jié)構(gòu)。

我們跳過(guò)網(wǎng)絡(luò)協(xié)議模塊,對(duì)于網(wǎng)絡(luò)協(xié)議我沒(méi)有太多想說(shuō)的,因?yàn)橐坏┥婕熬W(wǎng)絡(luò)協(xié)議,簡(jiǎn)直說(shuō)不盡道不完。在這里協(xié)議并不是我們主要關(guān)心的。

不過(guò)我們需要知道的是,數(shù)據(jù)傳輸使用的協(xié)議在套接字創(chuàng)建的時(shí)候就與指定的協(xié)議綁定了,然后相關(guān)的協(xié)議便會(huì)負(fù)責(zé)相關(guān)層的數(shù)據(jù)傳輸。

接下來(lái),數(shù)據(jù)由網(wǎng)絡(luò)層落到了設(shè)備無(wú)關(guān)層。這一層透明的連接著各種各樣的硬件設(shè)備(如以太網(wǎng)設(shè)備、 WiFi 設(shè)備等)。

設(shè)備無(wú)關(guān)層一個(gè)重要的結(jié)構(gòu)是: net_device 。我們回去看圖一,再看接下來(lái)的代碼就能解釋內(nèi)核是如何與以太網(wǎng)設(shè)備驅(qū)動(dòng)通信的。

具體接口通過(guò) net_device_ops 結(jié)構(gòu)實(shí)現(xiàn),該結(jié)構(gòu)對(duì)應(yīng)了 net_device 的很多操作。

如下是 net_device_ops 結(jié)構(gòu)的部分成員:


發(fā)包的時(shí)候, skb 在調(diào)用 dev_queue_xmit 時(shí)被傳入。在跟蹤具體調(diào)用關(guān)系后,最終是這樣調(diào)用的: ops->ndo_start_xmit(skb, dev) 。

注意,剛才的這個(gè)函數(shù)需要注冊(cè)才能生效。

對(duì)于 WiFi 設(shè)備而言,通常我們使用 mac80211 (代替了相應(yīng)的設(shè)備驅(qū)動(dòng)),那是因?yàn)?mac80211 已經(jīng)幫我們注冊(cè)了。

從 net/mac80211/iface.c 可以看到:


因此 mac80211 也就可以看作是一個(gè) net_device ,當(dāng)一個(gè)數(shù)據(jù)包通過(guò) WiFi 傳輸時(shí),相關(guān)的傳輸函數(shù) ieee80211_subif_start_xmit 將被調(diào)用。

我們進(jìn)入 mac80211 內(nèi)部 ieee80211_subif_start_xmit 實(shí)現(xiàn)可以看到這樣一個(gè)調(diào)用子序列:ieee80211_xmit => ieee80211_tx => ieee80211_tx_frags => drv_tx

目前我們處在 mac80211 和 WiFi 驅(qū)動(dòng)的邊界, drv_tx 僅僅調(diào)用了一個(gè)在 WiFi 驅(qū)動(dòng)層實(shí)現(xiàn)的并已注冊(cè)的回調(diào)函數(shù)。


到這里, mac80211 就結(jié)束了,并且設(shè)備驅(qū)動(dòng)相關(guān)也暫時(shí)告一段落了。

正如之前提到的一樣,通過(guò) mac80211 中的 local->ops->tx ,注冊(cè)到設(shè)備驅(qū)動(dòng)中的回調(diào)函數(shù)將會(huì)被調(diào)用。盡管每個(gè)驅(qū)動(dòng)對(duì)相應(yīng)回調(diào)函數(shù)的實(shí)現(xiàn)不盡相同。

下面利用之前模塊間接口的例子。結(jié)構(gòu)體成員 tx 對(duì)應(yīng)的函數(shù) rt2x00max_tx 首先需要填充準(zhǔn)備發(fā)送描述符(一般包含幀長(zhǎng)度、ACK 策略、 RTS/CTS、重傳時(shí)限、分片標(biāo)志以及 MCS 等)

部分信息由 mac80211 傳下來(lái)(結(jié)構(gòu)體 ieee80211_tx_info 中就有一些信息將會(huì)被使用到),然后驅(qū)動(dòng)程序還要將數(shù)據(jù)轉(zhuǎn)換成底層硬件可識(shí)別的形式。

一旦發(fā)送描述符就位,驅(qū)動(dòng)程序還會(huì)調(diào)整幀數(shù)據(jù)(如,調(diào)整字節(jié)對(duì)齊等),然后將數(shù)據(jù)幀放入發(fā)送隊(duì)列,***將要發(fā)送的幀的描述符發(fā)給硬件。

由于我們以一個(gè)基于 rt73usb 的 USB WiFi 適配器為例,所以數(shù)據(jù)幀***是通過(guò) USB 接口發(fā)送給無(wú)線設(shè)備。

然后數(shù)據(jù)將被插入 PHY 首部以及其他信息,***數(shù)據(jù)包被發(fā)送到了空中。驅(qū)動(dòng)同時(shí)也需要反饋發(fā)送狀態(tài)給 mac80211 , 通常狀態(tài)信息存放在 struct ieee80211_tx_info 中。

經(jīng)過(guò) ieee80211_tx_status 一系列的調(diào)用,或者某些變種函數(shù)反饋給上層。

說(shuō)到這里,關(guān)于數(shù)據(jù)包的發(fā)送也暫時(shí)告一段落了。

5 談?wù)劰芾砺窂?/p>

理論上,我們可以像數(shù)據(jù)路徑一樣在用戶空間下通過(guò)套接字發(fā)送控制幀。但是目前有很多開(kāi)發(fā)得十分完善的用戶層管理工具能完成這樣的工作。

特別是 wpa_supplicant 和 host_apd 。wpa_supplicant 控制客戶端 STA 模式下無(wú)線網(wǎng)絡(luò)的連接,如掃描發(fā)現(xiàn)網(wǎng)絡(luò)、身份認(rèn)證、關(guān)聯(lián)等。

而 host_apd 可以做 AP 。說(shuō)白了前者就是用來(lái)連接熱點(diǎn),后者用來(lái)發(fā)射熱點(diǎn)。這些用戶層工具通過(guò) netlink 套接字與內(nèi)核通信。

內(nèi)核中相關(guān)的回調(diào)接口是 cfg80211 中的 nl80211 。用戶層的工具通過(guò) netlink 提供的庫(kù)(如, NL80211_CMD_TRIGGER_SCAN )將命令發(fā)送到內(nèi)核。

在內(nèi)核中,由 nl80211 接收應(yīng)用層發(fā)出的命令。如下代碼展示了對(duì)應(yīng)綁定情況。


以 triggering scan 為例,掃描請(qǐng)求從 cfg80211 到 mac80211 是通過(guò) mac80211 在 cfg80211 中注冊(cè)的回調(diào)函數(shù)來(lái)實(shí)現(xiàn)的。


在 mac80211 中, ieee80211_scan 將會(huì)具體去實(shí)現(xiàn)掃描發(fā)現(xiàn)網(wǎng)絡(luò)的具體細(xì)節(jié)。


6 數(shù)據(jù)包又是如何被接收?

我們接下來(lái)反過(guò)來(lái)看看數(shù)據(jù)接收的過(guò)程,現(xiàn)在我們不再比較數(shù)據(jù)路徑與管理路徑的不同了。相信讀者同樣能明白。

當(dāng)一個(gè)數(shù)據(jù)包在空中被無(wú)線設(shè)備捕捉到后,硬件將會(huì)向內(nèi)核發(fā)出一個(gè)中斷(大部分 PCI 接口的設(shè)備這樣做),或則通過(guò)輪詢機(jī)制判斷是否有數(shù)據(jù)到來(lái)(如,使用了 USB 接口)。

前者,中斷將會(huì)引發(fā)中斷處理程序的執(zhí)行,后者促使特定的接收函數(shù)將被調(diào)用。

一般設(shè)備驅(qū)動(dòng)層的回調(diào)函數(shù)不會(huì)做太多關(guān)于接收數(shù)據(jù)包的操作,僅僅做數(shù)據(jù)校驗(yàn),為 mac80211 填充接收描述符,然后把數(shù)據(jù)包推給 mac80211 , 由 mac80211 來(lái)做之后的工作(直接或間接將數(shù)據(jù)包放入接收隊(duì)列)。

數(shù)據(jù)進(jìn)入 mac80211 后,將會(huì)調(diào)用 ieee80211_rx 或者其他變種接收函數(shù)。在這里數(shù)據(jù)路徑和管理路徑也將分開(kāi)進(jìn)行。

如果收到的幀是數(shù)據(jù),它將被轉(zhuǎn)換成 802.3 數(shù)據(jù)幀(通過(guò) __ieee80211_data_to8023 實(shí)現(xiàn)),然后該數(shù)據(jù)幀將通過(guò) netif_receive_skb 交付到網(wǎng)絡(luò)協(xié)議棧。在協(xié)議棧中,各層網(wǎng)絡(luò)協(xié)議將會(huì)對(duì)數(shù)據(jù)進(jìn)行解析,識(shí)別協(xié)議首部。

如果接收到的是控制幀,數(shù)據(jù)將會(huì)由 ieee80211_sta_rx_queued_mgmt 處理。部分控制幀在 mac80211 層就終止,另外一些將會(huì)通過(guò) cfg80211 發(fā)送到用戶空間下的管理程序。

例如,身份認(rèn)證控制幀被 cfg80211_rx_mlme_mgmt 處理,然后通過(guò) nl80211_send_rx_auth 發(fā)送到用戶空間下的 wpa_supplicant ; 相應(yīng)的關(guān)聯(lián)響應(yīng)控制幀被 cfg80211_rx_assoc_resp 處理,并由 nl80211_send_rx_assoc 發(fā)送到用戶空間。

7 總結(jié)一下

一般 WiFi 驅(qū)動(dòng)包含如下三個(gè)部分:配置、發(fā)送回調(diào)、接收回調(diào)。再以 USB WiFi 適配器為例,當(dāng)內(nèi)核探測(cè)到設(shè)備被插入時(shí),會(huì)調(diào)用 probe 函數(shù)。這可能發(fā)生在注冊(cè)配置好的 ieee80211_ops 時(shí)。

首先, ieee80211_alloc_hw 分配一個(gè) ieee80211_hw 結(jié)構(gòu)體,代表著相應(yīng) WiFi 設(shè)備。另外,如下的數(shù)據(jù)結(jié)構(gòu)也會(huì)被分配:

wiphy 結(jié)構(gòu):主要用來(lái)描述 WiFi 硬件參數(shù)(如, MAC 地址、接口模式與組合、支持的波特率以及其他一些硬件功能)。

ieee80211_local 結(jié)構(gòu):這是一個(gè)設(shè)備驅(qū)動(dòng)層可見(jiàn)的結(jié)構(gòu),并且被 mac80211 大量使用。ieee80211_ops 的映射綁定將鏈接到 ieee80211_local 中。 前者作為后者的一個(gè)成員。在 ieee80211_hw 中可以通過(guò) container_of 或者 hw_to_local 這個(gè)專用 API 得到 ieee80211_local 。

設(shè)備驅(qū)動(dòng)使用到的在 ieee80211_hw 中的私有結(jié)構(gòu) void *priv 。

注意:硬件設(shè)備的注冊(cè)由 ieee80211_register_hw 完成,前提是事先已經(jīng)插入注冊(cè)了 mac80211 模塊,好比在 STA 模式中,要先用 wpa_supplicant 控制設(shè)備連接上了某個(gè)熱點(diǎn)才能進(jìn)行通信一樣。


淺談Linux內(nèi)核無(wú)線子系統(tǒng)(超詳細(xì)~)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
庆城县| 天气| 合肥市| 南阳市| 辽宁省| 新化县| 巩留县| 延吉市| 广州市| 吐鲁番市| 双城市| 南岸区| 温宿县| 密山市| 城口县| 兴义市| 仁布县| 读书| 宁蒗| 灯塔市| 金坛市| 青阳县| 晋江市| 大丰市| 巴彦淖尔市| 莒南县| 漳浦县| 扎赉特旗| 威信县| 永兴县| 濉溪县| 大连市| 瑞安市| 大名县| 台北市| 萨嘎县| 兴仁县| 池州市| 阿拉善左旗| 封开县| 泰来县|