原址

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是对驱动可视的一部分。它们的生命周期管理依赖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
  • 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_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()
  • 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概览相关推荐

  1. 网卡驱动学习四、mac80211概览

    1. mac80211概览 目录 文章目录 1. mac80211概览 2. mac80211架构 3. mac80211代码结构 4. mac80211数据结构体 4.1 ieee80211 loc ...

  2. Intel Optane PMEM 概览

    文章目录 前言 基本架构 编程模型 PMDK 接口架构 接口概览 pmdk 安装 开发文档汇总 PMEM性能 官方性能 实测性能 前言 随着以PCM 为存储单元的3D XPoint 非易失存储介质 不 ...

  3. 操作系统学习2:操作系统的发展和概览

    操作系统的发展和概览 手工阶段(电子管时代) 特点: 用户独占全机 用户独占计算机所有资源,资源利用率低 CPU等待用户 计算前,手工装入纸带或卡片:计算完成后,手工卸取纸带或卡片:CPU利用率低. ...

  4. Windows 消息循环(1) - 概览

    本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍. 使用 EN5 课件获得更好的阅读体验: [希沃白板5]课件分享 : <Windows培训 - 消息循环> ...

  5. flutter ios启动白屏_Flutter技术架构概览

    前言 最近在整理各种技术架构,给自己的列了个TODO list,希望能在几个月的时间内,研究完各种前端技术架构,包括移动端技术架构.今天分享一下自己整理的flutter技术架构.完整的技术架构TODO ...

  6. RESTful之视图概览和视图说明

    一.视图概览 REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写. 视图的继承关系: 视图的方法与属性: 二.视图说明 1. 两个基类 1)APIView rest_fr ...

  7. 热点:3个故事概览突飞猛进的肠道病毒组研究

    编者按: 提到病毒可能很多人就会想到疾病和死亡,尤其是在当下这个特殊的时期. 过去 4 个月,新冠肺炎(COVID-19)在全世界范围内大流行,截至 5 月 23 日 11:00,中国累计确诊人数达到 ...

  8. emc celerra(一)--界面概览

    1.EMC celerra打开http://IP地址即可看到如下界面,可以看到此时灰色部分功能为未授权license 2.激活以上灰色部分的功能 3.下图显示都已激活 4.可以看到网络接口的IP地址 ...

  9. Apache Beam的架构概览

    不多说,直接上干货! Apache Beam是一个开源的数据处理编程库,由Google贡献给Apache的项目,前不久刚刚成为Apache TLP项目.它提供了一个高级的.统一的编程模型,允许我们通过 ...

最新文章

  1. @Ignore_JUnit - Ignore Test
  2. 【Ant Design Pro 三】样式动态绑定 react样式绑定
  3. 题目 1083:【蓝桥杯】【入门题】Hello, world!
  4. pytorch bceloss测试
  5. 云炬随笔20170901
  6. 图解Android事件传递之ViewGroup篇
  7. 通过ByteBuffer来操作byte
  8. 怎样进入pe重建硬盘
  9. 苹果电脑mac截屏_谁说 mac系统 不适合搞科研? | 假期不宜出门,宜学习!
  10. Jmeter 抓app包 抓到一半不好用了
  11. 618“后高考经济”数据:3C数码依旧是毕业季的首选礼品
  12. keepalived详解(二)——keepalived安装与配置文件
  13. 【狂神说Redis】2Redis入门 2-2Redis部署在Linux(Ubuntu)
  14. delphi7 安装 indy10.2.3
  15. 内定抽奖小程序_Excel制作抽奖小程序,单人、多人抽奖只要三步就可实现
  16. 图像的三次B样条插值原理与C++实现
  17. 清华同方台式计算机 U盘启动,清华同方台式电脑一键u盘启动bios设置教程
  18. C++ 野指针和悬空指针
  19. w ndows10输入法设置,Win10输入法设置技巧:切换输入法
  20. 去除加粗的css,CSS去掉b加粗和strong加粗标签样式

热门文章

  1. .NET 4.5 HttpClient 中使用Cookie
  2. 《计算机网络思想》系列(1)网络体系结构———理解,总结,辨析,升华
  3. eclipse部署web没部署成功的问题
  4. ubuntu下gns3 0.7安装笔记
  5. MySQL 死锁专题问题处理
  6. 微信公众号-关注取消关注后图文和普通消息自动回复
  7. python函数装饰器详解_Python语言函数装饰器用法实例详解
  8. html5 跳转参数不显示_TeeChart for PHP教程(十二):Javascript / HTML5图表
  9. 美国《国家地理》:年度十大新闻
  10. 剑指 Offer——和为 S 的两个数字