日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IEEE802.11协议栈

發(fā)布時間:2025/4/5 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IEEE802.11协议栈 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、概述

  • mac80211:是一個Linux內(nèi)核子系統(tǒng),是驅(qū)動開發(fā)者可用于為SoftMAC無線設(shè)備寫驅(qū)動的框架。mac80211在內(nèi)核空間實現(xiàn)STA模式,在用戶空間實現(xiàn)AP模式(hostapd)。

  • cfg80211:用于對無線設(shè)備進行配置管理,與FullMAC,mac80211和nl80211一起工作。

  • nl80211:用于對無線設(shè)備進行配置管理,它是一個基本Netlink的用戶態(tài)協(xié)議。

  • MLME:即MAC(Media Access Control) Layer Management Entity,它管理物理層MAC狀態(tài)機。

  • SoftMAC:其MLME由軟件實現(xiàn),mac80211為SoftMAC實現(xiàn)提供了一個API。即:SoftMAC設(shè)備允許對硬件執(zhí)行更好地控制,允許用軟件實現(xiàn)對802.11的幀管理,包括解析和產(chǎn)生802.11無線幀。目前大多數(shù)802.11設(shè)備為SoftMAC,而FullMAC設(shè)備較少。

  • FullMAC:其MLME由硬件管理,當(dāng)寫FullMAC無線驅(qū)動時,不需要使用mac80211。

  • wpa_supplicant:是用戶空間一個應(yīng)用程序,主要發(fā)起MLME命令,然后處理相關(guān)結(jié)果。

  • hostpad:是用戶空間一個應(yīng)用程序,主要實現(xiàn)station接入認(rèn)證管理。

  • cfg80211是Linux802.11配置API。cfg80211用于代碼wext(Wireless-Extensions),nl80211用于配置一個cfg80211設(shè)備,且用于kernel與userspace間的通信。wext現(xiàn)處理維護狀態(tài),沒有新的功能被增加,只是修改bug。如果需要通過wext操作,則需要定義ONFIG_CFG80211_WEXT。

  • cfg80211and nl80211:基于消息機制,使用netlink接口

  • wext:基于ioctl機制(madwifi wext 等已經(jīng)在linxu內(nèi)核中被移除linux 2.6.26)

  • struct ieee80211_hw:表示硬件信息和狀態(tài)

  • ieee80211_alloc_hw:每個driver調(diào)用ieee80211_alloc_hw分配ieee80211_hw,且以ieee80211_ops為參數(shù)

  • ieee80211_register_hw:每個driver調(diào)用ieee80211_register_hw創(chuàng)建wlan0和wmaster0,并進行各種初始化。

  • struct ieee80211_ops:每個driver實現(xiàn)它的成員函數(shù),且它的成員函數(shù)都以struct ieee80211_hw做為第一個參數(shù)。在struct ieee80211_ops中定義了24個方法,以下7個方法必須實現(xiàn):tx,start,stop,add_interface,remove_interface,config和configure_filter。

2、體系結(jié)構(gòu)

?

圖2-1系統(tǒng)框架

?

3、代碼結(jié)構(gòu)

  • ieee80211_i.h(主要數(shù)據(jù)結(jié)構(gòu))

  • main.c(主函數(shù)入口)

  • iface.c(虛擬接口處理)

  • key.c,key.h(密鑰管理)

  • sta_info.c,sta_info.h(用戶管理)

  • pm.c(功率管理)

  • rate.c,rate.h(速率控制函數(shù))

  • rc80211*(速率控制算法)

  • rx.c(幀接收路徑代碼)

  • tx.c(幀發(fā)送路徑代碼)

  • scan.c(軟件掃描代碼)

  • mlme.c(station/managed模式MLME)

  • ibss.c(IBSSMLME)

  • cfg.c,cfg.h,wext.c(配置入口代碼)

  • aes*,tkip*,wep*,michael*,wpa*(WPA/RSN/WEP代碼)

  • wme.c,wme.h(QoS代碼)

  • util.c(公共函數(shù))

4、數(shù)據(jù)結(jié)構(gòu)

