wpa_supplicant.c的方法wpa_supplicant_add_iface解析

文章讲述了wpa_supplicant如何添加和管理接口,每个interface对应一个wpa_supplicant实例,driver初始化并存储在全局列表中。wpa_supplicant_set_driver根据名称找到相应的驱动操作集。在HIDL层,通过StaIface与Java层交互,确保能找到对应的wpa_supplicant来执行驱动操作。
部署运行你感兴趣的模型镜像

wpa_supplicant_add_iface:

创建这个interface对应的wpa_supplicant,并且初始化这个wpa_supplicant的driver,然后放入全局的
global->ifaces中。

没有和驱动交互。

global->ifaces 存有系统所有的wpa_supplicant。

一个wpa_supplicant对应一个 interface 。
wpa_s->ifname 就是 iface->ifname 。
iface->driver在增加这个interface的时候被指定为nl80211。

constexpr char kIfaceDriverName[] = "nl80211";

对每一个interface ,构建对应的wpa_supplicant , 然后再存入全局的链表 global->ifaces 中(函数wpa_supplicant_add_iface) 。

wpa_s->driver 就是一个struct wpa_driver_ops 。

wpa_supplicant_set_driver 从全局的数组 wpa_drivers 找名字匹配的驱动

看这里

struct wpa_driver_ops定义了驱动需要实现的操作函数集。

global->ifaces:

使用在什么地方:
wpa_supplicant.c :
wpa_supplicant_remove_iface
wpa_supplicant_get_iface
wpa_supplicant_deinit

HIDL如何找对应的wpa_supplicant :

创建一个 interface 时,会创建对应的 StaIface(如果这个interface的类型不是p2p)
所以当 StaIface 收到java层的消息要发出去的时候,自然可以找到这个StaIface 对应的wpa_supplicant ,然后调用这个wpa_supplicant的driver的操作函数。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

