根因:内核配置缺少ARC4算法支持,导致wifi驱动初始化失败,在四次握手时Failed to set GTK to the driver导致连接失败;
根因链:内核未注册arc4(未配置CONFIG_CRYPTO_ARC4=y) → 驱动WEP/arc4 初始化失败 → wep_tx_tfm 无效 → 所有 TKIP(含 GTK)在 mac80211 层被拦掉 → Failed to set GTK to the driver
1、问题:
设备连接路由器时出现supplicant提示:
wlan0: WPA: Failed to set GTK to the driver (alg=2 keylen=32 keyidx=1)
nl80211: set_key failed; err=-22 Invalid argument)
2、问题定位:
即在 4-Way Handshake 完成 PTK 安装之后、安装 GTK(组握手阶段)失败,最终导致断开或无法上网。
查看wifi驱动代码发现
- ieee80211_wep_init()调用 crypto_alloc_cipher("arc4")。
- 若整机内核未注册 arc4(典型:**未配置 `CONFIG_CRYPTO_ARC4=y`**,或模块未加载、裁剪过度),分配失败 → wep_tx_tfm为错误指针。
- 在安装 **WEP40/WEP104/TKIP** 密钥前检测 IS_ERR(wep_tx_tfm),失败则 return -EINVAL。
- PTK 常为 CCMP,往往 不落入上述 switch分支 → 可先安装成功。
- GTK 为 TKIP → 落入 WLAN_CIPHER_SUITE_TKIP → 被同一守卫拒绝 → wpa_supplicant 报 Failed to set GTK,且 err=-22`(EINVAL);
复盘:其实驱动初始化的时候已经提示“Failed to initialize wep: -2”,只是当时并没注意到,从该位置也可以定位到问题根因;