NL80211模块接口
hostapd主要的一个功能便是处理管理帧,在过去,接收和发送管理帧都需要由 monitor 模式的接口来进行,那时需要一个运行 master 模式的接口来处理标准流量,还需要另一个单独的接口负责进行认证、密钥管理等工作。第二个接口可以使用标准的 Linux socket 进行读写,而不需要任何特殊的 API 。作为备份,nl80211 驱动仍然支持该方法
后来,nl80211 实现了用于发送管理帧(NL80211_CMD_FRAME)与接收返回(NL80211_CMD_REGISTER_FRAME)的特殊命令。这样就可以在用户空间使用单一的接口来管理无线基础设施了。这是目前推荐的使用管理帧的方法,可以被用于所有实现 AP 模式的 mac80211 驱动
hostapd模块对管理帧的处理
管理帧的接收
关于wifi管理帧的处理,大体流程是,hostapd会提前将网卡设置为AP模式,创建socket绑定网卡,底层硬件在接收到wifi数据后首先将数据从内核传到用户态,由hostapd设置的TX事件的回调,在对应的回调函数中分析帧格式
接受内核发送的管理帧是通过nl80211来实现,具体是通过NL80211_CMD_FRAME来进行接收,hostapd中使用hostapd_mgmt_rx来接受内核发来的数据
在mac80211中也会有关于管理帧的处理逻辑
管理帧的构造和发送
对于管理帧的构造则是通过hostapd和驱动来一起完成
hostapd (用户空间) 的职责:构造主要内容和逻辑
hostapd 负责管理接入点 (AP) 的高层逻辑和策略,因此它需要构造管理帧的大部分内容
- 构造帧内容:
hostapd生成认证响应、关联响应、EAPOL密钥交换消息、解除认证/解除关联请求等帧的负载 (payload) 和各种信息元素 (IEs)。它决定了帧中的安全参数、支持速率、SSID、认证算法等具体内容 - 安全和加密: 密钥管理和管理帧保护 (
PMF,802.11w) 的加密逻辑都在hostapd中实现
驱动/内核 (内核空间) 的职责:封装、发送和底层处理
驱动程序和内核的 mac80211 子系统负责处理与硬件相关的底层任务
- 底层封装:
hostapd将构造好的帧数据通过Netlink接口 (NL80211_CMD_FRAME命令) 发送给内核。内核和驱动负责添加必要的底层MAC头部、CRC校验、时间戳,并将数据包传输到物理空中 - 信标帧的模板: 对于需要周期性、高精度发送的信标帧 (
Beacon Frames),hostapd会创建信标帧的“模板”并将其传递给内核/驱动。内核随后在硬件层面自动、周期性地发送这些信标帧,减轻用户空间的负担 - 硬件卸载: 某些驱动和硬件甚至可以处理部分管理帧的自动响应(例如,简单的
Probe Response),但对于复杂的认证流程,控制权仍在hostapd
wifi数据帧的处理
wifi数据帧的处理主要是在内核协议栈和驱动来进行完成,需要注意的是内核协议栈并不区分802.11数据帧和802.3数据帧,所有的802.11数据帧会转换成802.3数据帧。对于802.11数据帧和802.3数据帧之间的转化在物理层、wifi驱动和内核的mac80211模块来进行
参考文档
https://wireless.docs.kernel.org/en/latest/en/users/documentation/hostapd.html