2003年,英特尔推出迅驰(centrino)技术,低功耗的Pentium-M CPU和芯片组加上无线网卡三件套捆绑销售,走遍天下,是英特尔历史上的辉煌之作。从此之后,WIFI成为移动计算的标配。
20多年后的今天,虽然WIFI技术已经非常成熟,但因为WIFI硬件种类繁多,软件代码量大且复杂,所以WIFI的问题还是挺多的。根据格蠹这几年的经验,每次适配新硬件平台或者操作系统时,最常出问题的就是WIFI。
比如,前些天在给幽兰代码本适配Debian 12时,又出现WIFI问题。系统启动到Debian的桌面后,在系统托盘区展开WIFI列表,可以找到很多热点(AP),但是选择一个热点,输入密码后,Debian显示一条恼人的错误:连接失败。附带一条模糊的消息:网络连接激活失败。
对于这样的WIFI问题,调试起来难度是很大的,主要原因是故障的范围大,从底层硬件,到WIFI固件,到WIFI内核驱动,到网络协议栈,到用户空间的网络服务,再到网络服务的客户端界面。
这么大范围,首先要决定从哪里寻找突破口。格蠹的小伙伴一度怀疑是内核驱动的问题,但是我觉得更可能是用户空间的问题。因为既然可以找到那么多的热点,说明内核驱动已经工作的挺好了。
顺手牵羊
本周三上午,我开始准备《RK3588驱动实战》系列直播第四讲的讲义,主题刚好是“WIFI常见问题和排查方法”。
借着这个机会,我一边整理以往调试WIFI问题的资料,一边调试Debian的WIFI问题。
wpa_supplicant
根据直觉,我把主要的战场放在用户空间。
因为错误信息中包含“网络连接激活失败”,所以我首先想到的是wpa_supplicant。
WPA(Wi-Fi Protected Access)是WIFI认证和授权协议, wpa_supplicant是实现这个协议的一个开源项目,主要作者是下面照片中的Jouni Malinen。很可能是因为这个开源项目被广泛使用,Jouni 在2012年获得了ieee802组织的表彰。
(照片来自ieee802组织官网)
wpa_supplicant一般是以后台服务的形式运行的。大多数Linux系统中,都可以看到这个服务:
geduer@ulan:~/ndb$ ps -A | grep wpa
600 ? 00:00:00 wpa_supplicant
geduer@ulan:~/ndb$
它也支持以命令行方式运行,特别是可以跟上调试选项-d,这样它就会输出很详细的调试信息。
root@ulan:/etc/wpa_supplicant# wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/gd.conf -d
wpa_supplicant v2.9
random: getrandom() support available
Successfully initialized wpa_supplicant
Initializing interface 'wlan0' conf '/etc/wpa_supplicant/gd.conf' driver 'default' ctrl_interface 'N/A' bridge 'N/A'
Configuration file '/etc/wpa_supplicant/gd.conf' -&g