Yuhang Zheng

Ubuntu22上WiFi问题笔记

N 人看过

目前在Ubuntu22.04上解决奇怪的问题,查阅了一些资料,现在把这几天了解到的内容汇总记录一下,以免时间长了忘记。

基于NetworkManager的WiFi STA和AP操作命令:

1、列出可用的wifi接入点, list可以省略
nmcli dev wifi list
2、输出所有字段的信息(可以列出超级详细的内容)
nmcli -f all device show mlan0
3、验证设备是否支持热点模式
nmcli -f WIFI-PROPERTIES.AP device show mlan0

1、打印wifi开关状态
nmcli radio wifi
2、关闭wifi
nmcli radio wifi off
3、打开wifi
nmcli radio wifi on
4、建立wifi连接:
nmcli dev wifi connect <wifi名> password <wifi密码>
5、删除wifi连接:
nmcli con del <wifi名>
6、启用wifi连接:
nmcli con up <wifi名>
或者:
nmcli dev con mlan0
7、关闭wifi连接:
nmcli con down <wifi名>
或者:
nmcli dev dis mlan0

1、创建热点
nmcli dev wifi hotspot con-name <名称> ifname <节点名> ssid <热点名称> password <热点密码>
2、关闭热点
nmcli con down <名称>
3、打开热点
nmcli con up <名称>
4、显示wifi密码
nmcli dev wifi show-password

一个命令行创建wifi热点的命令示例:

nmcli radio wifi on
nmcli dev wifi hotspot con-name Aubo_Camera ifname mlan0 ssid Aubo_Camera password 12345678
nmcli con up Aubo_Camera
nmcli con modify Aubo_Camera ipv4.addr 192.168.2.1/24

连接WiFi的操作和创建热点的操作都会在/etc/NetworkManager/system-connections/路径下创建对应的.nmconnection文件
另外目前发现nmcli创建的AP热点,使用的dhcp服务为自带的dnsmasq服务,而不需要额外安装udhcpd服务


另外在有些驱动中会流出设置的参数,可以设置模块支持的模式,如下

cat /etc/modprobe.d/mwifiex.conf
options mwifiex driver_mode=0x1

module_param(driver_mode, ushort, 0);                                 
MODULE_PARM_DESC(driver_mode,"station=0x1(default), ap-sta=0x3, station-p2p=0x5, ap-sta-p2p=0x7")

当然可以直接去修改驱动源码,以设置WiFi产生的节点只有mlan0

diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c
index 3402bff..fd77833 100644
--- a/drivers/net/wireless/mwifiex/main.c
+++ b/drivers/net/wireless/mwifiex/main.c
@@ -477,20 +477,6 @@  static void mwifiex_fw_dpc(const struct firmware *firmware, void *context)
         dev_err(adapter->dev, "cannot create default STA interface\n");
         goto err_add_intf;
     }
-
-    /* Create AP interface by default */
-    if (!mwifiex_add_virtual_intf(adapter->wiphy, "uap%d",
-                      NL80211_IFTYPE_AP, NULL, NULL)) {
-        dev_err(adapter->dev, "cannot create default AP interface\n");
-        goto err_add_intf;
-    }
-
-    /* Create P2P interface by default */
-    if (!mwifiex_add_virtual_intf(adapter->wiphy, "p2p%d",
-                      NL80211_IFTYPE_P2P_CLIENT, NULL, NULL)) {
-        dev_err(adapter->dev, "cannot create default P2P interface\n");
-        goto err_add_intf;
-    }
     rtnl_unlock();

     mwifiex_drv_get_driver_version(adapter, fmt, sizeof(fmt) - 1);

以下是野火的WiFi接口的使用说明,可以参考以下,介绍的比较详细
https://doc.embedfire.com/linux/rk356x/quick_start/zh/latest/quick_start/wireless/wifi/wifi.html
另外下面是配置WiFi AP的文章
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/configuring_and_managing_networking/assembly_configuring-rhel-as-a-wifi-access-point_configuring-and-managing-networking


关于88W9098 WiFi模块来说,旧版本驱动会产生三个网络节点,分别为mlan0,uap0,wfd0

其所代表的含义如下:

