mac80211_hwsim 仿真

安装与配置

查看内核版本

~$ uname -r
6.8.0-52-generic

查看编译配置

~$ grep CONFIG_MAC80211_HWSIM /boot/config-$(uname -r)
CONFIG_MAC80211_HWSIM=m

如果未编译,建议换系统或自行编译,OpenWRT 系统可以使用 opkg 安装。

安装内核模块

~$ sudo modprobe mac80211_hwsim
~$ iw dev
phy#3
        Unnamed/non-netdev interface
                wdev 0x300000002
                addr 42:00:00:00:01:00
                type P2P-device
                txpower 20.00 dBm
        Interface wlan1
                ifindex 12
                wdev 0x300000001
                addr 02:00:00:00:01:00
                type managed
                txpower 20.00 dBm
phy#2
        Interface wlan0
                ifindex 11
                wdev 0x200000001
                addr 02:00:00:00:00:00
                type managed
                txpower 20.00 dBm

调整模块参数

~$ modinfo -p mac80211_hwsim
radios:Number of simulated radios (int)
channels:Number of concurrent channels (int)
paged_rx:Use paged SKBs for RX instead of linear ones (bool)
rctbl:Handle rate control table (bool)
support_p2p_device:Support P2P-Device interface type (bool)
mlo:Support MLO (bool)
regtest:The type of regulatory test we want to run (int)
sudo rmmod mac80211_hwsim
sudo modprobe mac80211_hwsim radios=3
~$ ls -1 /sys/module/mac80211_hwsim/parameters/
channels
mlo
paged_rx
radios
rctbl
regtest
support_p2p_device
~$ cat /sys/module/mac80211_hwsim/parameters/radios
3
~$ iw dev
phy#8
Unnamed/non-netdev interface
        wdev 0x800000002
        addr 42:00:00:00:02:00
        type P2P-device
        txpower 20.00 dBm
Interface wlan2
        ifindex 19
        wdev 0x800000001
        addr 02:00:00:00:02:00
        type managed
        txpower 20.00 dBm
phy#7
        Interface wlan1
                ifindex 18
                wdev 0x700000001
                addr 02:00:00:00:01:00
                type managed
                txpower 20.00 dBm
phy#6
        Interface wlan0
                ifindex 17
                wdev 0x600000001
                addr 02:00:00:00:00:00
                type managed
                txpower 20.00 dBm

查看参数定义后,先卸载模块,然后修改参数重新插入,sys 目录可查看当前运行参数。

调整与适配

解锁 rfkill 控制

~$ sudo rfkill list
0: phy0: Wireless LAN
        Soft blocked: yes
        Hard blocked: no
1: phy0: Wireless LAN
        Soft blocked: yes
        Hard blocked: no
~$ sudo rfkill unblock 0
~$ sudo rfkill unblock wlan
~$ sudo rfkill list
0: phy0: Wireless LAN
        Soft blocked: no
        Hard blocked: no
1: phy0: Wireless LAN
        Soft blocked: no
        Hard blocked: no

解锁 0 号设备,即 phy0,或解锁全部 Wi-Fi 设备。

取消 NetworkManager 管理

nmcli device set <wlan dev> managed no
# 恢复管理,意义不大
nmcli device set <wlan dev> managed yes

NetworkManager 会自动检测接口状态,并修改为配置内容,这将干扰我们命令行操作。

关闭 wpa_supplicant 服务

~$ systemctl is-enabled wpa_supplicant.service
enabled
sudo systemctl stop wpa_supplicant.service
sudo systemctl disable wpa_supplicant.service
# sudo systemctl mask wpa_supplicant.service
# 恢复 wpa_supplicant 服务
# sudo systemctl unmask wpa_supplicant.service
sudo systemctl enable wpa_supplicant.service
sudo systemctl start wpa_supplicant.service

通常,我们将自己编译并修改 wpa_supplicant,系统程序会占用资源或干扰我们的程序。