mac80211概览

来源:互联网 发布:linux 查看snmp配置 编辑:程序博客网 时间:2024/06/05 23:54

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源码中除了头文件外的重要组成:

files function Kcon g, Make le build system ieee80211 i.h most internal data structures main.c main module entry points/main entry points for driver calls (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* 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 con guration 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

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_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_ctrlieee80211_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_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_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()

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传递给驱动

1 0
原创粉丝点击