您的位置:首页 > 运维架构 > Linux

mac80211概览

2017-02-11 19:56 796 查看
mac80211是linux kernel中的一个子系统,它为无线设备soft-MAC/half-MAC提供了分享实施方案,包含MLME和另外一些代码。

mac80211的架构



其他相关联的还有TX/RX路径(包含一些软件加密)

为网络管理,IBSS,mesh等提供的控制路径

一些AP的管理,如省电缓冲

mac80211的代码结构

最重要的是kernel提供的驱动API,该文件定义了mac8011源码中使用的API:

include/net/mac80211.h


以下是net/mac80211源码中除了头文件外的重要组成:

filesfunction
Kcon g, Make lebuild system
ieee80211 i.hmost internal data structures
main.cmain module entry points/main entry points for driver calls (reg/dereg)
iface.cvirtual interface handling
key.c, key.hkey management
sta info.c, sta info.hStation (peer) management
pm.cpower management (suspend/hibernate)
rate.c, rate.hinternal rate control functions
rc80211*rate control algorithms
rx.cframe receive path
tx.cframe transmit path
scan.csoftware scanning cod
ht.c, agg-rx.c, agg-tx.cHT/aggregation code
meshf, hwmp, plink, pathtblg.fc,hg802.11s mesh
mlme.cStation/managed mode MLME
ibss.cIBSS MLME
cfg.c, cfg.h, wext.ccon guration entry points
event.cevents to userspace
spectmgmt.cspectrum management code
aes*, tkip., wep., michael., wpa.WPA/RSN/WEP code
wme.c, wme.hsome QoS code
util.cutility functions
led.c, led.hLED handling
debugfs*debugfs code

mac80211数据结构体

 ieee80211 local/ieee80211 hw

这两个结构体用来表示每一个无线设备,ieee80211_hw是ieee80211_local的队驱动可视的一部分,它们包含了所有无线设备的操作信息。

sta info/ieee80211 sta

表示任何一个站点peer,mesh peer,IBSS peer,AP,WDS peer,也能做DLS peer。ieee80211_sta是对驱动可视的一部分。它们的生命周期管理依赖RCU

ieee80211 conf

表示硬件的配置信息,最重要的是当年的频率,它是硬件最特殊的参数结构体

ieee80211 bss conf

表示BSS的配置,且包含所有类别的BSSes。

ieee80211 key/ieee80211 key conf

表示加密和解密的key。

ieee80211 tx info

最复杂的数据结构体,用在skb的控制buffer中。

ieee80211 rx status

包含了接收帧的状态,可以通过mac80211驱动接收数据帧

ieee80211 sub if data/ieee80211 vif

包含了每个虚拟接口的信息。包括的子结构体

ieee80211 if ap

 ieee80211 if wds

 ieee80211 if vlan

 ieee80211 if managed

 ieee80211 if ibss

 ieee80211 if mesh

mac8011的主要流程

配置

所有发起来自用户空间(wext或者nl80211)

managed和IBSS模式:触发状态机(基于workqueue)

有些操作或多或少直接通过驱动传递(比如信道设置)

接收路径

通过函数
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


发送路径

帧传递给
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_lis
t移除

扫描请求路径

扫描请求由用户空间通过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()


MAC80211切换点

配置

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

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传递给驱动
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息