mac80211分析Word文档下载推荐.docx
《mac80211分析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《mac80211分析Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
WPAD:
图2-1系统框架
1.3代码结构(/net/mac80211/)
∙ieee80211_i.h(主要数据结构)
∙main.c(主函数入口)
∙iface.c(虚拟接口处理)
∙key.c,key.h(密钥管理)
∙sta_info.c,sta_info.h(用户管理)
∙pm.c(功率管理)
∙rate.c,rate.h(速率控制函数)
∙rc80211*(速率控制算法)
∙rx.c(帧接收路径代码)
∙tx.c(帧发送路径代码)
∙scan.c(软件扫描代码)
∙mlme.c(station/managed模式MLME)
∙ibss.c(IBSS
MLME)
∙cfg.c,cfg.h,wext.c(配置入口代码)
∙aes*,tkip*,wep*,michael*,wpa*(WPA/RSN/WEP代码)
∙wme.c,wme.h(QoS代码)
∙util.c(公共函数)
1.4数据结构
ieee80211_local/ieee80211_hw
∙每个数据结构代表一个无线设备(ieee80211_hw嵌入到ieee80211_local)
∙ieee80211_hw是ieee80211_local在驱动中的可见部分
∙包含无线设备的所有操作信息
sta_info/ieee80211_sta
∙代表每一个station
∙可能是mesh,IBSS,AP,WDS
∙ieee80211_sta是驱动可见部分
ieee80211_conf
∙硬件配置
∙当前信道是最重要的字段
∙硬件特殊参数
ieee80211_bss_conf
∙BSS配置
∙多BSSes类型(IBSS/AP/managed)
∙包含比如基础速率位图
∙per
BSS
parameters
in
case
hardware
supports
creating/associating
with
multiple
BSSes
ieee80211_key/ieee80211_key_conf
∙代表加密/解密密钥
∙ieee80211_key_conf提供给驱动用于硬件加速
∙ieee80211_key包含book-keeping和软件解密状态
ieee80211_tx_info
∙大部分复杂数据结构
∙skb部控制缓冲区(cb)
∙经历三个阶段:
1、由mac80211初始化;
2、由驱动使用;
3、由发送状态通告使用
ieee80211_rx_status
∙包含接收帧状态
∙驱动通过接收帧传给mac80211
ieee80211_sub_if_data/ieee80211_vif
∙包含每个虚拟接口信息
∙ieee80211_vif
is
passed
to
driver
for
those
virtual
interfaces
the
knows
about
(no
monitor,VLAN)
∙包含的sub-structures取决于模式
1.5主要流程
配置
∙所有发起来自用户空间(wext或者nl80211)
∙managed和IBSS模式:
触发状态机(基于workqueue)
∙有些操作或多或少直接通过驱动传递(比如信道设置)
接收路径
∙ieee80211_tasklet_handler,响应中断,在下半部tasklet处理数据,
∙通过函数ieee80211_rx()接收帧
∙调用ieee80211_rx_monitor()拷贝帧传递给所有监听接口
∙调用invoke_rx_handlers()处理帧
∙如果是数据帧,转换成802.3帧格式,传递给上层协议栈ieee80211_deliver_skb(rx.c中)→netif_receive_skb上送网络。
∙如果是管理帧/控制帧,传递给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
发送路径
∙帧传递给ieee80211_subif_start_xmit()
∙把帧转换成802.11格式,丢弃发给未认证工作站的单播包,除了来自本地的EAPOL帧
∙如果是MONITOR接口,在帧头部增加radiotap信息
∙调用invoke_tx_handlers()处理帧
∙调用drv_tx(),把帧传递给驱动
发送处理钩子(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
∙状态机运行依赖于用户请求
∙标准方法如下:
∙probe
request/response
∙auth
∙assoc
∙notification
IBSS
∙尝试寻找IBSS
∙加入IBSS或者创建IBSS
∙如果没有配对,则周期性地尝试寻找IBSS并加入
创建接口路径
∙创建接口由用户空间通过nl80211发起
∙分配网络设备空间(包含sdata对象空间)
∙初始化网络设备
∙初始化sdata对象(包括设备类型,接口类型,设备操作函数等等)
∙注册网络设备
∙把sdata对象加入local->
interfaces
删除接口路径
∙删除接口由用户空间通过nl80211发起
∙把sdata对象从local->
interfaces移除
∙移除网络设备
创建station路径
∙创建station由用户空间通过nl80211发起
∙分配sta_info对象空间
∙初始化sta_info对象(包括侦听间隔,支持速率集等等)
∙初始化sta_info对象的速率控制对象
∙把sta_info对象加入local->
sta_pending_list
∙调用local->
ops->
sta_add通知驱动创建station
sta_list
删除station路径
∙删除station由用户空间通过nl80211发起
∙删除sta_info对象的key对象
∙把sta_info对象从local->
sta_pending_list移除
sta_remove通知驱动移除station
∙删除sta_info对象的速率控制对象
sta_list移除
扫描请求路径
∙扫描请求由用户空间通过nl80211发起
∙如果支持硬件扫描,调用local->
hw_scan()执行硬件扫描
∙否则,调用ieee80211_start_sw_scan()执行软件扫描
∙延时唤醒ieee80211_scan_work()
扫描状态机路径
∙如果存在硬件扫描请求,调用drv_hw_scan()进行扫描,如果失败,调用ieee80211_scan_completed()完成扫描
∙如果存在扫描请求,同时未进行扫描,调用__ieee80211_start_scan()进行软件扫描,如果失败,调用ieee80211_scan_completed()完成扫描
∙根据next_scan_state调用相应的处理函数
∙如果next_delay==0,则继续根据next_scan_state调用相应的处理函数
管理报文接收
对于管理帧,通常是ieee80211_rx_handlers调用ieee80211_rx_h_mgmt,然后用wq的方式调用ieee80211_iface_work进一步调用ieee80211_sta_rx_queued_mgmt去处理。
Beacon响应流程
认证和关联
wpa_s->
drv_flags&
WPA_DRIVER_FLAGS_SME
1.true):
sme_authenticate->
wpa_driver_nl80211_authenticate...->
cfg80211_mlme_auth
2.false):
wpa_drv_associate->
wpa_driver_nl80211_connect...->
上线过程流程:
1.nl80211_connect
2.
cfg80211_connect(afterscanandhavebbs)
3.
cfg80211_conn_do_work
4.
__cfg80211_mlme_auth
5.
rdev->
auth(&
wiphy,dev,&
req);
6.CallBackbyrxirq:
7.ieee80211_rx_irqsafe
8.ieee80211_tasklet_handler
9.
ieee80211_rx
10.
__ieee80211_rx_handle_packet
11.
ieee80211_prepare_and_rx_handle
12.
ieee80211_invoke_rx_handlers
13.
ieee80211_rx_handlers
14.
ieee80211_rx_h_mgmt
15.Queuework:
16.ieee80211_iface_work(iface.c)
17.
ieee80211_sta_rx_queued_mgmt
18.
ieee80211_rx_mgmt_auth
19.
cfg80211_send_rx_auth
20.
nl80211_send_rx_auth(告诉用户空间)
21.
cfg80211_sme_rx_auth
22.
schedule_work(&
conn_work)
23.Queuework:
24.cfg80211_conn_work
25.
__cfg80211_mlme_assoc
26.
assoc
27.CallBackbyrxirq
28.....
29.ieee80211_sta_rx_queued_mgmt
30.
ieee80211_rx_mgmt_assoc_resp
31.
ieee80211_assoc_success
32.
ieee80211_sta_rx_notify
33.
通过timer定时触发ieee80211_mgd_probe_ap_send
34.
发送nullfunction或者probe_req
35.
cfg80211_send_rx_assoc
36.
nl80211_send_rx_assoc(告诉用户空间)
37.
__cfg80211_connect_result
38.
nl80211_send_connect_result
39.
cfg80211_upload_connect_keys
40.
add_key
1.6切换点
∙wireless
extensions
(wext)
∙cfg80211
(通过nl80211和用户空间通信)
wext
∙设置SSID,BSSID和其他关联参数
∙设置RTS/fragmentation
thresholds
∙managed/IBSS模式的加密密钥
cfg80211
∙扫描
∙用户管理(AP)
∙mesh管理
∙虚拟接口管理
∙AP模式加密密钥
从mac80211到速率控制
∙速率控制不是驱动的一部分
∙每个驱动有自己的速率控制选择算法
∙速率控制填充ieee80211_tx_info速率信息
∙速率控制获取发送状态
从mac80211到驱动
∙驱动方法(ieee80211_ops)
∙mac80211有一些输出函数
∙参考include/net/mac80211.h
1.7主要函数
ieee80211_alloc_hw()
∙分配wiphy对象空间(保证私有数据和硬件私有数据32字节对齐,wiphy包含ieee80211_local和驱动私有数据)
∙初始化wiphy对象(包括重传次数,RTS门限等等)
∙初始化ieee80211_local(包括重传次数,工作队列,接口链表等等)
∙初始化sta_pending_list链表
∙初始化sta_list链表
ieee80211_register_hw()
∙分配int_scan_req数据结构
∙初始化支持接口类型(包括MONITOR接口)
∙注册wiphy
∙初始化WEP
∙初始化速率控制算法
∙注册STA接口(默认wlan0)
ieee80211_rx()
∙拷贝skb,同时在skb头部增加radiotap信息,传递给所有监听接口
∙如果是数据帧,根据MAC地址查找station
∙如果station没有找到,把skb传递给所有接口处理
∙数据帧:
转换成802.3帧格式,传递给网络协议栈
∙管理帧/控制帧:
传递给MLME
ieee80211_xmit()
∙如果skb来自监听接口,移除skb头部的radiotap信息
∙进行skb预处理(包括设置QoS优先级,设置分段标志,ACK应答标志等等)
∙选择加密密钥
∙选择速率(ESP8089采用硬件速率控制,所以mac80211速率控制无效)
∙加密(mac80211采用硬件加速,所以mac80211加密无效)
∙通过local->
tx()把skb传递给驱动
1.8速率控制
Minstrel是mac80211从MadWifi移植过来的速率控制算法,支持多速率重传和提供最好速率。
工作原理
我们定义衡量吞吐量(发包数)的成功,用发送的比特数。
这个措施将获取无线接口的最大速率编号来调整传输速度。
而且,这表示在优先使用11Mpbs速率的情况将不使用1Mbps速率。
这个模块将记录所有已发送包的成功结果。
通过这个数据,模块就有充分的信息去决定哪个包最成功。
但是,需要一个可变参数。
去强制模块检查最理想的速率。
所以,一些百分比的包使用非正常速率进行发送。
重传序列
一些器件自己已经创建多速率重传序列。
比如Atheros
11abg芯片组有四个段。
每一段指导硬件采用某些速率来发送当前包,和固定的重传次数。
当包发送成功,剩余重传序列被忽略。
重传次数的选择是根据期望在26ms发包出去,或者失败。
重传序列是通过两个合理的规则计算的,如果包是一个普通发送包(90%的包)那么重传数是best
throughput,next
best
throughput,best
probability,lowest
baserate。
如果是采样包(10%的包)那么重传数是random
lookaround,best
表格如下:
重传数是经过调整的,所以重传序列部分发送时间小于26ms。
表格修改如下:
EWMA
EWMA(Exponential
Weighted
Moving
Average)是Minstrel速率算法的核心。
每秒钟实现10次EWMA计算,每个速率都会进行计算。
计算结果有平滑效果,所以新的结果对于所选择的速率有合理的影响。