wificond 是一个独立的 进程,该进程位于 system/connectivity/wificond 中。wificond 进程通过标准的 nl80211 命令与 Wi-Fi 驱动程序进行通信
- 独立进程,开机启动
- 负责WiFi的扫描以及扫描结果上报
- 对上(frameworks) 提供AIDL接口,对下通过nl80211操作驱动获取扫描结果
wificond.rc
文件路径:android14/system/connectivity/wificond/wificond.rc
service wificond /system/bin/wificond 守护进程wificond, 对应的可执行程序在设备的system/bin/wificond下, init进程会通过执行这个二进制文件来启动服务
class main “class将服务分组” ; "main服务类别"。 init 在 late-init 阶段会顺序执行 class_start main,于是 wificond 跟随 zygote、netd、vold 等核心服务一起拉起来;如果后续执行class_reset main 或 class_stop main,也会批量重启/停止它
user wifi
group wifi net_raw net_admin 指定组: net_raw能力组,net_admin能力组
capabilities NET_RAW NET_ADMIN 能力、功能:拥有NET_RAW能力,拥有NET_ADMIN能力
- net_raw:这个组允许创建 AF_PACKET 原始套接字、发送 802.11 管理帧(某些漫游/ANQP 需要);
- net_admin:这个组允许调用 SIOCSIF* / SIOCETHTOOL 等 ioctl,进行 ifconfig、iw、ip link set 之类接口管理操作。
- NET_RAW : 创建PF_PACKET/PF_NETLINK套接字,发送/接收raw 802.11 帧、ICMP/IGMP等;wificond 用generic netlink与 cfg80211 交互,必须此 cap。
- NET_ADMIN: 配置网络接口:set MAC、改 MTU、设置 tx-power、创建/删除 vif、设置监管域;对应内核检查 CAP_NET_ADMIN。
绑定Netlink协议组
android14/system/connectivity/wificond/net/netlink_manager.cpp
做该业务
订阅nl802.11消息
注册订阅nl802.11各组event消息
接收数据
发送数据
wificond中的AIDL
android14/system/connectivity/wificond/aidl/android/net/wifi/nl80211/IWificond.aidl
| 接口 | 描述 |
|---|---|
| IWificond.aidl 方法签名 | 作用一句话总结 |
| createApInterface(String iface_name) | 创建虚拟 AP 接口(如 wlan0),返回 IApInterface对象,供后续开热点用。 |
| createClientInterface(String iface_name) | 创建虚拟 STA 接口,返回 IClientInterface 对象,供后续连 Wi-Fi 用。 |
| tearDownApInterface(String iface_name) | 把刚才创建的 AP 接口销毁掉,成功返回 true。 |
| tearDownClientInterface(String iface_name) | 把刚才创建的 STA 接口销毁掉,成功返回 true。 |
| tearDownInterfaces() | 一键清场,把所有已创建的 AP/STA 接口全部拆掉,方便重新配置。 |
| GetClientInterfaces() | 拿到当前活着的所有 STA 接口 Binder 列表,方便上层枚举。 |
| GetApInterfaces() | 拿到当前活着的所有 AP 接口 Binder 列表。 |
| getAvailable2gChannels() | 返回 int[],列出 2.4 GHz 频段里当前管制域可用的信道频率(单位 MHz)。 |
| getAvailable5gNonDFSChannels() | 同上,仅 5 GHz 非 DFS 信道。 |
| getAvailableDFSChannels() | 同上,仅 5 GHz DFS/被动扫描信道。 |
| getAvailable6gChannels() | 同上,6 GHz 频段。 |
| getAvailable60gChannels() | 同上,60 GHz 频段(WiGig)。 |
| RegisterCallback(IInterfaceEventCallback) | 注册接口状态回调(接口创建/销毁事件),可多次注册,重复注册自动去重。 |
| UnregisterCallback(IInterfaceEventCallback) | 注销上面注册的回调,必须传同一对象实例。 |
| registerWificondEventCallback(IWificondEventCallback) | 注册底层事件回调(如 Regulatory domain 变化),同样支持多播。 |
| unregisterWificondEventCallback(IWificondEventCallback) | 注销该事件回调。 |
| getDeviceWiphyCapabilities(String iface_name) | 查询指定接口对应的物理设备(wiphy)能力,返回 DeviceWiphyCapabilities对象,包含频段、加密方式、MLO 等能力位。 |
| notifyCountryCodeChanged() | 通知 wificond 国家码已变,用于驱动不支持内核 Regulatory 事件时的手动刷新。 |
android14/system/connectivity/wificond/aidl/android/net/wifi/nl80211/IApInterface.aidl
| 元素 | 说明 |
|---|---|
| 接口用途 | 代表一个已配置为 Wi-Fi 接入点(AP) 的网络接口,供框架层控制热点功能。 |
| 常量 | |
ENCRYPTION_TYPE_NONE = 0 | 热点无加密(Open)。 |
ENCRYPTION_TYPE_WPA = 1 | 热点使用 WPA 加密。 |
ENCRYPTION_TYPE_WPA2 = 2 | 热点使用 WPA2 加密(最常用)。 |
| 方法 | |
registerCallback(IApInterfaceEventCallback callback) | 注册事件回调(如 STA 连接/断开、失败等),成功返回 true。 |
getInterfaceName() | 返回该 AP 接口的 Linux 名称(如 "wlan0"),便于后续 ioctl/网络配置。 |
android14/system/connectivity/wificond/aidl/android/net/wifi/nl80211/IWifiScannerImpl.aidl
| 分类 | 项 | 一句话说明 |
|---|---|---|
| 扫描类型常量 | SCAN_TYPE_LOW_SPAN = 0 | 快速扫描,耗时短,结果可能不全。 |
SCAN_TYPE_LOW_POWER = 1 | 省电扫描,速度慢,适合后台。 | |
SCAN_TYPE_HIGH_ACCURACY = 2 | 高精度扫描,信道/SSID 最全,耗电高。 | |
SCAN_TYPE_DEFAULT = -1 | 内部 fallback 值,框架不允许直接传。 | |
| 返回状态常量 | SCAN_STATUS_SUCCESS = 0 | 扫描请求成功。 |
SCAN_STATUS_FAILED_GENERIC = 1 | 通用错误(驱动未知故障)。 | |
SCAN_STATUS_FAILED_BUSY = 2 | 设备忙(正在连接/扫描)。 | |
SCAN_STATUS_FAILED_ABORT = 3 | 被高优先级事件(漫游等)中断。 | |
SCAN_STATUS_FAILED_NODEV = 4 | 接口不存在或已 down。 | |
SCAN_STATUS_FAILED_INVALID_ARGS = 5 | 参数非法(SSID 超长、信道列表空等)。 | |
| 获取结果 | getScanResults() | 取最近一次 单扫 结果数组。 |
getPnoScanResults() | 取最近一次 PNO 扫 结果数组。 | |
getMaxSsidsPerScan() | 返回驱动每次扫描最多支持的 SSID 数。 | |
| 单扫接口 | scan(SingleScanSettings) | 已废弃;旧版布尔返回。 |
scanRequest(SingleScanSettings) | 新版单扫,返回 int 状态码(见上表)。 | |
| 事件订阅 | subscribeScanEvents(IScanEvent) | 注册单扫结果回调,只允许一个订阅者,后注册顶掉前一个。 |
unsubscribeScanEvents() | 取消单扫回调。 | |
subscribePnoScanEvents(IPnoScanEvent) | 注册 PNO 扫结果回调,同样唯一订阅者。 | |
unsubscribePnoScanEvents() | 取消 PNO 扫回调。 | |
| PNO 控制 | startPnoScan(PnoSettings) | 启动定时 PNO 扫描(灭屏/断连后后台扫),布尔返回成功。 |
stopPnoScan() | 停止当前 PNO 扫描,布尔返回。 | |
| 通用控制 | abortScan() | 立即中止正在进行的任何扫描(单扫或 PNO)。 |