1. mac80211概览
目录
mac80211是linux kernel中的一个子系统,它为无线设备soft-MAC/half-MAC提供了分享实施方案,包含MLME和另外一些代码
2. mac80211架构
3. mac80211代码结构
kernel提供的驱动API,该文件定义了mac8011源码中使用的API:
include/net/mac80211.h
以下是net/mac80211源码中除了头文件外的重要组成:
files | function |
---|---|
Kconfig, Makefile | build system |
ieee80211_i.h | most internal data structures |
main.c | (reg/dereg) |
iface.c | virtual interface handling |
key.c, key.h | key management |
sta_info.c, sta_info.h | Station (peer) management |
pm.c | power management (suspend/hibernate) |
rate.c, rate.h | internal rate control functions |
rc80211*.c | rate control algorithms |
rx.c | frame receive path |
tx.c | frame transmit path |
scan.c | software scanning cod |
ht.c, agg-rx.c, agg-tx.c | HT/aggregation code |
meshf, hwmp, plink,pathtblg.fc,hg | 802.11s mesh |
mlme.c | Station/managed mode MLME |
ibss.c | IBSS MLME |
cfg.c, cfg.h, wext.c | conguration entry points |
event.c | events to userspace |
spectmgmt.c | spectrum management code |
aes*, tkip., wep., michael., wpa. | WPA/RSN/WEP code |
wme.c, wme.h | some QoS code |
util.c | utility functions |
led.c, led.h | LED handling |
debugfs* | debugfs code |
4. mac80211数据结构体
4.1 ieee80211 local/ieee80211 hw
这两个结构体用来表示每一个无线设备, ieee80211_hw
是 ieee80211_local
的队驱动可视的一部分,它们包含了所有无线设备的操作信息。
4.2 sta_info/ieee80211_sta
表示任何一个站点peer,mesh peer,IBSS peer,AP,WDS peer,也能做DLS peer。 ieee80211_sta是对驱动可视的一部分。它们的生命周期管理依赖RCU
4.3 ieee80211_conf
表示硬件的配置信息,最重要的是当年的频率,它是硬件最特殊的参数结构体
4.4 ieee80211 bss conf
表示BSS的配置,且包含所有类别的BSSes。
4.5 ieee80211 key/ieee80211 key conf
表示加密和解密的key。
4.6 ieee80211 tx info
最复杂的数据结构体,用在skb的控制buffer中。
4.7 ieee80211 rx status
包含了接收帧的状态,可以通过mac80211驱动接收数据帧
4.8 ieee80211 sub if data/ieee80211 vif
包含了每个虚拟接口的信息。包括的子结构体
- ieee80211 if ap
- ieee80211 if wds
- ieee80211 if vlan
- ieee80211 if managed
- ieee80211 if ibss
- ieee80211 if mesh
5. mac80211主要流程
5.1 配置
所有发起来自用户空间(wext或者nl80211) managed和IBSS模式:触发状态机(基于workqueue) 有些操作或多或少直接通过驱动传递(比如信道设置)
5.2 接收路径
通过函数 ieee80211_rx()
接收帧 调用 ieee80211_rx_monitor()
拷贝帧传递给所有监听接口 调用 invoke_rx_handlers()
处理帧 如果是数据帧,转换成802.3帧格式,传递给上层协议栈 如果是管理帧/控制帧,传递给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
5.3 发送路径
帧传递给 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
5.4 mangement/MLME
状态机运行依赖于用户请求 标准方法如下: probe request/response auth request/response assoc request/response notification request/response
5.5 IBSS
尝试寻找IBSS 加入IBSS或者创建IBSS 如果没有配对,则周期性地尝试寻找IBSS并加入
5.6 创建接口路径
创建接口由用户空间通过nl80211发起 分配网络设备空间(包含sdata对象空间)
初始化网络设备 初始化sdata对象(包括设备类型,接口类型,设备操作函数等等) 注册网络设备 把sdata对象加入 local->interfaces
5.7 删除接口路径
删除接口由用户空间通过nl80211发起 把sdata对象从 local->interfaces
移除 移除网络设备.
5.8 创建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
.
5.9 删除station路径
删除station
由用户空间通过 nl80211
发起 删除 sta_info 对象的key对象 把sta_info对象从 local->sta_pending_list
移除 调用 local->ops->sta_remove
通知驱动移除station 删除sta_info
对象的速率控制对象 把 sta_info
对象从 local->sta_list
移除.
5.10 扫描请求路径
扫描请求由用户空间通过nl80211发起 如果支持硬件扫描,调用 local->ops->hw_scan()
执行硬件扫描 否则,调用 ieee80211_start_sw_scan()
执行软件扫描 延时唤醒 ieee80211_scan_work()
.
5.11 扫描状态机路径
如果存在硬件扫描请求,调用drv_hw_scan()
进行扫描,如果失败,调用ieee80211_scan_completed()
完成扫描 如果存在扫描请求,同时未进行扫描,调用__ieee80211_start_scan()
进行软件扫描,如果失败,调用ieee80211_scan_completed()
完成扫描 根据 next_scan_state
调用相应的处理函数 如果next_delay==0,则继续根据 next_scan_state
调用相应的处理函数 延时唤醒 ieee80211_scan_work()
.
6. MAC80211切换点
6.1 配置
wireless extensions (wext)
cfg80211 (通过nl80211和用户空间通信)
6.1 wext
设置SSID,BSSID和其他关联参数 设置RTS/fragmentation thresholds managed/IBSS模式的加密密钥
6.2 cfg80211
扫描
用户管理(AP)
mesh管理
虚拟接口管理
AP模式加密密钥
6.3 从mac80211到速率控制
速率控制不是驱动的一部分 每个驱动有自己的速率控制选择算法 速率控制填充ieee80211_tx_info
速率信息 速率控制获取发送状态
6.4 从mac80211到驱动
驱动方法(ieee80211_ops
) mac80211有一些输出函数 参考include/net/mac80211.h
6.5 mac80211主要函数
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传递给驱动
转自:mac80211概览