WPA 控制接口管理(核心基础设施)
- WpaCtrl 结构体 :封装了
wpa_ctrl 的发送/接收双通道,用于与 wpa_supplicant 守护进程双向通信。
- InitWpaCtrl():初始化 WPA 控制接口,打开 send/recv 两个 socket 并 attach 事件监听。
- WpaCliCmd() :向
wpa_supplicant 发送命令并接收响应,带互斥锁保护(g_wpaCmdMutex),防止并发命令冲突。
- GetWpaCtrl():获取全局 WPA 控制实例,含重试逻辑(最多 20 次)。
- ReadConfig() :从
/data/misc/wifi/wpa_supplicant.conf 读取 ctrl_interface 路径和 interface 名称,确定 WPA 控制套接字路径。
P2P 组管理(GO/GC 角色)
- SoftBusP2pCreateGroup() :创建 P2P 组(作为 GO),发送
P2P_GROUP_ADD 命令,使用条件变量(g_createGroupCond)等待异步创建结果,5 秒超时。
- SoftBusP2pConnect() :以 GC 角色连接到远端 GO,发送
MAGICLINK 命令(含 SSID、MAC、PSK、频率等参数)。
- SoftBusRemoveGroup() :GO 角色删除组,发送
P2P_GROUP_REMOVE 命令。
- SoftBusRemoveGcGroup() :GC 角色断开连接,同样发送
P2P_GROUP_REMOVE。
- SoftBusGetCurrentGroup():获取当前组信息(接口名、频率、密码、GO 地址等),带互斥锁保护。
事件监听与回调机制
- WpaReceiveCallback() :WPA 事件接收线程,持续 poll 接收
wpa_supplicant 推送的事件消息。
- DealWpaP2pCallBackSubFun():分发 P2P 事件到具体处理函数(设备发现、组创建/移除、连接/断开等)。
- EventMonitorThread() :独立的事件监听线程,解析 P2P 事件(
P2P-GROUP-STARTED、P2P-GROUP-REMOVED)并通过异步回调通知上层。
- DispatchP2pCallbackAsync():将 P2P 连接状态变化回调分发到独立线程执行,避免阻塞事件监听线程。
- SoftBusRegisterP2pConnectionChangedCallback() / UnRegister:注册/注销 P2P 连接状态变化回调。
P2P 状态监控(Netlink 方式)
- NetlinkMonitorThread() :通过 Netlink socket 监听网络接口状态变化(
RTM_NEWLINK/RTM_DELLINK),检测 p2p0 接口的 UP/DOWN 状态。
- HandleNetlinkMessage():解析 Netlink 消息,识别 P2P 接口状态变化并通知上层。
- SoftBusStartP2PStateMonitor() / Stop:启动/停止 P2P 状态监控。
IP 地址管理(DHCP 替代方案)
- InitIpPool() :基于 GO 的 IP 地址(默认
192.168.49.1)初始化 IP 池(192.168.49.3 ~ 192.168.49.75),使用 GLib 的 GList 管理。
- GetIp() :从 IP 池中为 GC 分配 IP,维护
<MAC, IP> 映射表(GHashTable),支持按 MAC 地址分配固定 IP。
- SoftBusConfigIPAddr() :为 GC 配置网络接口的 IP 地址和子网掩码,通过
ioctl 系统调用设置。
网络接口操作
- AddIpAddr() :通过
ioctl(SIOCSIFADDR/SIOCSIFNETMASK) 为网络接口设置 IPv4 地址和子网掩码。
- AddRoute():添加路由规则,关联 IP 地址和子网前缀长度。
- GetInterfaceIp() :通过
ioctl(SIOCGIFADDR) 获取指定网络接口的 IP 地址。
- SoftBusGetMacAddress() :获取 P2P 设备 MAC 地址,依次尝试
p2p0 接口 → WPA STATUS 命令 → 配置接口。
5GHz 信道管理
- GetChannelListFor5G() :通过
nl80211 Netlink 协议查询无线网卡支持的 5GHz 信道列表,解析 DFS 状态。
- SoftBusGetChannelListFor5G():对外接口,获取 5GHz 信道列表并校验当前 STA 连接信道是否需要跟随。
- SoftBusGetStationFrequency():获取推荐的工作频率------如果已连接 STA 则跟随其频率,否则首选 149 信道(5745MHz)。
- FreqToChannel() / ChannelToFreq():频率与信道号的互转,包含完整的 5GHz 频段映射表。
辅助工具函数
- AnonymizeCore() / MacAnonymize() / IpAnonymize():MAC/IP 地址匿名化,在日志中隐藏敏感信息中间部分。
- PrintfDecode() :解码 WPA 响应中的转义字符(
\x、\n、八进制等)。
- ConvertIpv4Address() / ConvertIpv4Mask():IPv4 地址字符串与整数互转、前缀长度转掩码。
- IsValidIp():使用 GLib 正则表达式校验 IPv4 地址合法性。
整体架构
┌──────────────────────────────────────────────────┐
│ 上层业务 (SoftBus) │
├──────────────────────────────────────────────────┤
│ 对外 API 接口层 │
│ SoftBusP2pCreateGroup / Connect / RemoveGroup │
│ SoftBusGetCurrentGroup / GetMacAddress │
│ SoftBusGetChannelListFor5G / GetStationFrequency│
│ SoftBusConfigIPAddr / RegisterCallback │
├──────────────────────────────────────────────────┤
│ 内部实现层 │
│ ┌─────────────┐ ┌──────────────┐ ┌─────────┐ │
│ │ WPA 控制通道 │ │ Netlink 监控 │ │ IP 池管理│ │
│ │ (wpa_ctrl) │ │ (nl80211) │ │ (GLib) │ │
│ └──────┬──────┘ └──────┬───────┘ └────┬────┘ │
│ │ │ │ │
│ ┌──────┴────────────────┴────────────────┴────┐ │
│ │ Linux 内核网络子系统 │ │
│ │ wpa_supplicant / nl80211 / ioctl │ │
│ └──────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────┘