感谢你补充了关键信息: > `wlan0` 和 `wlan1` 分别属于 **phy#1(2.4G)** 与 **phy#2(5G)**,是两个独立的物理无线芯片。 这意味着: ✅ 它们不是同一个 radio 上的虚拟接口 ✅ 硬件层面支持并发操作(双频双发) ✅ `wpa_supplicant` 应该能够同时管理这两个接口 但你现在遇到的问题是: > 执行命令: ```bash wpa_supplicant -B -c /etc/config/wpa_supplicant.conf -D nl80211 -i wlan0 -i wlan1 ``` 结果:❌ `wlan0` 没有正常工作,✅ 只有 `wlan1` 能扫描和连接 --- ## ✅ 结论先行 虽然你的硬件完全支持双频并发(不同 phy),但由于 **`wpa_supplicant` 在多接口初始化时存在“最后添加优先”或“驱动上下文覆盖”问题**,导致先添加的接口(`wlan0`)未能正确完成初始化。 这是 **常见于某些驱动实现不完整或多接口处理逻辑缺陷的情况**。 我们来一步步分析并提供解决方案。 --- ## 🔍 原因深度剖析 ### 📌 1. `wpa_supplicant` 多接口启动流程 当你使用: ```bash -i wlan0 -i wlan1 ``` `wpa_supplicant` 会依次为每个接口调用: - `wpa_driver_nl80211_init()` → 初始化驱动 - `nl80211_add_iface()` → 添加接口到内核 - `wpa_supplicant_init_iface()` → 启动状态机 👉 **但它共享一个全局 EAPOL 套接字和 netlink 上下文**。如果第二个接口(`wlan1`)初始化过程中触发了某些全局资源重置,可能会干扰第一个接口(`wlan0`)的状态。 --- ### 📌 2. 日志中可能缺失 `wlan0` 的成功提示 运行以下命令查看详细日志: ```bash wpa_supplicant -dd -c /etc/config/wpa_supplicant.conf -D nl80211 -i wlan0 -i wlan1 ``` 观察输出中是否包含: ```log wlan0: Added interface wlan0 wlan0: State: UNINITIALIZED -> DISCONNECTED ... wlan1: Added interface wlan1 wlan1: State: UNINITIALIZED -> DISCONNECTED ``` 🔍 如果只有 `wlan1` 出现这些日志 → 表示 `wlan0` 根本没完成初始化! --- ### 📌 3. 驱动 bug:nl80211 对 multi-phy 支持不完善 尽管 `wlan0` 属于 `phy1`、`wlan1` 属于 `phy2`,但某些闭源驱动(如 Realtek RTL88XX、Mediatek MT76x2U)在多 phy 场景下: - 不允许跨 phy 共享 `wpa_supplicant` 实例 - 或内部缓存了最后一个 `wdev`,导致前一个接口失去控制 👉 这会导致 `wlan0` 的 netlink socket 被关闭或忽略。 --- ### 📌 4. 控制接口路径冲突(socket 文件被覆盖) 默认情况下,`wpa_supplicant` 会在 `/var/run/wpa_supplicant/` 下创建控制 socket: ```bash /var/run/wpa_supplicant/wlan0 /var/run/wpa_supplicant/wlan1 ``` 但如果权限不对、目录不存在、或前一个实例未清理干净,可能导致: - `wlan0` 的 socket 创建失败 - `wpa_cli -i wlan0` 无法连接 --- ## ✅ 解决方案(按优先级排序) --- ### ✅ 方案一:分别启动两个独立的 `wpa_supplicant` 实例(推荐!) 既然两个接口属于不同的 `phy`,完全可以也**应该**运行两个独立实例。 ```bash # 先清理 killall wpa_supplicant rm -rf /var/run/wpa_supplicant/* mkdir -p /var/run/wpa_supplicant # 启动 wlan0 实例(2.4G) wpa_supplicant -B \ -c /etc/config/wpa_supplicant.conf \ -D nl80211 \ -i wlan0 \ -g /var/run/wpa_supplicant/global # 启动 wlan1 实例(5G) wpa_supplicant -B \ -c /etc/config/wpa_supplicant.conf \ -D nl80211 \ -i wlan1 \ -g /var/run/wpa_supplicant/global2 ``` > 💡 使用 `-g` 指定不同全局控制接口,避免冲突 #### ✅ 优点: - 每个接口有独立资源(EAPOL 套接字、netlink 上下文) - 不受“最后添加优先”影响 - 更稳定可靠 #### ❗ 注意: 不要让两个实例共用同一个配置文件中的 `ctrl_interface=` 目录而没有隔离,否则仍可能冲突。 --- ### ✅ 方案二:交换接口顺序,让 `wlan0` 成为最后一个添加的接口 有些驱动对“最后添加”的接口更友好: ```bash # 把 wlan0 放到最后 wpa_supplicant -B \ -c /etc/config/wpa_supplicant.conf \ -D nl80211 \ -i wlan1 \ # 先加 -i wlan0 # 后加 → 更容易激活 ``` 然后测试: ```bash wpa_cli -i wlan0 scan && wpa_cli -i wlan0 scan_results wpa_cli -i wlan1 scan && wpa_cli -i wlan1 scan_results ``` ✅ 如果现在 `wlan0` 正常了,说明是驱动初始化顺序问题。 --- ### ✅ 方案三:使用 `wpa_cli reattach` 手动恢复接口 有时接口已注册但处于“inactive”状态。 尝试手动附加: ```bash # 查看当前接口 wpa_cli -g /var/run/wpa_supplicant/global interface # 若 wlan0 未列出,则尝试重新附加 wpa_cli -g /var/run/wpa_supplicant/global interface add wlan0 nl80211 /etc/config/wpa_supplicant.conf ``` 参数说明: - `interface add <ifname> <driver> <conf>` - 可动态添加新接口 --- ### ✅ 方案四:确保 `ctrl_interface` 配置正确 编辑 `/etc/config/wpa_supplicant.conf`: ```conf ctrl_interface=/var/run/wpa_supplicant ctrl_interface_group=0 update_config=1 network={ ssid="MyNetwork" psk="12345678" } ``` 确保: - 目录存在且可写:`mkdir -p /var/run/wpa_supplicant` - 权限足够:`chmod 700 /var/run/wpa_supplicant` 否则 `wlan0` 的控制 socket 无法创建。 --- ### ✅ 方案五:分步调试 + 日志验证 使用 `-dd` 查看详细过程: ```bash wpa_supplicant -dd -c /etc/config/wpa_supplicant.conf -D nl80211 -i wlan0 -i wlan1 ``` 重点关注: ```log nl80211: Supported cipher 00-0f-ac:1 nl80211: Using driver-based off-channel TX nl80211: Interface type for wlan0: managed (2) nl80211: Add own interface (ifindex 21) ... wlan0: Added interface wlan0 ← 必须看到这一行! ``` 如果没有看到 `Added interface wlan0` → 表示驱动拒绝添加。 --- ## ✅ 如何确认两个接口都活跃? ### 方法 1:检查控制 socket ```bash ls /var/run/wpa_supplicant/ ``` 应看到: ``` wlan0 wlan1 global ``` ### 方法 2:查询接口状态 ```bash wpa_cli -i wlan0 status wpa_cli -i wlan1 status ``` 输出应类似: ``` ssid=MyNetwork ip_address=192.168.1.100 ``` 而不是: ``` Could not connect to interface: No such file or directory ``` ### 方法 3:查看内核日志 ```bash dmesg | grep wlan dmesg | grep nl80211 ``` 查找错误: ```log nl80211: Failed to set interface wlan0 into mode 2 nl80211: Could not configure driver mode ``` --- ## ✅ 推荐最终配置(双 phy 最佳实践) ```bash #!/bin/sh # 清理旧状态 killall wpa_supplicant 2>/dev/null rm -rf /var/run/wpa_supplicant mkdir -p /var/run/wpa_supplicant # 启动 2.4G 接口 (wlan0) wpa_supplicant -B \ -c /etc/config/wpa_supplicant.conf \ -D nl80211 \ -i wlan0 \ -g /var/run/wpa_supplicant/global # 启动 5G 接口 (wlan1) wpa_supplicant -B \ -c /etc/config/wpa_supplicant.conf \ -D nl80211 \ -i wlan1 \ -g /var/run/wpa_supplicant/global2 ``` 这样: - ✅ 每个接口独立运行 - ✅ 避免资源竞争 - ✅ 即使一个崩溃不影响另一个 - ✅ 易于调试和监控 --- ## ✅ 总结 | 问题 | 原因 | 解决方案 | |------|------|-----------| | `-i wlan0 -i wlan1` 只有 `wlan1` 工作 | 驱动对多接口初始化顺序敏感或资源覆盖 | 交换顺序或拆分为独立实例 | | `wlan0` 扫描失败 | 控制 socket 未创建或状态未激活 | 检查 `/var/run/wpa_supplicant/wlan0` | | 多 phy 却不能并发 | 闭源驱动限制 | 使用独立 `wpa_supplicant` 实例 | | `Address already in use` | 多个进程争抢 `ETH_P_PAE` | 确保每个接口单独实例或单进程统一管理 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值