ieee80211_local/ieee80211_hw

  • 每個數(shù)據(jù)結(jié)構(gòu)代表一個無線設(shè)備(ieee80211_hw嵌入到ieee80211_local)

  • ieee80211_hw是ieee80211_local在驅(qū)動中的可見部分

  • 包含無線設(shè)備的所有操作信息

sta_info/ieee80211_sta

  • 代表每一個station

  • 可能是mesh,IBSS,AP,WDS

  • ieee80211_sta是驅(qū)動可見部分

ieee80211_conf

  • 硬件配置

  • 當(dāng)前信道是最重要的字段

  • 硬件特殊參數(shù)

ieee80211_bss_conf

  • BSS配置

  • 多BSSes類型(IBSS/AP/managed)

  • 包含比如基礎(chǔ)速率位圖

  • perBSS parameters in case hardware supports creating/associating withmultiple BSSes

ieee80211_key/ieee80211_key_conf

  • 代表加密/解密密鑰

  • ieee80211_key_conf提供給驅(qū)動用于硬件加速

  • ieee80211_key包含book-keeping和軟件解密狀態(tài)

ieee80211_tx_info

  • 大部分復(fù)雜數(shù)據(jù)結(jié)構(gòu)

  • skb內(nèi)部控制緩沖區(qū)(cb)

  • 經(jīng)歷三個階段:1、由mac80211初始化;2、由驅(qū)動使用;3、由發(fā)送狀態(tài)通告使用

ieee80211_rx_status

  • 包含接收幀狀態(tài)

  • 驅(qū)動通過接收幀傳給mac80211

ieee80211_sub_if_data/ieee80211_vif

  • 包含每個虛擬接口信息

  • ieee80211_vif is passed to driver for those virtual interfaces the driver knowsabout (no monitor,VLAN)

  • 包含的sub-structures取決于模式

5、主要流程

配置

  • 所有發(fā)起來自用戶空間(wext或者nl80211)

  • managed和IBSS模式:觸發(fā)狀態(tài)機(基于workqueue)

  • 有些操作或多或少直接通過驅(qū)動傳遞(比如信道設(shè)置)

接收路徑

  • 通過函數(shù)ieee80211_rx()接收幀

  • 調(diào)用ieee80211_rx_monitor()拷貝幀傳遞給所有監(jiān)聽接口

  • 調(diào)用invoke_rx_handlers()處理幀

  • 如果是數(shù)據(jù)幀,轉(zhuǎn)換成802.3幀格式,傳遞給上層協(xié)議棧

  • 如果是管理幀/控制幀,傳遞給MLME

