http://blog.csdn.net/myarrow/article/details/9271515
1. 基本概念
• cfg80211: 用于對無線裝置進行配置管理。與FullMAC, mac80211和nl80211一起工作。(Kernel态)
• mac80211: 是一個driver開發者可用于為SoftMAC無線裝置寫驅動的架構 (Kernel态)。
• nl80211: 用于對無線裝置進行配置管理,它是一個基本Netlink的使用者态協定(User态)
• WNIC : Wireless Network Interface Controller, 它總是指望硬體執行協定(如IEEE802.11)描述的功能。
• 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。
• wpa_supplicant: 是使用者空間一個應用程式,主要發起MLME指令,然後處理相關結果。
•
2. cfg80211
cfg80211是Linux 802.11配置API。cfg80211用于代碼wext(Wireless-Extensions),nl80211用于配置一個cfg80211裝置,且用于kernel與userspace間的通信。wext現處理維護狀态,沒有新的功能被增加,隻是修改bug。如果需要通過wext操作,則需要定義CONFIG_CFG80211_WEXT。
cfg80211 and nl80211: 基于消息機制,使用netlink接口
wext: 基于ioctl機制
• struct ieee80211_hw: 表示硬體資訊和狀态
• ieee80211_alloc_hw:每個driver調用ieee80211_alloc_hw配置設定ieee80211_hw,且以ieee80211_ops為參數
• ieee80211_register_hw:每個driver調用ieee80211_register_hw建立wlan0和 wmaster0,并進行各種初始化。
• struct ieee80211_ops:每個driver實作它的成員函數,且它的成員函數都以struct ieee80211_hw做為第一個參數。在struct ieee80211_ops中定義了24個方法,以下7個方法必須實作:
tx,start,stop,add_interface,remove_interface,config和configure_filter。
3. mac80211
它是一個driver開發者可用于為SoftMAC無線裝置寫驅動的架構,mac80211為SoftMAC裝置實作了cfg80211回調函數,且mac80211通過cfg80211實作了向網絡子系統注冊和配置。配置由cfg80211通過nl80211和wext實作。
mac80211在體系結構中的位置如下圖所示:
4. socket
http://wireless.kernel.org/en/developers/Documentation/
IEEE802.11協定基礎知識
http://blog.csdn.net/myarrow/article/details/9306961
1. 802.11管理功能–使用者接入過程
STA (工作站)啟動初始化、開始正式使用、AP 傳送資料幀之前,要經過三個階段才能接入:
(1) 掃描(SCAN)
(2) 認證(Authentication)
(3) 關聯(Association)
1.1 802.11管理–掃描(SCAN)
1) 若無線站點 STA 設成 Ad-hoc (無AP)模式:
STA先尋找是否已有 IBSS(與STA所屬相同的SSID)存在,如有,則參加(join);若無, 則會自己建立一個IBSS,等其他站來 join。
2) 若無線站點 STA 設成 Infrastructure (有AP)模式:
--主動掃描方式 (特點:能迅速找到)
•依次在每個信道上發送Probe request封包,從Probe Response中擷取BSS的基本資訊, Probe Response包含的資訊和Beacon幀類似
-- 被動掃描方式 (特點:找到時間較長,但STA節電)
• 通過偵聽AP定期發送的Beacon幀來發現網絡, Beacon幀中包含該AP所屬的BSS的基本資訊以及AP的基本能力級,包括: BSSID(AP的MAC位址)、 SSID、支援的速率、支援的認證方式,加密算法、 Beacons幀發送間隔,使用的信道等 • 當未發現包含期望的SSID的BSS時,STA可以工作于IBSS狀态
1.2 802.11管理功能–認證(Authentication)
802.11支援兩種基本的認證方式: • Open-system Authentication 1) 等同于不需要認證,沒有任何安全防護能力 2) 通過其他方式來保證使用者接入網絡的安全性,例如Address filter、使用者封包中的SSID
• Shared-Key Authentication 1) 采用WEP加密算法 2) Attacker可以通過監聽AP發送的明文Challenge text和STA回複的密文Challenge text計算出WEP KEY
另外, STA可以通過Deauthentication來終結認證關系。
1.3 802.11管理功能–關聯(Association)
1) Association
• STA通過Association和一個AP建立關聯,後續的資料封包的收發隻能和建立Association關系的AP進行 2) Reassociation • STA在從一個老的AP移動到新AP時通過Reassociation和新AP建立關聯 • Reassociation前必須經曆Authentication過程 3) Deassociation • STA通過Deassociation和AP解除關聯關系
2. 802.11相關協定
3. 802.11幀格式
3.1 802.11 MAC Header(MAC頭)
• Frame Control(幀控制域)
• Duration/ID(持續時間/辨別)
• Address(位址域)
• Sequence Control(序列控制域)
3.1.1 Frame Control(幀控制域)
• Protocol Version(協定版本):通常為0;
• Type(類型域)和Subtype(子類型域):共同指出幀的類型;
• To DS:表明該幀是BSS向DS發送的幀;
• From DS:表明該幀是DS向BSS發送的幀;
• More Frag:用于說明長幀被分段的情況,是否還有其它的幀;
• Retry(重傳域):用于幀的重傳,接收STA利用該域消除重傳幀;
• Pwr Mgt(能量管理域):1:STA處于power_save模式;0:處于active模式;
• More Data(更多資料域):1:至少還有一個資料幀要發送給STA ;
• Protected Frame: 1:幀體部分包含被密鑰套處理過的資料;否則:0;
• Order(序号域):1:長幀分段傳送采用嚴格編号方式;否則:0。
3.1.2 Duration/ID(持續時間/辨別)
表明該幀和它的确認幀将會占用信道多長時間;對于幀控制域子類型為:Power Save-Poll的幀,該域表示了STA的連接配接身份(AID, Association Indentification)。
3.1.3 Address(位址域)
Address(位址域):源位址(SA)、目的位址(DA)、傳輸工作站位址(TA)、接收工作站位址(RA),SA與DA必不可少,後兩個隻對跨BSS的通信有用,而目的位址可以為單點傳播位址(Unicast address)、多點傳播位址(Multicast address)、廣播位址(Broadcast address)。
3.1.4 Sequence Control(序列控制域)
Sequence Control(序列控制域):由代表MSDU(MAC Server Data Unit)或者MMSDU(MAC Management Server Data Unit)的12位序列号(Sequence Number)和表示MSDU和MMSDU的每一個片段的編号的4位片段号組成(Fragment Number)。
3.2 Frame Body(幀體部分)
包含資訊根據幀的類型有所不同,主要封裝的是上層的資料單元,長度為0~2312個位元組,可以推出,802.11幀最大長度為:2346個位元組;
3.3 FCS(校驗域)
包含32位循環備援碼。
3.4 位址格式
1) 方案一:
A和B 在同一個IBSS,A->B (Ad hoc無線自組網中的資料幀的位址格式)。
2) 方案二:
從AP發出的無線資料幀中的位址格式。
3) 方案三:
發到AP的無線資料幀中的位址格式。
4) 方案四:
通過無線分布系統傳輸的無線資料幀中的位址格式。
4. WLAN拓撲結構
WLAN有以下三種網絡拓撲結構:
1) 獨立基本服務集(Independent BSS, IBSS)網絡(也叫ad-hoc網絡);
2) 基本服務集(Basic Service Set, BSS)網絡;
3) 擴充服務集(Extent Service Set, ESS)網絡。
其各自的特點如下所示:
4.1 IBSS-無AP
也叫Ad Hoc 網(無線自組網):IBSS (Independent BSS,獨立基本服務集),無AP,站點間直接通信。
4.2 BSS-有AP
又名Infrastructured網(基礎設施網):有AP(Access Point, 接入點),無線站點通信首先要經過AP。
4.3 ESS-有AP和DS
ESS:屬 Infrastructured 網 ( DS:配置設定系統,AP:接入點, SSID:ESS擴充服務集辨別符。一個移動節點使用某 ESS 的 SSID 加入到該擴充服務集中,一旦加入ESS,移動節點便可實作從該ESS的一個BSS到另一個BSS的漫遊)
5. 802.11幀類型
針對幀的不同功能,可将802.11中的MAC幀細分為以下3類:
• 資料幀:用于在競争期和非競争期傳輸資料;
• 控制幀:用于競争期間的握手通信和正向确認(RTS信道預約、CTS預約成功、ACK等)、結束非競争期等,為資料幀的發送提供輔助功能;
• 管理幀:主要用于STA與AP之間協商、關系的控制,如關聯、認證、同步等。
Frame Control(幀控制域)中的Type(類型域)和Subtype(子類型域)共同指出幀的類型,當Type的B3B2位為00時,該幀為管理幀;為01時,該幀為控制幀;為10時,該幀為資料幀。而Subtype進一步判斷幀類型,如管理幀裡頭細分為關聯和認證幀
5.1 管理幀 (Management Frame)
Type | SubType | FrameType |
00 | 0000 | Association request (連接配接請求) |
00 | 0001 | Association response (連接配接響應) |
00 | 0010 | Reassociation request(重連接配接請求) |
00 | 0011 | Reassociation response(重連接配接聯響應) |
00 | 0100 | Probe request(探測請求) |
00 | 0101 | Probe response(探測響應) |
00 | 1000 | Beacon(信标,被動掃描時AP 發出,notify) |
00 | 1001 | ATIM(通知傳輸訓示消息) |
00 | 1010 | Disassociation(解除連接配接,notify) |
00 | 1011 | Authentication(身份驗證) |
00 | 1100 | Deauthentication(解除認證,notify) |
00 | 1101~1111 | Reserved(保留,未使用) |
ATIM:Announcement Traffic Indication Message,ATIM僅在ATIM視窗期間傳送,ATIM沒有負載。
5.2 控制幀 (Control Frame)
Type | Subtype | Frametype |
01 | 1010 | Power Save(PS)- Poll(省電-輪詢) |
01 | 1011 | RTS(請求發送,即: Request To Send ,預約信道,幀長20位元組) |
01 | 1100 | CTS(清除發送,即:Clear To Send ,同意預約,幀長14位元組) |
01 | 1101 | ACK(确認) |
01 | 1110 | CF-End(無競争周期結束) |
01 | 1111 | CF-End(無競争周期結束)+CF-ACK(無競争周期确認) |
RTS和CTS用于信道預約,CF-End+CF_ACK和ACK用于确認正确接收到幀。
1) ACK幀
5.3 資料幀 (Data Frame)
Type | Subtype | Frametype |
10 | 0000 | Data(資料) |
10 | 0001 | Data+CF-ACK |
10 | 0010 | Data+CF-Poll |
10 | 0011 | Data+CF-ACK+CF-Poll |
10 | 0100 | Null data(無資料:未傳送資料) |
10 | 0101 | CF-ACK(未傳送資料) |
10 | 0110 | CF-Poll(未傳送資料) |
10 | 0111 | Data+CF-ACK+CF-Poll |
10 | 1000 | Qos Data |
10 | 1001 | Qos Data + CF-ACK |
10 | 1010 | Qos Data + CF-Poll |
10 | 1011 | Qos Data + CF-ACK+ CF-Poll |
10 | 1100 | QoS Null(未傳送資料) |
10 | 1101 | QoS CF-ACK(未傳送資料) |
10 | 1110 | QoS CF-Poll(未傳送資料) |
10 | 1111 | QoS CF-ACK+ CF-Poll(未傳送資料) |
Linux Wireless子系統初始化
http://blog.csdn.net/myarrow/article/details/9300823
1. cfg80211_init
• cfg80211_wq工作隊列主要處理以下工作:
1) 清除:wireless_dev.cleanup_work
2) 掃描:cfg80211_registered_device.scan_done_wk
3) 事件:cfg80211_registered_device.event_work
• 注冊netlink,其名為:"nl80211",其操作為:nl80211_ops
net/wireless/core.c
[cpp] view plain copy
- static int __init cfg80211_init(void)
- {
- int err;
- // 注冊網絡命名空間
- err = register_pernet_device(&cfg80211_pernet_ops);
- if (err)
- goto out_fail_pernet;
- // 注冊ieee80211_class類
- err = wiphy_sysfs_init();
- if (err)
- goto out_fail_sysfs;
- // 注冊網絡通知,以接收網絡事件
- err = register_netdevice_notifier(&cfg80211_netdev_notifier);
- if (err)
- goto out_fail_notifier;
- // 注冊netlink "nl80211",其操作為nl80211_ops
- err = nl80211_init();
- if (err)
- goto out_fail_nl80211;
- // 建立sys/class/ieee80211目錄
- ieee80211_debugfs_dir = debugfs_create_dir("ieee80211", NULL);
- err = regulatory_init();
- if (err)
- goto out_fail_reg;
- // 建立名為“cfg80211”的核心線程
- cfg80211_wq = create_singlethread_workqueue("cfg80211");
- if (!cfg80211_wq)
- goto out_fail_wq;
- return 0;
- out_fail_wq:
- regulatory_exit();
- out_fail_reg:
- debugfs_remove(ieee80211_debugfs_dir);
- out_fail_nl80211:
- unregister_netdevice_notifier(&cfg80211_netdev_notifier);
- out_fail_notifier:
- wiphy_sysfs_exit();
- out_fail_sysfs:
- unregister_pernet_device(&cfg80211_pernet_ops);
- out_fail_pernet:
- return err;
- }
- subsys_initcall(cfg80211_init);