简单学: Android14中的WiFi—wificond进程

182 阅读5分钟

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 mainclass将服务分组” ; "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 做该业务 image.png

wifi小代码.png

订阅nl802.11消息

image.png 注册订阅nl802.11各组event消息

image.png

接收数据

image.png

发送数据

image.png

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)。

androdi14中wificond业务框架流程

wifi_cond进程的交互流程.png