mac80211分析.docx

上传人:b****8 文档编号:9209992 上传时间:2023-02-03 格式:DOCX 页数:16 大小:372.37KB
下载 相关 举报
mac80211分析.docx_第1页
第1页 / 共16页
mac80211分析.docx_第2页
第2页 / 共16页
mac80211分析.docx_第3页
第3页 / 共16页
mac80211分析.docx_第4页
第4页 / 共16页
mac80211分析.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

mac80211分析.docx

《mac80211分析.docx》由会员分享,可在线阅读,更多相关《mac80211分析.docx(16页珍藏版)》请在冰豆网上搜索。

mac80211分析.docx

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 (Media Access Control) Layer Management Entity,它管理物理层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.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(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 driver 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 request/response

∙assoc request/response

∙notification request/response

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_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对象从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()完成扫描

∙根据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_SME

1.true):

sme_authenticate->wpa_driver_nl80211_authenticate...->cfg80211_mlme_auth

2.false):

 wpa_drv_associate->wpa_driver_nl80211_connect...->cfg80211_mlme_auth

上线过程流程:

1.nl80211_connect

2.    cfg80211_connect(afterscanandhavebbs)

3.        cfg80211_conn_do_work

4.            __cfg80211_mlme_auth

5.                rdev->ops->auth(&rdev->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(&rdev->conn_work)

23.Queuework:

24.cfg80211_conn_work

25.    __cfg80211_mlme_assoc

26.        rdev->ops->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.                    rdev->ops->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->ops->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 throughput,best probability,lowest baserate。

表格如下:

重传数是经过调整的,所以重传序列部分发送时间小于26ms。

表格修改如下:

EWMA

EWMA(Exponential Weighted Moving Average)是Minstrel速率算法的核心。

每秒钟实现10次EWMA计算,每个速率都会进行计算。

计算结果有平滑效果,所以新的结果对于所选择的速率有合理的影响。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1