什么是FullMAC and SoftMAC?
SoftMAC 和 FullMAC (或者叫HardMAC) 是两种主流的无线网卡(Wi-Fi芯片)架构。
他们的区别在哪里呢?
核心区别在于 MAC 层(Media Access Control,介质访问控制)的管理功能(MLME,MAC sublayer management entity)由哪里来实现,是交给网卡硬件/固件实现,还是交给主机的操作系统驱动实现
简单描述:FullMAC 是硬实现,硬件负责得更多;SoftMAC 是软实现,更依赖主机内核驱动
基础架构

特性特点对比

如何区分FullMAC还是SoftMAC架构?
在Linux系统中,判断标准是看驱动是否依赖于mac80211框架

在FullMAC角度,还有通过驱动实现的接口来区分fullmac和softmac的:
SoftMAC 的Linx驱动则是与mac80211连接,对接的接口是struct ieee80211_ops,mac80211负责对接网络子系统
FullMAC 的Linux驱动不使用mac80211, 因此其需要与网络设备子系统直接连接,接口是struct net_device_ops
这两种描述之间有什么关系?
FullMAC 驱动实际上实现了两个接口

SoftMAC 驱动则只实现一个

主流厂商的选择
不同厂商在两种架构上的倾向性也不同:
博通:大多数现代网卡采用FullMAC架构
高通:大部分桌面/路由器级别的网卡(如 ath5k, ath9k, ath10k)采用SoftMAC;移动端芯片(如ath6kl)则采用FullMAC
瑞昱:绝大多数网卡采用SoftMAC,但驱动代码质量常被我们吐槽
美满:部分网卡支持在两种模式间切换
SoftMAC
在SoftMAC架构中,无线网卡的固件只负责最基本的硬件操作(如发送和接收数据包),而无线协议栈的复杂逻辑(如扫描、加密、关联、漫游、电源管理等)由操作系统内核中的软件实现,所以SoftMAC架构使得驱动程序和协议栈的开发更加灵活和可控
核心分工逻辑
要弄清楚硬件和软件各自承担什么角色,以ath9k高通SoftMAC驱动为例:

到这里,我们就很清楚了各个功能的分工,对于后期的代码学习和修改,是非常有帮助的。
SoftMAC驱动工程师所做的主要工作
实现一组硬件操作回调函数 (ieee80211_ops),如发送帧、配置信道、设置密钥等,作为mac80211控制硬件接口
向mac80211汇报硬件能力 (如支持的加密类型、是否支持多队列等),以便框架做出最佳调度决策
工作流程
上层通过cfg80211发来一个请求:扫描所有wifi
在整个过程中,ath9k驱动主要负责把mac80211准备好的帧,交给硬件去发送;以及把硬件收到的原始帧,传递给mac80211去解析
FullMAC
FullMAC架构中,无线网卡固件(Firmware)负责实现大部分的无线协议栈功能(比如802.11的管理帧处理、加密解密、扫描等),驱动程序的主要职责:
FullMAC的主要思路是将无线协议的复杂逻辑尽可能地放到网卡的fw中,而驱动程序只需要处理基本的硬件控制和数据传输
工作流程
用户执行连接wifi
cfg80211将连接命令转换为一个特定的NL80211_CMD_CONNECT消息,通过nl80211接口发送给驱动
FullMAC驱动将这个命令打包成一个内部协议消息,通过(PCIe/USB/SDIO)总线发送给网卡固件
网卡固件自主完成剩下的所有工作:扫描信道、认证、关联、握手的wifi连接流程
建立连接后,固件通知驱动已连接wifi状态
驱动收到通知,通过 cfg80211 上报给上层,用户看到连接成功
在整个过程中,主机端的mac80211完全没有参与
FullMAC的优点
降低驱动复杂性:由于大部分功能由固件实现,驱动程序的代码量和复杂性显著降低
更高的稳定性:固件运行在网卡内部,与操作系统隔离,减少了因内核更新或驱动问题导致的不稳定性
跨平台支持:固件与操作系统无关,因此 FullMAC 驱动程序可以更容易地支持不同的操作系统(如 Linux、Windows、Android)
节省host资源:大部分协议处理在网卡内部完成,减少了host CPU 的负担
FullMAC的缺点
灵活性较低:固件是由硬件厂商开发的,无法轻松修改或扩展功能,对于一些高级功能(如 Mesh 网络等),需要厂商支持
依赖厂商支持:固件的更新和维护完全依赖厂商,导致功能更新滞后等安全问题
调试困难:固件是封闭的,开发者无法直接查看或修改其实现,调试问题时受限
结语
看到这里,两者没有绝对的优劣,只有适合的场景。如果你需要灵活性(研究、开发学习等),SoftMAC更适合。如果你需要低功耗、低 CPU 占用、更稳定的商业产品,FullMAC 会是更普遍的选择
拓展
学习和理解:UMAC和LMAC