OpenHamony wifip2p驱动适配

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-STARTEDP2P-GROUP-REMOVED)并通过异步回调通知上层。
  • DispatchP2pCallbackAsync():将 P2P 连接状态变化回调分发到独立线程执行,避免阻塞事件监听线程。
  • SoftBusRegisterP2pConnectionChangedCallback() / UnRegister:注册/注销 P2P 连接状态变化回调。
  • 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           │ │
│  └──────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────┘