接收處理鉤子(invoke_rx_handlers

  • ieee80211_rx_h_passive_scan

  • ieee80211_rx_h_check

  • ieee80211_rx_h_decrypt

  • ieee80211_rx_h_check_more_data

  • ieee80211_rx_h_sta_process

  • ieee80211_rx_h_defragment

  • ieee80211_rx_h_ps_poll

  • ieee80211_rx_h_michael_mic_verify

  • ieee80211_rx_h_remove_qos_control

  • ieee80211_rx_h_amsdu

  • ieee80211_rx_h_mesh_fwding

  • ieee80211_rx_h_data

  • ieee80211_rx_h_ctrl

  • ieee80211_rx_h_action

  • ieee80211_rx_h_mgmt

發(fā)送路徑

  • 幀傳遞給ieee80211_subif_start_xmit()

  • 把幀轉(zhuǎn)換成802.11格式,丟棄發(fā)給未認(rèn)證工作站的單播包,除了來自本地的EAPOL幀

  • 如果是MONITOR接口,在幀頭部增加radiotap信息

  • 調(diào)用invoke_tx_handlers()處理幀

  • 調(diào)用drv_tx(),把幀傳遞給驅(qū)動

發(fā)送處理鉤子(invoke_tx_handlers

  • ieee80211_tx_h_dynamic_ps

  • ieee80211_tx_h_check_assoc

  • ieee80211_tx_h_ps_buf

  • ieee80211_tx_h_select_key

  • ieee80211_tx_h_sta

  • ieee80211_tx_h_rate_ctrl

  • ieee80211_tx_h_michael_mic_add

  • ieee80211_tx_h_sequence

  • ieee80211_tx_h_fragment

  • ieee80211_tx_h_stats

  • ieee80211_tx_h_encrypt

  • ieee80211_tx_h_calculate_duration

mangement/MLME

  • 狀態(tài)機運行依賴于用戶請求

  • 標(biāo)準(zhǔn)方法如下:

  • proberequest/response

  • authrequest/response

  • assocrequest/response

  • notificationrequest/response

IBSS

  • 嘗試尋找IBSS

  • 加入IBSS或者創(chuàng)建IBSS

  • 如果沒有配對,則周期性地嘗試尋找IBSS并加入

創(chuàng)建接口路徑

  • 創(chuàng)建接口由用戶空間通過nl80211發(fā)起

  • 分配網(wǎng)絡(luò)設(shè)備空間(包含sdata對象空間)

  • 初始化網(wǎng)絡(luò)設(shè)備

  • 初始化sdata對象(包括設(shè)備類型,接口類型,設(shè)備操作函數(shù)等等)

  • 注冊網(wǎng)絡(luò)設(shè)備

  • 把sdata對象加入local->interfaces

刪除接口路徑

  • 刪除接口由用戶空間通過nl80211發(fā)起

  • 把sdata對象從local->interfaces移除

  • 移除網(wǎng)絡(luò)設(shè)備

創(chuàng)建station路徑

  • 創(chuàng)建station由用戶空間通過nl80211發(fā)起

  • 分配sta_info對象空間

  • 初始化sta_info對象(包括偵聽間隔,支持速率集等等)

  • 初始化sta_info對象的速率控制對象

  • 把sta_info對象加入local->sta_pending_list

  • 調(diào)用local->ops->sta_add通知驅(qū)動創(chuàng)建station

  • 把sta_info對象加入local->sta_list

刪除station路徑

  • 刪除station由用戶空間通過nl80211發(fā)起

  • 刪除sta_info對象的key對象

  • 把sta_info對象從local->sta_pending_list移除

  • 調(diào)用local->ops->sta_remove通知驅(qū)動移除station

  • 刪除sta_info對象的速率控制對象

  • 把sta_info對象從local->sta_list移除

掃描請求路徑

  • 掃描請求由用戶空間通過nl80211發(fā)起

  • 如果支持硬件掃描,調(diào)用local->ops->hw_scan()執(zhí)行硬件掃描

  • 否則,調(diào)用ieee80211_start_sw_scan()執(zhí)行軟件掃描

  • 延時喚醒ieee80211_scan_work()

掃描狀態(tài)機路徑

  • 如果存在硬件掃描請求,調(diào)用drv_hw_scan()進行掃描,如果失敗,調(diào)用ieee80211_scan_completed()完成掃描

  • 如果存在掃描請求,同時未進行掃描,調(diào)用__ieee80211_start_scan()進行軟件掃描,如果失敗,調(diào)用ieee80211_scan_completed()完成掃描

  • 根據(jù)next_scan_state調(diào)用相應(yīng)的處理函數(shù)

  • 如果next_delay==0,則繼續(xù)根據(jù)next_scan_state調(diào)用相應(yīng)的處理函數(shù)

  • 延時喚醒ieee80211_scan_work()

6、切換點

配置

  • wirelessextensions (wext)

  • cfg80211(通過nl80211和用戶空間通信)

wext

  • 設(shè)置SSID,BSSID和其他關(guān)聯(lián)參數(shù)

  • 設(shè)置RTS/fragmentationthresholds

  • managed/IBSS模式的加密密鑰

cfg80211

  • 掃描

  • 用戶管理(AP)

  • mesh管理

  • 虛擬接口管理

  • AP模式加密密鑰

mac80211到速率控制

  • 速率控制不是驅(qū)動的一部分

  • 每個驅(qū)動有自己的速率控制選擇算法

  • 速率控制填充ieee80211_tx_info速率信息

  • 速率控制獲取發(fā)送狀態(tài)

mac80211到驅(qū)動

  • 驅(qū)動方法(ieee80211_ops)

  • mac80211有一些輸出函數(shù)

  • 參考include/net/mac80211.h

7、主要函數(shù)

ieee80211_alloc_hw()

  • 分配wiphy對象空間(保證私有數(shù)據(jù)和硬件私有數(shù)據(jù)32字節(jié)對齊,wiphy包含ieee80211_local和驅(qū)動私有數(shù)據(jù))

  • 初始化wiphy對象(包括重傳次數(shù),RTS門限等等)

  • 初始化ieee80211_local(包括重傳次數(shù),工作隊列,接口鏈表等等)

  • 初始化sta_pending_list鏈表

  • 初始化sta_list鏈表

ieee80211_register_hw()

  • 分配int_scan_req數(shù)據(jù)結(jié)構(gòu)

  • 初始化支持接口類型(包括MONITOR接口)

  • 注冊wiphy

  • 初始化WEP

  • 初始化速率控制算法

  • 注冊STA接口(默認(rèn)wlan0)

ieee80211_rx()

  • 拷貝skb,同時在skb頭部增加radiotap信息,傳遞給所有監(jiān)聽接口

  • 如果是數(shù)據(jù)幀,根據(jù)MAC地址查找station

  • 如果station沒有找到,把skb傳遞給所有接口處理

  • 數(shù)據(jù)幀:轉(zhuǎn)換成802.3幀格式,傳遞給網(wǎng)絡(luò)協(xié)議棧

  • 管理幀/控制幀:傳遞給MLME

ieee80211_xmit()

  • 如果skb來自監(jiān)聽接口,移除skb頭部的radiotap信息

  • 進行skb預(yù)處理(包括設(shè)置QoS優(yōu)先級,設(shè)置分段標(biāo)志,ACK應(yīng)答標(biāo)志等等)

  • 選擇加密密鑰

  • 選擇速率(ESP8089采用硬件速率控制,所以mac80211速率控制無效)

  • 加密(mac80211采用硬件加速,所以mac80211加密無效)

  • 通過local->ops->tx()把skb傳遞給驅(qū)動

8、速率控制

Minstrel是mac80211從MadWifi移植過來的速率控制算法,支持多速率重傳和提供最好速率。

工作原理

我們定義衡量吞吐量(發(fā)包數(shù))的成功,用發(fā)送的比特數(shù)。

?

這個措施將獲取無線接口的最大速率編號來調(diào)整傳輸速度。而且,這表示在優(yōu)先使用11Mpbs速率的情況將不使用1Mbps速率。這個模塊將記錄所有已發(fā)送包的成功結(jié)果。通過這個數(shù)據(jù),模塊就有充分的信息去決定哪個包最成功。但是,需要一個可變參數(shù)。去強制模塊檢查最理想的速率。所以,一些百分比的包使用非正常速率進行發(fā)送。


?

重傳序列

一些器件自己已經(jīng)創(chuàng)建多速率重傳序列。比如Atheros11abg芯片組有四個段。每一段指導(dǎo)硬件采用某些速率來發(fā)送當(dāng)前包,和固定的重傳次數(shù)。當(dāng)包發(fā)送成功,剩余重傳序列被忽略。重傳次數(shù)的選擇是根據(jù)期望在26ms內(nèi)發(fā)包出去,或者失敗。重傳序列是通過兩個合理的規(guī)則計算的,如果包是一個普通發(fā)送包(90%的包)那么重傳數(shù)是bestthroughput,nextbest throughput,bestprobability,lowestbaserate。如果是采樣包(10%的包)那么重傳數(shù)是randomlookaround,bestthroughput,bestprobability,lowestbaserate。表格如下:

?

重傳數(shù)是經(jīng)過調(diào)整的,所以重傳序列部分發(fā)送時間小于26ms。表格修改如下:

?

?

EWMA

EWMA(ExponentialWeighted MovingAverage)是Minstrel速率算法的核心。每秒鐘實現(xiàn)10次EWMA計算,每個速率都會進行計算。計算結(jié)果有平滑效果,所以新的結(jié)果對于所選擇的速率有合理的影響。

總結(jié)

以上是生活随笔為你收集整理的IEEE802.11协议栈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。