1、mac80211分析mac80211源码分析1.概述2.体系结构3.代码结构4.数据结构5.主要流程6.切换点7.主要函数8.速率控制1.1概述mac80211:是一个Linux核子系统,是驱动开发者可用于为SoftMAC无线设备写驱动的框架。mac80211在核空间实现STA模式,在用户空间实现AP模式(hostapd)。cfg80211:用于对无线设备进行配置管理,与FullMAC,mac80211和nl80211一起工作。nl80211:用于对无线设备进行配置管理,它是一个基本Netlink的用户态协议。MLME:即MAC(MediaAccessControl)LayerManageme
2、ntEntity,它管理物理层MAC状态机。SoftMAC: 其MLME由软件实现,mac80211为SoftMAC实现提供了一个API。即:SoftMAC设备允许对硬件执行更好地控制,允许用软件实现对 802.11的帧管理,包括解析和产生802.11无线帧。目前大多数802.11设备为SoftMAC,而FullMAC设备较少。FullMAC:其MLME由硬件管理,当写FullMAC无线驱动时,不需要使用mac80211。wpa_supplicant:是用户空间一个应用程序,主要发起MLME命令,然后处理相关结果。hostpad:是用户空间一个应用程序,主要实现station接入认证管理。1.
3、2体系结构HOSTAPD: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(IBSSMLME)cfg.c,cfg.h,wext.c(配置入口代码
4、)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,WDSieee80211_sta是驱动可见部分ieee80211_conf硬件配置当前信
5、道是最重要的字段硬件特殊参数ieee80211_bss_confBSS配置多BSSes类型(IBSS/AP/managed)包含比如基础速率位图perBSSparametersincasehardwaresupportscreating/associatingwithmultipleBSSesieee80211_key/ieee80211_key_conf代表加密/解密密钥ieee80211_key_conf提供给驱动用于硬件加速ieee80211_key包含book-keeping和软件解密状态ieee80211_tx_info大部分复杂数据结构skb部控制缓冲区(cb)经历三个阶段:1、由
6、mac80211初始化;2、由驱动使用;3、由发送状态通告使用ieee80211_rx_status包含接收帧状态驱动通过接收帧传给mac80211ieee80211_sub_if_data/ieee80211_vif包含每个虚拟接口信息ieee80211_vifispassedtodriverforthosevirtualinterfacesthedriverknowsabout(nomonitor,VLAN)包含的sub-structures取决于模式1.5主要流程配置所有发起来自用户空间(wext或者nl80211)managed和IBSS模式:触发状态机(基于workqueue)有些操
7、作或多或少直接通过驱动传递(比如信道设置)接收路径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_
8、scanieee80211_rx_h_checkieee80211_rx_h_decryptieee80211_rx_h_check_more_dataieee80211_rx_h_sta_processieee80211_rx_h_defragmentieee80211_rx_h_ps_pollieee80211_rx_h_michael_mic_verifyieee80211_rx_h_remove_qos_controlieee80211_rx_h_amsduieee80211_rx_h_mesh_fwdingieee80211_rx_h_dataieee80211_rx_h_ctrli
9、eee80211_rx_h_actionieee80211_rx_h_mgmt发送路径帧传递给ieee80211_subif_start_xmit()把帧转换成802.11格式,丢弃发给未认证工作站的单播包,除了来自本地的EAPOL帧如果是MONITOR接口,在帧头部增加radiotap信息调用invoke_tx_handlers()处理帧调用drv_tx(),把帧传递给驱动发送处理钩子(invoke_tx_handlers)ieee80211_tx_h_dynamic_psieee80211_tx_h_check_associeee80211_tx_h_ps_bufieee80211_tx_
10、h_select_keyieee80211_tx_h_staieee80211_tx_h_rate_ctrlieee80211_tx_h_michael_mic_addieee80211_tx_h_sequenceieee80211_tx_h_fragmentieee80211_tx_h_statsieee80211_tx_h_encryptieee80211_tx_h_calculate_durationmangement/MLME状态机运行依赖于用户请求标准方法如下:proberequest/responseauthrequest/responseassocrequest/response
11、notificationrequest/responseIBSS尝试寻找IBSS加入IBSS或者创建IBSS如果没有配对,则周期性地尝试寻找IBSS并加入创建接口路径创建接口由用户空间通过nl80211发起分配网络设备空间(包含sdata对象空间)初始化网络设备初始化sdata对象(包括设备类型,接口类型,设备操作函数等等)注册网络设备把sdata对象加入local-interfaces删除接口路径删除接口由用户空间通过nl80211发起把sdata对象从local-interfaces移除移除网络设备创建station路径创建station由用户空间通过nl80211发起分配sta_info
12、对象空间初始化sta_info对象(包括侦听间隔,支持速率集等等)初始化sta_info对象的速率控制对象把sta_info对象加入local-sta_pending_list调用local-ops-sta_add通知驱动创建station把sta_info对象加入local-sta_list删除station路径删除station由用户空间通过nl80211发起删除sta_info对象的key对象把sta_info对象从local-sta_pending_list移除调用local-ops-sta_remove通知驱动移除station删除sta_info对象的速率控制对象把sta_info
13、对象从local-sta_list移除扫描请求路径扫描请求由用户空间通过nl80211发起如果支持硬件扫描,调用local-ops-hw_scan()执行硬件扫描否则,调用ieee80211_start_sw_scan()执行软件扫描延时唤醒ieee80211_scan_work()扫描状态机路径如果存在硬件扫描请求,调用drv_hw_scan()进行扫描,如果失败,调用ieee80211_scan_completed()完成扫描如果存在扫描请求,同时未进行扫描,调用_ieee80211_start_scan()进行软件扫描,如果失败,调用ieee80211_scan_completed()完
14、成扫描根据next_scan_state调用相应的处理函数如果next_delay=0,则继续根据next_scan_state调用相应的处理函数延时唤醒ieee80211_scan_work()管理报文接收 对于管理帧,通常是ieee80211_rx_handlers调用ieee80211_rx_h_mgmt,然后用wq的方式调用ieee80211_iface_work进一步调用ieee80211_sta_rx_queued_mgmt去处理。Beacon响应流程认证和关联wpa_s-drv_flags & WPA_DRIVER_FLAGS_SME1.true): sme_authentica
15、te-wpa_driver_nl80211_authenticate.-cfg80211_mlme_auth2.false): wpa_drv_associate-wpa_driver_nl80211_connect.-cfg80211_mlme_auth上线过程流程:1.nl80211_connect2.cfg80211_connect(after scan and have bbs)3.cfg80211_conn_do_work4._cfg80211_mlme_auth5.rdev-ops-auth(&rdev-wiphy, dev, &req);6.CallBack by rx irq:
16、7.ieee80211_rx_irqsafe8.ieee80211_tasklet_handler9.ieee80211_rx10._ieee80211_rx_handle_packet11.ieee80211_prepare_and_rx_handle12.ieee80211_invoke_rx_handlers13.ieee80211_rx_handlers14.ieee80211_rx_h_mgmt15.Queuework:16.ieee80211_iface_work(iface.c)17.ieee80211_sta_rx_queued_mgmt18.ieee80211_rx_mgmt
17、_auth19.cfg80211_send_rx_auth20.nl80211_send_rx_auth(告诉用户空间)21.cfg80211_sme_rx_auth22.schedule_work(&rdev-conn_work)23.Queuework:24.cfg80211_conn_work25._cfg80211_mlme_assoc26.rdev-ops-assoc27.CallBack by rx irq28.29.ieee80211_sta_rx_queued_mgmt30.ieee80211_rx_mgmt_assoc_resp31.ieee80211_assoc_succe
18、ss32.ieee80211_sta_rx_notify33.通过timer定时触发 ieee80211_mgd_probe_ap_send34.发送nullfunction或者probe_req35.cfg80211_send_rx_assoc36.nl80211_send_rx_assoc(告诉用户空间)37._cfg80211_connect_result38.nl80211_send_connect_result39.cfg80211_upload_connect_keys40.rdev-ops-add_key1.6切换点配置wirelessextensions(wext)cfg802
19、11(通过nl80211和用户空间通信)wext设置SSID,BSSID和其他关联参数设置RTS/fragmentationthresholdsmanaged/IBSS模式的加密密钥cfg80211扫描用户管理(AP)mesh管理虚拟接口管理AP模式加密密钥从mac80211到速率控制速率控制不是驱动的一部分每个驱动有自己的速率控制选择算法速率控制填充ieee80211_tx_info速率信息速率控制获取发送状态从mac80211到驱动驱动方法(ieee80211_ops)mac80211有一些输出函数参考include/net/mac80211.h1.7主要函数ieee80211_alloc
20、_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头部增加radi
21、otap信息,传递给所有监听接口如果是数据帧,根据MAC地址查找station如果station没有找到,把skb传递给所有接口处理数据帧:转换成802.3帧格式,传递给网络协议栈管理帧/控制帧:传递给MLMEieee80211_xmit()如果skb来自监听接口,移除skb头部的radiotap信息进行skb预处理(包括设置QoS优先级,设置分段标志,ACK应答标志等等)选择加密密钥选择速率(ESP8089采用硬件速率控制,所以mac80211速率控制无效)加密(mac80211采用硬件加速,所以mac80211加密无效)通过local-ops-tx()把skb传递给驱动1.8速率控制Min
22、strel是mac80211从MadWifi移植过来的速率控制算法,支持多速率重传和提供最好速率。工作原理我们定义衡量吞吐量(发包数)的成功,用发送的比特数。这个措施将获取无线接口的最大速率编号来调 整传输速度。而且,这表示在优先使用11Mpbs速率的情况将不使用1Mbps速率。这个模块将记录所有已发送包的成功结果。通过这个数据,模块就有充分 的信息去决定哪个包最成功。但是,需要一个可变参数。去强制模块检查最理想的速率。所以,一些百分比的包使用非正常速率进行发送。重传序列一些器件自己已经创建多速率重传序列。比如 Atheros11abg芯片组有四个段。每一段指导硬件采用某些速率来发送当前包,和
23、固定的重传次数。当包发送成功,剩余重传序列被忽略。重传次数的 选择是根据期望在26ms发包出去,或者失败。重传序列是通过两个合理的规则计算的,如果包是一个普通发送包(90%的包)那么重传数是 bestthroughput,nextbestthroughput,bestprobability,lowestbaserate。如果 是采样包(10%的包)那么重传数是 randomlookaround,bestthroughput,bestprobability,lowestbaserate。表格如下:重传数是经过调整的,所以重传序列部分发送时间小于26ms。表格修改如下:EWMAEWMA(ExponentialWeightedMovingAverage)是Minstrel速率算法的核心。每秒钟实现10次EWMA计算,每个速率都会进行计算。计算结果有平滑效果,所以新的结果对于所选择的速率有合理的影响。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1