通过将网络共享流量(借助 USB、Wi-Fi)分流到硬件,网络共享分流可让设备节省电量并提高性能。通过在调制解调器和外围设备之间提供直接路径,并绕过应用处理器,可以分流网络共享流量。
规范
从 Android 8.1 开始,设备可以使用网络共享分流将 IPv4、IPv6 或 IPv4+IPv6 转发分流到硬件。
分流功能不需要分流所有数据包。框架能够处理软件中的任何数据包。控制数据包通常是在软件中处理。由于 IPv4 端口在网络共享流量和设备流量之间共享,因此必须在软件中处理 IPv4 会话设置/拆解数据包(例如,SYN/SYN+ACK、FIN),以便内核可以构建流程状态。框架提供了控制平面和状态机,还为硬件提供了有关上游和下游接口/前缀的信息。
对于 IPv4,硬件允许 IPv4 网络地址转换 (NAT) 会话设置数据包到达 CPU。内核会创建 NAT 条目,HAL 实现会观察框架提供的文件描述符中的条目,并在硬件中处理这些流程。这意味着 HAL 实现不需要 CAP_NET_*
,因为 HAL 会从框架中获取打开的 NF_NETLINK_CONNTRACK
套接字。硬件会定期将当前活动流程的 NAT 状态更新发送给框架,框架会刷新相应的内核连接跟踪状态条目。
对于 IPv6,框架会编制一个不得将流量分流到的 IPv6 目标前缀的列表。所有其他网络共享数据包都可以分流。
NetworkStatsService
数据流量使用情况轮询会使框架向硬件请求流量统计信息,以便计算数据流量使用量。框架还会通过 HAL 向硬件传达数据流量使用限制。
硬件要求
如需实现网络共享分流,您的硬件必须能够在调制解调器和 Wi-Fi/USB 之间转发 IP 数据包,而无需通过主处理器发送流量。
实现
如需启用网络共享分流功能,您必须同时实现配置 HAL (IOffloadConfig
) 和控制 HAL (IOffloadControl
)。
配置 HAL:IOffloadConfig
IOffloadConfig
HAL 会启动网络共享分流实现。框架会为 HAL 实现提供预先连接的 NF_NETLINK_CONNTRACK
套接字,以供该实现观察 IPv4 流程。只有转发的流程必须加速。
控制 HAL:IOffloadControl
IOffloadControl
HAL 会控制分流实现。必须实现以下方法:
- 启动/停止分流硬件:使用
initOffload/stopOffload
,并使用setLocalPrefixes
让本地 IP 地址或其他网络免于分流。 - 设置上游接口、IPv4 地址和 IPv6 网关:使用
setUpstreamParameters
,并使用addDownstream/removeDownstream
配置下游 IP 地址范围。 - 计算数据流量使用量:使用
getForwardedStats/setDataLimit
。
您的供应商 HAL 还必须通过 ITetheringOffloadCallback
接口发送回调,该接口会通知框架:
- 分流等异步事件被启动和停止 (OffloadCallbackEvent)
- NAT 超时更新,必须定期发送这些更新以表明特定 IPv4 流程包含流量且不得由内核关闭
验证
要验证网络共享分流的实现,请使用手动或自动测试验证网络共享和 WLAN 热点是否按预期方式工作。供应商测试套件 (VTS) 包含针对网络共享分流 HAL 的测试。