mac80211概览
原址
mac80211是linux kernel中的一个子系统,它为无线设备soft-MAC/half-MAC提供了分享实施方案,包含MLME和另外一些代码。
mac80211的架构
其他相关联的还有TX/RX路径(包含一些软件加密)
为网络管理,IBSS,mesh等提供的控制路径
一些AP的管理,如省电缓冲
mac80211的代码结构
最重要的是kernel提供的驱动API,该文件定义了mac8011源码中使用的API:
include/net/mac80211.h
- 1
- 2
以下是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是对驱动可视的一部分。它们的生命周期管理依赖RCUieee80211 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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
发送路径
帧传递给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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
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()
- 1
- 2
分配wiphy对象空间(保证私有数据和硬件私有数据32字节对齐,wiphy包含ieee80211_local
和驱动私有数据)
初始化wiphy对象(包括重传次数,RTS门限等等)
初始化ieee80211_local
(包括重传次数,工作队列,接口链表等等)
初始化sta_pending_list
链表
初始化sta_list
链表
ieee80211_register_hw()
- 1
- 2
分配int_scan_req
数据结构
初始化支持接口类型(包括MONITOR接口)
注册wiphy
初始化WEP
初始化速率控制算法
注册STA接口(默认wlan0)
ieee80211_rx()
- 1
- 2
拷贝skb,同时在skb头部增加radiotap信息,传递给所有监听接口
如果是数据帧,根据MAC地址查找station
如果station没有找到,把skb传递给所有接口处理
数据帧:转换成802.3帧格式,传递给网络协议栈
管理帧/控制帧:传递给MLME
ieee80211_xmit()
- 1
- 2
如果skb来自监听接口,移除skb头部的radiotap信息
进行skb预处理(包括设置QoS优先级,设置分段标志,ACK应答标志等等)
选择加密密钥
选择速率(ESP8089采用硬件速率控制,所以mac80211速率控制无效)
加密(mac80211采用硬件加速,所以mac80211加密无效)
通过local->ops->tx()
把skb传递给驱动
mac80211概览相关推荐
- 网卡驱动学习四、mac80211概览
1. mac80211概览 目录 文章目录 1. mac80211概览 2. mac80211架构 3. mac80211代码结构 4. mac80211数据结构体 4.1 ieee80211 loc ...
- Intel Optane PMEM 概览
文章目录 前言 基本架构 编程模型 PMDK 接口架构 接口概览 pmdk 安装 开发文档汇总 PMEM性能 官方性能 实测性能 前言 随着以PCM 为存储单元的3D XPoint 非易失存储介质 不 ...
- 操作系统学习2:操作系统的发展和概览
操作系统的发展和概览 手工阶段(电子管时代) 特点: 用户独占全机 用户独占计算机所有资源,资源利用率低 CPU等待用户 计算前,手工装入纸带或卡片:计算完成后,手工卸取纸带或卡片:CPU利用率低. ...
- Windows 消息循环(1) - 概览
本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍. 使用 EN5 课件获得更好的阅读体验: [希沃白板5]课件分享 : <Windows培训 - 消息循环> ...
- flutter ios启动白屏_Flutter技术架构概览
前言 最近在整理各种技术架构,给自己的列了个TODO list,希望能在几个月的时间内,研究完各种前端技术架构,包括移动端技术架构.今天分享一下自己整理的flutter技术架构.完整的技术架构TODO ...
- RESTful之视图概览和视图说明
一.视图概览 REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写. 视图的继承关系: 视图的方法与属性: 二.视图说明 1. 两个基类 1)APIView rest_fr ...
- 热点:3个故事概览突飞猛进的肠道病毒组研究
编者按: 提到病毒可能很多人就会想到疾病和死亡,尤其是在当下这个特殊的时期. 过去 4 个月,新冠肺炎(COVID-19)在全世界范围内大流行,截至 5 月 23 日 11:00,中国累计确诊人数达到 ...
- emc celerra(一)--界面概览
1.EMC celerra打开http://IP地址即可看到如下界面,可以看到此时灰色部分功能为未授权license 2.激活以上灰色部分的功能 3.下图显示都已激活 4.可以看到网络接口的IP地址 ...
- Apache Beam的架构概览
不多说,直接上干货! Apache Beam是一个开源的数据处理编程库,由Google贡献给Apache的项目,前不久刚刚成为Apache TLP项目.它提供了一个高级的.统一的编程模型,允许我们通过 ...
最新文章
- @Ignore_JUnit - Ignore Test
- 【Ant Design Pro 三】样式动态绑定 react样式绑定
- 题目 1083:【蓝桥杯】【入门题】Hello, world!
- pytorch bceloss测试
- 云炬随笔20170901
- 图解Android事件传递之ViewGroup篇
- 通过ByteBuffer来操作byte
- 怎样进入pe重建硬盘
- 苹果电脑mac截屏_谁说 mac系统 不适合搞科研? | 假期不宜出门,宜学习!
- Jmeter 抓app包 抓到一半不好用了
- 618“后高考经济”数据:3C数码依旧是毕业季的首选礼品
- keepalived详解(二)——keepalived安装与配置文件
- 【狂神说Redis】2Redis入门 2-2Redis部署在Linux(Ubuntu)
- delphi7 安装 indy10.2.3
- 内定抽奖小程序_Excel制作抽奖小程序,单人、多人抽奖只要三步就可实现
- 图像的三次B样条插值原理与C++实现
- 清华同方台式计算机 U盘启动,清华同方台式电脑一键u盘启动bios设置教程
- C++ 野指针和悬空指针
- w ndows10输入法设置,Win10输入法设置技巧:切换输入法
- 去除加粗的css,CSS去掉b加粗和strong加粗标签样式
热门文章
- .NET 4.5 HttpClient 中使用Cookie
- 《计算机网络思想》系列(1)网络体系结构———理解,总结,辨析,升华
- eclipse部署web没部署成功的问题
- ubuntu下gns3 0.7安装笔记
- MySQL 死锁专题问题处理
- 微信公众号-关注取消关注后图文和普通消息自动回复
- python函数装饰器详解_Python语言函数装饰器用法实例详解
- html5 跳转参数不显示_TeeChart for PHP教程(十二):Javascript / HTML5图表
- 美国《国家地理》:年度十大新闻
- 剑指 Offer——和为 S 的两个数字