mac80211基础知识总结
可参考:
现代Linux下的wifi框架-CSDN博客
Linux下wifi子系统的数据流-CSDN博客
在进一步认识mac80211之前,我们先学习几点预备知识
MLME
MLME 是MAC Sublayer Management Entity的缩写,即MAC 子层管理实体。
简单来说,它是 802.11 协议中负责"管理面"功能的模块,与负责"数据面"的功能相对。
一、管理面 vs. 数据面
层面 英文 职责 例子 数据面 Data Plane 负责用户数据的传输 你的网页浏览、视频流、文件下载 管理面 Management Plane 负责建立、维护和断开连接 扫描热点、认证、关联、漫游、省电模式管理 MLME 就是管理面的核心执行者。
二、MLME 具体负责什么?
MLME 处理的是 802.11 协议中各种管理帧和管理流程:
功能 对应管理帧/流程 描述 扫描 (Scan) Probe Request / Response
Beacon发现周围有哪些 Wi-Fi 热点 认证 (Authentication) Authentication 帧 与 AP 进行身份验证 关联 (Association) Association Request / Response 与 AP 建立连接,获得 AID 重关联 (Reassociation) Reassociation Request / Response 漫游时,重新关联到新 AP 解除关联 (Disassociation) Disassociation 帧 断开连接 解除认证 (Deauthentication) Deauthentication 帧 强制踢出或主动退出 省电管理 PS-Poll, Null Data 帧 通知 AP 进入/退出睡眠模式 速率控制 (部分) 与 AP 协商支持的数据速率 三、MLME 的位置
在 802.11 协议栈中,MLME 位于MAC 层内部,位于数据面之上、物理层管理实体(PLME)之上:
+---------------------+ | 管理面 (MLME) | ← 管理帧处理、连接状态机 +---------------------+ | 数据面 (MAC) | ← 数据帧收发、ACK、加密 +---------------------+ | 物理层 (PHY) | +---------------------+四、MLME 在 AIC8800 中由谁实现?
这正是我们之前讨论的核心问题。MLME 的实现取决于芯片是SoftMAC还是FullMAC:
SoftMAC 设备:MLME 由主机端的
mac80211软件实现。FullMAC 设备(如 AIC8800):MLME主要由芯片内部的固件(运行在 Cortex-M4F 上)实现,以降低主机 CPU 负载和响应延迟。
在实际的驱动开发中,即使是 FullMAC 的 AIC8800,主机侧的
aic8800_fdrv驱动仍需通过一些回调或消息(如通过rwnx_msg_*接口)与固件中的 MLME 交互,以转发来自用户态的扫描、连接等命令。五、一句话总结
MLME 就是 Wi-Fi 连接的 "管家":它不负责搬运数据,而是负责"找谁连接、怎么连上、什么时候断开、睡着了怎么叫醒"等所有管理性事务。在 AIC8800 这种 FullMAC 芯片中,MLME 的大部分逻辑由模组内部的 Cortex-M4F 固件实现,主机驱动通过消息接口来调用它。
HardMAC和SoftMAC
HardMAC和SoftMAC是 802.11 无线设备中两种不同的架构,主要区别在于MLME(管理面)功能是在硬件/固件中实现,还是在主机软件的驱动中实现。
一、核心区别对比表
维度 SoftMAC HardMAC (FullMAC) MLME 位置 主机侧(Linux mac80211软件实现)芯片内部固件(如 AIC8800 的 Cortex-M4F) 主机 CPU 负担 较高(需处理管理帧、扫描、关联等) 较低(芯片自行处理,主机只下发命令) 实时性要求 较高(需快速响应管理事件) 较低(芯片自主处理,不依赖主机响应) 灵活性 高(协议 Bug 或新特性可通过软件升级修复) 低(依赖厂商固件更新) 功耗 较高(主机 CPU 需频繁参与) 较低(芯片可自主进入省电模式) 驱动开发复杂度 较低( mac80211提供大部分协议逻辑)较高(需实现与芯片固件的私有通信接口) 典型芯片 老式 Atheros (ath9k)、RTL8187 AIC8800、博通 (bcmdhd)、MTK (mt76部分) 二、架构差异图解
SoftMAC 架构 HardMAC 架构 +----------------+ +----------------+ | 用户态应用 | | 用户态应用 | +----------------+ +----------------+ ↓ ↓ +----------------+ +----------------+ | mac80211 | ← 软件实现 MLME | cfg80211 | | (协议栈软件) | | (轻量配置层) | +----------------+ +----------------+ ↓ ↓ +----------------+ +----------------+ | 驱动 (部分) | | 驱动 (轻量) | +----------------+ +----------------+ ↓ ↓ +----------------+ +----------------+ | WiFi 芯片 | | WiFi 芯片 | | (仅PHY+底层MAC)| | (完整MAC+MLME) | +----------------+ | + Cortex-M4F | | | 运行固件 | | +------------+ +----------------+关键点:SoftMAC 的芯片只负责物理层和简单的 MAC 操作(如 ACK 应答),而 HardMAC 的芯片内部有一个独立的处理器(如 AIC8800 的 Cortex-M4F)运行完整的 MAC 层和管理面逻辑。
三、各自的优缺点
SoftMAC 的优点
修复协议 Bug 容易:802.11 协议的问题可通过更新主机
mac80211解决,不需要升级芯片固件(往往是最棘手的部分)。支持新特性快:新的 802.11 特性可以更快地在软件中实现,不受芯片硬件能力限制。
芯片成本低:芯片内部无需集成强大的处理器,只需要实现基础的物理层和简单 MAC。
SoftMAC 的缺点
主机 CPU 负载高:管理帧解析、扫描、漫游决策都需要主机 CPU 参与,在嵌入式设备(如路由器)上可能成为瓶颈。
实时性挑战:管理事件(如 Beacon 丢失)通过总线传递到主机存在延迟,可能影响漫游体验。
HardMAC 的优点
主机 CPU 负载低:管理面完全由芯片自主处理,主机只需通过
WLAN接口进行简单命令下发和数据传输。功耗更低:芯片可以在主机睡眠时自主维持连接、监听 Beacon、在指定时间唤醒主机(TWT 等省电机制更容易实现)。
实时性更好:管理事件的响应在芯片内部完成,不依赖主机的调度。
HardMAC 的缺点
芯片成本高:需要集成一个独立的处理器(如 Cortex-M)和较大容量的 RAM/ROM 来运行固件。
灵活性差:协议 Bug 或新特性依赖厂商提供固件更新,而厂商往往更新缓慢或根本不更新。
驱动开发复杂:驱动需要实现与芯片固件通信的私有协议(如 AIC8800 的
rwnx_msg_*接口),而非使用mac80211提供的标准接口。四、典型芯片举例
架构 芯片型号 特点 SoftMAC Atheros AR9271 (ath9k_htc) 著名的开源友好芯片, mac80211实现大部分逻辑RTL8187 (Realtek) 老式 USB 网卡,SoftMAC 典型代表 MT7601 (MediaTek) 低成本 USB 网卡,SoftMAC 实现 HardMAC AIC8800 内部 Cortex-M4F 运行完整固件 BCM43438 (博通) Raspberry Pi 3 内置 WiFi,FullMAC CYW43455 (Cypress/博通) 主流 FullMAC 芯片 MT7668 (MediaTek) 部分 FullMAC 特性 五、LInux 内核中的体现
SoftMAC 设备:驱动必须注册到
mac80211框架,实现struct ieee80211_ops中的回调函数(如start、stop、tx、add_interface等)。HardMAC 设备:驱动通常不依赖
mac80211,而是直接通过cfg80211注册wiphy,实现struct cfg80211_ops中的回调(如scan、connect、disconnect)。六、一句话总结
SoftMAC 把 Wi-Fi 的管理大脑放在主机的 Linux 驱动里(由
mac80211实现),芯片只管手脚;HardMAC 把整个大脑都放进芯片内部(由固件实现),主机只负责下达指令。在嵌入式系统选型中,HardMAC(如 AIC8800)通常更受欢迎,因为它能显著降低主控 CPU 的负载,并简化系统集成。
mac80211
简单来说,
mac80211是 Linux 内核中一个专门为SoftMAC无线设备设计的核心框架(WiFi 协议栈)。它实现了那些 802.11 协议中管理面(MLME)的大部分复杂逻辑,让驱动开发者无需从零实现整个协议栈。mac80211的定位:
mac80211实现的功能:
mac80211对比fullmac:
实际例子:
总结:
