基于mac80211_hwsim搭建WiFi模拟测试环境(上)– 前篇介绍

前面有介绍基于 mac80211_hwsimnetns 来创建虚拟WLAN接口并测试:

《Linux创建虚拟WLAN接口并测试》- https://notes.z-dd.online/2024/11/12/Linux%E5%88%9B%E5%BB%BA%E8%99%9A%E6%8B%9FWLAN%E6%8E%A5%E5%8F%A3%E5%B9%B6%E6%B5%8B%E8%AF%95/

这次来看看 hostap 项目中基于mac80211_hwsim的测试用例,方便测试及调试 Linux 80211协议栈。

这篇是前篇,主要做些介绍,下篇做环境搭建。

mac80211_hwsim

官方介绍
mac80211_hwsim 是一个用于 mac80211 的 802.11 无线电软件模拟器。它由 Jouni Malinen 于 2008 年编写,旨在帮助在没有硬件的情况下测试 mac80211。

mac80211_hwsim 是一个 Linux 内核模块,可用于为 mac80211 模拟任意数量的 IEEE 802.11 无线网卡。它能够以与使用真实 WLAN 硬件极为相似的方式,测试 mac80211 的大部分功能以及用户空间工具(例如 hostapd 和 wpa_supplicant)。从 mac80211 的角度来看,mac80211_hwsim 只是一个额外的硬件驱动程序,也就是说,使用这一测试工具无需对 mac80211 进行任何修改。

mac80211_hwsim 的主要目标是让开发者更轻松地测试其代码,并与 mac80211、hostapd 和 wpa_supplicant 的新功能进行协作。由于模拟的无线网卡不存在真实硬件的种种限制,因此可以轻松构建任意复杂的测试环境,并且每次测试都能完全复现相同的配置。此外,由于所有无线操作都是模拟实现的,因此在测试中可随意选择任何信道,不受监管规则的限制。

mac80211_hwsim 内核模块提供了一个名为“radios”的参数,可用于指定模拟的无线网卡数量(默认值为 2)。这使得开发者既可以轻松配置简单的测试环境(例如仅有一个接入点和一个站点),也可以进行大规模测试(多个接入点搭配数百个站点)。

mac80211_hwsim 的工作原理是:它会跟踪每个虚拟无线网卡当前所处的信道,并将所有发送的帧复制到所有当前启用且与发送端无线网卡处于同一信道的其他无线网卡上。此外,mac80211 中采用了软件加密机制,从而确保帧在虚拟空中接口上得到真正的加密,以支持更全面的加密测试。

mac80211_hwsim 还会创建一个全局监控网络设备 hwsim#,该设备独立于 mac80211。通过这个接口,无论信道如何,都可以监控所有发送的帧。

来自内核官方文档: https://wireless.docs.kernel.org/en/latest/en/users/drivers/mac80211_hwsim.html

hostap项目

该项目包含两个主要组成部分:

  • hostapd—用于接入点的用户空间守护进程,包括但不限于:适用于多种Linux和BSD驱动程序的IEEE 802.1X/WPA/EAP认证器、RADIUS客户端、集成式EAP服务器以及RADIUS认证服务器。
  • wpa_supplicant—适用于多种Linux、BSD和Windows驱动程序的用户空间IEEE 802.1X/WPA supplicant(无线客户端)。

官网:https://w1.fi/
仓库:git://w1.fi/srv/git/hostap.git

历来版本:
hostap_versions.png

hostap 项目测试框架

hostap下的子目录tests/hwsim 是 hostap 项目的自动化回归测试框架,基于 mac80211_hwsim 内核模块模拟 WiFi 硬件,无需真实硬件即可测试 hostapd/wpa_supplicant 的完整功能。这种设置使大多数 hostapd 和 wpa_supplicant 的功能(以及大部分的Linux cfg80211 和 mac80211 功能)能够被测试。

mac80211_hwsim加载了五个模拟无线电,以允许不同的设备组合进行测试。wlantest用于分析通过hwsim0监视接口捕获的原始数据包,该接口捕获所有频道上发送的所有帧,可以存储无线帧来进行分析。三个wpa_supplicant进程用于控制三个虚拟无线电,一个hostapd进程用于动态控制其他两个虚拟无线电。wpa_supplicant/hostapd测试功能用于验证两个netdev之间的数据连接(包括单播和广播)是否正常工作。

目录中的Python脚本和工具控制测试用例的执行。它们通过控制接口与 wpa_supplicant 和 hostapd 交互以执行操作。此外,wlantest_cli用于验证操作已正确执行,并且网络连接按预期方式工作。

测试架构

组件 作用
mac80211_hwsim 内核模块,模拟 5 个 802.11 无线网卡
wlantest 通过 hwsim0 监控接口捕获并分析所有无线帧
3 个 wpa_supplicant 进程 控制 3 个虚拟客户端
1 个 hostapd 进程 动态控制 2 个虚拟 AP 接口
Python 测试框架 通过控制接口自动化执行测试用例

主要测试分类

分类 测试文件 测试内容
AP 基础功能 test_ap_open.py, test_ap_psk.py, test_ap_eap.py 开放网络、WPA-PSK、WPA2-Enterprise 配置与连接
加密与安全 test_ap_ciphers.py, test_ap_pmf.py, test_sae.py, test_owe.py 加密算法、管理帧保护(MFP)、SAE(WPA3)、机会无线加密
802.1X 认证 test_ieee8021x.py, test_eap.py, test_authsrv.py 802.1X 端口认证、EAP 方法(TEAP/PWD/SIM/AKA等)
漫游与切换 test_ap_roam.py, test_ap_ft.py, test_ap_csa.py 快速漫游(802.11r)、信道切换
高速率协议 test_ap_ht.py, test_ap_vht.py, test_he.py, test_eht.py HT(802.11n)、VHT(802.11ac)、HE(802.11ax)、EHT(802.11be)
P2P/Wi-Fi Direct test_p2p_*.py (14个文件) 设备发现、组协商、邀请、持久化组等
DPP 配置 test_dpp.py, test_dpp3.py 设备配置协议(二维码/NFC配网)
企业功能 test_ap_hs20.py, test_gas.py, test_rrm.py Hotspot 2.0、GAS查询、无线资源测量
VLAN test_ap_vlan.py 基于用户/组的VLAN动态分配
WPS test_ap_wps.py, test_nfc_wps.py Wi-Fi Protected Setup
扫描与连接 test_scan.py, test_bgscan.py, test_connect_cmd.py 背景扫描、自动扫描、连接命令
高级特性 test_dfs.py, test_macsec.py, test_fils.py, test_mbo.py 动态频率选择、MACsec、快速初始登录、多频带操作
协议健壮性 test_eap_proto.py, test_hostapd_oom.py EAP协议状态机、内存耗尽测试
内核交互 test_cfg80211.py, test_kernel.py cfg80211/nl80211 接口测试
DBus 接口 test_dbus.py wpa_supplicant D-Bus API

测试目的

  • 回归测试: 每次提交代码后自动运行,防止功能退化
  • 全功能覆盖: 测试 hostapd/wpa_supplicant 几乎所有配置组合
  • 协议正确性: 通过 wlantest 验证无线帧交互符合 802.11 标准
  • 稳定性保障: 包含内存泄漏、异常处理等健壮性测试