Interface     Description
mlan0        WLAN Station/client mode
uap0         WLAN micro access point mode (uAP)
wfd0         Wi-Fi DirectTM mode (WFD Client or Group Owner)
nan0         Neighbor Awareness Networking mode (Wi-Fi AwareTM)

实际上88W9098支持两个MAC,所以在新版本驱动中你可以找到mlan0/uap0/wfd0,mmlan0/muap0/mwfd0 六个网络节点。

目前实际测试中发现,mlan0既可做STA,也可以做AP
uap0可以做AP,不可做STA

另外结合最近客户遇到的问题:

问题:

WIFI 热点不稳定,热点信号很强,显示有热点,但是连接不成功,只有重启板子后,才能连接成功。reboot重启也连不上。
阶段性排查结果:

不知道是什么原因让wifi进入了某种异常,然后驱动无法恢复这种异常,这种就像是因为外部因素引发,然后使wifi进入了某种异常状态,现有驱动无法解除,只能靠硬件重启来恢复。根据客户之前的描述,使用reboot重启还无法解决,必须要给板子断电重启才行,更像是Wifi模块本身进入到了异常

在使用海华XM458 wifi模块的mlan0做AP热点的时候,发现有时会出现wifi断连的问题,断连之后能看到热点名字,但连接不进去。此时使用手机尝试连接的时候,通过系统日志可以发现如下信息

image-20230926151849260

结合DHCP的工作流程

http://www.360doc.com/content/20/0220/22/17302338_893512767.shtml

image-20230926151858043

可以看到DHCP服务能收到客户端的请求,但是客户端无法收到服务端的回包
此时查看ifconfig可以看到,TX error一直在增长,说明wifi可以收到数据,但是发送全部异常了,这个也可以和现象对的上

客户出现问题后的ifconfig

img

然后去客户现场之后验证,在不重启问题板子的情况下,通过nmcil命令将热点设置为由uap0创建,发现可以使用。
另外使用nmcil命令设置mlan0去连接WiFi,发现也可以连接的上,并且可以ping通网关,Tx packets也会正常增长。
但是重新设置回来之后,由mlan0去创建热点,发现问题依然存在,手机去连接的时候,Tx error增长。

结合以上信息,可以知道uap0与mlan0互不干扰,STA和AP模式也互不干扰,这个是一个神奇的发现。


另外在使用RTL8822CE模块的时候,发现使用Ubuntu22.04界面创建热点之后,iPhone手机和Android12的手机无法连接热点,
以下是关于这个问题的相关两个链接:
https://blog.incompetent.me/2023/02/ubuntu-2204-hotspot-stops-working.html
https://askubuntu.com/questions/1424633/unable-to-connect-with-the-hotspot-created-on-ubuntu

总结下来就是Ubuntu22.04使用的wpa_supplicant v2.10版本存在bug,解决方法有如下三个:

1、回退wpa_supplicant版本到 v2.09,也就是上面第一个链接中提到的解决方法
2、尝试使用其他的加密方式,如WPA3/SAE,方法如下:
nmcli connection down <connection>
nmcli connection modify <connection> 802-11-wireless-security.key-mgmt sae
nmcli connection up <connection>
3、参考以下链接中提到的内容:
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/104
使用以下命令禁用 PMF 连接
nmcli connection modify <connection> wifi-sec.pmf disable
nmcli connection modify <connection> 802-11-wireless-security.pmf 1

这样完整的命令如下:

nmcli radio wifi on
nmcli dev wifi hotspot con-name Aubo_Camera ifname wlan0 ssid Aubo_Camera password 12345678
nmcli con modify Aubo_Camera 802-11-wireless-security.key-mgmt sae
nmcli con modify Aubo_Camera ipv4.addr 192.168.2.1/24
nmcli con up Aubo_Camera

nmcli radio wifi on
nmcli dev wifi hotspot con-name Aubo_Camera ifname wlan0 ssid Aubo_Camera password 12345678
nmcli con modify Aubo_Camera 802-11-wireless-security.pmf 1
nmcli con modify Aubo_Camera ipv4.addr 192.168.2.1/24
nmcli con up Aubo_Camera